diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.spec.ts b/src/app/access-control/epeople-registry/epeople-registry.component.spec.ts index 0278416cca..ee4d5fa603 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.spec.ts +++ b/src/app/access-control/epeople-registry/epeople-registry.component.spec.ts @@ -1,16 +1,40 @@ import { CommonModule } from '@angular/common'; -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { BrowserModule, By } from '@angular/platform-browser'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { + BrowserModule, + By, +} from '@angular/platform-browser'; import { Router } from '@angular/router'; -import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { + NgbModal, + NgbModule, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FindListOptions } from '../../core/data/find-list-options.model'; -import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { RequestService } from '../../core/data/request.service'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; @@ -21,7 +45,10 @@ import { FormBuilderService } from '../../shared/form/builder/form-builder.servi import { getMockFormBuilderService } from '../../shared/mocks/form-builder-service.mock'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { EPersonMock, EPersonMock2 } from '../../shared/testing/eperson.mock'; +import { + EPersonMock, + EPersonMock2, +} from '../../shared/testing/eperson.mock'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { RouterStub } from '../../shared/testing/router.stub'; diff --git a/src/app/access-control/epeople-registry/epeople-registry.component.ts b/src/app/access-control/epeople-registry/epeople-registry.component.ts index c15729b9e6..ddf5fe7bfb 100644 --- a/src/app/access-control/epeople-registry/epeople-registry.component.ts +++ b/src/app/access-control/epeople-registry/epeople-registry.component.ts @@ -1,15 +1,31 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, +} from '@angular/core'; import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { map, switchMap, take } from 'rxjs/operators'; +import { + BehaviorSubject, + combineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + map, + switchMap, + take, +} from 'rxjs/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; -import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { RequestService } from '../../core/data/request.service'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; @@ -17,13 +33,19 @@ import { EPerson } from '../../core/eperson/models/eperson.model'; import { EpersonDtoModel } from '../../core/eperson/models/eperson-dto.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { NoContent } from '../../core/shared/NoContent.model'; -import { getAllSucceededRemoteData, getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { + getAllSucceededRemoteData, + getFirstCompletedRemoteData, +} from '../../core/shared/operators'; import { PageInfo } from '../../core/shared/page-info.model'; import { ConfirmationModalComponent } from '../../shared/confirmation-modal/confirmation-modal.component'; import { hasValue } from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { getEPersonEditRoute, getEPersonsRoute } from '../access-control-routing-paths'; +import { + getEPersonEditRoute, + getEPersonsRoute, +} from '../access-control-routing-paths'; @Component({ selector: 'ds-epeople-registry', diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index 5797ef1add..7eb743f1ab 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -1,11 +1,37 @@ -import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { DynamicCheckboxModel, DynamicFormControlModel, DynamicFormLayout, DynamicInputModel } from '@ng-dynamic-forms/core'; +import { + DynamicCheckboxModel, + DynamicFormControlModel, + DynamicFormLayout, + DynamicInputModel, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; -import { combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { debounceTime, finalize, map, switchMap, take } from 'rxjs/operators'; +import { + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + debounceTime, + finalize, + map, + switchMap, + take, +} from 'rxjs/operators'; import { AuthService } from '../../../core/auth/auth.service'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; @@ -21,7 +47,11 @@ import { EPerson } from '../../../core/eperson/models/eperson.model'; import { Group } from '../../../core/eperson/models/group.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { NoContent } from '../../../core/shared/NoContent.model'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, getRemoteDataPayload } from '../../../core/shared/operators'; +import { + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../../../core/shared/operators'; import { PageInfo } from '../../../core/shared/page-info.model'; import { Registration } from '../../../core/shared/registration.model'; import { TYPE_REQUEST_FORGOT } from '../../../register-email-form/register-email-form.component'; diff --git a/src/app/access-control/group-registry/group-form/group-form.component.ts b/src/app/access-control/group-registry/group-form/group-form.component.ts index 75e28cad13..89bb4c395f 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.ts +++ b/src/app/access-control/group-registry/group-form/group-form.component.ts @@ -1,12 +1,40 @@ -import { ChangeDetectorRef, Component, EventEmitter, HostListener, OnDestroy, OnInit, Output } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + HostListener, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { DynamicFormControlModel, DynamicFormLayout, DynamicInputModel, DynamicTextAreaModel } from '@ng-dynamic-forms/core'; +import { + DynamicFormControlModel, + DynamicFormLayout, + DynamicInputModel, + DynamicTextAreaModel, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; import { Operation } from 'fast-json-patch'; -import { combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { catchError, debounceTime, filter, map, switchMap, take } from 'rxjs/operators'; +import { + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + catchError, + debounceTime, + filter, + map, + switchMap, + take, +} from 'rxjs/operators'; import { environment } from '../../../../environments/environment'; import { getCollectionEditRolesRoute } from '../../../collection-page/collection-page-routing-paths'; @@ -25,14 +53,26 @@ import { Collection } from '../../../core/shared/collection.model'; import { Community } from '../../../core/shared/community.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { NoContent } from '../../../core/shared/NoContent.model'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../../core/shared/operators'; +import { + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, + getRemoteDataPayload, +} from '../../../core/shared/operators'; import { AlertType } from '../../../shared/alert/alert-type'; import { ConfirmationModalComponent } from '../../../shared/confirmation-modal/confirmation-modal.component'; -import { hasValue, hasValueOperator, isNotEmpty } from '../../../shared/empty.util'; +import { + hasValue, + hasValueOperator, + isNotEmpty, +} from '../../../shared/empty.util'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { followLink } from '../../../shared/utils/follow-link-config.model'; -import { getGroupEditRoute, getGroupsRoute } from '../../access-control-routing-paths'; +import { + getGroupEditRoute, + getGroupsRoute, +} from '../../access-control-routing-paths'; import { ValidateGroupExists } from './validators/group-exists.validator'; @Component({ diff --git a/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts b/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts index f0f3df6a2e..c1bdff9818 100644 --- a/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts +++ b/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts @@ -1,29 +1,33 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { LdnServicesOverviewComponent } from './ldn-services-directory/ldn-services-directory.component'; -import { NavigationBreadcrumbResolver } from '../../core/breadcrumbs/navigation-breadcrumb.resolver'; +import { + RouterModule, + Routes, +} from '@angular/router'; + import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { NavigationBreadcrumbResolver } from '../../core/breadcrumbs/navigation-breadcrumb.resolver'; import { LdnServiceFormComponent } from './ldn-service-form/ldn-service-form.component'; +import { LdnServicesOverviewComponent } from './ldn-services-directory/ldn-services-directory.component'; const moduleRoutes: Routes = [ { path: '', pathMatch: 'full', component: LdnServicesOverviewComponent, - resolve: {breadcrumb: I18nBreadcrumbResolver}, - data: {title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new'}, + resolve: { breadcrumb: I18nBreadcrumbResolver }, + data: { title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new' }, }, { path: 'new', - resolve: {breadcrumb: NavigationBreadcrumbResolver}, + resolve: { breadcrumb: NavigationBreadcrumbResolver }, component: LdnServiceFormComponent, - data: {title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service'} + data: { title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service' }, }, { path: 'edit/:serviceId', - resolve: {breadcrumb: NavigationBreadcrumbResolver}, + resolve: { breadcrumb: NavigationBreadcrumbResolver }, component: LdnServiceFormComponent, - data: {title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service'} + data: { title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service' }, }, ]; @@ -31,15 +35,15 @@ const moduleRoutes: Routes = [ @NgModule({ imports: [ RouterModule.forChild(moduleRoutes.map(route => { - return {...route, data: { - ...route.data, - relatedRoutes: moduleRoutes.filter(relatedRoute => relatedRoute.path !== route.path) - .map((relatedRoute) => { - return {path: relatedRoute.path, data: relatedRoute.data}; - }) - }}; - })) - ] + return { ...route, data: { + ...route.data, + relatedRoutes: moduleRoutes.filter(relatedRoute => relatedRoute.path !== route.path) + .map((relatedRoute) => { + return { path: relatedRoute.path, data: relatedRoute.data }; + }), + } }; + })), + ], }) export class AdminLdnServicesRoutingModule { diff --git a/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts b/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts index 7d70a38fc0..59875158ef 100644 --- a/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts +++ b/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts @@ -1,24 +1,25 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { AdminLdnServicesRoutingModule } from './admin-ldn-services-routing.module'; -import { LdnServicesOverviewComponent } from './ldn-services-directory/ldn-services-directory.component'; -import { SharedModule } from '../../shared/shared.module'; -import { LdnServiceFormComponent } from './ldn-service-form/ldn-service-form.component'; +import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; + +import { SharedModule } from '../../shared/shared.module'; +import { AdminLdnServicesRoutingModule } from './admin-ldn-services-routing.module'; +import { LdnServiceFormComponent } from './ldn-service-form/ldn-service-form.component'; import { LdnItemfiltersService } from './ldn-services-data/ldn-itemfilters-data.service'; +import { LdnServicesOverviewComponent } from './ldn-services-directory/ldn-services-directory.component'; @NgModule({ imports: [ CommonModule, SharedModule, AdminLdnServicesRoutingModule, - FormsModule + FormsModule, ], declarations: [ LdnServicesOverviewComponent, LdnServiceFormComponent, ], - providers: [LdnItemfiltersService] + providers: [LdnItemfiltersService], }) export class AdminLdnServicesModule { } diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts index 8e44f47c02..b5d774b6c5 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts @@ -1,23 +1,49 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; - -import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { LdnServiceFormComponent } from './ldn-service-form.component'; -import { ChangeDetectorRef, EventEmitter } from '@angular/core'; -import { FormArray, FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + ChangeDetectorRef, + EventEmitter, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; +import { + FormArray, + FormBuilder, + FormControl, + FormGroup, + ReactiveFormsModule, +} from '@angular/forms'; +import { By } from '@angular/platform-browser'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + NgbDropdownModule, + NgbModal, +} from '@ng-bootstrap/ng-bootstrap'; +import { provideMockStore } from '@ngrx/store/testing'; +import { + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { PaginationService } from 'ngx-pagination'; +import { + of as observableOf, + of, +} from 'rxjs'; + +import { RouteService } from '../../../core/services/route.service'; +import { MockActivatedRoute } from '../../../shared/mocks/active-router.mock'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { RouterStub } from '../../../shared/testing/router.stub'; import { LdnItemfiltersService } from '../ldn-services-data/ldn-itemfilters-data.service'; import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { RouterStub } from '../../../shared/testing/router.stub'; -import { MockActivatedRoute } from '../../../shared/mocks/active-router.mock'; -import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; -import { of as observableOf, of } from 'rxjs'; -import { RouteService } from '../../../core/services/route.service'; -import { provideMockStore } from '@ngrx/store/testing'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { By } from '@angular/platform-browser'; +import { LdnServiceFormComponent } from './ldn-service-form.component'; describe('LdnServiceFormEditComponent', () => { let component: LdnServiceFormComponent; @@ -33,7 +59,7 @@ describe('LdnServiceFormEditComponent', () => { const routeParams = { serviceId: testId, }; - const routeUrlSegments = [{path: 'path'}]; + const routeUrlSegments = [{ path: 'path' }]; const formMockValue = { 'id': '', 'name': 'name', @@ -52,9 +78,9 @@ describe('LdnServiceFormEditComponent', () => { 'pattern': '', 'patternLabel': 'Select a pattern', 'constraint': '', - 'automatic': false - } - ] + 'automatic': false, + }, + ], }; @@ -63,7 +89,7 @@ describe('LdnServiceFormEditComponent', () => { instant: () => 'translated-text', onLangChange: new EventEmitter(), onTranslationChange: new EventEmitter(), - onDefaultLangChange: new EventEmitter() + onDefaultLangChange: new EventEmitter(), }; beforeEach(async () => { @@ -77,11 +103,11 @@ describe('LdnServiceFormEditComponent', () => { findAll: () => of(['item1', 'item2']), }; cdRefStub = Object.assign({ - detectChanges: () => fixture.detectChanges() + detectChanges: () => fixture.detectChanges(), }); modalService = { open: () => {/*comment*/ - } + }, }; @@ -91,19 +117,19 @@ describe('LdnServiceFormEditComponent', () => { imports: [ReactiveFormsModule, TranslateModule.forRoot(), NgbDropdownModule], declarations: [LdnServiceFormComponent], providers: [ - {provide: LdnServicesService, useValue: ldnServicesService}, - {provide: LdnItemfiltersService, useValue: ldnItemfiltersService}, - {provide: Router, useValue: new RouterStub()}, - {provide: ActivatedRoute, useValue: activatedRoute}, - {provide: ChangeDetectorRef, useValue: cdRefStub}, - {provide: NgbModal, useValue: modalService}, - {provide: NotificationsService, useValue: new NotificationsServiceStub()}, - {provide: TranslateService, useValue: translateServiceStub}, - {provide: PaginationService, useValue: {}}, + { provide: LdnServicesService, useValue: ldnServicesService }, + { provide: LdnItemfiltersService, useValue: ldnItemfiltersService }, + { provide: Router, useValue: new RouterStub() }, + { provide: ActivatedRoute, useValue: activatedRoute }, + { provide: ChangeDetectorRef, useValue: cdRefStub }, + { provide: NgbModal, useValue: modalService }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: TranslateService, useValue: translateServiceStub }, + { provide: PaginationService, useValue: {} }, FormBuilder, RouteService, provideMockStore({}), - ] + ], }) .compileComponents(); @@ -139,7 +165,7 @@ describe('LdnServiceFormEditComponent', () => { it('should handle create service with valid form', () => { spyOn(component, 'fetchServiceData').and.callFake((a) => a); - component.formModel.addControl('notifyServiceInboundPatterns', (component as any).formBuilder.array([{pattern: 'patternValue'}])); + component.formModel.addControl('notifyServiceInboundPatterns', (component as any).formBuilder.array([{ pattern: 'patternValue' }])); const nameInput = fixture.debugElement.query(By.css('#name')); const descriptionInput = fixture.debugElement.query(By.css('#description')); const urlInput = fixture.debugElement.query(By.css('#url')); @@ -184,7 +210,7 @@ describe('LdnServiceFormEditComponent', () => { spyOn(component.formModel, 'markAllAsTouched'); spyOn(component, 'closeModal'); spyOn(component, 'checkPatterns').and.callFake(() => true); - component.formModel.addControl('notifyServiceInboundPatterns', (component as any).formBuilder.array([{pattern: 'patternValue'}])); + component.formModel.addControl('notifyServiceInboundPatterns', (component as any).formBuilder.array([{ pattern: 'patternValue' }])); component.formModel.patchValue(formMockValue); component.createService(); @@ -196,13 +222,13 @@ describe('LdnServiceFormEditComponent', () => { it('should check patterns', () => { const arrValid = new FormArray([ new FormGroup({ - pattern: new FormControl('pattern') + pattern: new FormControl('pattern'), }), ]); const arrInvalid = new FormArray([ new FormGroup({ - pattern: new FormControl('') + pattern: new FormControl(''), }), ]); diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts index 2e585058c7..51aaa08957 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts @@ -1,25 +1,51 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; -import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; -import { ActivatedRoute, Router } from '@angular/router'; -import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { notifyPatterns } from '../ldn-services-patterns/ldn-service-coar-patterns'; -import { animate, state, style, transition, trigger } from '@angular/animations'; +import { + animate, + state, + style, + transition, + trigger, +} from '@angular/animations'; +import { + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + TemplateRef, + ViewChild, +} from '@angular/core'; +import { + FormArray, + FormBuilder, + FormGroup, + Validators, +} from '@angular/forms'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; -import { LdnService } from '../ldn-services-model/ldn-services.model'; -import { RemoteData } from 'src/app/core/data/remote-data'; import { Operation } from 'fast-json-patch'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { LdnItemfiltersService } from '../ldn-services-data/ldn-itemfilters-data.service'; -import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { combineLatestWith, Observable, Subscription } from 'rxjs'; -import { PaginationService } from '../../../core/pagination/pagination.service'; +import { + combineLatestWith, + Observable, + Subscription, +} from 'rxjs'; +import { RemoteData } from 'src/app/core/data/remote-data'; + import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { NotifyServicePattern } from '../ldn-services-model/ldn-service-patterns.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { IpV4Validator } from '../../../shared/utils/ipV4.validator'; +import { LdnItemfiltersService } from '../ldn-services-data/ldn-itemfilters-data.service'; +import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; +import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; +import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; +import { NotifyServicePattern } from '../ldn-services-model/ldn-service-patterns.model'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; +import { notifyPatterns } from '../ldn-services-patterns/ldn-service-coar-patterns'; /** * Component for editing LDN service through a form that allows to create or edit the properties of a service @@ -39,15 +65,15 @@ import { IpV4Validator } from '../../../shared/utils/ipV4.validator'; export class LdnServiceFormComponent implements OnInit, OnDestroy { formModel: FormGroup; - @ViewChild('confirmModal', {static: true}) confirmModal: TemplateRef; - @ViewChild('resetFormModal', {static: true}) resetFormModal: TemplateRef; + @ViewChild('confirmModal', { static: true }) confirmModal: TemplateRef; + @ViewChild('resetFormModal', { static: true }) resetFormModal: TemplateRef; public inboundPatterns: string[] = notifyPatterns; public isNewService: boolean; public areControlsInitialized: boolean; public itemfiltersRD$: Observable>>; public config: FindListOptions = Object.assign(new FindListOptions(), { - elementsPerPage: 20 + elementsPerPage: 20, }); public markedForDeletionInboundPattern: number[] = []; public selectedInboundPatterns: string[]; @@ -70,7 +96,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { protected modalService: NgbModal, private notificationService: NotificationsService, private translateService: TranslateService, - protected paginationService: PaginationService + protected paginationService: PaginationService, ) { this.formModel = this.formBuilder.group({ @@ -89,8 +115,8 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.routeSubscription = this.route.params.pipe( - combineLatestWith(this.route.url) + this.routeSubscription = this.route.params.pipe( + combineLatestWith(this.route.url), ).subscribe(([params, segment]) => { this.serviceId = params.serviceId; this.isNewService = segment[0].path === 'new'; @@ -141,17 +167,17 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { patternLabel: string, constraintFormatted: string; }) => { - const {patternLabel, ...rest} = pattern; + const { patternLabel, ...rest } = pattern; delete rest.constraintFormatted; return rest; }); - const values = {...this.formModel.value, enabled: true}; + const values = { ...this.formModel.value, enabled: true }; const ldnServiceData = this.ldnServicesService.create(values); ldnServiceData.pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData(), ).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { this.notificationService.success(this.translateService.get('ldn-service-notification.created.success.title'), @@ -191,7 +217,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { */ fetchServiceData(serviceId: string): void { this.ldnServicesService.findById(serviceId).pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData(), ).subscribe( (data: RemoteData) => { if (data.hasSucceeded) { @@ -206,18 +232,18 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { type: this.ldnService.type, enabled: this.ldnService.enabled, lowerIp: this.ldnService.lowerIp, - upperIp: this.ldnService.upperIp + upperIp: this.ldnService.upperIp, }); this.filterPatternObjectsAndAssignLabel('notifyServiceInboundPatterns'); - let notifyServiceInboundPatternsFormArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; + const notifyServiceInboundPatternsFormArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; notifyServiceInboundPatternsFormArray.controls.forEach( control => { const controlFormGroup = control as FormGroup; const controlConstraint = controlFormGroup.get('constraint').value; controlFormGroup.patchValue({ - constraintFormatted: controlConstraint ? this.translateService.instant((controlConstraint as string) + '.label') : '' + constraintFormatted: controlConstraint ? this.translateService.instant((controlConstraint as string) + '.label') : '', }); - } + }, ); } }, @@ -232,14 +258,14 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { const PatternsArray = this.formModel.get(formArrayName) as FormArray; PatternsArray.clear(); - let servicesToUse = this.ldnService.notifyServiceInboundPatterns; + const servicesToUse = this.ldnService.notifyServiceInboundPatterns; servicesToUse.forEach((patternObj: NotifyServicePattern) => { let patternFormGroup; patternFormGroup = this.initializeInboundPatternFormGroup(); const newPatternObjWithLabel = Object.assign(new NotifyServicePattern(), { ...patternObj, - patternLabel: this.translateService.instant('ldn-service.form.pattern.' + patternObj?.pattern + '.label') + patternLabel: this.translateService.instant('ldn-service.form.pattern.' + patternObj?.pattern + '.label'), }); patternFormGroup.patchValue(newPatternObjWithLabel); @@ -267,7 +293,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { this.deletedInboundPatterns.forEach(index => { const removeOperation: Operation = { op: 'remove', - path: `notifyServiceInboundPatterns[${index}]` + path: `notifyServiceInboundPatterns[${index}]`, }; patchOperations.push(removeOperation); }); @@ -297,8 +323,8 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { */ selectInboundPattern(patternValue: string, index: number): void { const patternArray = (this.formModel.get('notifyServiceInboundPatterns') as FormArray); - patternArray.controls[index].patchValue({pattern: patternValue}); - patternArray.controls[index].patchValue({patternLabel: this.translateService.instant('ldn-service.form.pattern.' + patternValue + '.label')}); + patternArray.controls[index].patchValue({ pattern: patternValue }); + patternArray.controls[index].patchValue({ patternLabel: this.translateService.instant('ldn-service.form.pattern.' + patternValue + '.label') }); } /** @@ -310,7 +336,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { const filterArray = (this.formModel.get('notifyServiceInboundPatterns') as FormArray); filterArray.controls[index].patchValue({ constraint: filterValue, - constraintFormatted: this.translateService.instant((filterValue !== '' ? filterValue : 'ldn.no-filter') + '.label') + constraintFormatted: this.translateService.instant((filterValue !== '' ? filterValue : 'ldn.no-filter') + '.label'), }); filterArray.markAllAsTouched(); } @@ -340,12 +366,12 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { }; this.ldnServicesService.patch(this.ldnService, [patchOperation]).pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData(), ).subscribe( () => { this.formModel.get('enabled').setValue(newStatus); this.cdRef.detectChanges(); - } + }, ); } @@ -391,7 +417,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { } this.ldnServicesService.patch(this.ldnService, patchOperations).pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData(), ).subscribe( (rd: RemoteData) => { if (rd.hasSucceeded) { @@ -529,7 +555,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { constraint: '', constraintFormatted: '', automatic: false, - isNew: true + isNew: true, }; if (this.isNewService) { @@ -560,6 +586,6 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy { private setLdnUrlError(): void { const control = this.formModel.controls.ldnUrl; const controlErrors = control.errors || {}; - control.setErrors({...controlErrors, ldnUrlAlreadyAssociated: true }); + control.setErrors({ ...controlErrors, ldnUrlAlreadyAssociated: true }); } } diff --git a/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts b/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts index 2b2a6576f6..8494b67dab 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts @@ -1,9 +1,13 @@ -import { LdnService } from '../ldn-services-model/ldn-services.model'; -import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; -import { RemoteData } from '../../../core/data/remote-data'; +import { + Observable, + of, +} from 'rxjs'; + import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { Observable, of } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; export const mockLdnService: LdnService = { uuid: '1', @@ -31,7 +35,7 @@ export const mockLdnService: LdnService = { type: LDN_SERVICE, _links: { self: { - href: 'http://localhost/api/ldn/ldnservices/1' + href: 'http://localhost/api/ldn/ldnservices/1', }, }, get self(): string { @@ -68,7 +72,7 @@ export const mockLdnServices: LdnService[] = [{ type: LDN_SERVICE, _links: { self: { - href: 'http://localhost/api/ldn/ldnservices/1' + href: 'http://localhost/api/ldn/ldnservices/1', }, }, get self(): string { @@ -100,12 +104,12 @@ export const mockLdnServices: LdnService[] = [{ type: LDN_SERVICE, _links: { self: { - href: 'http://localhost/api/ldn/ldnservices/1' + href: 'http://localhost/api/ldn/ldnservices/1', }, }, get self(): string { return ''; }, -} +}, ]; export const mockLdnServicesRD$: Observable>> = of((mockLdnServices as unknown) as RemoteData>); diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilter-data.service.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilter-data.service.spec.ts index b5b0881727..110a0779fb 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilter-data.service.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilter-data.service.spec.ts @@ -1,19 +1,23 @@ +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; +import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { LdnItemfiltersService } from './ldn-itemfilters-data.service'; -import { RequestService } from '../../../core/data/request.service'; + import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { RequestEntry } from '../../../core/data/request-entry.model'; -import { RemoteData } from '../../../core/data/remote-data'; -import { RequestEntryState } from '../../../core/data/request-entry-state.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; import { RestResponse } from '../../../core/cache/response.models'; -import { of } from 'rxjs'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { FindAllData } from '../../../core/data/base/find-all-data'; import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec'; +import { RemoteData } from '../../../core/data/remote-data'; +import { RequestService } from '../../../core/data/request.service'; +import { RequestEntry } from '../../../core/data/request-entry.model'; +import { RequestEntryState } from '../../../core/data/request-entry-state.model'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { LdnItemfiltersService } from './ldn-itemfilters-data.service'; describe('LdnItemfiltersService test', () => { let scheduler: TestScheduler; @@ -60,12 +64,12 @@ describe('LdnItemfiltersService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: of(endpointURL) + getEndpoint: of(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) + buildList: cold('a', { a: remoteDataMocks.Success }), }); diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts index d4e417aba2..8222c69d79 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts @@ -1,20 +1,23 @@ import { Injectable } from '@angular/core'; -import { dataService } from '../../../core/data/base/data-service.decorator'; -import { LDN_SERVICE_CONSTRAINT_FILTERS } from '../ldn-services-model/ldn-service.resource-type'; -import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; -import { FindAllData, FindAllDataImpl } from '../../../core/data/base/find-all-data'; +import { Observable } from 'rxjs'; -import { RequestService } from '../../../core/data/request.service'; import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { dataService } from '../../../core/data/base/data-service.decorator'; +import { + FindAllData, + FindAllDataImpl, +} from '../../../core/data/base/find-all-data'; +import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { RequestService } from '../../../core/data/request.service'; import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; -import { Observable } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; +import { LDN_SERVICE_CONSTRAINT_FILTERS } from '../ldn-services-model/ldn-service.resource-type'; import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; /** * A service responsible for fetching/sending data from/to the REST API on the itemfilters endpoint diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.spec.ts index 85cbb9d386..4ff781f629 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.spec.ts @@ -1,130 +1,134 @@ -import { TestScheduler } from 'rxjs/testing'; -import { RequestService } from '../../../core/data/request.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { RequestEntry } from '../../../core/data/request-entry.model'; -import { RemoteData } from '../../../core/data/remote-data'; -import { RequestEntryState } from '../../../core/data/request-entry-state.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; -import { RestResponse } from '../../../core/cache/response.models'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { FindAllData } from '../../../core/data/base/find-all-data'; -import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec'; -import { LdnServicesService } from './ldn-services-data.service'; -import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec'; -import { DeleteData } from '../../../core/data/base/delete-data'; -import { testSearchDataImplementation } from '../../../core/data/base/search-data.spec'; -import { SearchData } from '../../../core/data/base/search-data'; -import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec'; -import { PatchData } from '../../../core/data/base/patch-data'; +import { TestScheduler } from 'rxjs/testing'; + +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { RestResponse } from '../../../core/cache/response.models'; import { CreateData } from '../../../core/data/base/create-data'; import { testCreateDataImplementation } from '../../../core/data/base/create-data.spec'; +import { DeleteData } from '../../../core/data/base/delete-data'; +import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec'; +import { FindAllData } from '../../../core/data/base/find-all-data'; +import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec'; +import { PatchData } from '../../../core/data/base/patch-data'; +import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec'; +import { SearchData } from '../../../core/data/base/search-data'; +import { testSearchDataImplementation } from '../../../core/data/base/search-data.spec'; import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { RequestParam } from '../../../core/cache/models/request-param.model'; -import { mockLdnService } from '../ldn-service-serviceMock/ldnServicesRD$-mock'; +import { RemoteData } from '../../../core/data/remote-data'; +import { RequestService } from '../../../core/data/request.service'; +import { RequestEntry } from '../../../core/data/request-entry.model'; +import { RequestEntryState } from '../../../core/data/request-entry-state.model'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { createPaginatedList } from '../../../shared/testing/utils.test'; +import { mockLdnService } from '../ldn-service-serviceMock/ldnServicesRD$-mock'; +import { LdnServicesService } from './ldn-services-data.service'; describe('LdnServicesService test', () => { - let scheduler: TestScheduler; - let service: LdnServicesService; - let requestService: RequestService; - let rdbService: RemoteDataBuildService; - let objectCache: ObjectCacheService; - let halService: HALEndpointService; - let notificationsService: NotificationsService; - let responseCacheEntry: RequestEntry; + let scheduler: TestScheduler; + let service: LdnServicesService; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let responseCacheEntry: RequestEntry; - const endpointURL = `https://rest.api/rest/api/ldn/ldnservices`; - const requestUUID = '8b3c613a-5a4b-438b-9686-be1d5b4a1c5a'; + const endpointURL = `https://rest.api/rest/api/ldn/ldnservices`; + const requestUUID = '8b3c613a-5a4b-438b-9686-be1d5b4a1c5a'; - const remoteDataMocks = { - Success: new RemoteData(null, null, null, RequestEntryState.Success, null, null, 200), - }; + const remoteDataMocks = { + Success: new RemoteData(null, null, null, RequestEntryState.Success, null, null, 200), + }; - function initTestService() { - return new LdnServicesService( - requestService, - rdbService, - objectCache, - halService, - notificationsService, - ); - } + function initTestService() { + return new LdnServicesService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + ); + } - beforeEach(() => { - scheduler = getTestScheduler(); + beforeEach(() => { + scheduler = getTestScheduler(); - objectCache = {} as ObjectCacheService; - notificationsService = {} as NotificationsService; - responseCacheEntry = new RequestEntry(); - responseCacheEntry.request = { href: 'https://rest.api/' } as any; - responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + objectCache = {} as ObjectCacheService; + notificationsService = {} as NotificationsService; + responseCacheEntry = new RequestEntry(); + responseCacheEntry.request = { href: 'https://rest.api/' } as any; + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); - requestService = jasmine.createSpyObj('requestService', { - generateRequestId: requestUUID, - send: true, - removeByHrefSubstring: {}, - getByHref: observableOf(responseCacheEntry), - getByUUID: observableOf(responseCacheEntry), - }); - - halService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf(endpointURL) - }); - - rdbService = jasmine.createSpyObj('rdbService', { - buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildFromRequestUUID: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) - }); - - - service = initTestService(); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), }); - describe('composition', () => { - const initFindAllService = () => new LdnServicesService(null, null, null, null, null) as unknown as FindAllData; - const initDeleteService = () => new LdnServicesService(null, null, null, null, null) as unknown as DeleteData; - const initSearchService = () => new LdnServicesService(null, null, null, null, null) as unknown as SearchData; - const initPatchService = () => new LdnServicesService(null, null, null, null, null) as unknown as PatchData; - const initCreateService = () => new LdnServicesService(null, null, null, null, null) as unknown as CreateData; - - testFindAllDataImplementation(initFindAllService); - testDeleteDataImplementation(initDeleteService); - testSearchDataImplementation(initSearchService); - testPatchDataImplementation(initPatchService); - testCreateDataImplementation(initCreateService); + halService = jasmine.createSpyObj('halService', { + getEndpoint: observableOf(endpointURL), }); - describe('custom methods', () => { - it('should find service by inbound pattern', (done) => { - const params = [new RequestParam('pattern', 'testPattern')]; - const findListOptions = Object.assign(new FindListOptions(), {}, {searchParams: params}); - spyOn(service, 'searchBy').and.returnValue(observableOf(null)); - spyOn((service as any).searchData, 'searchBy').and.returnValue(createSuccessfulRemoteDataObject$(createPaginatedList([mockLdnService]))); - - service.findByInboundPattern('testPattern').subscribe(() => { - expect(service.searchBy).toHaveBeenCalledWith('byInboundPattern', findListOptions, undefined, undefined ); - done(); - }); - }); - - it('should invoke service', (done) => { - const constraints = [{void: true}]; - const files = [new File([],'fileName')]; - spyOn(service as any, 'getInvocationFormData'); - spyOn(service, 'getBrowseEndpoint').and.returnValue(observableOf('testEndpoint')); - service.invoke('serviceName', 'serviceId', constraints, files).subscribe(result => { - expect((service as any).getInvocationFormData).toHaveBeenCalledWith(constraints, files); - expect(service.getBrowseEndpoint).toHaveBeenCalled(); - expect(result).toBeInstanceOf(RemoteData); - done(); - }); - - }); + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: createSuccessfulRemoteDataObject$({}, 500), + buildFromRequestUUID: createSuccessfulRemoteDataObject$({}, 500), + buildList: cold('a', { a: remoteDataMocks.Success }), }); + + service = initTestService(); + }); + + describe('composition', () => { + const initFindAllService = () => new LdnServicesService(null, null, null, null, null) as unknown as FindAllData; + const initDeleteService = () => new LdnServicesService(null, null, null, null, null) as unknown as DeleteData; + const initSearchService = () => new LdnServicesService(null, null, null, null, null) as unknown as SearchData; + const initPatchService = () => new LdnServicesService(null, null, null, null, null) as unknown as PatchData; + const initCreateService = () => new LdnServicesService(null, null, null, null, null) as unknown as CreateData; + + testFindAllDataImplementation(initFindAllService); + testDeleteDataImplementation(initDeleteService); + testSearchDataImplementation(initSearchService); + testPatchDataImplementation(initPatchService); + testCreateDataImplementation(initCreateService); + }); + + describe('custom methods', () => { + it('should find service by inbound pattern', (done) => { + const params = [new RequestParam('pattern', 'testPattern')]; + const findListOptions = Object.assign(new FindListOptions(), {}, { searchParams: params }); + spyOn(service, 'searchBy').and.returnValue(observableOf(null)); + spyOn((service as any).searchData, 'searchBy').and.returnValue(createSuccessfulRemoteDataObject$(createPaginatedList([mockLdnService]))); + + service.findByInboundPattern('testPattern').subscribe(() => { + expect(service.searchBy).toHaveBeenCalledWith('byInboundPattern', findListOptions, undefined, undefined ); + done(); + }); + }); + + it('should invoke service', (done) => { + const constraints = [{ void: true }]; + const files = [new File([],'fileName')]; + spyOn(service as any, 'getInvocationFormData'); + spyOn(service, 'getBrowseEndpoint').and.returnValue(observableOf('testEndpoint')); + service.invoke('serviceName', 'serviceId', constraints, files).subscribe(result => { + expect((service as any).getInvocationFormData).toHaveBeenCalledWith(constraints, files); + expect(service.getBrowseEndpoint).toHaveBeenCalled(); + expect(result).toBeInstanceOf(RemoteData); + done(); + }); + + }); + }); + }); diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts index 59525a5cf8..a41bf0c759 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts @@ -1,35 +1,49 @@ import { Injectable } from '@angular/core'; -import { dataService } from '../../../core/data/base/data-service.decorator'; -import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; -import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; -import { FindAllData, FindAllDataImpl } from '../../../core/data/base/find-all-data'; -import { DeleteData, DeleteDataImpl } from '../../../core/data/base/delete-data'; -import { RequestService } from '../../../core/data/request.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; -import { Observable } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NoContent } from '../../../core/shared/NoContent.model'; -import { map, take } from 'rxjs/operators'; -import { URLCombiner } from '../../../core/url-combiner/url-combiner'; -import { MultipartPostRequest } from '../../../core/data/request.models'; -import { RestRequest } from '../../../core/data/rest-request.model'; - -import { LdnService } from '../ldn-services-model/ldn-services.model'; - -import { PatchData, PatchDataImpl } from '../../../core/data/base/patch-data'; -import { ChangeAnalyzer } from '../../../core/data/change-analyzer'; import { Operation } from 'fast-json-patch'; -import { RestRequestMethod } from '../../../core/data/rest-request-method'; -import { CreateData, CreateDataImpl } from '../../../core/data/base/create-data'; -import { LdnServiceConstrain } from '../ldn-services-model/ldn-service.constrain.model'; -import { SearchDataImpl } from '../../../core/data/base/search-data'; +import { Observable } from 'rxjs'; +import { + map, + take, +} from 'rxjs/operators'; + +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; import { RequestParam } from '../../../core/cache/models/request-param.model'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { + CreateData, + CreateDataImpl, +} from '../../../core/data/base/create-data'; +import { dataService } from '../../../core/data/base/data-service.decorator'; +import { + DeleteData, + DeleteDataImpl, +} from '../../../core/data/base/delete-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../../../core/data/base/find-all-data'; +import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; +import { + PatchData, + PatchDataImpl, +} from '../../../core/data/base/patch-data'; +import { SearchDataImpl } from '../../../core/data/base/search-data'; +import { ChangeAnalyzer } from '../../../core/data/change-analyzer'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { MultipartPostRequest } from '../../../core/data/request.models'; +import { RequestService } from '../../../core/data/request.service'; +import { RestRequest } from '../../../core/data/rest-request.model'; +import { RestRequestMethod } from '../../../core/data/rest-request-method'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NoContent } from '../../../core/shared/NoContent.model'; +import { URLCombiner } from '../../../core/url-combiner/url-combiner'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { LdnServiceConstrain } from '../ldn-services-model/ldn-service.constrain.model'; +import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; /** * Injectable service responsible for fetching/sending data from/to the REST API on the ldnservices endpoint. @@ -146,7 +160,7 @@ export class LdnServicesService extends IdentifiableDataService impl */ findByInboundPattern(pattern: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { const params = [new RequestParam('pattern', pattern)]; - const findListOptions = Object.assign(new FindListOptions(), options, {searchParams: params}); + const findListOptions = Object.assign(new FindListOptions(), options, { searchParams: params }); return this.searchBy(this.findByPatternEndpoint, findListOptions, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } @@ -199,7 +213,7 @@ export class LdnServicesService extends IdentifiableDataService impl map((endpoint: string) => { const body = this.getInvocationFormData(parameters, files); return new MultipartPostRequest(requestId, endpoint, body); - }) + }), ).subscribe((request: RestRequest) => this.requestService.send(request)); return this.rdbService.buildFromRequestUUID(requestId); diff --git a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts index c7653a5d96..babab8a5ab 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts @@ -1,19 +1,32 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { ChangeDetectorRef, EventEmitter, NO_ERRORS_SCHEMA } from '@angular/core'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + ChangeDetectorRef, + EventEmitter, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { of } from 'rxjs'; -import { LdnService } from '../ldn-services-model/ldn-services.model'; + import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; -import { LdnServicesOverviewComponent } from './ldn-services-directory.component'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { createPaginatedList } from '../../../shared/testing/utils.test'; +import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; +import { LdnServicesOverviewComponent } from './ldn-services-directory.component'; describe('LdnServicesOverviewComponent', () => { let component: LdnServicesOverviewComponent; @@ -26,7 +39,7 @@ describe('LdnServicesOverviewComponent', () => { get: () => of('translated-text'), onLangChange: new EventEmitter(), onTranslationChange: new EventEmitter(), - onDefaultLangChange: new EventEmitter() + onDefaultLangChange: new EventEmitter(), }; beforeEach(async () => { @@ -42,20 +55,20 @@ describe('LdnServicesOverviewComponent', () => { providers: [ { provide: LdnServicesService, - useValue: ldnServicesService + useValue: ldnServicesService, }, - {provide: PaginationService, useValue: paginationService}, + { provide: PaginationService, useValue: paginationService }, { provide: NgbModal, useValue: { open: () => { /*comment*/ - } - } + }, + }, }, - {provide: ChangeDetectorRef, useValue: {}}, - {provide: NotificationsService, useValue: new NotificationsServiceStub()}, - {provide: TranslateService, useValue: translateServiceStub}, + { provide: ChangeDetectorRef, useValue: {} }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: TranslateService, useValue: translateServiceStub }, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); }); @@ -65,8 +78,8 @@ describe('LdnServicesOverviewComponent', () => { ldnServicesService = TestBed.inject(LdnServicesService); paginationService = TestBed.inject(PaginationService); modalService = TestBed.inject(NgbModal); - component.modalRef = jasmine.createSpyObj({close: null}); - component.isProcessingSub = jasmine.createSpyObj({unsubscribe: null}); + component.modalRef = jasmine.createSpyObj({ close: null }); + component.isProcessingSub = jasmine.createSpyObj({ unsubscribe: null }); component.ldnServicesRD$ = of({} as RemoteData>); fixture.detectChanges(); }); @@ -86,9 +99,9 @@ describe('LdnServicesOverviewComponent', () => { it('should set ldnServicesRD$ with mock data', fakeAsync(() => { spyOn(component, 'setLdnServices').and.callThrough(); const testData: LdnService[] = Object.assign([new LdnService()], [ - {id: 1, name: 'Service 1', description: 'Description 1', enabled: true}, - {id: 2, name: 'Service 2', description: 'Description 2', enabled: false}, - {id: 3, name: 'Service 3', description: 'Description 3', enabled: true}]); + { id: 1, name: 'Service 1', description: 'Description 1', enabled: true }, + { id: 2, name: 'Service 2', description: 'Description 2', enabled: false }, + { id: 3, name: 'Service 3', description: 'Description 3', enabled: true }]); const mockLdnServicesRD = createPaginatedList(testData); component.ldnServicesRD$ = createSuccessfulRemoteDataObject$(mockLdnServicesRD); @@ -155,7 +168,7 @@ describe('LdnServicesOverviewComponent', () => { describe('toggleStatus', () => { it('should toggle status', (() => { - component.toggleStatus({enabled: false}, ldnServicesService); + component.toggleStatus({ enabled: false }, ldnServicesService); expect(ldnServicesService.patch).toHaveBeenCalled(); })); }); diff --git a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts index c2be83e6c7..aa85ff1cbe 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts @@ -1,19 +1,34 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; -import { Observable, Subscription } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { LdnService } from '../ldn-services-model/ldn-services.model'; -import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { map, switchMap } from 'rxjs/operators'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + TemplateRef, + ViewChild, +} from '@angular/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateService } from '@ngx-translate/core'; +import { Operation } from 'fast-json-patch'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; import { LdnServicesService } from 'src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; import { PaginationService } from 'src/app/core/pagination/pagination.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { hasValue } from '../../../shared/empty.util'; -import { Operation } from 'fast-json-patch'; + +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { hasValue } from '../../../shared/empty.util'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { TranslateService } from '@ngx-translate/core'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; /** * The `LdnServicesOverviewComponent` is a component that provides an overview of LDN (Linked Data Notifications) services. @@ -24,20 +39,20 @@ import { TranslateService } from '@ngx-translate/core'; selector: 'ds-ldn-services-directory', templateUrl: './ldn-services-directory.component.html', styleUrls: ['./ldn-services-directory.component.scss'], - changeDetection: ChangeDetectionStrategy.Default + changeDetection: ChangeDetectionStrategy.Default, }) export class LdnServicesOverviewComponent implements OnInit, OnDestroy { selectedServiceId: string | number | null = null; servicesData: any[] = []; - @ViewChild('deleteModal', {static: true}) deleteModal: TemplateRef; + @ViewChild('deleteModal', { static: true }) deleteModal: TemplateRef; ldnServicesRD$: Observable>>; config: FindListOptions = Object.assign(new FindListOptions(), { - elementsPerPage: 10 + elementsPerPage: 10, }); pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { id: 'po', - pageSize: 10 + pageSize: 10, }); isProcessingSub: Subscription; modalRef: any; @@ -63,8 +78,8 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { setLdnServices() { this.ldnServicesRD$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.config).pipe( switchMap((config) => this.ldnServicesService.findAll(config, false, false).pipe( - getFirstCompletedRemoteData() - )) + getFirstCompletedRemoteData(), + )), ); } @@ -119,7 +134,7 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { remoteData.payload.page = remoteData.payload.page.filter(service => service.id.toString() !== serviceId); } return remoteData; - }) + }), ); this.cdRef.detectChanges(); this.closeModal(); @@ -161,7 +176,7 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { this.notificationService.error(this.translateService.get('ldn-enable-service.notification.error.title'), this.translateService.get('ldn-enable-service.notification.error.content')); } - } + }, ); } } diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts index e524286737..73af060413 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts @@ -1,9 +1,14 @@ -import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; -import { LDN_SERVICE_CONSTRAINT_FILTER } from './ldn-service.resource-type'; -import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { + autoserialize, + deserialize, + inheritSerialization, +} from 'cerialize'; + import { typedObject } from '../../../core/cache/builders/build-decorators'; -import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; +import { CacheableObject } from '../../../core/cache/cacheable-object.model'; import { ResourceType } from '../../../core/shared/resource-type'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; +import { LDN_SERVICE_CONSTRAINT_FILTER } from './ldn-service.resource-type'; /** A single filter value and its properties. */ @typedObject @@ -13,13 +18,13 @@ export class Itemfilter extends CacheableObject { @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; @autoserialize - id: string; + id: string; @deserialize - _links: { + _links: { self: { href: string; }; diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts index fac5a1d704..650511005c 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts @@ -5,9 +5,9 @@ import { autoserialize } from 'cerialize'; */ export class NotifyServicePattern { @autoserialize - pattern: string; + pattern: string; @autoserialize - constraint: string; + constraint: string; @autoserialize - automatic: string; + automatic: string; } diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts index 8a20c50314..69b84427d1 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts @@ -1,9 +1,15 @@ -import { ResourceType } from '../../../core/shared/resource-type'; -import { CacheableObject } from '../../../core/cache/cacheable-object.model'; -import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize'; -import { LDN_SERVICE } from './ldn-service.resource-type'; -import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; +import { + autoserialize, + deserialize, + deserializeAs, + inheritSerialization, +} from 'cerialize'; + import { typedObject } from '../../../core/cache/builders/build-decorators'; +import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { ResourceType } from '../../../core/shared/resource-type'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; +import { LDN_SERVICE } from './ldn-service.resource-type'; import { NotifyServicePattern } from './ldn-service-patterns.model'; /** @@ -23,43 +29,43 @@ export class LdnService extends CacheableObject { @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; @autoserialize - id: number; + id: number; @deserializeAs('id') - uuid: string; + uuid: string; @autoserialize - name: string; + name: string; @autoserialize - description: string; + description: string; @autoserialize - url: string; + url: string; @autoserialize - score: number; + score: number; @autoserialize - enabled: boolean; + enabled: boolean; @autoserialize - ldnUrl: string; + ldnUrl: string; @autoserialize - lowerIp: string; + lowerIp: string; @autoserialize - upperIp: string; + upperIp: string; @autoserialize - notifyServiceInboundPatterns?: NotifyServicePattern[]; + notifyServiceInboundPatterns?: NotifyServicePattern[]; @deserialize - _links: { + _links: { self: { href: string; }; diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page-resolver.service.ts index f524cd56c2..4d988e6908 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page-resolver.service.ts +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page-resolver.service.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; /** * Interface for the route parameters. @@ -26,7 +30,7 @@ export class NotificationsSuggestionTargetsPageResolver implements Resolve { @@ -13,17 +17,17 @@ describe('NotificationsSuggestionTargetsPageComponent', () => { TestBed.configureTestingModule({ imports: [ CommonModule, - TranslateModule.forRoot() + TranslateModule.forRoot(), ], declarations: [ - NotificationsSuggestionTargetsPageComponent + NotificationsSuggestionTargetsPageComponent, ], providers: [ - NotificationsSuggestionTargetsPageComponent + NotificationsSuggestionTargetsPageComponent, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts index 2256a1bc36..c25fc43d45 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts @@ -3,7 +3,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'ds-admin-notifications-publication-claim-page', templateUrl: './admin-notifications-publication-claim-page.component.html', - styleUrls: ['./admin-notifications-publication-claim-page.component.scss'] + styleUrls: ['./admin-notifications-publication-claim-page.component.scss'], }) export class AdminNotificationsPublicationClaimPageComponent { diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts index 8056c67ead..abcc6587dd 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -4,19 +4,22 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; -import { PUBLICATION_CLAIMS_PATH, QUALITY_ASSURANCE_EDIT_PATH } from './admin-notifications-routing-paths'; -import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; -import { SiteAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { QualityAssuranceBreadcrumbResolver } from '../../core/breadcrumbs/quality-assurance-breadcrumb.resolver'; import { QualityAssuranceBreadcrumbService } from '../../core/breadcrumbs/quality-assurance-breadcrumb.service'; -import { QualityAssuranceEventsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver'; +import { SiteAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { AdminNotificationsPublicationClaimPageResolver } from '../../quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service'; -import { QualityAssuranceTopicsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component'; -import { QualityAssuranceTopicsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; +import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component'; +import { QualityAssuranceEventsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver'; +import { SourceDataResolver } from '../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver'; import { QualityAssuranceSourcePageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page.component'; import { QualityAssuranceSourcePageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service'; -import { SourceDataResolver } from '../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver'; -import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component'; +import { QualityAssuranceTopicsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component'; +import { QualityAssuranceTopicsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; +import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; +import { + PUBLICATION_CLAIMS_PATH, + QUALITY_ASSURANCE_EDIT_PATH, +} from './admin-notifications-routing-paths'; @NgModule({ imports: [ @@ -28,13 +31,13 @@ import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-not pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - suggestionTargetParams: AdminNotificationsPublicationClaimPageResolver + suggestionTargetParams: AdminNotificationsPublicationClaimPageResolver, }, data: { title: 'admin.notifications.publicationclaim.page.title', breadcrumbKey: 'admin.notifications.publicationclaim', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ AuthenticatedGuard ], @@ -43,7 +46,7 @@ import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-not pathMatch: 'full', resolve: { breadcrumb: QualityAssuranceBreadcrumbResolver, - openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver + openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { title: 'admin.quality-assurance.page.title', @@ -58,13 +61,13 @@ import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-not pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver + openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { title: 'admin.quality-assurance.page.title', breadcrumbKey: 'admin.quality-assurance', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ SiteAdministratorGuard ], @@ -74,7 +77,7 @@ import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-not resolve: { breadcrumb: I18nBreadcrumbResolver, openaireQualityAssuranceSourceParams: QualityAssuranceSourcePageResolver, - sourceData: SourceDataResolver + sourceData: SourceDataResolver, }, data: { title: 'admin.notifications.source.breadcrumbs', @@ -89,7 +92,7 @@ import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-not pathMatch: 'full', resolve: { breadcrumb: QualityAssuranceBreadcrumbResolver, - openaireQualityAssuranceEventsParams: QualityAssuranceEventsPageResolver + openaireQualityAssuranceEventsParams: QualityAssuranceEventsPageResolver, }, data: { title: 'admin.notifications.event.page.title', diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts index d7eb3df2ec..e2149cda7a 100644 --- a/src/app/admin/admin-notifications/admin-notifications.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -1,10 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; + import { CoreModule } from '../../core/core.module'; -import { SharedModule } from '../../shared/shared.module'; -import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; -import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; import { NotificationsModule } from '../../notifications/notifications.module'; +import { SharedModule } from '../../shared/shared.module'; +import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; +import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; @NgModule({ imports: [ diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts index 7635b1effb..dc9312ec28 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts @@ -1,11 +1,12 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; + import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; -import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; +import { NotifyInfoGuard } from '../../core/coar-notify/notify-info/notify-info.guard'; import { SiteAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; +import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component'; import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component'; -import { NotifyInfoGuard } from '../../core/coar-notify/notify-info/notify-info.guard'; @NgModule({ imports: [ @@ -46,8 +47,8 @@ import { NotifyInfoGuard } from '../../core/coar-notify/notify-info/notify-info. title: 'admin.notify.dashboard.page.title', breadcrumbKey: 'admin.notify.dashboard', }, - } - ]) + }, + ]), ], }) /** diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts index 74007055b4..2629313363 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts @@ -1,13 +1,16 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; -import { TranslateModule } from '@ngx-translate/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; + +import { buildPaginatedList } from '../../core/data/paginated-list.model'; import { SearchService } from '../../core/shared/search/search.service'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { buildPaginatedList } from '../../core/data/paginated-list.model'; -import { AdminNotifySearchResult } from './models/admin-notify-message-search-result.model'; +import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; import { AdminNotifyMessage } from './models/admin-notify-message.model'; +import { AdminNotifySearchResult } from './models/admin-notify-message-search-result.model'; describe('AdminNotifyDashboardComponent', () => { let component: AdminNotifyDashboardComponent; @@ -23,7 +26,7 @@ describe('AdminNotifyDashboardComponent', () => { const mockBoxes = [ { title: 'admin-notify-dashboard.received-ldn', boxes: [ undefined, undefined, undefined, undefined, undefined ] }, - { title: 'admin-notify-dashboard.generated-ldn', boxes: [ undefined, undefined, undefined, undefined, undefined ] } + { title: 'admin-notify-dashboard.generated-ldn', boxes: [ undefined, undefined, undefined, undefined, undefined ] }, ]; beforeEach(async () => { @@ -38,9 +41,9 @@ describe('AdminNotifyDashboardComponent', () => { await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot(), NgbNavModule], declarations: [ AdminNotifyDashboardComponent ], - providers: [{ provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results)}}] + providers: [{ provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results) } }], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifyDashboardComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts index bcec885345..40100d8684 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts @@ -1,16 +1,26 @@ -import { Component, OnInit } from '@angular/core'; -import { SearchService } from '../../core/shared/search/search.service'; -import { environment } from '../../../environments/environment'; -import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { forkJoin, Observable } from 'rxjs'; -import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + forkJoin, + Observable, +} from 'rxjs'; import { map } from 'rxjs/operators'; -import { SearchObjects } from '../../shared/search/models/search-objects.model'; -import { AdminNotifyMetricsBox, AdminNotifyMetricsRow } from './admin-notify-metrics/admin-notify-metrics.model'; + +import { environment } from '../../../environments/environment'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; -import { SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { SearchService } from '../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; +import { SearchObjects } from '../../shared/search/models/search-objects.model'; +import { + AdminNotifyMetricsBox, + AdminNotifyMetricsRow, +} from './admin-notify-metrics/admin-notify-metrics.model'; @Component({ selector: 'ds-admin-notify-dashboard', @@ -18,9 +28,9 @@ import { SearchConfigurationService } from '../../core/shared/search/search-conf providers: [ { provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] + useClass: SearchConfigurationService, + }, + ], }) /** @@ -33,7 +43,7 @@ export class AdminNotifyDashboardComponent implements OnInit{ private metricsConfig = environment.notifyMetrics; private singleResultOptions = Object.assign(new PaginationComponentOptions(), { id: 'single-result-options', - pageSize: 1 + pageSize: 1, }); constructor(private searchService: SearchService) { @@ -46,17 +56,17 @@ export class AdminNotifyDashboardComponent implements OnInit{ const flatConfigurations = [].concat(...mertricsRowsConfigurations.map((config) => config)); const searchConfigurations = flatConfigurations .map(config => Object.assign(new PaginatedSearchOptions({}), - { configuration: config, pagination: this.singleResultOptions } - )); + { configuration: config, pagination: this.singleResultOptions }, + )); this.notifyMetricsRows$ = forkJoin(searchConfigurations.map(config => this.searchService.search(config) - .pipe( - getFirstCompletedRemoteData(), - map(response => this.mapSearchObjectsToMetricsBox(response.payload)), - ) - ) + .pipe( + getFirstCompletedRemoteData(), + map(response => this.mapSearchObjectsToMetricsBox(response.payload)), + ), + ), ).pipe( - map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)) + map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)), ); } @@ -73,7 +83,7 @@ export class AdminNotifyDashboardComponent implements OnInit{ return { ...metricsBoxes.find(box => box.config === objectConfig), - count + count, }; } @@ -85,10 +95,10 @@ export class AdminNotifyDashboardComponent implements OnInit{ */ private mapUpdatedBoxesToMetricsRows(boxesWithCount: AdminNotifyMetricsBox[]): AdminNotifyMetricsRow[] { return this.metricsConfig.map(row => { - return { - ...row, - boxes: row.boxes.map(rowBox => boxesWithCount.find(boxWithCount => boxWithCount.config === rowBox.config)) - }; + return { + ...row, + boxes: row.boxes.map(rowBox => boxesWithCount.find(boxWithCount => boxWithCount.config === rowBox.config)), + }; }); } } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts index dc5c1a62d9..d840197ea7 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts @@ -1,21 +1,25 @@ +import { + CommonModule, + DatePipe, +} from '@angular/common'; import { NgModule } from '@angular/core'; -import { CommonModule, DatePipe } from '@angular/common'; import { RouterModule } from '@angular/router'; + +import { SearchPageModule } from '../../search-page/search-page.module'; +import { SearchModule } from '../../shared/search/search.module'; +import { SharedModule } from '../../shared/shared.module'; import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; import { AdminNotifyDashboardRoutingModule } from './admin-notify-dashboard-routing.module'; -import { AdminNotifyMetricsComponent } from './admin-notify-metrics/admin-notify-metrics.component'; -import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component'; -import { SharedModule } from '../../shared/shared.module'; -import { SearchModule } from '../../shared/search/search.module'; -import { SearchPageModule } from '../../search-page/search-page.module'; -import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component'; import { AdminNotifyDetailModalComponent } from './admin-notify-detail-modal/admin-notify-detail-modal.component'; +import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component'; +import { AdminNotifyLogsResultComponent } from './admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component'; +import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component'; +import { AdminNotifyMetricsComponent } from './admin-notify-metrics/admin-notify-metrics.component'; import { AdminNotifySearchResultComponent } from './admin-notify-search-result/admin-notify-search-result.component'; import { AdminNotifyMessagesService } from './services/admin-notify-messages.service'; -import { AdminNotifyLogsResultComponent } from './admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component'; const ENTRY_COMPONENTS = [ - AdminNotifySearchResultComponent + AdminNotifySearchResultComponent, ]; @NgModule({ imports: [ @@ -24,11 +28,11 @@ const ENTRY_COMPONENTS = [ SharedModule, AdminNotifyDashboardRoutingModule, SearchModule, - SearchPageModule + SearchPageModule, ], providers: [ AdminNotifyMessagesService, - DatePipe + DatePipe, ], declarations: [ ...ENTRY_COMPONENTS, @@ -38,14 +42,14 @@ const ENTRY_COMPONENTS = [ AdminNotifyOutgoingComponent, AdminNotifyDetailModalComponent, AdminNotifySearchResultComponent, - AdminNotifyLogsResultComponent - ] + AdminNotifyLogsResultComponent, + ], }) export class AdminNotifyDashboardModule { static withEntryComponents() { return { ngModule: AdminNotifyDashboardModule, - providers: ENTRY_COMPONENTS.map((component) => ({provide: component})) + providers: ENTRY_COMPONENTS.map((component) => ({ provide: component })), }; } } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.spec.ts index 0ddf449e5c..7fddf170ff 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.spec.ts @@ -1,9 +1,12 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyDetailModalComponent } from './admin-notify-detail-modal.component'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; +import { AdminNotifyDetailModalComponent } from './admin-notify-detail-modal.component'; + describe('AdminNotifyDetailModalComponent', () => { let component: AdminNotifyDetailModalComponent; let fixture: ComponentFixture; @@ -14,9 +17,9 @@ describe('AdminNotifyDetailModalComponent', () => { await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], declarations: [ AdminNotifyDetailModalComponent ], - providers: [{ provide: NgbActiveModal, useValue: modalStub }] + providers: [{ provide: NgbActiveModal, useValue: modalStub }], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifyDetailModalComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.ts index 54b14be64c..3962d9cb50 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.ts @@ -1,16 +1,22 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { MissingTranslationHelper } from '../../../shared/translate/missing-translation.helper'; + import { fadeIn } from '../../../shared/animations/fade'; +import { MissingTranslationHelper } from '../../../shared/translate/missing-translation.helper'; +import { AdminNotifyMessage } from '../models/admin-notify-message.model'; @Component({ selector: 'ds-admin-notify-detail-modal', templateUrl: './admin-notify-detail-modal.component.html', animations: [ - fadeIn - ] + fadeIn, + ], }) /** * Component for detailed view of LDN messages displayed in search result in AdminNotifyDashboardComponent @@ -24,7 +30,7 @@ export class AdminNotifyDetailModalComponent { * An event fired when the modal is closed */ @Output() - response = new EventEmitter(); + response = new EventEmitter(); public isCoarMessageVisible = false; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.spec.ts index f7388c5210..70771bac54 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.spec.ts @@ -1,18 +1,21 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyIncomingComponent } from './admin-notify-incoming.component'; -import { TranslateModule } from '@ngx-translate/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; -import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; import { provideMockStore } from '@ngrx/store/testing'; -import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; -import { RouteService } from '../../../../core/services/route.service'; -import { routeServiceStub } from '../../../../shared/testing/route-service.stub'; -import { RequestService } from '../../../../core/data/request.service'; +import { TranslateModule } from '@ngx-translate/core'; + import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; -import { getMockRemoteDataBuildService } from '../../../../shared/mocks/remote-data-build.service.mock'; +import { RequestService } from '../../../../core/data/request.service'; +import { RouteService } from '../../../../core/services/route.service'; +import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; +import { getMockRemoteDataBuildService } from '../../../../shared/mocks/remote-data-build.service.mock'; +import { routeServiceStub } from '../../../../shared/testing/route-service.stub'; +import { AdminNotifyIncomingComponent } from './admin-notify-incoming.component'; describe('AdminNotifyIncomingComponent', () => { let component: AdminNotifyIncomingComponent; @@ -26,7 +29,7 @@ describe('AdminNotifyIncomingComponent', () => { beforeEach(async () => { rdbService = getMockRemoteDataBuildService(); halService = jasmine.createSpyObj('halService', { - 'getRootHref': '/api' + 'getRootHref': '/api', }); requestService = jasmine.createSpyObj('requestService', { 'generateRequestId': 'client/1234', @@ -43,9 +46,9 @@ describe('AdminNotifyIncomingComponent', () => { { provide: RequestService, useValue: requestService }, { provide: RemoteDataBuildService, useValue: rdbService }, provideMockStore({}), - ] + ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifyIncomingComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts index 6c758b8d59..fc0f410ad5 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts @@ -1,6 +1,10 @@ -import { Component, Inject } from '@angular/core'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { + Component, + Inject, +} from '@angular/core'; + import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; @Component({ selector: 'ds-admin-notify-incoming', @@ -8,9 +12,9 @@ import { SearchConfigurationService } from '../../../../core/shared/search/searc providers: [ { provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] + useClass: SearchConfigurationService, + }, + ], }) export class AdminNotifyIncomingComponent { constructor(@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.spec.ts index e59a52198d..16adbd17f3 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.spec.ts @@ -1,17 +1,23 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyLogsResultComponent } from './admin-notify-logs-result.component'; -import { ActivatedRoute, Router } from '@angular/router'; -import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { provideMockStore } from '@ngrx/store/testing'; -import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; +import { TranslateModule } from '@ngx-translate/core'; + +import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; import { RequestService } from '../../../../core/data/request.service'; -import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; -import { TranslateModule } from '@ngx-translate/core'; -import { RouterStub } from '../../../../shared/testing/router.stub'; import { RouteService } from '../../../../core/services/route.service'; +import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; +import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; import { routeServiceStub } from '../../../../shared/testing/route-service.stub'; +import { RouterStub } from '../../../../shared/testing/router.stub'; +import { AdminNotifyLogsResultComponent } from './admin-notify-logs-result.component'; describe('AdminNotifyLogsResultComponent', () => { let component: AdminNotifyLogsResultComponent; @@ -34,9 +40,9 @@ describe('AdminNotifyLogsResultComponent', () => { { provide: RequestService, useValue: requestService }, { provide: RemoteDataBuildService, useValue: rdbService }, provideMockStore({}), - ] + ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifyLogsResultComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.ts index a9c03cd2bd..626cd2da1f 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-logs-result/admin-notify-logs-result.component.ts @@ -1,11 +1,22 @@ -import { ChangeDetectorRef, Component, Inject, Input, OnInit } from '@angular/core'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { + ChangeDetectorRef, + Component, + Inject, + Input, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + ActivatedRouteSnapshot, + Router, +} from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { Context } from '../../../../core/shared/context.model'; import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; -import { Observable } from 'rxjs'; -import { ActivatedRoute, ActivatedRouteSnapshot, Router } from '@angular/router'; import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { map } from 'rxjs/operators'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; @Component({ selector: 'ds-admin-notify-logs-result', @@ -13,9 +24,9 @@ import { map } from 'rxjs/operators'; providers: [ { provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] + useClass: SearchConfigurationService, + }, + ], }) /** @@ -25,7 +36,7 @@ import { map } from 'rxjs/operators'; export class AdminNotifyLogsResultComponent implements OnInit { @Input() - defaultConfiguration: string; + defaultConfiguration: string; public selectedSearchConfig$: Observable; @@ -42,7 +53,7 @@ export class AdminNotifyLogsResultComponent implements OnInit { ngOnInit() { this.selectedSearchConfig$ = this.searchConfigService.getCurrentConfiguration(this.defaultConfiguration); this.isInbound$ = this.selectedSearchConfig$.pipe( - map(config => config.startsWith('NOTIFY.incoming')) + map(config => config.startsWith('NOTIFY.incoming')), ); } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.spec.ts index a8af9a7fd6..73773736ff 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.spec.ts @@ -1,18 +1,21 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyOutgoingComponent } from './admin-notify-outgoing.component'; -import { TranslateModule } from '@ngx-translate/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; -import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; import { provideMockStore } from '@ngrx/store/testing'; -import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; -import { RouteService } from '../../../../core/services/route.service'; -import { routeServiceStub } from '../../../../shared/testing/route-service.stub'; -import { RequestService } from '../../../../core/data/request.service'; -import { getMockRemoteDataBuildService } from '../../../../shared/mocks/remote-data-build.service.mock'; +import { TranslateModule } from '@ngx-translate/core'; + import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; +import { RequestService } from '../../../../core/data/request.service'; +import { RouteService } from '../../../../core/services/route.service'; +import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { MockActivatedRoute } from '../../../../shared/mocks/active-router.mock'; +import { getMockRemoteDataBuildService } from '../../../../shared/mocks/remote-data-build.service.mock'; +import { routeServiceStub } from '../../../../shared/testing/route-service.stub'; +import { AdminNotifyOutgoingComponent } from './admin-notify-outgoing.component'; describe('AdminNotifyOutgoingComponent', () => { let component: AdminNotifyOutgoingComponent; @@ -29,7 +32,7 @@ describe('AdminNotifyOutgoingComponent', () => { 'send': '', }); halService = jasmine.createSpyObj('halService', { - 'getRootHref': '/api' + 'getRootHref': '/api', }); await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], @@ -42,9 +45,9 @@ describe('AdminNotifyOutgoingComponent', () => { { provide: RequestService, useValue: requestService }, { provide: RemoteDataBuildService, useValue: rdbService }, provideMockStore({}), - ] + ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifyOutgoingComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts index a99470a6ba..26d6d345be 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts @@ -1,6 +1,10 @@ -import { Component, Inject } from '@angular/core'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { + Component, + Inject, +} from '@angular/core'; + import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; @Component({ selector: 'ds-admin-notify-outgoing', @@ -8,9 +12,9 @@ import { SearchConfigurationService } from '../../../../core/shared/search/searc providers: [ { provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] + useClass: SearchConfigurationService, + }, + ], }) export class AdminNotifyOutgoingComponent { constructor(@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.spec.ts index 57f21a4ef3..3411a6134f 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.spec.ts @@ -1,10 +1,13 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminNotifyMetricsComponent } from './admin-notify-metrics.component'; -import { TranslateModule } from '@ngx-translate/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + import { ViewMode } from '../../../core/shared/view-mode.model'; import { RouterStub } from '../../../shared/testing/router.stub'; +import { AdminNotifyMetricsComponent } from './admin-notify-metrics.component'; describe('AdminNotifyMetricsComponent', () => { let component: AdminNotifyMetricsComponent; @@ -13,16 +16,16 @@ describe('AdminNotifyMetricsComponent', () => { beforeEach(async () => { router = Object.assign(new RouterStub(), - {url : '/notify-dashboard'} + { url : '/notify-dashboard' }, ); await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], declarations: [ AdminNotifyMetricsComponent ], - providers: [{provide: Router, useValue: router}] + providers: [{ provide: Router, useValue: router }], }) - .compileComponents(); + .compileComponents(); @@ -42,21 +45,21 @@ describe('AdminNotifyMetricsComponent', () => { const routeExtras = { queryParams: { configuration: searchConfig, - view: ViewMode.ListElement + view: ViewMode.ListElement, }, }; const routeExtrasTable = { queryParams: { configuration: incomingConfig, - view: ViewMode.Table + view: ViewMode.Table, }, }; const routeExtrasTableOutgoing = { queryParams: { configuration: outgoingConfig, - view: ViewMode.Table + view: ViewMode.Table, }, }; component.navigateToSelectedSearchConfig(searchConfig); diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.ts index 8822e2bd1e..6d08f21415 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.component.ts @@ -1,7 +1,11 @@ -import { Component, Input } from '@angular/core'; -import { AdminNotifyMetricsRow } from './admin-notify-metrics.model'; +import { + Component, + Input, +} from '@angular/core'; import { Router } from '@angular/router'; + import { ViewMode } from '../../../core/shared/view-mode.model'; +import { AdminNotifyMetricsRow } from './admin-notify-metrics.model'; @Component({ selector: 'ds-admin-notify-metrics', @@ -14,7 +18,7 @@ import { ViewMode } from '../../../core/shared/view-mode.model'; export class AdminNotifyMetricsComponent { @Input() - boxesConfig: AdminNotifyMetricsRow[]; + boxesConfig: AdminNotifyMetricsRow[]; private incomingConfiguration = 'NOTIFY.incoming'; private involvedItemsSuffix = 'involvedItems'; @@ -33,7 +37,7 @@ export class AdminNotifyMetricsComponent { this.router.navigate([this.adminSearchPath], { queryParams: { configuration: searchConfig, - view: ViewMode.ListElement + view: ViewMode.ListElement, }, }); @@ -46,7 +50,7 @@ export class AdminNotifyMetricsComponent { this.router.navigate([`${this.router.url}${selectedPath}`], { queryParams: { configuration: searchConfig, - view: ViewMode.Table + view: ViewMode.Table, }, }); } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts index b42c1ae467..1a6411cb60 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts @@ -1,25 +1,32 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotifySearchResultComponent } from './admin-notify-search-result.component'; -import { AdminNotifyMessagesService } from '../services/admin-notify-messages.service'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { RequestService } from '../../../core/data/request.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { cold } from 'jasmine-marbles'; -import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; -import { RouteService } from '../../../core/services/route.service'; -import { routeServiceStub } from '../../../shared/testing/route-service.stub'; -import { ActivatedRoute } from '@angular/router'; -import { RouterStub } from '../../../shared/testing/router.stub'; -import { TranslateModule } from '@ngx-translate/core'; -import { of as observableOf, of } from 'rxjs'; -import { AdminNotifyMessage } from '../models/admin-notify-message.model'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { AdminNotifyDetailModalComponent } from '../admin-notify-detail-modal/admin-notify-detail-modal.component'; -import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; -import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { DatePipe } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { cold } from 'jasmine-marbles'; +import { + of as observableOf, + of, +} from 'rxjs'; + +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { RequestService } from '../../../core/data/request.service'; +import { RouteService } from '../../../core/services/route.service'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; +import { routeServiceStub } from '../../../shared/testing/route-service.stub'; +import { RouterStub } from '../../../shared/testing/router.stub'; +import { AdminNotifyDetailModalComponent } from '../admin-notify-detail-modal/admin-notify-detail-modal.component'; +import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { AdminNotifyMessagesService } from '../services/admin-notify-messages.service'; +import { AdminNotifySearchResultComponent } from './admin-notify-search-result.component'; export const mockAdminNotifyMessages = [ { @@ -39,15 +46,15 @@ export const mockAdminNotifyMessages = [ 'queueStatus': 3, '_links': { 'self': { - 'href': 'http://localhost:8080/server/api/ldn/messages/urn:uuid:5fb3af44-d4f8-4226-9475-2d09c2d8d9e0' - } + 'href': 'http://localhost:8080/server/api/ldn/messages/urn:uuid:5fb3af44-d4f8-4226-9475-2d09c2d8d9e0', + }, }, 'thumbnail': 'test', 'item': {}, 'accessStatus': {}, 'ldnService': 'NOTIFY inbox - Automatic service', 'relatedItem': 'test coar 2 demo', - 'message': '{"@context":["https://www.w3.org/ns/activitystreams","https://purl.org/coar/notify"],"id":"urn:uuid:668f26e0-2e8d-4118-b0d2-ee713523bc45","type":["Reject","coar-notify:IngestAction"],"actor":{"id":"https://generic-service.com","type":["Service"],"name":"Generic Service"},"context":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Document"],"ietf:cite-as":"https://doi.org/10.4598/12123488"},"object":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Offer"]},"origin":{"id":"https://generic-service.com/system","type":["Service"],"inbox":"https://notify-inbox.info/inbox7"},"target":{"id":"https://some-organisation.org","type":["Organization"],"inbox":"https://dspace-coar.4science.cloud/server/ldn/inbox"},"inReplyTo":"urn:uuid:d9b4010a-f128-4815-abb2-83707a2ee9cf"}' + 'message': '{"@context":["https://www.w3.org/ns/activitystreams","https://purl.org/coar/notify"],"id":"urn:uuid:668f26e0-2e8d-4118-b0d2-ee713523bc45","type":["Reject","coar-notify:IngestAction"],"actor":{"id":"https://generic-service.com","type":["Service"],"name":"Generic Service"},"context":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Document"],"ietf:cite-as":"https://doi.org/10.4598/12123488"},"object":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Offer"]},"origin":{"id":"https://generic-service.com/system","type":["Service"],"inbox":"https://notify-inbox.info/inbox7"},"target":{"id":"https://some-organisation.org","type":["Organization"],"inbox":"https://dspace-coar.4science.cloud/server/ldn/inbox"},"inReplyTo":"urn:uuid:d9b4010a-f128-4815-abb2-83707a2ee9cf"}', }, { 'type': 'message', @@ -66,16 +73,16 @@ export const mockAdminNotifyMessages = [ 'queueStatus': 6, '_links': { 'self': { - 'href': 'http://localhost:8080/server/api/ldn/messages/urn:uuid:544c8777-e826-4810-a625-3e394cc3660d' - } + 'href': 'http://localhost:8080/server/api/ldn/messages/urn:uuid:544c8777-e826-4810-a625-3e394cc3660d', + }, }, 'thumbnail': {}, 'item': {}, 'accessStatus': {}, 'ldnService': 'NOTIFY inbox - Automatic service', 'relatedItem': 'test coar demo', - 'message': '{"@context":["https://www.w3.org/ns/activitystreams","https://purl.org/coar/notify"],"id":"urn:uuid:668f26e0-2e8d-4118-b0d2-ee713523bc45","type":["Reject","coar-notify:IngestAction"],"actor":{"id":"https://generic-service.com","type":["Service"],"name":"Generic Service"},"context":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Document"],"ietf:cite-as":"https://doi.org/10.4598/12123488"},"object":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Offer"]},"origin":{"id":"https://generic-service.com/system","type":["Service"],"inbox":"https://notify-inbox.info/inbox7"},"target":{"id":"https://some-organisation.org","type":["Organization"],"inbox":"https://dspace-coar.4science.cloud/server/ldn/inbox"},"inReplyTo":"urn:uuid:d9b4010a-f128-4815-abb2-83707a2ee9cf"}' - } + 'message': '{"@context":["https://www.w3.org/ns/activitystreams","https://purl.org/coar/notify"],"id":"urn:uuid:668f26e0-2e8d-4118-b0d2-ee713523bc45","type":["Reject","coar-notify:IngestAction"],"actor":{"id":"https://generic-service.com","type":["Service"],"name":"Generic Service"},"context":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Document"],"ietf:cite-as":"https://doi.org/10.4598/12123488"},"object":{"id":"https://dspace-coar.4science.cloud/handle/123456789/28","type":["Offer"]},"origin":{"id":"https://generic-service.com/system","type":["Service"],"inbox":"https://notify-inbox.info/inbox7"},"target":{"id":"https://some-organisation.org","type":["Organization"],"inbox":"https://dspace-coar.4science.cloud/server/ldn/inbox"},"inReplyTo":"urn:uuid:d9b4010a-f128-4815-abb2-83707a2ee9cf"}', + }, ] as unknown as AdminNotifyMessage[]; describe('AdminNotifySearchResultComponent', () => { let component: AdminNotifySearchResultComponent; @@ -91,12 +98,12 @@ describe('AdminNotifySearchResultComponent', () => { const testObject = { uuid: 'test-property', name: 'test-property', - values: ['value-1', 'value-2'] + values: ['value-1', 'value-2'], } as ConfigurationProperty; beforeEach(async () => { halService = jasmine.createSpyObj('halService', { - getEndpoint: cold('a', { a: '' }) + getEndpoint: cold('a', { a: '' }), }); adminNotifyMessageService = jasmine.createSpyObj('adminNotifyMessageService', { getDetailedMessages: of(mockAdminNotifyMessages), @@ -104,18 +111,18 @@ describe('AdminNotifySearchResultComponent', () => { }); requestService = jasmine.createSpyObj('requestService', { generateRequestId: requestUUID, - send: true + send: true, }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: cold('a', { a: { - payload: testObject - } - }) + payload: testObject, + }, + }), }); searchConfigService = jasmine.createSpyObj('searchConfigService', { - getCurrentConfiguration: of('NOTIFY.outgoing') + getCurrentConfiguration: of('NOTIFY.outgoing'), }); objectCache = {} as ObjectCacheService; @@ -132,11 +139,11 @@ describe('AdminNotifySearchResultComponent', () => { { provide: RequestService, useValue: requestService }, { provide: RemoteDataBuildService, useValue: rdbService }, { provide: SEARCH_CONFIG_SERVICE, useValue: searchConfigService }, - DatePipe + DatePipe, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(AdminNotifySearchResultComponent); component = fixture.componentInstance; diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts index dc85261b0c..a9a329d0b5 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts @@ -1,18 +1,27 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AdminNotifySearchResult } from '../models/admin-notify-message-search-result.model'; -import { ViewMode } from '../../../core/shared/view-mode.model'; +import { DatePipe } from '@angular/common'; +import { + Component, + Inject, + OnDestroy, + OnInit, +} from '@angular/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { + BehaviorSubject, + Subscription, +} from 'rxjs'; + +import { PaginatedList } from '../../../core/data/paginated-list.model'; import { Context } from '../../../core/shared/context.model'; -import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { ViewMode } from '../../../core/shared/view-mode.model'; +import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { tabulatableObjectsComponent } from '../../../shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator'; import { TabulatableResultListElementsComponent } from '../../../shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { AdminNotifyDetailModalComponent } from '../admin-notify-detail-modal/admin-notify-detail-modal.component'; -import { BehaviorSubject, Subscription } from 'rxjs'; +import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { AdminNotifySearchResult } from '../models/admin-notify-message-search-result.model'; import { AdminNotifyMessagesService } from '../services/admin-notify-messages.service'; -import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; -import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; -import { DatePipe } from '@angular/common'; @tabulatableObjectsComponent(PaginatedList, ViewMode.Table, Context.CoarNotify) @Component({ @@ -21,9 +30,9 @@ import { DatePipe } from '@angular/common'; providers: [ { provide: SEARCH_CONFIG_SERVICE, - useClass: SearchConfigurationService - } - ] + useClass: SearchConfigurationService, + }, + ], }) /** * Component for visualization in table format of the search results related to the AdminNotifyDashboardComponent @@ -43,7 +52,7 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme 'QUEUE_STATUS_UNTRUSTED', 'QUEUE_STATUS_UNTRUSTED_IP', 'QUEUE_STATUS_FAILED', - 'QUEUE_STATUS_UNMAPPED_ACTION' + 'QUEUE_STATUS_UNMAPPED_ACTION', ]; @@ -73,7 +82,7 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme 'queueAttempts', 'queueLastStartTime', 'queueStatusLabel', - 'queueTimeout' + 'queueTimeout', ]; /** @@ -82,12 +91,12 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme */ private dateFormat = 'YYYY/MM/d hh:mm:ss'; - constructor(private modalService: NgbModal, + constructor(private modalService: NgbModal, private adminNotifyMessagesService: AdminNotifyMessagesService, private datePipe: DatePipe, @Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { - super(); - } + super(); + } /** * Map messages on init for readable representation @@ -97,7 +106,7 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme this.subs.push(this.searchConfigService.getCurrentConfiguration('') .subscribe(configuration => { this.isInbound = configuration.startsWith('NOTIFY.incoming'); - }) + }), ); } @@ -111,7 +120,7 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme */ openDetailModal(notifyMessage: AdminNotifyMessage) { const modalRef = this.modalService.open(AdminNotifyDetailModalComponent); - const messageToOpen = {...notifyMessage}; + const messageToOpen = { ...notifyMessage }; this.messageKeys.forEach(key => { if (this.dateTypeKeys.includes(key)) { @@ -134,8 +143,8 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme this.adminNotifyMessagesService.reprocessMessage(message, this.messagesSubject$) .subscribe(response => { this.messagesSubject$.next(response); - } - ) + }, + ), ); } @@ -148,6 +157,6 @@ export class AdminNotifySearchResultComponent extends TabulatableResultListEleme this.subs.push(this.adminNotifyMessagesService.getDetailedMessages(this.objects?.page.map(pageResult => pageResult.indexableObject)) .subscribe(response => { this.messagesSubject$.next(response); - })); + })); } } diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts index fe811ceeef..5115118993 100644 --- a/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts +++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts @@ -1,6 +1,6 @@ -import { AdminNotifyMessage } from './admin-notify-message.model'; -import { searchResultFor } from '../../../shared/search/search-result-element-decorator'; import { SearchResult } from '../../../shared/search/models/search-result.model'; +import { searchResultFor } from '../../../shared/search/search-result-element-decorator'; +import { AdminNotifyMessage } from './admin-notify-message.model'; @searchResultFor(AdminNotifyMessage) export class AdminNotifySearchResult extends SearchResult { diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts index 5124686b42..f32451eaff 100644 --- a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts +++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts @@ -1,11 +1,16 @@ -import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; +import { + autoserialize, + deserialize, + inheritSerialization, +} from 'cerialize'; +import { Observable } from 'rxjs'; + import { typedObject } from '../../../core/cache/builders/build-decorators'; -import { ADMIN_NOTIFY_MESSAGE } from './admin-notify-message.resource-type'; -import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { GenericConstructor } from '../../../core/shared/generic-constructor'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; -import { Observable } from 'rxjs'; +import { ADMIN_NOTIFY_MESSAGE } from './admin-notify-message.resource-type'; /** * A message that includes admin notify info @@ -19,138 +24,138 @@ export class AdminNotifyMessage extends DSpaceObject { * The type of the resource */ @excludeFromEquals - type = ADMIN_NOTIFY_MESSAGE; + type = ADMIN_NOTIFY_MESSAGE; /** * The id of the message */ @autoserialize - id: string; + id: string; /** * The id of the notification */ @autoserialize - notificationId: string; + notificationId: string; /** * The type of the notification */ @autoserialize - notificationType: string; + notificationType: string; /** * The type of the notification */ @autoserialize - coarNotifyType: string; + coarNotifyType: string; /** * The type of the activity */ @autoserialize - activityStreamType: string; + activityStreamType: string; /** * The object the message reply to */ @autoserialize - inReplyTo: string; + inReplyTo: string; /** * The object the message relates to */ @autoserialize - object: string; + object: string; /** * The name of the related item */ @autoserialize - relatedItem: string; + relatedItem: string; /** * The name of the related ldn service */ @autoserialize - ldnService: string; + ldnService: string; /** * The context of the message */ @autoserialize - context: string; + context: string; /** * The related COAR message */ @autoserialize - message: string; + message: string; /** * The attempts of the queue */ @autoserialize - queueAttempts: number; + queueAttempts: number; /** * Timestamp of the last queue attempt */ @autoserialize - queueLastStartTime: string; + queueLastStartTime: string; /** * The type of the activity stream */ @autoserialize - origin: number | string; + origin: number | string; /** * The type of the activity stream */ @autoserialize - target: number | string; + target: number | string; /** * The label for the status of the queue */ @autoserialize - queueStatusLabel: string; + queueStatusLabel: string; /** * The timeout of the queue */ @autoserialize - queueTimeout: string; + queueTimeout: string; /** * The status of the queue */ @autoserialize - queueStatus: number; + queueStatus: number; /** * Thumbnail link used when browsing items with showThumbs config enabled. */ @autoserialize - thumbnail: string; + thumbnail: string; /** * The observable pointing to the item itself */ @autoserialize - item: Observable; + item: Observable; /** * The observable pointing to the access status of the item */ @autoserialize - accessStatus: Observable; + accessStatus: Observable; @deserialize - _links: { + _links: { self: { href: string; }; diff --git a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.spec.ts b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.spec.ts index bf521116fa..6178b20133 100644 --- a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.spec.ts +++ b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.spec.ts @@ -1,22 +1,26 @@ +import { deepClone } from 'fast-json-patch'; import { cold } from 'jasmine-marbles'; -import { AdminNotifyMessagesService } from './admin-notify-messages.service'; -import { RequestService } from '../../../core/data/request.service'; +import { + BehaviorSubject, + of, +} from 'rxjs'; +import { take } from 'rxjs/operators'; + import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { RestResponse } from '../../../core/cache/response.models'; +import { ItemDataService } from '../../../core/data/item-data.service'; +import { RemoteData } from '../../../core/data/remote-data'; +import { RequestService } from '../../../core/data/request.service'; +import { RequestEntry } from '../../../core/data/request-entry.model'; +import { RequestEntryState } from '../../../core/data/request-entry-state.model'; import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { LdnServicesService } from '../../admin-ldn-services/ldn-services-data/ldn-services-data.service'; -import { ItemDataService } from '../../../core/data/item-data.service'; -import { RequestEntry } from '../../../core/data/request-entry.model'; -import { RestResponse } from '../../../core/cache/response.models'; -import { BehaviorSubject, of } from 'rxjs'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { RemoteData } from '../../../core/data/remote-data'; -import { RequestEntryState } from '../../../core/data/request-entry-state.model'; +import { LdnServicesService } from '../../admin-ldn-services/ldn-services-data/ldn-services-data.service'; import { mockAdminNotifyMessages } from '../admin-notify-search-result/admin-notify-search-result.component.spec'; -import { take } from 'rxjs/operators'; -import { deepClone } from 'fast-json-patch'; import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { AdminNotifyMessagesService } from './admin-notify-messages.service'; describe('AdminNotifyMessagesService test', () => { let service: AdminNotifyMessagesService; @@ -46,7 +50,7 @@ describe('AdminNotifyMessagesService test', () => { halService, notificationsService, ldnServicesService, - itemDataService + itemDataService, ); } @@ -68,21 +72,21 @@ describe('AdminNotifyMessagesService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: of(endpointURL) + getEndpoint: of(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), buildList: cold('a', { a: remoteDataMocks.Success }), - buildFromRequestUUID: createSuccessfulRemoteDataObject$(mockMessages) + buildFromRequestUUID: createSuccessfulRemoteDataObject$(mockMessages), }); ldnServicesService = jasmine.createSpyObj('ldnServicesService', { - findById: createSuccessfulRemoteDataObject$({name: testLdnServiceName}), + findById: createSuccessfulRemoteDataObject$({ name: testLdnServiceName }), }); itemDataService = jasmine.createSpyObj('itemDataService', { - findById: createSuccessfulRemoteDataObject$({name: testRelatedItemName}), + findById: createSuccessfulRemoteDataObject$({ name: testRelatedItemName }), }); service = initTestService(); diff --git a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts index 0083761de5..04f26c29af 100644 --- a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts +++ b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts @@ -1,20 +1,35 @@ import { Injectable } from '@angular/core'; -import { dataService } from '../../../core/data/base/data-service.decorator'; -import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; -import { RequestService } from '../../../core/data/request.service'; +import { + BehaviorSubject, + from, + Observable, + of, + scan, +} from 'rxjs'; +import { + map, + mergeMap, + switchMap, + tap, +} from 'rxjs/operators'; + import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { BehaviorSubject, from, Observable, of, scan } from 'rxjs'; -import { ADMIN_NOTIFY_MESSAGE } from '../models/admin-notify-message.resource-type'; -import { AdminNotifyMessage } from '../models/admin-notify-message.model'; -import { map, mergeMap, switchMap, tap } from 'rxjs/operators'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { LdnServicesService } from '../../admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { dataService } from '../../../core/data/base/data-service.decorator'; +import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; import { ItemDataService } from '../../../core/data/item-data.service'; import { PostRequest } from '../../../core/data/request.models'; +import { RequestService } from '../../../core/data/request.service'; import { RestRequest } from '../../../core/data/rest-request.model'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, +} from '../../../core/shared/operators'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { LdnServicesService } from '../../admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { AdminNotifyMessage } from '../models/admin-notify-message.model'; +import { ADMIN_NOTIFY_MESSAGE } from '../models/admin-notify-message.resource-type'; /** * Injectable service responsible for fetching/sending data from/to the REST API on the messages endpoint. @@ -51,13 +66,13 @@ export class AdminNotifyMessagesService extends IdentifiableDataService message.target || message.origin ? this.ldnServicesService.findById((message.target || message.origin).toString()).pipe( getAllSucceededRemoteDataPayload(), - map(detail => ({...message, ldnService: detail.name})) + map(detail => ({ ...message, ldnService: detail.name })), ) : of(message), ), mergeMap(message => message.object || message.context ? this.itemDataService.findById(message.object || message.context).pipe( getAllSucceededRemoteDataPayload(), - map(detail => ({...message, relatedItem: detail.name})) + map(detail => ({ ...message, relatedItem: detail.name })), ) : of(message), ), scan((acc: any, value: any) => [...acc, value], []), @@ -93,7 +108,7 @@ export class AdminNotifyMessagesService extends IdentifiableDataService { let component: FilteredCollectionsComponent; @@ -19,11 +30,11 @@ describe('FiltersComponent', () => { payload: { collections: [], summary: { - label: 'Test' - } + label: 'Test', + }, }, statusCode: 200, - statusText: 'OK' + statusText: 'OK', } as RawRestResponse; beforeEach(waitForAsync(() => { @@ -34,16 +45,16 @@ describe('FiltersComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: TranslateLoaderMock - } + useClass: TranslateLoaderMock, + }, }), - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ FormBuilder, - DspaceRestService + DspaceRestService, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }); })); diff --git a/src/app/admin/admin-reports/filtered-collections/filtered-collections.component.ts b/src/app/admin/admin-reports/filtered-collections/filtered-collections.component.ts index 23fde05278..84e334e971 100644 --- a/src/app/admin/admin-reports/filtered-collections/filtered-collections.component.ts +++ b/src/app/admin/admin-reports/filtered-collections/filtered-collections.component.ts @@ -1,11 +1,18 @@ -import { Component, ViewChild } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; +import { + Component, + ViewChild, +} from '@angular/core'; +import { + FormBuilder, + FormGroup, +} from '@angular/forms'; import { NgbAccordion } from '@ng-bootstrap/ng-bootstrap'; import { Observable } from 'rxjs'; import { RestRequestMethod } from 'src/app/core/data/rest-request-method'; import { DspaceRestService } from 'src/app/core/dspace-rest/dspace-rest.service'; import { RawRestResponse } from 'src/app/core/dspace-rest/raw-rest-response.model'; import { environment } from 'src/environments/environment'; + import { FiltersComponent } from '../filters-section/filters-section.component'; import { FilteredCollections } from './filtered-collections.model'; @@ -15,7 +22,7 @@ import { FilteredCollections } from './filtered-collections.model'; @Component({ selector: 'ds-report-filtered-collections', templateUrl: './filtered-collections.component.html', - styleUrls: ['./filtered-collections.component.scss'] + styleUrls: ['./filtered-collections.component.scss'], }) export class FilteredCollectionsComponent { @@ -29,7 +36,7 @@ export class FilteredCollectionsComponent { ngOnInit() { this.queryForm = this.formBuilder.group({ - filters: FiltersComponent.formGroup(this.formBuilder) + filters: FiltersComponent.formGroup(this.formBuilder), }); } @@ -48,22 +55,22 @@ export class FilteredCollectionsComponent { response => { this.results.deserialize(response.payload); this.accordionComponent.expand('collections'); - } + }, ); } getFilteredCollections(): Observable { let params = this.toQueryString(); if (params.length > 0) { - params = `?${params}`; + params = `?${params}`; } - let scheme = environment.rest.ssl ? 'https' : 'http'; - let urlRestApp = `${scheme}://${environment.rest.host}:${environment.rest.port}${environment.rest.nameSpace}`; + const scheme = environment.rest.ssl ? 'https' : 'http'; + const urlRestApp = `${scheme}://${environment.rest.host}:${environment.rest.port}${environment.rest.nameSpace}`; return this.restService.request(RestRequestMethod.GET, `${urlRestApp}/api/contentreport/filteredcollections${params}`); } private toQueryString(): string { - let params = FiltersComponent.toQueryString(this.queryForm.value.filters); + const params = FiltersComponent.toQueryString(this.queryForm.value.filters); return params; } diff --git a/src/app/admin/admin-reports/filtered-collections/filtered-collections.model.ts b/src/app/admin/admin-reports/filtered-collections/filtered-collections.model.ts index 6ea5a2fc80..248924c761 100644 --- a/src/app/admin/admin-reports/filtered-collections/filtered-collections.model.ts +++ b/src/app/admin/admin-reports/filtered-collections/filtered-collections.model.ts @@ -12,12 +12,12 @@ export class FilteredCollections { public deserialize(object: any) { this.clear(); - let summary = object.summary; + const summary = object.summary; this.summary.deserialize(summary); - let collections = object.collections; + const collections = object.collections; for (let i = 0; i < collections.length; i++) { - let collection = collections[i]; - let coll = new FilteredCollection(); + const collection = collections[i]; + const coll = new FilteredCollection(); coll.deserialize(collection); this.collections.push(coll); } diff --git a/src/app/admin/admin-reports/filtered-items/filtered-items-model.ts b/src/app/admin/admin-reports/filtered-items/filtered-items-model.ts index 2c384fe39c..b5bc55f6ff 100644 --- a/src/app/admin/admin-reports/filtered-items/filtered-items-model.ts +++ b/src/app/admin/admin-reports/filtered-items/filtered-items-model.ts @@ -12,9 +12,9 @@ export class FilteredItems { public deserialize(object: any, offset: number = 0) { this.clear(); this.itemCount = object.itemCount; - let items = object.items; + const items = object.items; for (let i = 0; i < items.length; i++) { - let item = items[i]; + const item = items[i]; item.index = this.items.length + offset + 1; this.items.push(item); } diff --git a/src/app/admin/admin-reports/filtered-items/filtered-items.component.ts b/src/app/admin/admin-reports/filtered-items/filtered-items.component.ts index 7fbf90565d..c63880ae48 100644 --- a/src/app/admin/admin-reports/filtered-items/filtered-items.component.ts +++ b/src/app/admin/admin-reports/filtered-items/filtered-items.component.ts @@ -1,8 +1,19 @@ -import { Component, ViewChild } from '@angular/core'; -import { FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { + Component, + ViewChild, +} from '@angular/core'; +import { + FormArray, + FormBuilder, + FormControl, + FormGroup, +} from '@angular/forms'; import { NgbAccordion } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { map, Observable } from 'rxjs'; +import { + map, + Observable, +} from 'rxjs'; import { CollectionDataService } from 'src/app/core/data/collection-data.service'; import { CommunityDataService } from 'src/app/core/data/community-data.service'; import { MetadataFieldDataService } from 'src/app/core/data/metadata-field-data.service'; @@ -18,6 +29,7 @@ import { Item } from 'src/app/core/shared/item.model'; import { getFirstSucceededRemoteListPayload } from 'src/app/core/shared/operators'; import { isEmpty } from 'src/app/shared/empty.util'; import { environment } from 'src/environments/environment'; + import { FiltersComponent } from '../filters-section/filters-section.component'; import { FilteredItems } from './filtered-items-model'; import { OptionVO } from './option-vo.model'; @@ -30,7 +42,7 @@ import { QueryPredicate } from './query-predicate.model'; @Component({ selector: 'ds-report-filtered-items', templateUrl: './filtered-items.component.html', - styleUrls: ['./filtered-items.component.scss'] + styleUrls: ['./filtered-items.component.scss'], }) export class FilteredItemsComponent { @@ -63,8 +75,8 @@ export class FilteredItemsComponent { this.loadPredicates(); this.loadPageLimits(); - let formQueryPredicates: FormGroup[] = [ - new QueryPredicate().toFormGroup(this.formBuilder) + const formQueryPredicates: FormGroup[] = [ + new QueryPredicate().toFormGroup(this.formBuilder), ]; this.queryForm = this.formBuilder.group({ @@ -73,111 +85,111 @@ export class FilteredItemsComponent { queryPredicates: this.formBuilder.array(formQueryPredicates), pageLimit: this.formBuilder.control('10', []), filters: FiltersComponent.formGroup(this.formBuilder), - additionalFields: this.formBuilder.control([], []) + additionalFields: this.formBuilder.control([], []), }); } loadCollections(): void { this.collections = []; - let wholeRepo$ = this.translateService.stream('admin.reports.items.wholeRepo'); + const wholeRepo$ = this.translateService.stream('admin.reports.items.wholeRepo'); this.collections.push(OptionVO.collectionLoc('', wholeRepo$)); this.communityService.findAll({ elementsPerPage: 10000, currentPage: 1 }).pipe( - getFirstSucceededRemoteListPayload() + getFirstSucceededRemoteListPayload(), ).subscribe( - (communitiesRest: Community[]) => { - communitiesRest.forEach(community => { - let commVO = OptionVO.collection(community.uuid, community.name, true); - this.collections.push(commVO); + (communitiesRest: Community[]) => { + communitiesRest.forEach(community => { + const commVO = OptionVO.collection(community.uuid, community.name, true); + this.collections.push(commVO); - this.collectionService.findByParent(community.uuid, { elementsPerPage: 10000, currentPage: 1 }).pipe( - getFirstSucceededRemoteListPayload() - ).subscribe( - (collectionsRest: Collection[]) => { - collectionsRest.filter(collection => collection.firstMetadataValue('dspace.entity.type') === 'Publication') - .forEach(collection => { - let collVO = OptionVO.collection(collection.uuid, '–' + collection.name); - this.collections.push(collVO); - }); - } - ); - }); - } - ); + this.collectionService.findByParent(community.uuid, { elementsPerPage: 10000, currentPage: 1 }).pipe( + getFirstSucceededRemoteListPayload(), + ).subscribe( + (collectionsRest: Collection[]) => { + collectionsRest.filter(collection => collection.firstMetadataValue('dspace.entity.type') === 'Publication') + .forEach(collection => { + const collVO = OptionVO.collection(collection.uuid, '–' + collection.name); + this.collections.push(collVO); + }); + }, + ); + }); + }, + ); } loadPresetQueries(): void { this.presetQueries = [ PresetQuery.of('new', 'admin.reports.items.preset.new', []), PresetQuery.of('q1', 'admin.reports.items.preset.hasNoTitle', [ - QueryPredicate.of('dc.title', QueryPredicate.DOES_NOT_EXIST) + QueryPredicate.of('dc.title', QueryPredicate.DOES_NOT_EXIST), ]), PresetQuery.of('q2', 'admin.reports.items.preset.hasNoIdentifierUri', [ - QueryPredicate.of('dc.identifier.uri', QueryPredicate.DOES_NOT_EXIST) + QueryPredicate.of('dc.identifier.uri', QueryPredicate.DOES_NOT_EXIST), ]), PresetQuery.of('q3', 'admin.reports.items.preset.hasCompoundSubject', [ - QueryPredicate.of('dc.subject.*', QueryPredicate.LIKE, '%;%') + QueryPredicate.of('dc.subject.*', QueryPredicate.LIKE, '%;%'), ]), PresetQuery.of('q4', 'admin.reports.items.preset.hasCompoundAuthor', [ - QueryPredicate.of('dc.contributor.author', QueryPredicate.LIKE, '% and %') + QueryPredicate.of('dc.contributor.author', QueryPredicate.LIKE, '% and %'), ]), PresetQuery.of('q5', 'admin.reports.items.preset.hasCompoundCreator', [ - QueryPredicate.of('dc.creator', QueryPredicate.LIKE, '% and %') + QueryPredicate.of('dc.creator', QueryPredicate.LIKE, '% and %'), ]), PresetQuery.of('q6', 'admin.reports.items.preset.hasUrlInDescription', [ - QueryPredicate.of('dc.description', QueryPredicate.MATCHES, '^.*(http://|https://|mailto:).*$') + QueryPredicate.of('dc.description', QueryPredicate.MATCHES, '^.*(http://|https://|mailto:).*$'), ]), PresetQuery.of('q7', 'admin.reports.items.preset.hasFullTextInProvenance', [ - QueryPredicate.of('dc.description.provenance', QueryPredicate.MATCHES, '^.*No\. of bitstreams(.|\r|\n|\r\n)*\.(PDF|pdf|DOC|doc|PPT|ppt|DOCX|docx|PPTX|pptx).*$') + QueryPredicate.of('dc.description.provenance', QueryPredicate.MATCHES, '^.*No\. of bitstreams(.|\r|\n|\r\n)*\.(PDF|pdf|DOC|doc|PPT|ppt|DOCX|docx|PPTX|pptx).*$'), ]), PresetQuery.of('q8', 'admin.reports.items.preset.hasNonFullTextInProvenance', [ - QueryPredicate.of('dc.description.provenance', QueryPredicate.DOES_NOT_MATCH, '^.*No\. of bitstreams(.|\r|\n|\r\n)*\.(PDF|pdf|DOC|doc|PPT|ppt|DOCX|docx|PPTX|pptx).*$') + QueryPredicate.of('dc.description.provenance', QueryPredicate.DOES_NOT_MATCH, '^.*No\. of bitstreams(.|\r|\n|\r\n)*\.(PDF|pdf|DOC|doc|PPT|ppt|DOCX|docx|PPTX|pptx).*$'), ]), PresetQuery.of('q9', 'admin.reports.items.preset.hasEmptyMetadata', [ - QueryPredicate.of('*', QueryPredicate.MATCHES, '^\s*$') + QueryPredicate.of('*', QueryPredicate.MATCHES, '^\s*$'), ]), PresetQuery.of('q10', 'admin.reports.items.preset.hasUnbreakingDataInDescription', [ - QueryPredicate.of('dc.description.*', QueryPredicate.MATCHES, '^.*[^\s]{50,}.*$') + QueryPredicate.of('dc.description.*', QueryPredicate.MATCHES, '^.*[^\s]{50,}.*$'), ]), PresetQuery.of('q12', 'admin.reports.items.preset.hasXmlEntityInMetadata', [ - QueryPredicate.of('*', QueryPredicate.MATCHES, '^.*&#.*$') + QueryPredicate.of('*', QueryPredicate.MATCHES, '^.*&#.*$'), ]), PresetQuery.of('q13', 'admin.reports.items.preset.hasNonAsciiCharInMetadata', [ - QueryPredicate.of('*', QueryPredicate.MATCHES, '^.*[^[:ascii:]].*$') - ]) + QueryPredicate.of('*', QueryPredicate.MATCHES, '^.*[^[:ascii:]].*$'), + ]), ]; } loadMetadataFields(): void { this.metadataFields = []; this.metadataFieldsWithAny = []; - let anyField$ = this.translateService.stream('admin.reports.items.anyField'); + const anyField$ = this.translateService.stream('admin.reports.items.anyField'); this.metadataFieldsWithAny.push(OptionVO.itemLoc('*', anyField$)); this.metadataSchemaService.findAll({ elementsPerPage: 10000, currentPage: 1 }).pipe( - getFirstSucceededRemoteListPayload() + getFirstSucceededRemoteListPayload(), ).subscribe( - (schemasRest: MetadataSchema[]) => { - schemasRest.forEach(schema => { - this.metadataFieldService.findBySchema(schema, { elementsPerPage: 10000, currentPage: 1 }).pipe( - getFirstSucceededRemoteListPayload() - ).subscribe( - (fieldsRest: MetadataField[]) => { - fieldsRest.forEach(field => { - let fieldName = schema.prefix + '.' + field.toString(); - let fieldVO = OptionVO.item(fieldName, fieldName); - this.metadataFields.push(fieldVO); - this.metadataFieldsWithAny.push(fieldVO); - if (isEmpty(field.qualifier)) { - fieldName = schema.prefix + '.' + field.element + '.*'; - fieldVO = OptionVO.item(fieldName, fieldName); - this.metadataFieldsWithAny.push(fieldVO); - } - }); - } - ); - }); - } - ); + (schemasRest: MetadataSchema[]) => { + schemasRest.forEach(schema => { + this.metadataFieldService.findBySchema(schema, { elementsPerPage: 10000, currentPage: 1 }).pipe( + getFirstSucceededRemoteListPayload(), + ).subscribe( + (fieldsRest: MetadataField[]) => { + fieldsRest.forEach(field => { + let fieldName = schema.prefix + '.' + field.toString(); + let fieldVO = OptionVO.item(fieldName, fieldName); + this.metadataFields.push(fieldVO); + this.metadataFieldsWithAny.push(fieldVO); + if (isEmpty(field.qualifier)) { + fieldName = schema.prefix + '.' + field.element + '.*'; + fieldVO = OptionVO.item(fieldName, fieldName); + this.metadataFieldsWithAny.push(fieldVO); + } + }); + }, + ); + }); + }, + ); } loadPredicates(): void { @@ -191,7 +203,7 @@ export class FilteredItemsComponent { OptionVO.item(QueryPredicate.CONTAINS, 'admin.reports.items.predicate.contains'), OptionVO.item(QueryPredicate.DOES_NOT_CONTAIN, 'admin.reports.items.predicate.doesNotContain'), OptionVO.item(QueryPredicate.MATCHES, 'admin.reports.items.predicate.matches'), - OptionVO.item(QueryPredicate.DOES_NOT_MATCH, 'admin.reports.items.predicate.doesNotMatch') + OptionVO.item(QueryPredicate.DOES_NOT_MATCH, 'admin.reports.items.predicate.doesNotMatch'), ]; } @@ -200,7 +212,7 @@ export class FilteredItemsComponent { OptionVO.item('10', '10'), OptionVO.item('25', '25'), OptionVO.item('50', '50'), - OptionVO.item('100', '100') + OptionVO.item('100', '100'), ]; } @@ -223,14 +235,14 @@ export class FilteredItemsComponent { } setPresetQuery() { - let queryField = this.queryForm.controls.presetQuery as FormControl; - let value = queryField.value; - let query = this.presetQueries.find(q => q.id === value); + const queryField = this.queryForm.controls.presetQuery as FormControl; + const value = queryField.value; + const query = this.presetQueries.find(q => q.id === value); if (query !== undefined) { this.queryPredicatesArray().clear(); query.predicates - .map(qp => qp.toFormGroup(this.formBuilder)) - .forEach(qp => this.addQueryPredicate(qp)); + .map(qp => qp.toFormGroup(this.formBuilder)) + .forEach(qp => this.addQueryPredicate(qp)); if (query.predicates.length === 0) { this.addQueryPredicate(new QueryPredicate().toFormGroup(this.formBuilder)); } @@ -242,7 +254,7 @@ export class FilteredItemsComponent { } private pageSize() { - let form = this.queryForm.value; + const form = this.queryForm.value; return form.pageLimit; } @@ -258,7 +270,7 @@ export class FilteredItemsComponent { } pageCount(): number { - let total = this.results.itemCount || 0; + const total = this.results.itemCount || 0; return Math.ceil(total / this.pageSize()); } @@ -284,32 +296,32 @@ export class FilteredItemsComponent { .getFilteredItems() .pipe( map(response => { - let offset = this.currentPage * this.pageSize(); + const offset = this.currentPage * this.pageSize(); this.results.deserialize(response.payload, offset); return this.results.items; - }) + }), ); } getFilteredItems(): Observable { let params = this.toQueryString(); if (params.length > 0) { - params = `?${params}`; + params = `?${params}`; } - let scheme = environment.rest.ssl ? 'https' : 'http'; - let urlRestApp = `${scheme}://${environment.rest.host}:${environment.rest.port}${environment.rest.nameSpace}`; + const scheme = environment.rest.ssl ? 'https' : 'http'; + const urlRestApp = `${scheme}://${environment.rest.host}:${environment.rest.port}${environment.rest.nameSpace}`; return this.restService.request(RestRequestMethod.GET, `${urlRestApp}/api/contentreport/filtereditems${params}`); } private toQueryString(): string { let params = `pageNumber=${this.currentPage}&pageLimit=${this.pageSize()}`; - let colls = this.queryForm.value.collections; + const colls = this.queryForm.value.collections; for (let i = 0; i < colls.length; i++) { params += `&collections=${colls[i]}`; } - let preds = this.queryForm.value.queryPredicates; + const preds = this.queryForm.value.queryPredicates; for (let i = 0; i < preds.length; i++) { const field = preds[i].field; const op = preds[i].operator; @@ -320,12 +332,12 @@ export class FilteredItemsComponent { } } - let filters = FiltersComponent.toQueryString(this.queryForm.value.filters); + const filters = FiltersComponent.toQueryString(this.queryForm.value.filters); if (filters.length > 0) { params += `&${filters}`; } - let addFlds = this.queryForm.value.additionalFields; + const addFlds = this.queryForm.value.additionalFields; for (let i = 0; i < addFlds.length; i++) { params += `&additionalFields=${addFlds[i]}`; } diff --git a/src/app/admin/admin-reports/filtered-items/option-vo.model.ts b/src/app/admin/admin-reports/filtered-items/option-vo.model.ts index 0aee34d070..56334b041f 100644 --- a/src/app/admin/admin-reports/filtered-items/option-vo.model.ts +++ b/src/app/admin/admin-reports/filtered-items/option-vo.model.ts @@ -11,7 +11,7 @@ export class OptionVO { disabled = false; static collection(id: string, name: string, disabled: boolean = false): OptionVO { - let opt = new OptionVO(); + const opt = new OptionVO(); opt.id = id; opt.name$ = OptionVO.toObservable(name); opt.disabled = disabled; @@ -19,7 +19,7 @@ export class OptionVO { } static collectionLoc(id: string, name$: Observable, disabled: boolean = false): OptionVO { - let opt = new OptionVO(); + const opt = new OptionVO(); opt.id = id; opt.name$ = name$; opt.disabled = disabled; @@ -27,14 +27,14 @@ export class OptionVO { } static item(id: string, name: string): OptionVO { - let opt = new OptionVO(); + const opt = new OptionVO(); opt.id = id; opt.name$ = OptionVO.toObservable(name); return opt; } static itemLoc(id: string, name$: Observable): OptionVO { - let opt = new OptionVO(); + const opt = new OptionVO(); opt.id = id; opt.name$ = name$; return opt; diff --git a/src/app/admin/admin-reports/filtered-items/preset-query.model.ts b/src/app/admin/admin-reports/filtered-items/preset-query.model.ts index 73522f02cf..213819b70e 100644 --- a/src/app/admin/admin-reports/filtered-items/preset-query.model.ts +++ b/src/app/admin/admin-reports/filtered-items/preset-query.model.ts @@ -7,7 +7,7 @@ export class PresetQuery { predicates: QueryPredicate[]; static of(id: string, label: string, predicates: QueryPredicate[]) { - let query = new PresetQuery(); + const query = new PresetQuery(); query.id = id; query.label = label; query.predicates = predicates; diff --git a/src/app/admin/admin-reports/filtered-items/query-predicate.model.ts b/src/app/admin/admin-reports/filtered-items/query-predicate.model.ts index c5f323ed2c..1c12d72e27 100644 --- a/src/app/admin/admin-reports/filtered-items/query-predicate.model.ts +++ b/src/app/admin/admin-reports/filtered-items/query-predicate.model.ts @@ -1,4 +1,8 @@ -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { + FormBuilder, + FormControl, + FormGroup, +} from '@angular/forms'; export class QueryPredicate { @@ -18,7 +22,7 @@ export class QueryPredicate { value: string; static of(field: string, operator: string, value: string = '') { - let pred = new QueryPredicate(); + const pred = new QueryPredicate(); pred.field = field; pred.operator = operator; pred.value = value; @@ -29,7 +33,7 @@ export class QueryPredicate { return formBuilder.group({ field: new FormControl(this.field), operator: new FormControl(this.operator), - value: new FormControl(this.value) + value: new FormControl(this.value), }); } diff --git a/src/app/admin/admin-reports/filters-section/filters-section.component.spec.ts b/src/app/admin/admin-reports/filters-section/filters-section.component.spec.ts index fcbc171351..918ddff1c9 100644 --- a/src/app/admin/admin-reports/filters-section/filters-section.component.spec.ts +++ b/src/app/admin/admin-reports/filters-section/filters-section.component.spec.ts @@ -1,9 +1,17 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { FiltersComponent } from './filters-section.component'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateLoaderMock } from 'src/app/shared/mocks/translate-loader.mock'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { FormBuilder } from '@angular/forms'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { TranslateLoaderMock } from 'src/app/shared/mocks/translate-loader.mock'; + +import { FiltersComponent } from './filters-section.component'; describe('FiltersComponent', () => { let component: FiltersComponent; @@ -17,14 +25,14 @@ describe('FiltersComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: TranslateLoaderMock - } - }) + useClass: TranslateLoaderMock, + }, + }), ], providers: [ - FormBuilder + FormBuilder, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }); })); diff --git a/src/app/admin/admin-reports/filters-section/filters-section.component.ts b/src/app/admin/admin-reports/filters-section/filters-section.component.ts index d5dc074f08..b678cd4800 100644 --- a/src/app/admin/admin-reports/filters-section/filters-section.component.ts +++ b/src/app/admin/admin-reports/filters-section/filters-section.component.ts @@ -1,7 +1,15 @@ -import { Component, Input } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { FilterGroup } from './filter-group.model'; +import { + Component, + Input, +} from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, +} from '@angular/forms'; + import { Filter } from './filter.model'; +import { FilterGroup } from './filter-group.model'; /** * Component representing the Query Filters section used in both @@ -10,7 +18,7 @@ import { Filter } from './filter.model'; @Component({ selector: 'ds-filters', templateUrl: './filters-section.component.html', - styleUrls: ['./filters-section.component.scss'] + styleUrls: ['./filters-section.component.scss'], }) export class FiltersComponent { @@ -20,12 +28,12 @@ export class FiltersComponent { new Filter('is_withdrawn'), new Filter('is_not_withdrawn'), new Filter('is_discoverable'), - new Filter('is_not_discoverable') + new Filter('is_not_discoverable'), ]), new FilterGroup('bitstream', [ new Filter('has_multiple_originals'), new Filter('has_no_originals'), - new Filter('has_one_original') + new Filter('has_one_original'), ]), new FilterGroup('bitstream_mime', [ new Filter('has_doc_original'), @@ -36,13 +44,13 @@ export class FiltersComponent { new Filter('has_jpg_original'), new Filter('has_small_pdf'), new Filter('has_large_pdf'), - new Filter('has_doc_without_text') + new Filter('has_doc_without_text'), ]), new FilterGroup('mime', [ new Filter('has_only_supp_image_type'), new Filter('has_unsupp_image_type'), new Filter('has_only_supp_doc_type'), - new Filter('has_unsupp_doc_type') + new Filter('has_unsupp_doc_type'), ]), new FilterGroup('bundle', [ new Filter('has_unsupported_bundle'), @@ -51,24 +59,24 @@ export class FiltersComponent { new Filter('has_invalid_thumbnail_name'), new Filter('has_non_generated_thumb'), new Filter('no_license'), - new Filter('has_license_documentation') + new Filter('has_license_documentation'), ]), new FilterGroup('permission', [ new Filter('has_restricted_original', true), new Filter('has_restricted_thumbnail', true), - new Filter('has_restricted_metadata', true) - ]) + new Filter('has_restricted_metadata', true), + ]), ]; @Input() filtersForm: FormGroup; static formGroup(formBuilder: FormBuilder): FormGroup { - let fields = {}; - let allFilters = FiltersComponent.FILTERS; + const fields = {}; + const allFilters = FiltersComponent.FILTERS; for (let i = 0; i < allFilters.length; i++) { - let group = allFilters[i]; + const group = allFilters[i]; for (let j = 0; j < group.filters.length; j++) { - let filter = group.filters[j]; + const filter = group.filters[j]; fields[filter.id] = new FormControl(false); } } @@ -76,11 +84,11 @@ export class FiltersComponent { } static getFilter(filterId: string): Filter { - let allFilters = FiltersComponent.FILTERS; + const allFilters = FiltersComponent.FILTERS; for (let i = 0; i < allFilters.length; i++) { - let group = allFilters[i]; + const group = allFilters[i]; for (let j = 0; j < group.filters.length; j++) { - let filter = group.filters[j]; + const filter = group.filters[j]; if (filter.id === filterId) { return filter; } @@ -90,11 +98,11 @@ export class FiltersComponent { } static getGroup(filterId: string): FilterGroup { - let allFilters = FiltersComponent.FILTERS; + const allFilters = FiltersComponent.FILTERS; for (let i = 0; i < allFilters.length; i++) { - let group = allFilters[i]; + const group = allFilters[i]; for (let j = 0; j < group.filters.length; j++) { - let filter = group.filters[j]; + const filter = group.filters[j]; if (filter.id === filterId) { return group; } @@ -126,12 +134,12 @@ export class FiltersComponent { private setAllFilters(value: boolean) { // I don't know why, but patchValue() with individual controls doesn't work. // I therefore use setValue() with the whole set, which mercifully works... - let fields = {}; - let allFilters = FiltersComponent.FILTERS; + const fields = {}; + const allFilters = FiltersComponent.FILTERS; for (let i = 0; i < allFilters.length; i++) { - let group = allFilters[i]; + const group = allFilters[i]; for (let j = 0; j < group.filters.length; j++) { - let filter = group.filters[j]; + const filter = group.filters[j]; fields[filter.id] = value; } } diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index 3c45081d70..bfcd16d18d 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -1,5 +1,5 @@ -import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getAdminModuleRoute } from '../app-routing-paths'; +import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getQualityAssuranceEditRoute } from './admin-notifications/admin-notifications-routing-paths'; export const REGISTRIES_MODULE_PATH = 'registries'; diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 5ba0ba9722..d9255e6482 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -3,13 +3,19 @@ import { RouterModule } from '@angular/router'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; +import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; import { MetadataImportPageComponent } from './admin-import-metadata-page/metadata-import-page.component'; -import { LDN_PATH, NOTIFICATIONS_MODULE_PATH, NOTIFY_DASHBOARD_MODULE_PATH, REGISTRIES_MODULE_PATH, REPORTS_MODULE_PATH } from './admin-routing-paths'; +import { + LDN_PATH, + NOTIFICATIONS_MODULE_PATH, + NOTIFY_DASHBOARD_MODULE_PATH, + REGISTRIES_MODULE_PATH, + REPORTS_MODULE_PATH, +} from './admin-routing-paths'; import { AdminSearchPageComponent } from './admin-search-page/admin-search-page.component'; import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; -import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; @NgModule({ imports: [ @@ -23,49 +29,49 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu path: REGISTRIES_MODULE_PATH, loadChildren: () => import('./admin-registries/admin-registries.module') .then((m) => m.AdminRegistriesModule), - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'search', resolve: { breadcrumb: I18nBreadcrumbResolver }, component: AdminSearchPageComponent, data: { title: 'admin.search.title', breadcrumbKey: 'admin.search' }, - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'workflow', resolve: { breadcrumb: I18nBreadcrumbResolver }, component: AdminWorkflowPageComponent, data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' }, - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'curation-tasks', resolve: { breadcrumb: I18nBreadcrumbResolver }, component: AdminCurationTasksComponent, data: { title: 'admin.curation-tasks.title', breadcrumbKey: 'admin.curation-tasks' }, - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'metadata-import', resolve: { breadcrumb: I18nBreadcrumbResolver }, component: MetadataImportPageComponent, data: { title: 'admin.metadata-import.title', breadcrumbKey: 'admin.metadata-import' }, - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'batch-import', resolve: { breadcrumb: I18nBreadcrumbResolver }, component: BatchImportPageComponent, data: { title: 'admin.batch-import.title', breadcrumbKey: 'admin.batch-import' }, - canActivate: [SiteAdministratorGuard] + canActivate: [SiteAdministratorGuard], }, { path: 'system-wide-alert', resolve: { breadcrumb: I18nBreadcrumbResolver }, loadChildren: () => import('../system-wide-alert/system-wide-alert.module').then((m) => m.SystemWideAlertModule), - data: {title: 'admin.system-wide-alert.title', breadcrumbKey: 'admin.system-wide-alert'}, - canActivate: [SiteAdministratorGuard] + data: { title: 'admin.system-wide-alert.title', breadcrumbKey: 'admin.system-wide-alert' }, + canActivate: [SiteAdministratorGuard], }, { path: LDN_PATH, @@ -75,7 +81,7 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu path: 'services', loadChildren: () => import('./admin-ldn-services/admin-ldn-services.module') .then((m) => m.AdminLdnServicesModule), - } + }, ], }, { diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts index 34e66068d3..b337df8ed2 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts @@ -1,4 +1,11 @@ -import { Component, ComponentRef, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { + Component, + ComponentRef, + ElementRef, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; @@ -6,13 +13,16 @@ import { Context } from '../../../../../core/shared/context.model'; import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; import { Item } from '../../../../../core/shared/item.model'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; +import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; +import { hasValue } from '../../../../../shared/empty.util'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { getListableObjectComponent, listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { + getListableObjectComponent, + listableObjectComponent, +} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { hasValue } from '../../../../../shared/empty.util'; @listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminSearch) @Component({ diff --git a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.spec.ts b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.spec.ts index a594eb0cf4..3131899c49 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.spec.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.spec.ts @@ -1,5 +1,9 @@ import { Component } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; diff --git a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts index e0504a6712..d677c7f8ba 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts @@ -1,4 +1,9 @@ -import { Component, Inject, Injector, OnInit } from '@angular/core'; +import { + Component, + Inject, + Injector, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; import { isEmpty } from '../../../shared/empty.util'; diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts index 0c6ab0165c..b8de30031b 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts @@ -1,5 +1,15 @@ -import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + Injector, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index 390c7463e3..37bc8bbf98 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -1,6 +1,24 @@ -import { Component, HostListener, Injector, Input, OnInit } from '@angular/core'; -import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; -import { debounceTime, distinctUntilChanged, first, map, withLatestFrom } from 'rxjs/operators'; +import { + Component, + HostListener, + Injector, + Input, + OnInit, +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { + BehaviorSubject, + combineLatest, + Observable, +} from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + first, + map, + withLatestFrom, +} from 'rxjs/operators'; + import { AuthService } from '../../core/auth/auth.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { slideSidebar } from '../../shared/animations/slide'; @@ -9,7 +27,6 @@ import { MenuService } from '../../shared/menu/menu.service'; import { MenuID } from '../../shared/menu/menu-id.model'; import { CSSVariableService } from '../../shared/sass-helper/css-variable.service'; import { ThemeService } from '../../shared/theme-support/theme.service'; -import { ActivatedRoute } from '@angular/router'; /** * Component representing the admin sidebar diff --git a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.spec.ts b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.spec.ts index 99d3163edf..d01f4693ef 100644 --- a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.spec.ts +++ b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.spec.ts @@ -1,5 +1,9 @@ import { Component } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; diff --git a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.ts b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.ts index c8b15faed1..a43be47879 100644 --- a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.ts +++ b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.ts @@ -1,6 +1,14 @@ -import { Component, Inject, Injector, OnInit } from '@angular/core'; +import { + Component, + Inject, + Injector, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; -import { combineLatest as combineLatestObservable, Observable } from 'rxjs'; +import { + combineLatest as combineLatestObservable, + Observable, +} from 'rxjs'; import { map } from 'rxjs/operators'; import { bgColor } from '../../../shared/animations/bgColor'; @@ -69,7 +77,7 @@ export class ExpandableAdminSidebarSectionComponent extends AdminSidebarSectionC this.isSidebarCollapsed$ = this.menuService.isMenuCollapsed(this.menuID); this.isSidebarPreviewCollapsed$ = this.menuService.isMenuPreviewCollapsed(this.menuID); this.isExpanded$ = combineLatestObservable([this.active, this.isSidebarCollapsed$, this.isSidebarPreviewCollapsed$]).pipe( - map(([active, sidebarCollapsed, sidebarPreviewCollapsed]) => (active && (!sidebarCollapsed || !sidebarPreviewCollapsed))) + map(([active, sidebarCollapsed, sidebarPreviewCollapsed]) => (active && (!sidebarCollapsed || !sidebarPreviewCollapsed))), ); } diff --git a/src/app/admin/admin-sidebar/themed-admin-sidebar.component.ts b/src/app/admin/admin-sidebar/themed-admin-sidebar.component.ts index 1770b221be..30f1a60ee2 100644 --- a/src/app/admin/admin-sidebar/themed-admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/themed-admin-sidebar.component.ts @@ -1,8 +1,11 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input, +} from '@angular/core'; +import { Observable } from 'rxjs'; import { ThemedComponent } from '../../shared/theme-support/themed.component'; import { AdminSidebarComponent } from './admin-sidebar.component'; -import { Observable } from 'rxjs'; /** * Themed wrapper for AdminSidebarComponent diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts index 3c82766e9d..7ef5896b3c 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts @@ -1,8 +1,24 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; +import { + Component, + EventEmitter, + Input, + OnInit, + Output, +} from '@angular/core'; +import { + NgbModal, + NgbModalRef, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { map, Observable } from 'rxjs'; -import { switchMap, take, tap } from 'rxjs/operators'; +import { + map, + Observable, +} from 'rxjs'; +import { + switchMap, + take, + tap, +} from 'rxjs/operators'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSpaceObject } from '../../../../../core/shared/dspace-object.model'; diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts index a8006a0c1c..732a691102 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts @@ -1,5 +1,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; @@ -10,16 +14,16 @@ import { BitstreamDataService } from '../../../../../core/data/bitstream-data.se import { Item } from '../../../../../core/shared/item.model'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; -import { ItemGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component'; import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock'; import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type'; +import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; +import { ItemGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; import { WorkflowItemSearchResultAdminWorkflowGridElementComponent } from './workflow-item-search-result-admin-workflow-grid-element.component'; describe('WorkflowItemSearchResultAdminWorkflowGridElementComponent', () => { diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts index 37ff173ff6..a94a96e9d5 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts @@ -1,24 +1,37 @@ -import { Component, ComponentRef, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { Item } from '../../../../../core/shared/item.model'; -import { ViewMode } from '../../../../../core/shared/view-mode.model'; -import { getListableObjectComponent, listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; -import { Context } from '../../../../../core/shared/context.model'; -import { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; -import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; -import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; -import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { + Component, + ComponentRef, + ElementRef, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; import { RemoteData } from '../../../../../core/data/remote-data'; -import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; -import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; -import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { Context } from '../../../../../core/shared/context.model'; +import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; +import { Item } from '../../../../../core/shared/item.model'; +import { + getAllSucceededRemoteData, + getRemoteDataPayload, +} from '../../../../../core/shared/operators'; +import { ViewMode } from '../../../../../core/shared/view-mode.model'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; import { hasValue } from '../../../../../shared/empty.util'; +import { + getListableObjectComponent, + listableObjectComponent, +} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; +import { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; +import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { followLink } from '../../../../../shared/utils/follow-link-config.model'; @listableObjectComponent(WorkflowItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @@ -82,7 +95,7 @@ export class WorkflowItemSearchResultAdminWorkflowGridElementComponent extends S index: 0, injector: undefined, projectableNodes: [ - [this.badges.nativeElement], + [this.badges.nativeElement], [this.buttons.nativeElement], ], }, diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts index ebdf43a03b..b9781fb4f9 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts @@ -1,5 +1,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; @@ -11,18 +15,21 @@ import { DSpaceObject } from '../../../../../core/shared/dspace-object.model'; import { Item } from '../../../../../core/shared/item.model'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; -import { ItemGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component'; -import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service'; +import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock'; import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type'; -import { supervisionOrderPaginatedListRD, supervisionOrderPaginatedListRD$ } from '../../../../../shared/testing/supervision-order.mock'; +import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; +import { ItemGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; +import { + supervisionOrderPaginatedListRD, + supervisionOrderPaginatedListRD$, +} from '../../../../../shared/testing/supervision-order.mock'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; import { WorkspaceItemSearchResultAdminWorkflowGridElementComponent } from './workspace-item-search-result-admin-workflow-grid-element.component'; describe('WorkspaceItemSearchResultAdminWorkflowGridElementComponent', () => { diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts index 28d2aacfe5..a25b8c6f00 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts @@ -1,30 +1,50 @@ -import { Component, ComponentRef, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; - -import { BehaviorSubject, Observable } from 'rxjs'; -import { map, mergeMap, take, tap } from 'rxjs/operators'; - -import { Item } from '../../../../../core/shared/item.model'; -import { ViewMode } from '../../../../../core/shared/view-mode.model'; -import { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; -import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; -import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; -import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model'; +import { + Component, + ComponentRef, + ElementRef, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; +import { + BehaviorSubject, + Observable, +} from 'rxjs'; +import { + map, + mergeMap, + take, + tap, +} from 'rxjs/operators'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; import { PaginatedList } from '../../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../../core/data/remote-data'; import { Context } from '../../../../../core/shared/context.model'; import { DSpaceObject } from '../../../../../core/shared/dspace-object.model'; -import { getAllSucceededRemoteData, getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; +import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; +import { Item } from '../../../../../core/shared/item.model'; +import { + getAllSucceededRemoteData, + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../../../../core/shared/operators'; +import { ViewMode } from '../../../../../core/shared/view-mode.model'; +import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model'; import { SupervisionOrder } from '../../../../../core/supervision-order/models/supervision-order.model'; import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service'; -import { getListableObjectComponent, listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; -import { WorkspaceItemSearchResult } from '../../../../../shared/object-collection/shared/workspace-item-search-result.model'; -import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { DynamicComponentLoaderDirective } from '../../../../../shared/abstract-component-loader/dynamic-component-loader.directive'; import { hasValue } from '../../../../../shared/empty.util'; +import { + getListableObjectComponent, + listableObjectComponent, +} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { WorkspaceItemSearchResult } from '../../../../../shared/object-collection/shared/workspace-item-search-result.model'; +import { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; +import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { followLink } from '../../../../../shared/utils/follow-link-config.model'; @listableObjectComponent(WorkspaceItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @@ -93,20 +113,20 @@ export class WorkspaceItemSearchResultAdminWorkflowGridElementComponent extends this.dso = this.linkService.resolveLink(this.dso, followLink('item')); this.item$ = (this.dso.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); this.item$.pipe(take(1)).subscribe((item: Item) => { - const component: GenericConstructor = this.getComponent(item); + const component: GenericConstructor = this.getComponent(item); - const viewContainerRef = this.dynamicComponentLoaderDirective.viewContainerRef; + const viewContainerRef = this.dynamicComponentLoaderDirective.viewContainerRef; viewContainerRef.clear(); - this.compRef = viewContainerRef.createComponent( - component, { + this.compRef = viewContainerRef.createComponent( + component, { index: 0, projectableNodes: [ - [this.badges.nativeElement], - [this.buttons.nativeElement], - ], - }); - this.compRef.setInput('object', item); + [this.badges.nativeElement], + [this.buttons.nativeElement], + ], + }); + this.compRef.setInput('object', item); this.compRef.setInput('index', this.index); this.compRef.setInput('linkType', this.linkType); this.compRef.setInput('listID', this.listID); diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index b39387a86b..d75d4457f7 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -1,18 +1,19 @@ import { NgModule } from '@angular/core'; -import { SharedModule } from '../shared/shared.module'; +import { UiSwitchModule } from 'ngx-ui-switch'; + import { AccessControlModule } from '../access-control/access-control.module'; +import { SharedModule } from '../shared/shared.module'; +import { UploadModule } from '../shared/upload/upload.module'; +import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; +import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; import { MetadataImportPageComponent } from './admin-import-metadata-page/metadata-import-page.component'; import { AdminRegistriesModule } from './admin-registries/admin-registries.module'; +import { AdminReportsModule } from './admin-reports/admin-reports.module'; import { AdminRoutingModule } from './admin-routing.module'; -import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; -import { AdminWorkflowModuleModule } from './admin-workflow-page/admin-workflow.module'; import { AdminSearchModule } from './admin-search-page/admin-search.module'; import { AdminSidebarSectionComponent } from './admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; import { ExpandableAdminSidebarSectionComponent } from './admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component'; -import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; -import { AdminReportsModule } from './admin-reports/admin-reports.module'; -import { UiSwitchModule } from 'ngx-ui-switch'; -import { UploadModule } from '../shared/upload/upload.module'; +import { AdminWorkflowModuleModule } from './admin-workflow-page/admin-workflow.module'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator diff --git a/src/app/app-routing-paths.ts b/src/app/app-routing-paths.ts index 4ff2a18dcc..9b95ee0d0a 100644 --- a/src/app/app-routing-paths.ts +++ b/src/app/app-routing-paths.ts @@ -5,7 +5,10 @@ import { Community } from './core/shared/community.model'; import { DSpaceObject } from './core/shared/dspace-object.model'; import { Item } from './core/shared/item.model'; import { URLCombiner } from './core/url-combiner/url-combiner'; -import { getItemModuleRoute, getItemPageRoute } from './item-page/item-page-routing-paths'; +import { + getItemModuleRoute, + getItemPageRoute, +} from './item-page/item-page-routing-paths'; import { hasValue } from './shared/empty.util'; export const BITSTREAM_MODULE_PATH = 'bitstreams'; diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index de4a02f843..84b6fa9275 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,5 +1,26 @@ import { NgModule } from '@angular/core'; -import { ACCESS_CONTROL_MODULE_PATH, ADMIN_MODULE_PATH, BITSTREAM_MODULE_PATH, ERROR_PAGE, FORBIDDEN_PATH, FORGOT_PASSWORD_PATH, HEALTH_PAGE_PATH, INFO_MODULE_PATH, INTERNAL_SERVER_ERROR, LEGACY_BITSTREAM_MODULE_PATH, PROFILE_MODULE_PATH, REGISTER_PATH, REQUEST_COPY_MODULE_PATH, WORKFLOW_ITEM_MODULE_PATH } from './app-routing-paths'; +import { + NoPreloading, + RouterModule, +} from '@angular/router'; + +import { NOTIFICATIONS_MODULE_PATH } from './admin/admin-routing-paths'; +import { + ACCESS_CONTROL_MODULE_PATH, + ADMIN_MODULE_PATH, + BITSTREAM_MODULE_PATH, + ERROR_PAGE, + FORBIDDEN_PATH, + FORGOT_PASSWORD_PATH, + HEALTH_PAGE_PATH, + INFO_MODULE_PATH, + INTERNAL_SERVER_ERROR, + LEGACY_BITSTREAM_MODULE_PATH, + PROFILE_MODULE_PATH, + REGISTER_PATH, + REQUEST_COPY_MODULE_PATH, + WORKFLOW_ITEM_MODULE_PATH, +} from './app-routing-paths'; import { COLLECTION_MODULE_PATH } from './collection-page/collection-page-routing-paths'; import { COMMUNITY_MODULE_PATH } from './community-page/community-page-routing-paths'; import { AuthBlockingGuard } from './core/auth/auth-blocking.guard'; @@ -8,18 +29,16 @@ import { GroupAdministratorGuard } from './core/data/feature-authorization/featu import { SiteRegisterGuard } from './core/data/feature-authorization/feature-authorization-guard/site-register.guard'; import { EndUserAgreementCurrentUserGuard } from './core/end-user-agreement/end-user-agreement-current-user.guard'; import { ReloadGuard } from './core/reload/reload.guard'; +import { ForgotPasswordCheckGuard } from './core/rest-property/forgot-password-check-guard.guard'; import { ServerCheckGuard } from './core/server-check/server-check.guard'; import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component'; -import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; -import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths'; +import { ITEM_MODULE_PATH } from './item-page/item-page-routing-paths'; import { MenuResolver } from './menu.resolver'; import { ThemedPageErrorComponent } from './page-error/themed-page-error.component'; -import { NOTIFICATIONS_MODULE_PATH } from './admin/admin-routing-paths'; -import { ForgotPasswordCheckGuard } from './core/rest-property/forgot-password-check-guard.guard'; +import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound.component'; -import { NoPreloading, RouterModule } from '@angular/router'; -import { ITEM_MODULE_PATH } from './item-page/item-page-routing-paths'; import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; +import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths'; @NgModule({ imports: [ @@ -74,7 +93,7 @@ import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; path: FORGOT_PASSWORD_PATH, loadChildren: () => import('./forgot-password/forgot-password.module') .then((m) => m.ForgotPasswordModule), - canActivate: [EndUserAgreementCurrentUserGuard, ForgotPasswordCheckGuard] + canActivate: [EndUserAgreementCurrentUserGuard, ForgotPasswordCheckGuard], }, { path: COMMUNITY_MODULE_PATH, @@ -134,19 +153,19 @@ import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; path: ADMIN_MODULE_PATH, loadChildren: () => import('./admin/admin.module') .then((m) => m.AdminModule), - canActivate: [EndUserAgreementCurrentUserGuard] + canActivate: [EndUserAgreementCurrentUserGuard], }, { path: NOTIFICATIONS_MODULE_PATH, loadChildren: () => import('./admin/admin-notifications/admin-notifications.module') .then((m) => m.AdminNotificationsModule), - canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard], }, { path: NOTIFICATIONS_MODULE_PATH, loadChildren: () => import('./quality-assurance-notifications-pages/notifications-pages.module') .then((m) => m.NotificationsPageModule), - canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard], }, { path: 'login', @@ -197,7 +216,7 @@ import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; { path: SUGGESTION_MODULE_PATH, loadChildren: () => import('./suggestions-page/suggestions-page.module') .then((m) => m.SuggestionsPageModule), - canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard], }, { path: INFO_MODULE_PATH, diff --git a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts index e153ef3270..97e18d34a2 100644 --- a/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts +++ b/src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts @@ -1,31 +1,69 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { Bitstream } from '../../core/shared/bitstream.model'; -import { ActivatedRoute, Router } from '@angular/router'; -import { filter, map, switchMap, tap } from 'rxjs/operators'; -import { combineLatest, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + DynamicFormControlModel, + DynamicFormGroupModel, + DynamicFormLayout, + DynamicFormService, + DynamicInputModel, + DynamicSelectModel, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; -import { DynamicCustomSwitchModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import cloneDeep from 'lodash/cloneDeep'; +import { + combineLatest, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + filter, + map, + switchMap, + tap, +} from 'rxjs/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../../core/data/bitstream-data.service'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../core/shared/operators'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { PrimaryBitstreamService } from '../../core/data/primary-bitstream.service'; import { RemoteData } from '../../core/data/remote-data'; +import { Bitstream } from '../../core/shared/bitstream.model'; import { BitstreamFormat } from '../../core/shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../../core/shared/bitstream-format-support-level'; import { Bundle } from '../../core/shared/bundle.model'; import { Item } from '../../core/shared/item.model'; import { Metadata } from '../../core/shared/metadata.utils'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, + getRemoteDataPayload, +} from '../../core/shared/operators'; import { getEntityEditRoute } from '../../item-page/item-page-routing-paths'; -import { hasValue, hasValueOperator, isEmpty, isNotEmpty } from '../../shared/empty.util'; +import { + hasValue, + hasValueOperator, + isEmpty, + isNotEmpty, +} from '../../shared/empty.util'; +import { DynamicCustomSwitchModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model'; import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; @Component({ selector: 'ds-edit-bitstream-page', @@ -258,7 +296,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { group: [ this.primaryBitstreamModel, this.fileNameModel, - ] + ], }, { grid: { host: 'form-row', @@ -295,11 +333,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy { }, primaryBitstream: { grid: { - container: 'col-12' + container: 'col-12', }, element: { - container: 'text-right' - } + container: 'text-right', + }, }, description: { grid: { diff --git a/src/app/browse-by/browse-by-date/browse-by-date.component.spec.ts b/src/app/browse-by/browse-by-date/browse-by-date.component.spec.ts index e3d54a9514..b6e87356f2 100644 --- a/src/app/browse-by/browse-by-date/browse-by-date.component.spec.ts +++ b/src/app/browse-by/browse-by-date/browse-by-date.component.spec.ts @@ -1,11 +1,21 @@ -import { BrowseByDateComponent } from './browse-by-date.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { CommonModule } from '@angular/common'; -import { ChangeDetectorRef, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ChangeDetectorRef, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; +import { cold } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { APP_CONFIG } from '../../../config/app-config.interface'; @@ -17,14 +27,14 @@ import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.serv import { PaginationService } from '../../core/pagination/pagination.service'; import { Community } from '../../core/shared/community.model'; import { Item } from '../../core/shared/item.model'; -import { toRemoteData } from '../browse-by-metadata/browse-by-metadata.component.spec'; -import { VarDirective } from '../../shared/utils/var.directive'; +import { RouterMock } from '../../shared/mocks/router.mock'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; -import { cold } from 'jasmine-marbles'; import { EnumKeysPipe } from '../../shared/utils/enum-keys-pipe'; -import { RouterMock } from '../../shared/mocks/router.mock'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { toRemoteData } from '../browse-by-metadata/browse-by-metadata.component.spec'; +import { BrowseByDateComponent } from './browse-by-date.component'; describe('BrowseByDateComponent', () => { let comp: BrowseByDateComponent; diff --git a/src/app/browse-by/browse-by-date/browse-by-date.component.ts b/src/app/browse-by/browse-by-date/browse-by-date.component.ts index 0f5995dde6..7e772fb4c1 100644 --- a/src/app/browse-by/browse-by-date/browse-by-date.component.ts +++ b/src/app/browse-by/browse-by-date/browse-by-date.component.ts @@ -1,22 +1,48 @@ -import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core'; -import { BrowseByMetadataComponent, browseParamsToOptions, getBrowseSearchOptions } from '../browse-by-metadata/browse-by-metadata.component'; -import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; -import { ActivatedRoute, Params, Router } from '@angular/router'; +import { + ChangeDetectorRef, + Component, + Inject, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Params, + Router, +} from '@angular/router'; +import { + combineLatest as observableCombineLatest, + Observable, +} from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { + APP_CONFIG, + AppConfig, +} from '../../../config/app-config.interface'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { BrowseService } from '../../core/browse/browse.service'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { RemoteData } from '../../core/data/remote-data'; import { PaginationService } from '../../core/pagination/pagination.service'; import { Item } from '../../core/shared/item.model'; import { isValidDate } from '../../shared/date.util'; +import { + hasValue, + isNotEmpty, +} from '../../shared/empty.util'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; -import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; -import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; import { StartsWithType } from '../../shared/starts-with/starts-with-decorator'; -import { map } from 'rxjs/operators'; +import { + BrowseByMetadataComponent, + browseParamsToOptions, + getBrowseSearchOptions, +} from '../browse-by-metadata/browse-by-metadata.component'; +import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; @Component({ selector: 'ds-browse-by-date', @@ -61,7 +87,7 @@ export class BrowseByDateComponent extends BrowseByMetadataComponent implements this.currentPagination$, this.currentSort$]).pipe( map(([routeParams, queryParams, scope, data, currentPage, currentSort]) => { return [Object.assign({}, routeParams, queryParams, data), scope, currentPage, currentSort]; - }) + }), ).subscribe(([params, scope, currentPage, currentSort]: [Params, string, PaginationComponentOptions, SortOptions]) => { const metadataKeys = params.browseDefinition ? params.browseDefinition.metadataKeys : this.defaultMetadataKeys; this.browseId = params.id || this.defaultBrowseId; @@ -89,7 +115,7 @@ export class BrowseByDateComponent extends BrowseByMetadataComponent implements firstItemRD$, lastItemRD$, ]).pipe( - map(([firstItemRD, lastItemRD]: [RemoteData, RemoteData]) => firstItemRD.isLoading || lastItemRD.isLoading) + map(([firstItemRD, lastItemRD]: [RemoteData, RemoteData]) => firstItemRD.isLoading || lastItemRD.isLoading), ); this.subs.push( observableCombineLatest([ @@ -97,7 +123,7 @@ export class BrowseByDateComponent extends BrowseByMetadataComponent implements lastItemRD$, ]).subscribe(([firstItemRD, lastItemRD]: [RemoteData, RemoteData]) => { let lowerLimit: number = this.getLimit(firstItemRD, metadataKeys, this.appConfig.browseBy.defaultLowerLimit); - let upperLimit: number = this.getLimit(lastItemRD, metadataKeys, new Date().getUTCFullYear()); + const upperLimit: number = this.getLimit(lastItemRD, metadataKeys, new Date().getUTCFullYear()); const options: number[] = []; const oneYearBreak: number = Math.floor((upperLimit - this.appConfig.browseBy.oneYearLimit) / 5) * 5; const fiveYearBreak: number = Math.floor((upperLimit - this.appConfig.browseBy.fiveYearLimit) / 10) * 10; diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index 603f8b531d..04a0b99651 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -1,8 +1,12 @@ import { first } from 'rxjs/operators'; -import { BrowseByGuard } from './browse-by-guard'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; + import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-definition.model'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../shared/remote-data.utils'; import { RouterStub } from '../shared/testing/router.stub'; +import { BrowseByGuard } from './browse-by-guard'; import { BrowseByDataType } from './browse-by-switcher/browse-by-data-type'; describe('BrowseByGuard', () => { diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index 5b8ec5f0ce..744b5d5ea8 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -1,15 +1,30 @@ -import { ActivatedRouteSnapshot, CanActivate, Data, Router, RouterStateSnapshot } from '@angular/router'; import { Injectable } from '@angular/core'; -import { hasNoValue, hasValue } from '../shared/empty.util'; -import { map, switchMap } from 'rxjs/operators'; -import { getFirstCompletedRemoteData } from '../core/shared/operators'; +import { + ActivatedRouteSnapshot, + CanActivate, + Data, + Router, + RouterStateSnapshot, +} from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; import { PAGE_NOT_FOUND_PATH } from '../app-routing-paths'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; import { RemoteData } from '../core/data/remote-data'; import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { getFirstCompletedRemoteData } from '../core/shared/operators'; +import { + hasNoValue, + hasValue, +} from '../shared/empty.util'; @Injectable() /** diff --git a/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.spec.ts b/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.spec.ts index 623982b174..c359983f14 100644 --- a/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.spec.ts +++ b/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.spec.ts @@ -1,19 +1,32 @@ -import { BrowseByMetadataComponent, browseParamsToOptions, getBrowseSearchOptions } from './browse-by-metadata.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { BrowseService } from '../../core/browse/browse.service'; import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; +import { cold } from 'jasmine-marbles'; +import { + Observable, + of as observableOf, +} from 'rxjs'; import { APP_CONFIG } from '../../../config/app-config.interface'; +import { BrowseService } from '../../core/browse/browse.service'; import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; import { SortDirection } from '../../core/cache/models/sort-options.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; -import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { PaginationService } from '../../core/pagination/pagination.service'; import { BrowseEntry } from '../../core/shared/browse-entry.model'; @@ -25,7 +38,11 @@ import { PaginationComponentOptions } from '../../shared/pagination/pagination-c import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; -import { cold } from 'jasmine-marbles'; +import { + BrowseByMetadataComponent, + browseParamsToOptions, + getBrowseSearchOptions, +} from './browse-by-metadata.component'; describe('BrowseByMetadataComponent', () => { let comp: BrowseByMetadataComponent; diff --git a/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts b/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts index bbcef69789..8d5382f27b 100644 --- a/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts +++ b/src/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts @@ -1,27 +1,52 @@ -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { Component, Inject, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { RemoteData } from '../../core/data/remote-data'; -import { PaginatedList } from '../../core/data/paginated-list.model'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { ActivatedRoute, Params, Router } from '@angular/router'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { + Component, + Inject, + Input, + OnChanges, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Params, + Router, +} from '@angular/router'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { + APP_CONFIG, + AppConfig, +} from '../../../config/app-config.interface'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { BrowseService } from '../../core/browse/browse.service'; import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; -import { StartsWithType } from '../../shared/starts-with/starts-with-decorator'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { RemoteData } from '../../core/data/remote-data'; import { PaginationService } from '../../core/pagination/pagination.service'; -import { map } from 'rxjs/operators'; -import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; -import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; -import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; -import { Context } from '../../core/shared/context.model'; import { BrowseEntry } from '../../core/shared/browse-entry.model'; -import { Collection } from '../../core/shared/collection.model'; -import { Community } from '../../core/shared/community.model'; +import { Context } from '../../core/shared/context.model'; import { Item } from '../../core/shared/item.model'; import { getFirstSucceededRemoteData } from '../../core/shared/operators'; +import { + hasValue, + isNotEmpty, +} from '../../shared/empty.util'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { StartsWithType } from '../../shared/starts-with/starts-with-decorator'; +import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; export const BBM_PAGINATION_ID = 'bbm'; @@ -167,7 +192,7 @@ export class BrowseByMetadataComponent implements OnInit, OnChanges, OnDestroy { observableCombineLatest([this.route.params, this.route.queryParams, this.scope$, this.currentPagination$, this.currentSort$]).pipe( map(([routeParams, queryParams, scope, currentPage, currentSort]) => { return [Object.assign({}, routeParams, queryParams), scope, currentPage, currentSort]; - }) + }), ).subscribe(([params, scope, currentPage, currentSort]: [Params, string, PaginationComponentOptions, SortOptions]) => { this.browseId = params.id || this.defaultBrowseId; this.authority = params.authority; @@ -187,9 +212,9 @@ export class BrowseByMetadataComponent implements OnInit, OnChanges, OnDestroy { } if (isNotEmpty(this.value)) { - this.updatePageWithItems(browseParamsToOptions(params, scope, currentPage, currentSort, this.browseId, this.fetchThumbnails), this.value, this.authority); + this.updatePageWithItems(browseParamsToOptions(params, scope, currentPage, currentSort, this.browseId, this.fetchThumbnails), this.value, this.authority); } else { - this.updatePage(browseParamsToOptions(params, scope, currentPage, currentSort, this.browseId, false)); + this.updatePage(browseParamsToOptions(params, scope, currentPage, currentSort, this.browseId, false)); } })); this.updateStartsWithTextOptions(); @@ -307,7 +332,7 @@ export function getBrowseSearchOptions(defaultBrowseId: string, * @param fetchThumbnail Optional parameter for requesting thumbnail images */ export function browseParamsToOptions(params: any, - scope: string, + scope: string, paginationConfig: PaginationComponentOptions, sortConfig: SortOptions, metadata?: string, diff --git a/src/app/browse-by/browse-by-page.module.ts b/src/app/browse-by/browse-by-page.module.ts index 34dfcf7f27..7602e9fa76 100644 --- a/src/app/browse-by/browse-by-page.module.ts +++ b/src/app/browse-by/browse-by-page.module.ts @@ -3,10 +3,10 @@ import { NgModule } from '@angular/core'; import { BrowseService } from '../core/browse/browse.service'; import { ItemDataService } from '../core/data/item-data.service'; import { SharedBrowseByModule } from '../shared/browse-by/shared-browse-by.module'; -import { BrowseByPageComponent } from './browse-by-page/browse-by-page.component'; import { SharedModule } from '../shared/shared.module'; import { BrowseByModule } from './browse-by.module'; import { BrowseByGuard } from './browse-by-guard'; +import { BrowseByPageComponent } from './browse-by-page/browse-by-page.component'; import { BrowseByRoutingModule } from './browse-by-routing.module'; const DECLARATIONS = [ diff --git a/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts b/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts index 25483028eb..688ce48bf8 100644 --- a/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts +++ b/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts @@ -1,17 +1,21 @@ // eslint-disable-next-line max-classes-per-file -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { BrowseByPageComponent } from './browse-by-page.component'; -import { BrowseBySwitcherComponent } from '../browse-by-switcher/browse-by-switcher.component'; -import { DynamicComponentLoaderDirective } from '../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { ActivatedRoute } from '@angular/router'; -import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; -import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; -import { ThemeService } from '../../shared/theme-support/theme.service'; -import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; import { Component } from '@angular/core'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; + +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { DynamicComponentLoaderDirective } from '../../shared/abstract-component-loader/dynamic-component-loader.directive'; +import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; +import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; +import { ThemeService } from '../../shared/theme-support/theme.service'; import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; +import { BrowseBySwitcherComponent } from '../browse-by-switcher/browse-by-switcher.component'; +import { BrowseByPageComponent } from './browse-by-page.component'; @rendersBrowseBy('BrowseByPageComponent' as BrowseByDataType) @Component({ diff --git a/src/app/browse-by/browse-by-page/browse-by-page.component.ts b/src/app/browse-by/browse-by-page/browse-by-page.component.ts index 9df02562c6..7007b89174 100644 --- a/src/app/browse-by/browse-by-page/browse-by-page.component.ts +++ b/src/app/browse-by/browse-by-page/browse-by-page.component.ts @@ -1,8 +1,12 @@ -import { Component, OnInit } from '@angular/core'; -import { map } from 'rxjs/operators'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { + Component, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; @Component({ diff --git a/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts b/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts index 62e666227d..8011f86713 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-decorator.ts @@ -1,8 +1,12 @@ import { Component } from '@angular/core'; -import { hasNoValue } from '../../shared/empty.util'; -import { DEFAULT_THEME, resolveTheme } from '../../shared/object-collection/shared/listable-object/listable-object.decorator'; + import { Context } from '../../core/shared/context.model'; import { GenericConstructor } from '../../core/shared/generic-constructor'; +import { hasNoValue } from '../../shared/empty.util'; +import { + DEFAULT_THEME, + resolveTheme, +} from '../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { BrowseByDataType } from './browse-by-data-type'; export const DEFAULT_BROWSE_BY_TYPE = BrowseByDataType.Metadata; diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts index 5d5eea230d..1c1898d95f 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts @@ -1,14 +1,22 @@ -import { BrowseBySwitcherComponent } from './browse-by-switcher.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { Component, SimpleChange } from '@angular/core'; -import { rendersBrowseBy } from './browse-by-decorator'; -import { ThemeService } from '../../shared/theme-support/theme.service'; +import { + Component, + SimpleChange, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; + import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; import { NonHierarchicalBrowseDefinition } from '../../core/shared/non-hierarchical-browse-definition'; -import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; -import { DynamicComponentLoaderDirective } from '../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { BrowseByDataType } from './browse-by-data-type'; import { ValueListBrowseDefinition } from '../../core/shared/value-list-browse-definition.model'; +import { DynamicComponentLoaderDirective } from '../../shared/abstract-component-loader/dynamic-component-loader.directive'; +import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; +import { ThemeService } from '../../shared/theme-support/theme.service'; +import { BrowseByDataType } from './browse-by-data-type'; +import { rendersBrowseBy } from './browse-by-decorator'; +import { BrowseBySwitcherComponent } from './browse-by-switcher.component'; @rendersBrowseBy('BrowseBySwitcherComponent' as BrowseByDataType) @Component({ diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts index 99b969417e..c7fcd4e9d3 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts @@ -1,13 +1,17 @@ -import { Component, Input } from '@angular/core'; -import { getComponentByBrowseByType } from './browse-by-decorator'; +import { + Component, + Input, +} from '@angular/core'; + +import { Context } from '../../core/shared/context.model'; import { GenericConstructor } from '../../core/shared/generic-constructor'; import { AbstractComponentLoaderComponent } from '../../shared/abstract-component-loader/abstract-component-loader.component'; import { BrowseByDataType } from './browse-by-data-type'; -import { Context } from '../../core/shared/context.model'; +import { getComponentByBrowseByType } from './browse-by-decorator'; @Component({ selector: 'ds-browse-by-switcher', - templateUrl: '../../shared/abstract-component-loader/abstract-component-loader.component.html' + templateUrl: '../../shared/abstract-component-loader/abstract-component-loader.component.html', }) export class BrowseBySwitcherComponent extends AbstractComponentLoaderComponent { diff --git a/src/app/browse-by/browse-by-switcher/dynamic-component-loader.directive.ts b/src/app/browse-by/browse-by-switcher/dynamic-component-loader.directive.ts index 8c77df1cdb..b670b7bea4 100644 --- a/src/app/browse-by/browse-by-switcher/dynamic-component-loader.directive.ts +++ b/src/app/browse-by/browse-by-switcher/dynamic-component-loader.directive.ts @@ -1,10 +1,13 @@ -import { Directive, ViewContainerRef } from '@angular/core'; +import { + Directive, + ViewContainerRef, +} from '@angular/core'; /** * Directive used as a hook to know where to inject the dynamic loaded component */ @Directive({ - selector: '[dsDynamicComponentLoader]' + selector: '[dsDynamicComponentLoader]', }) export class DynamicComponentLoaderDirective { diff --git a/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.spec.ts b/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.spec.ts index 687dad9279..6841acb1dc 100644 --- a/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.spec.ts +++ b/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.spec.ts @@ -1,14 +1,17 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { BrowseByTaxonomyComponent } from './browse-by-taxonomy.component'; -import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; -import { TranslateModule } from '@ngx-translate/core'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; import { BehaviorSubject } from 'rxjs'; import { HierarchicalBrowseDefinition } from '../../core/shared/hierarchical-browse-definition.model'; +import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { ThemeService } from '../../shared/theme-support/theme.service'; import { createDataWithBrowseDefinition } from '../browse-by-switcher/browse-by-switcher.component.spec'; +import { BrowseByTaxonomyComponent } from './browse-by-taxonomy.component'; describe('BrowseByTaxonomyComponent', () => { let component: BrowseByTaxonomyComponent; diff --git a/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts b/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts index 5ee080d115..92dc7a4a6e 100644 --- a/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts +++ b/src/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts @@ -1,15 +1,29 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model'; -import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; -import { ActivatedRoute, Params } from '@angular/router'; -import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; -import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; +import { + Component, + Input, + OnChanges, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Params, +} from '@angular/router'; +import { + BehaviorSubject, + Observable, + Subscription, +} from 'rxjs'; import { map } from 'rxjs/operators'; -import { HierarchicalBrowseDefinition } from '../../core/shared/hierarchical-browse-definition.model'; -import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; + +import { BrowseDefinition } from '../../core/shared/browse-definition.model'; import { Context } from '../../core/shared/context.model'; +import { HierarchicalBrowseDefinition } from '../../core/shared/hierarchical-browse-definition.model'; +import { VocabularyEntryDetail } from '../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; +import { VocabularyOptions } from '../../core/submission/vocabularies/models/vocabulary-options.model'; import { hasValue } from '../../shared/empty.util'; +import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; @Component({ selector: 'ds-browse-by-taxonomy', diff --git a/src/app/browse-by/browse-by-title/browse-by-title.component.spec.ts b/src/app/browse-by/browse-by-title/browse-by-title.component.spec.ts index 6e47668e1b..83d52db2ae 100644 --- a/src/app/browse-by/browse-by-title/browse-by-title.component.spec.ts +++ b/src/app/browse-by/browse-by-title/browse-by-title.component.spec.ts @@ -1,7 +1,14 @@ import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; @@ -21,8 +28,8 @@ import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { EnumKeysPipe } from '../../shared/utils/enum-keys-pipe'; import { VarDirective } from '../../shared/utils/var.directive'; -import { BrowseByTitleComponent } from './browse-by-title.component'; import { toRemoteData } from '../browse-by-metadata/browse-by-metadata.component.spec'; +import { BrowseByTitleComponent } from './browse-by-title.component'; describe('BrowseByTitleComponent', () => { let comp: BrowseByTitleComponent; diff --git a/src/app/browse-by/browse-by-title/browse-by-title.component.ts b/src/app/browse-by/browse-by-title/browse-by-title.component.ts index e05ca46d33..d7e5ca4494 100644 --- a/src/app/browse-by/browse-by-title/browse-by-title.component.ts +++ b/src/app/browse-by/browse-by-title/browse-by-title.component.ts @@ -1,17 +1,28 @@ -import { combineLatest as observableCombineLatest } from 'rxjs'; -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; import { Params } from '@angular/router'; -import { BrowseByMetadataComponent, browseParamsToOptions, getBrowseSearchOptions } from '../browse-by-metadata/browse-by-metadata.component'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { combineLatest as observableCombineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; + +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; +import { + BrowseByMetadataComponent, + browseParamsToOptions, + getBrowseSearchOptions, +} from '../browse-by-metadata/browse-by-metadata.component'; import { BrowseByDataType } from '../browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; @Component({ selector: 'ds-browse-by-title', styleUrls: ['../browse-by-metadata/browse-by-metadata.component.scss'], - templateUrl: '../browse-by-metadata/browse-by-metadata.component.html' + templateUrl: '../browse-by-metadata/browse-by-metadata.component.html', }) /** * Component for browsing items by title (dc.title) @@ -29,7 +40,7 @@ export class BrowseByTitleComponent extends BrowseByMetadataComponent implements observableCombineLatest([this.route.params, this.route.queryParams, this.scope$, this.currentPagination$, this.currentSort$]).pipe( map(([routeParams, queryParams, scope, currentPage, currentSort]) => { return [Object.assign({}, routeParams, queryParams), scope, currentPage, currentSort]; - }) + }), ).subscribe(([params, scope, currentPage, currentSort]: [Params, string, PaginationComponentOptions, SortOptions]) => { this.startsWith = +params.startsWith || params.startsWith; this.browseId = params.id || this.defaultBrowseId; diff --git a/src/app/browse-by/browse-by.module.ts b/src/app/browse-by/browse-by.module.ts index 2d84cb6e2c..4fcbc61ec5 100644 --- a/src/app/browse-by/browse-by.module.ts +++ b/src/app/browse-by/browse-by.module.ts @@ -1,14 +1,15 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { BrowseByTitleComponent } from './browse-by-title/browse-by-title.component'; -import { BrowseByMetadataComponent } from './browse-by-metadata/browse-by-metadata.component'; -import { BrowseByDateComponent } from './browse-by-date/browse-by-date.component'; -import { BrowseBySwitcherComponent } from './browse-by-switcher/browse-by-switcher.component'; -import { BrowseByTaxonomyComponent } from './browse-by-taxonomy/browse-by-taxonomy.component'; + import { SharedBrowseByModule } from '../shared/browse-by/shared-browse-by.module'; import { DsoPageModule } from '../shared/dso-page/dso-page.module'; import { FormModule } from '../shared/form/form.module'; import { SharedModule } from '../shared/shared.module'; +import { BrowseByDateComponent } from './browse-by-date/browse-by-date.component'; +import { BrowseByMetadataComponent } from './browse-by-metadata/browse-by-metadata.component'; +import { BrowseBySwitcherComponent } from './browse-by-switcher/browse-by-switcher.component'; +import { BrowseByTaxonomyComponent } from './browse-by-taxonomy/browse-by-taxonomy.component'; +import { BrowseByTitleComponent } from './browse-by-title/browse-by-title.component'; const DECLARATIONS = [ BrowseBySwitcherComponent, @@ -32,12 +33,12 @@ const ENTRY_COMPONENTS = [ ], declarations: [ ...DECLARATIONS, - ...ENTRY_COMPONENTS + ...ENTRY_COMPONENTS, ], exports: [ ...DECLARATIONS, ...ENTRY_COMPONENTS, - ] + ], }) export class BrowseByModule { /** diff --git a/src/app/collection-page/collection-page-routing.module.ts b/src/app/collection-page/collection-page-routing.module.ts index 72174b2b17..75ce2fe9d2 100644 --- a/src/app/collection-page/collection-page-routing.module.ts +++ b/src/app/collection-page/collection-page-routing.module.ts @@ -1,27 +1,31 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; +import { BrowseByGuard } from '../browse-by/browse-by-guard'; +import { BrowseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { CollectionBreadcrumbResolver } from '../core/breadcrumbs/collection-breadcrumb.resolver'; import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { LinkService } from '../core/cache/builders/link.service'; +import { ComcolBrowseByComponent } from '../shared/comcol/sections/comcol-browse-by/comcol-browse-by.component'; +import { ComcolSearchSectionComponent } from '../shared/comcol/sections/comcol-search-section/comcol-search-section.component'; import { DSOEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { CollectionPageResolver } from './collection-page.resolver'; import { CollectionPageAdministratorGuard } from './collection-page-administrator.guard'; -import { COLLECTION_CREATE_PATH, COLLECTION_EDIT_PATH, ITEMTEMPLATE_PATH } from './collection-page-routing-paths'; +import { + COLLECTION_CREATE_PATH, + COLLECTION_EDIT_PATH, + ITEMTEMPLATE_PATH, +} from './collection-page-routing-paths'; import { CreateCollectionPageComponent } from './create-collection-page/create-collection-page.component'; import { CreateCollectionPageGuard } from './create-collection-page/create-collection-page.guard'; import { DeleteCollectionPageComponent } from './delete-collection-page/delete-collection-page.component'; import { ItemTemplatePageResolver } from './edit-item-template-page/item-template-page.resolver'; import { ThemedEditItemTemplatePageComponent } from './edit-item-template-page/themed-edit-item-template-page.component'; import { ThemedCollectionPageComponent } from './themed-collection-page.component'; -import { ComcolBrowseByComponent } from '../shared/comcol/sections/comcol-browse-by/comcol-browse-by.component'; -import { BrowseByGuard } from '../browse-by/browse-by-guard'; -import { BrowseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; -import { ComcolSearchSectionComponent } from '../shared/comcol/sections/comcol-search-section/comcol-search-section.component'; @NgModule({ imports: [ @@ -82,7 +86,7 @@ import { ComcolSearchSectionComponent } from '../shared/comcol/sections/comcol-s data: { breadcrumbKey: 'browse.metadata' }, }, ], - } + }, ], data: { menu: { diff --git a/src/app/collection-page/collection-page.component.ts b/src/app/collection-page/collection-page.component.ts index 798f92412a..86f99518ee 100644 --- a/src/app/collection-page/collection-page.component.ts +++ b/src/app/collection-page/collection-page.component.ts @@ -1,21 +1,40 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ChangeDetectionStrategy, + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { Observable } from 'rxjs'; -import { filter, map, mergeMap, take } from 'rxjs/operators'; +import { + filter, + map, + mergeMap, + take, +} from 'rxjs/operators'; + +import { AuthService } from '../core/auth/auth.service'; +import { DSONameService } from '../core/breadcrumbs/dso-name.service'; import { SortOptions } from '../core/cache/models/sort-options.model'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { RemoteData } from '../core/data/remote-data'; import { redirectOn4xx } from '../core/shared/authorized.operators'; import { Bitstream } from '../core/shared/bitstream.model'; import { Collection } from '../core/shared/collection.model'; import { getAllSucceededRemoteDataPayload } from '../core/shared/operators'; -import { fadeIn, fadeInOut } from '../shared/animations/fade'; -import { hasValue, isNotEmpty } from '../shared/empty.util'; +import { + fadeIn, + fadeInOut, +} from '../shared/animations/fade'; +import { + hasValue, + isNotEmpty, +} from '../shared/empty.util'; import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; -import { AuthService } from '../core/auth/auth.service'; -import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; -import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { getCollectionPageRoute } from './collection-page-routing-paths'; -import { DSONameService } from '../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-collection-page', diff --git a/src/app/collection-page/collection-page.module.ts b/src/app/collection-page/collection-page.module.ts index 7071b842da..4651270ffe 100644 --- a/src/app/collection-page/collection-page.module.ts +++ b/src/app/collection-page/collection-page.module.ts @@ -1,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { BrowseByPageModule } from '../browse-by/browse-by-page.module'; import { SearchService } from '../core/shared/search/search.service'; import { DsoSharedModule } from '../dso-shared/dso-shared.module'; import { EditItemPageModule } from '../item-page/edit-item-page/edit-item-page.module'; @@ -17,7 +18,6 @@ import { DeleteCollectionPageComponent } from './delete-collection-page/delete-c import { EditItemTemplatePageComponent } from './edit-item-template-page/edit-item-template-page.component'; import { ThemedEditItemTemplatePageComponent } from './edit-item-template-page/themed-edit-item-template-page.component'; import { ThemedCollectionPageComponent } from './themed-collection-page.component'; -import { BrowseByPageModule } from '../browse-by/browse-by-page.module'; const DECLARATIONS = [ CollectionPageComponent, diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts index 748e29a251..de28e4a23c 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.spec.ts @@ -1,10 +1,16 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { CollectionAccessControlComponent } from './collection-access-control.component'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; -import { of, of as observableOf } from 'rxjs'; -import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { + of as observableOf, + of, +} from 'rxjs'; + import { Community } from '../../../core/shared/community.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { CollectionAccessControlComponent } from './collection-access-control.component'; describe('CollectionAccessControlComponent', () => { let component: CollectionAccessControlComponent; @@ -13,26 +19,26 @@ describe('CollectionAccessControlComponent', () => { { type: 'community', metadata: { - 'dc.title': [{ value: 'community' }] + 'dc.title': [{ value: 'community' }], }, uuid: 'communityUUID', parentCommunity: observableOf(Object.assign(createSuccessfulRemoteDataObject(undefined), { statusCode: 204 })), _links: { parentCommunity: 'site', - self: '/' + 'communityUUID' - } - } + self: '/' + 'communityUUID', + }, + }, ); const routeStub = { parent: { - parent: { - data: of({ - dso: createSuccessfulRemoteDataObject(testCommunity) - }) - } - } + parent: { + data: of({ + dso: createSuccessfulRemoteDataObject(testCommunity), + }), + }, + }, }; beforeEach(async () => { diff --git a/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.spec.ts index 44b5014693..db922cba65 100644 --- a/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.spec.ts +++ b/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.spec.ts @@ -1,6 +1,10 @@ import { HttpClient } from '@angular/common/http'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; diff --git a/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.ts b/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.ts index 67243c7bed..e6f1cef898 100644 --- a/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-source/collection-source-controls/collection-source-controls.component.ts @@ -1,22 +1,40 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { + BehaviorSubject, + Observable, + Subscription, +} from 'rxjs'; +import { + filter, + map, + switchMap, + tap, +} from 'rxjs/operators'; + +import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; +import { CollectionDataService } from '../../../../core/data/collection-data.service'; +import { ProcessDataService } from '../../../../core/data/processes/process-data.service'; import { ScriptDataService } from '../../../../core/data/processes/script-data.service'; import { RequestService } from '../../../../core/data/request.service'; import { Collection } from '../../../../core/shared/collection.model'; import { ContentSource } from '../../../../core/shared/content-source.model'; import { ContentSourceSetSerializer } from '../../../../core/shared/content-source-set-serializer'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators'; -import { filter, map, switchMap, tap } from 'rxjs/operators'; -import { hasValue } from '../../../../shared/empty.util'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload, +} from '../../../../core/shared/operators'; import { Process } from '../../../../process-page/processes/process.model'; import { ProcessStatus } from '../../../../process-page/processes/process-status.model'; +import { hasValue } from '../../../../shared/empty.util'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, Observable, Subscription } from 'rxjs'; - -import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; -import { CollectionDataService } from '../../../../core/data/collection-data.service'; -import { ProcessDataService } from '../../../../core/data/processes/process-data.service'; /** * Component that contains the controls to run, reset and test the harvest @@ -96,7 +114,7 @@ export class CollectionSourceControlsComponent implements OnInit, OnDestroy { this.autoRefreshIDs.push(rd.payload.processId); return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId); }), - map((rd) => rd.payload) + map((rd) => rd.payload), ).subscribe((process: Process) => { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { this.notificationsService.error(this.translateService.get('collection.source.controls.test.failed')); @@ -140,7 +158,7 @@ export class CollectionSourceControlsComponent implements OnInit, OnDestroy { this.autoRefreshIDs.push(rd.payload.processId); return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId); }), - map((rd) => rd.payload) + map((rd) => rd.payload), ).subscribe((process) => { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { this.notificationsService.error(this.translateService.get('collection.source.controls.import.failed')); @@ -178,7 +196,7 @@ export class CollectionSourceControlsComponent implements OnInit, OnDestroy { this.autoRefreshIDs.push(rd.payload.processId); return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId); }), - map((rd) => rd.payload) + map((rd) => rd.payload), ).subscribe((process) => { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { this.notificationsService.error(this.translateService.get('collection.source.controls.reset.failed')); diff --git a/src/app/community-list-page/community-list/community-list.component.spec.ts b/src/app/community-list-page/community-list/community-list.component.spec.ts index 67e961243e..434a14a85f 100644 --- a/src/app/community-list-page/community-list/community-list.component.spec.ts +++ b/src/app/community-list-page/community-list/community-list.component.spec.ts @@ -1,8 +1,23 @@ import { CdkTreeModule } from '@angular/cdk/tree'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core'; +import { + CUSTOM_ELEMENTS_SCHEMA, + DebugElement, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + inject, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { RouterLinkWithHref } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; import { v4 as uuidv4 } from 'uuid'; @@ -10,14 +25,19 @@ import { buildPaginatedList } from '../../core/data/paginated-list.model'; import { Collection } from '../../core/shared/collection.model'; import { Community } from '../../core/shared/community.model'; import { PageInfo } from '../../core/shared/page-info.model'; -import { isEmpty, isNotEmpty } from '../../shared/empty.util'; +import { + isEmpty, + isNotEmpty, +} from '../../shared/empty.util'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { CommunityListService, showMoreFlatNode, toFlatNode } from '../community-list-service'; +import { + CommunityListService, + showMoreFlatNode, + toFlatNode, +} from '../community-list-service'; import { FlatNode } from '../flat-node.model'; import { CommunityListComponent } from './community-list.component'; -import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { RouterLinkWithHref } from '@angular/router'; describe('CommunityListComponent', () => { let component: CommunityListComponent; diff --git a/src/app/community-list-page/community-list/community-list.component.ts b/src/app/community-list-page/community-list/community-list.component.ts index 05b0f8902b..369e51ea12 100644 --- a/src/app/community-list-page/community-list/community-list.component.ts +++ b/src/app/community-list-page/community-list/community-list.component.ts @@ -1,9 +1,16 @@ import { FlatTreeControl } from '@angular/cdk/tree'; -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, +} from '@angular/core'; import { take } from 'rxjs/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { FindListOptions } from '../../core/data/find-list-options.model'; import { isEmpty } from '../../shared/empty.util'; import { CommunityListDatasource } from '../community-list-datasource'; diff --git a/src/app/community-page/community-page-routing.module.ts b/src/app/community-page/community-page-routing.module.ts index 36283af9ba..2d86223801 100644 --- a/src/app/community-page/community-page-routing.module.ts +++ b/src/app/community-page/community-page-routing.module.ts @@ -1,26 +1,29 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; +import { BrowseByGuard } from '../browse-by/browse-by-guard'; +import { BrowseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { CommunityBreadcrumbResolver } from '../core/breadcrumbs/community-breadcrumb.resolver'; import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { LinkService } from '../core/cache/builders/link.service'; +import { ComcolBrowseByComponent } from '../shared/comcol/sections/comcol-browse-by/comcol-browse-by.component'; +import { ComcolSearchSectionComponent } from '../shared/comcol/sections/comcol-search-section/comcol-search-section.component'; import { DSOEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { CommunityPageResolver } from './community-page.resolver'; import { CommunityPageAdministratorGuard } from './community-page-administrator.guard'; -import { COMMUNITY_CREATE_PATH, COMMUNITY_EDIT_PATH } from './community-page-routing-paths'; +import { + COMMUNITY_CREATE_PATH, + COMMUNITY_EDIT_PATH, +} from './community-page-routing-paths'; import { CreateCommunityPageComponent } from './create-community-page/create-community-page.component'; import { CreateCommunityPageGuard } from './create-community-page/create-community-page.guard'; import { DeleteCommunityPageComponent } from './delete-community-page/delete-community-page.component'; -import { ThemedCommunityPageComponent } from './themed-community-page.component'; -import { ComcolSearchSectionComponent } from '../shared/comcol/sections/comcol-search-section/comcol-search-section.component'; import { SubComColSectionComponent } from './sections/sub-com-col-section/sub-com-col-section.component'; -import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; -import { ComcolBrowseByComponent } from '../shared/comcol/sections/comcol-browse-by/comcol-browse-by.component'; -import { BrowseByGuard } from '../browse-by/browse-by-guard'; -import { BrowseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; +import { ThemedCommunityPageComponent } from './themed-community-page.component'; @NgModule({ imports: [ diff --git a/src/app/community-page/community-page.component.ts b/src/app/community-page/community-page.component.ts index f59d1eb183..916de6f67b 100644 --- a/src/app/community-page/community-page.component.ts +++ b/src/app/community-page/community-page.component.ts @@ -1,19 +1,31 @@ -import { filter, map, mergeMap } from 'rxjs/operators'; -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ChangeDetectionStrategy, + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { Observable } from 'rxjs'; +import { + filter, + map, + mergeMap, +} from 'rxjs/operators'; + +import { AuthService } from '../core/auth/auth.service'; +import { DSONameService } from '../core/breadcrumbs/dso-name.service'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { RemoteData } from '../core/data/remote-data'; import { redirectOn4xx } from '../core/shared/authorized.operators'; import { Bitstream } from '../core/shared/bitstream.model'; import { Community } from '../core/shared/community.model'; +import { getAllSucceededRemoteDataPayload } from '../core/shared/operators'; import { fadeInOut } from '../shared/animations/fade'; import { hasValue } from '../shared/empty.util'; -import { getAllSucceededRemoteDataPayload } from '../core/shared/operators'; -import { AuthService } from '../core/auth/auth.service'; -import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; -import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { getCommunityPageRoute } from './community-page-routing-paths'; -import { DSONameService } from '../core/breadcrumbs/dso-name.service'; @Component({ selector: 'ds-community-page', diff --git a/src/app/community-page/community-page.module.ts b/src/app/community-page/community-page.module.ts index 49dd3aa335..07434c9673 100644 --- a/src/app/community-page/community-page.module.ts +++ b/src/app/community-page/community-page.module.ts @@ -1,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { BrowseByPageModule } from '../browse-by/browse-by-page.module'; import { ComcolModule } from '../shared/comcol/comcol.module'; import { DsoPageModule } from '../shared/dso-page/dso-page.module'; import { SharedModule } from '../shared/shared.module'; @@ -10,13 +11,12 @@ import { CommunityPageComponent } from './community-page.component'; import { CommunityPageRoutingModule } from './community-page-routing.module'; import { CreateCommunityPageComponent } from './create-community-page/create-community-page.component'; import { DeleteCommunityPageComponent } from './delete-community-page/delete-community-page.component'; -import { ThemedCommunityPageComponent } from './themed-community-page.component'; -import { ThemedCommunityPageSubCommunityListComponent } from './sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component'; +import { CommunityPageSubCollectionListComponent } from './sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; import { ThemedCollectionPageSubCollectionListComponent } from './sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component'; import { SubComColSectionComponent } from './sections/sub-com-col-section/sub-com-col-section.component'; -import { BrowseByPageModule } from '../browse-by/browse-by-page.module'; -import { CommunityPageSubCollectionListComponent } from './sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageSubCommunityListComponent } from './sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component'; +import { ThemedCommunityPageSubCommunityListComponent } from './sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component'; +import { ThemedCommunityPageComponent } from './themed-community-page.component'; const DECLARATIONS = [ CommunityPageComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts index bec709e89a..aa01183519 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.spec.ts @@ -1,11 +1,16 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { CommunityAccessControlComponent } from './community-access-control.component'; -import { Community } from '../../../core/shared/community.model'; -import { of, of as observableOf } from 'rxjs'; -import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; - +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; +import { + of as observableOf, + of, +} from 'rxjs'; + +import { Community } from '../../../core/shared/community.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { CommunityAccessControlComponent } from './community-access-control.component'; describe('CommunityAccessControlComponent', () => { let component: CommunityAccessControlComponent; @@ -14,26 +19,26 @@ describe('CommunityAccessControlComponent', () => { { type: 'community', metadata: { - 'dc.title': [{ value: 'community' }] + 'dc.title': [{ value: 'community' }], }, uuid: 'communityUUID', parentCommunity: observableOf(Object.assign(createSuccessfulRemoteDataObject(undefined), { statusCode: 204 })), _links: { parentCommunity: 'site', - self: '/' + 'communityUUID' - } - } + self: '/' + 'communityUUID', + }, + }, ); const routeStub = { parent: { parent: { data: of({ - dso: createSuccessfulRemoteDataObject(testCommunity) - }) - } - } + dso: createSuccessfulRemoteDataObject(testCommunity), + }), + }, + }, }; diff --git a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.spec.ts b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.spec.ts index 657ec912e4..2a6ec9510c 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.spec.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.spec.ts @@ -1,33 +1,40 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; -import { CommunityPageSubCollectionListComponent } from './community-page-sub-collection-list.component'; -import { Community } from '../../../../core/shared/community.model'; -import { SharedModule } from '../../../../shared/shared.module'; import { CollectionDataService } from '../../../../core/data/collection-data.service'; -import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; -import { buildPaginatedList } from '../../../../core/data/paginated-list.model'; -import { PageInfo } from '../../../../core/shared/page-info.model'; -import { HostWindowService } from '../../../../shared/host-window.service'; -import { HostWindowServiceStub } from '../../../../shared/testing/host-window-service.stub'; -import { SelectableListService } from '../../../../shared/object-list/selectable-list/selectable-list.service'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; -import { getMockThemeService } from '../../../../shared/mocks/theme-service.mock'; -import { ThemeService } from '../../../../shared/theme-support/theme.service'; -import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; -import { FindListOptions } from '../../../../core/data/find-list-options.model'; -import { GroupDataService } from '../../../../core/eperson/group-data.service'; -import { LinkHeadService } from '../../../../core/services/link-head.service'; import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; -import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { FindListOptions } from '../../../../core/data/find-list-options.model'; +import { buildPaginatedList } from '../../../../core/data/paginated-list.model'; +import { GroupDataService } from '../../../../core/eperson/group-data.service'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { LinkHeadService } from '../../../../core/services/link-head.service'; +import { Community } from '../../../../core/shared/community.model'; import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; -import { createPaginatedList } from '../../../../shared/testing/utils.test'; +import { PageInfo } from '../../../../core/shared/page-info.model'; +import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { HostWindowService } from '../../../../shared/host-window.service'; +import { getMockThemeService } from '../../../../shared/mocks/theme-service.mock'; +import { SelectableListService } from '../../../../shared/object-list/selectable-list/selectable-list.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; +import { SharedModule } from '../../../../shared/shared.module'; +import { HostWindowServiceStub } from '../../../../shared/testing/host-window-service.stub'; +import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service.stub'; +import { createPaginatedList } from '../../../../shared/testing/utils.test'; +import { ThemeService } from '../../../../shared/theme-support/theme.service'; +import { CommunityPageSubCollectionListComponent } from './community-page-sub-collection-list.component'; describe('CommunityPageSubCollectionListComponent', () => { let comp: CommunityPageSubCollectionListComponent; diff --git a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts index 421707d700..f526f76641 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts @@ -1,17 +1,30 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Subscription } from 'rxjs'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Subscription, +} from 'rxjs'; +import { switchMap } from 'rxjs/operators'; + +import { + SortDirection, + SortOptions, +} from '../../../../core/cache/models/sort-options.model'; +import { CollectionDataService } from '../../../../core/data/collection-data.service'; +import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; import { Collection } from '../../../../core/shared/collection.model'; import { Community } from '../../../../core/shared/community.model'; import { fadeIn } from '../../../../shared/animations/fade'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../../../core/cache/models/sort-options.model'; -import { CollectionDataService } from '../../../../core/data/collection-data.service'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; -import { switchMap } from 'rxjs/operators'; import { hasValue } from '../../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; @Component({ selector: 'ds-community-page-sub-collection-list', diff --git a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component.ts b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component.ts index ebbec33e8e..edc15260f6 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component.ts @@ -1,7 +1,11 @@ +import { + Component, + Input, +} from '@angular/core'; + +import { Community } from '../../../../core/shared/community.model'; import { ThemedComponent } from '../../../../shared/theme-support/themed.component'; import { CommunityPageSubCollectionListComponent } from './community-page-sub-collection-list.component'; -import { Component, Input } from '@angular/core'; -import { Community } from '../../../../core/shared/community.model'; @Component({ selector: 'ds-themed-community-page-sub-collection-list', diff --git a/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.spec.ts b/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.spec.ts index cb3c41aa97..e28ff98ee7 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.spec.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.spec.ts @@ -1,7 +1,11 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { SubComColSectionComponent } from './sub-com-col-section.component'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; + import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; +import { SubComColSectionComponent } from './sub-com-col-section.component'; describe('SubComColSectionComponent', () => { let component: SubComColSectionComponent; diff --git a/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.ts b/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.ts index a72674adec..eb6f827240 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-com-col-section.component.ts @@ -1,9 +1,16 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Data, +} from '@angular/router'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { RemoteData } from '../../../core/data/remote-data'; import { Community } from '../../../core/shared/community.model'; -import { ActivatedRoute, Data } from '@angular/router'; -import { map } from 'rxjs/operators'; @Component({ selector: 'ds-sub-com-col-section', diff --git a/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.spec.ts b/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.spec.ts index 9a0c523ada..3b04db7ff6 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.spec.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.spec.ts @@ -1,32 +1,39 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; -import { CommunityPageSubCommunityListComponent } from './community-page-sub-community-list.component'; -import { Community } from '../../../../core/shared/community.model'; -import { buildPaginatedList } from '../../../../core/data/paginated-list.model'; -import { PageInfo } from '../../../../core/shared/page-info.model'; -import { SharedModule } from '../../../../shared/shared.module'; -import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; -import { HostWindowService } from '../../../../shared/host-window.service'; -import { HostWindowServiceStub } from '../../../../shared/testing/host-window-service.stub'; import { CommunityDataService } from '../../../../core/data/community-data.service'; -import { SelectableListService } from '../../../../shared/object-list/selectable-list/selectable-list.service'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; -import { getMockThemeService } from '../../../../shared/mocks/theme-service.mock'; -import { ThemeService } from '../../../../shared/theme-support/theme.service'; -import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; -import { FindListOptions } from '../../../../core/data/find-list-options.model'; -import { GroupDataService } from '../../../../core/eperson/group-data.service'; -import { LinkHeadService } from '../../../../core/services/link-head.service'; import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; -import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; -import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service.stub'; +import { FindListOptions } from '../../../../core/data/find-list-options.model'; +import { buildPaginatedList } from '../../../../core/data/paginated-list.model'; +import { GroupDataService } from '../../../../core/eperson/group-data.service'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { LinkHeadService } from '../../../../core/services/link-head.service'; +import { Community } from '../../../../core/shared/community.model'; import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; +import { PageInfo } from '../../../../core/shared/page-info.model'; +import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { HostWindowService } from '../../../../shared/host-window.service'; +import { getMockThemeService } from '../../../../shared/mocks/theme-service.mock'; +import { SelectableListService } from '../../../../shared/object-list/selectable-list/selectable-list.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; +import { SharedModule } from '../../../../shared/shared.module'; +import { HostWindowServiceStub } from '../../../../shared/testing/host-window-service.stub'; +import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub'; +import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service.stub'; import { createPaginatedList } from '../../../../shared/testing/utils.test'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { ThemeService } from '../../../../shared/theme-support/theme.service'; +import { CommunityPageSubCommunityListComponent } from './community-page-sub-community-list.component'; describe('CommunityPageSubCommunityListComponent', () => { let comp: CommunityPageSubCommunityListComponent; diff --git a/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts b/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts index 6b83a3a03a..181e6a3bd4 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts @@ -1,17 +1,29 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Subscription } from 'rxjs'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Subscription, +} from 'rxjs'; import { switchMap } from 'rxjs/operators'; +import { + SortDirection, + SortOptions, +} from '../../../../core/cache/models/sort-options.model'; +import { CommunityDataService } from '../../../../core/data/community-data.service'; +import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; import { Community } from '../../../../core/shared/community.model'; import { fadeIn } from '../../../../shared/animations/fade'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../../../core/cache/models/sort-options.model'; -import { CommunityDataService } from '../../../../core/data/community-data.service'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; import { hasValue } from '../../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; @Component({ selector: 'ds-community-page-sub-community-list', diff --git a/src/app/community-page/sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component.ts b/src/app/community-page/sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component.ts index 9c500cac10..8de902138e 100644 --- a/src/app/community-page/sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component.ts +++ b/src/app/community-page/sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component.ts @@ -1,7 +1,11 @@ +import { + Component, + Input, +} from '@angular/core'; + +import { Community } from '../../../../core/shared/community.model'; import { ThemedComponent } from '../../../../shared/theme-support/themed.component'; import { CommunityPageSubCommunityListComponent } from './community-page-sub-community-list.component'; -import { Component, Input } from '@angular/core'; -import { Community } from '../../../../core/shared/community.model'; @Component({ selector: 'ds-themed-community-page-sub-community-list', diff --git a/src/app/core/auth/auth.interceptor.spec.ts b/src/app/core/auth/auth.interceptor.spec.ts index e87ba3ae6c..d824df472a 100644 --- a/src/app/core/auth/auth.interceptor.spec.ts +++ b/src/app/core/auth/auth.interceptor.spec.ts @@ -1,5 +1,8 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { + HttpClientTestingModule, + HttpTestingController, +} from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 8fff24df23..7da72b25b6 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -1,20 +1,50 @@ import { HttpHeaders } from '@angular/common/http'; -import { Inject, Injectable, Optional } from '@angular/core'; +import { + Inject, + Injectable, + Optional, +} from '@angular/core'; import { Router } from '@angular/router'; -import { select, Store } from '@ngrx/store'; -import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; +import { + select, + Store, +} from '@ngrx/store'; +import { + REQUEST, + RESPONSE, +} from '@nguniversal/express-engine/tokens'; import { TranslateService } from '@ngx-translate/core'; import { CookieAttributes } from 'js-cookie'; -import { Observable, of as observableOf } from 'rxjs'; -import { filter, map, startWith, switchMap, take } from 'rxjs/operators'; +import { + Observable, + of as observableOf, +} from 'rxjs'; +import { + filter, + map, + startWith, + switchMap, + take, +} from 'rxjs/operators'; import { environment } from '../../../environments/environment'; import { AppState } from '../../app.reducer'; -import { hasNoValue, hasValue, hasValueOperator, isEmpty, isNotEmpty, isNotNull, isNotUndefined } from '../../shared/empty.util'; +import { + hasNoValue, + hasValue, + hasValueOperator, + isEmpty, + isNotEmpty, + isNotNull, + isNotUndefined, +} from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { followLink } from '../../shared/utils/follow-link-config.model'; -import { buildPaginatedList, PaginatedList } from '../data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { EPersonDataService } from '../eperson/eperson-data.service'; @@ -23,15 +53,41 @@ import { Group } from '../eperson/models/group.model'; import { CookieService } from '../services/cookie.service'; import { HardRedirectService } from '../services/hard-redirect.service'; import { RouteService } from '../services/route.service'; -import { NativeWindowRef, NativeWindowService } from '../services/window.service'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData } from '../shared/operators'; +import { + NativeWindowRef, + NativeWindowService, +} from '../services/window.service'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, +} from '../shared/operators'; import { PageInfo } from '../shared/page-info.model'; -import { CheckAuthenticationTokenAction, RefreshTokenAction, ResetAuthenticationMessagesAction, SetAuthCookieStatus, SetRedirectUrlAction, SetUserAsIdleAction, UnsetUserAsIdleAction } from './auth.actions'; +import { + CheckAuthenticationTokenAction, + RefreshTokenAction, + ResetAuthenticationMessagesAction, + SetAuthCookieStatus, + SetRedirectUrlAction, + SetUserAsIdleAction, + UnsetUserAsIdleAction, +} from './auth.actions'; import { AuthRequestService } from './auth-request.service'; import { AuthMethod } from './models/auth.method'; import { AuthStatus } from './models/auth-status.model'; -import { AuthTokenInfo, TOKENITEM } from './models/auth-token-info.model'; -import { getAuthenticatedUserId, getAuthenticationToken, getExternalAuthCookieStatus, getRedirectUrl, isAuthenticated, isAuthenticatedLoaded, isIdle, isTokenRefreshing } from './selectors'; +import { + AuthTokenInfo, + TOKENITEM, +} from './models/auth-token-info.model'; +import { + getAuthenticatedUserId, + getAuthenticationToken, + getExternalAuthCookieStatus, + getRedirectUrl, + isAuthenticated, + isAuthenticatedLoaded, + isIdle, + isTokenRefreshing, +} from './selectors'; export const LOGIN_ROUTE = '/login'; export const LOGOUT_ROUTE = '/logout'; diff --git a/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.spec.ts b/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.spec.ts index 81b3b8ad2a..db89d02f75 100644 --- a/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.spec.ts +++ b/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.spec.ts @@ -18,25 +18,25 @@ describe('NavigationBreadcrumbResolver', () => { relatedRoutes: [ { path: '', - data: {breadcrumbKey: relatedI18nKey}, - } - ] + data: { breadcrumbKey: relatedI18nKey }, + }, + ], }, routeConfig: { - path: 'example' + path: 'example', }, parent: { routeConfig: { - path: '' + path: '', }, url: [{ - path: 'base' - }] - } as any + path: 'base', + }], + } as any, }; state = { - url: '/base/example' + url: '/base/example', }; expectedPath = '/base/example:/base'; NavigationBreadcrumbService = {}; diff --git a/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.ts index 18ebfc395b..594c1a694f 100644 --- a/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/navigation-breadcrumb.resolver.ts @@ -1,13 +1,18 @@ -import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model'; import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; + +import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model'; import { NavigationBreadcrumbsService } from './navigation-breadcrumb.service'; /** * The class that resolves a BreadcrumbConfig object with an i18n key string for a route and related parents */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class NavigationBreadcrumbResolver implements Resolve> { @@ -47,6 +52,6 @@ export class NavigationBreadcrumbResolver implements Resolve { diff --git a/src/app/core/breadcrumbs/navigation-breadcrumbs.service.spec.ts b/src/app/core/breadcrumbs/navigation-breadcrumbs.service.spec.ts index 98e20e285d..646b967fe5 100644 --- a/src/app/core/breadcrumbs/navigation-breadcrumbs.service.spec.ts +++ b/src/app/core/breadcrumbs/navigation-breadcrumbs.service.spec.ts @@ -1,6 +1,10 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; -import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { getTestScheduler } from 'jasmine-marbles'; + +import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; import { BREADCRUMB_MESSAGE_POSTFIX } from './i18n-breadcrumbs.service'; import { NavigationBreadcrumbsService } from './navigation-breadcrumb.service'; @@ -35,9 +39,9 @@ describe('NavigationBreadcrumbsService', () => { it('should return an array of breadcrumbs based on strings by adding the postfix', () => { const breadcrumbs = service.getBreadcrumbs(exampleString, exampleURL); getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [ - new Breadcrumb(childrenString + BREADCRUMB_MESSAGE_POSTFIX, childrenUrl), - new Breadcrumb(parentString + BREADCRUMB_MESSAGE_POSTFIX, parentUrl), - ].reverse() }); + new Breadcrumb(childrenString + BREADCRUMB_MESSAGE_POSTFIX, childrenUrl), + new Breadcrumb(parentString + BREADCRUMB_MESSAGE_POSTFIX, parentUrl), + ].reverse() }); }); }); }); diff --git a/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.spec.ts b/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.spec.ts index b6f4142469..7a0e9d43ed 100644 --- a/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.spec.ts +++ b/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.spec.ts @@ -16,14 +16,14 @@ describe('PublicationClaimBreadcrumbResolver', () => { return this[param]; }, targetId: expectedId, - } + }, }; publicationClaimBreadcrumbService = {}; resolver = new PublicationClaimBreadcrumbResolver(publicationClaimBreadcrumbService); }); it('should resolve the breadcrumb config', () => { - const resolvedConfig = resolver.resolve(route as any, {url: fullPath } as any); + const resolvedConfig = resolver.resolve(route as any, { url: fullPath } as any); const expectedConfig = { provider: publicationClaimBreadcrumbService, key: expectedKey }; expect(resolvedConfig).toEqual(expectedConfig); }); diff --git a/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.ts index 21bb9eab9f..7bcff921e1 100644 --- a/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/publication-claim-breadcrumb.resolver.ts @@ -1,10 +1,15 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; + import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model'; import { PublicationClaimBreadcrumbService } from './publication-claim-breadcrumb.service'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class PublicationClaimBreadcrumbResolver implements Resolve> { constructor(protected breadcrumbService: PublicationClaimBreadcrumbService) { diff --git a/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.spec.ts b/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.spec.ts index 11062210bb..8424b5edda 100644 --- a/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.spec.ts +++ b/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.spec.ts @@ -1,14 +1,18 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; -import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { getTestScheduler } from 'jasmine-marbles'; -import { PublicationClaimBreadcrumbService } from './publication-claim-breadcrumb.service'; -import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { of } from 'rxjs'; +import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { PublicationClaimBreadcrumbService } from './publication-claim-breadcrumb.service'; + describe('PublicationClaimBreadcrumbService', () => { let service: PublicationClaimBreadcrumbService; let dsoNameService: any = { - getName: (str) => str + getName: (str) => str, }; let translateService: any = { instant: (str) => str, @@ -44,7 +48,7 @@ describe('PublicationClaimBreadcrumbService', () => { it('should return a breadcrumb based on a string', () => { const breadcrumbs = service.getBreadcrumbs(exampleKey); getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY, ADMIN_PUBLICATION_CLAIMS_PATH), - new Breadcrumb(exampleKey, undefined)] + new Breadcrumb(exampleKey, undefined)], }); }); }); diff --git a/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.ts b/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.ts index f65c7c7cd7..43b7ed5761 100644 --- a/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.ts +++ b/src/app/core/breadcrumbs/publication-claim-breadcrumb.service.ts @@ -1,20 +1,24 @@ -import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; -import { BreadcrumbsProviderService } from './breadcrumbsProviderService'; -import { combineLatest, Observable } from 'rxjs'; import { Injectable } from '@angular/core'; -import { ItemDataService } from '../data/item-data.service'; -import { getFirstCompletedRemoteData } from '../shared/operators'; -import { map } from 'rxjs/operators'; -import { DSONameService } from './dso-name.service'; import { TranslateService } from '@ngx-translate/core'; +import { + combineLatest, + Observable, +} from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; import { FeatureID } from '../data/feature-authorization/feature-id'; +import { ItemDataService } from '../data/item-data.service'; +import { getFirstCompletedRemoteData } from '../shared/operators'; +import { BreadcrumbsProviderService } from './breadcrumbsProviderService'; +import { DSONameService } from './dso-name.service'; /** * Service to calculate Publication claims breadcrumbs */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class PublicationClaimBreadcrumbService implements BreadcrumbsProviderService { private ADMIN_PUBLICATION_CLAIMS_PATH = 'admin/notifications/publication-claim'; @@ -36,9 +40,9 @@ export class PublicationClaimBreadcrumbService implements BreadcrumbsProviderSer map(([item, isAdmin]) => { const itemName = this.dsoNameService.getName(item.payload); return isAdmin ? [new Breadcrumb(this.tranlsateService.instant(this.ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY), this.ADMIN_PUBLICATION_CLAIMS_PATH), - new Breadcrumb(this.tranlsateService.instant('suggestion.suggestionFor.breadcrumb', {name: itemName}), undefined)] : - [new Breadcrumb(this.tranlsateService.instant('suggestion.suggestionFor.breadcrumb', {name: itemName}), undefined)]; - }) + new Breadcrumb(this.tranlsateService.instant('suggestion.suggestionFor.breadcrumb', { name: itemName }), undefined)] : + [new Breadcrumb(this.tranlsateService.instant('suggestion.suggestionFor.breadcrumb', { name: itemName }), undefined)]; + }), ); } } diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts b/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts index 11bd9a7781..f8d30754ca 100644 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts +++ b/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts @@ -1,4 +1,7 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { getTestScheduler } from 'jasmine-marbles'; import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts b/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts index 0d2eaf1f78..580a5e5f8e 100644 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts +++ b/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts @@ -1,6 +1,9 @@ import { Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; import { BreadcrumbsProviderService } from './breadcrumbsProviderService'; @@ -33,7 +36,7 @@ export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderSer if (topicId) { return observableOf( [new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url), - new Breadcrumb(sourceId, `${url}${sourceId}`), + new Breadcrumb(sourceId, `${url}${sourceId}`), new Breadcrumb(topicId, undefined)]); } else { return observableOf([new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url), diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts index 18da9223d0..a724673d32 100644 --- a/src/app/core/browse/browse.service.ts +++ b/src/app/core/browse/browse.service.ts @@ -1,9 +1,21 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; -import { distinctUntilChanged, map, startWith } from 'rxjs/operators'; +import { + distinctUntilChanged, + map, + startWith, +} from 'rxjs/operators'; -import { hasValue, hasValueOperator, isEmpty, isNotEmpty } from '../../shared/empty.util'; -import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { + hasValue, + hasValueOperator, + isEmpty, + isNotEmpty, +} from '../../shared/empty.util'; +import { + followLink, + FollowLinkConfig, +} from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { SortDirection } from '../cache/models/sort-options.model'; import { HrefOnlyDataService } from '../data/href-only-data.service'; @@ -15,7 +27,13 @@ import { BrowseEntry } from '../shared/browse-entry.model'; import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; -import { getBrowseDefinitionLinks, getFirstOccurrence, getFirstSucceededRemoteData, getPaginatedListPayload, getRemoteDataPayload } from '../shared/operators'; +import { + getBrowseDefinitionLinks, + getFirstOccurrence, + getFirstSucceededRemoteData, + getPaginatedListPayload, + getRemoteDataPayload, +} from '../shared/operators'; import { URLCombiner } from '../url-combiner/url-combiner'; import { BrowseDefinitionDataService } from './browse-definition-data.service'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; diff --git a/src/app/core/cache/builders/build-decorators.spec.ts b/src/app/core/cache/builders/build-decorators.spec.ts index e4baaa4a5a..53f4cb2f7f 100644 --- a/src/app/core/cache/builders/build-decorators.spec.ts +++ b/src/app/core/cache/builders/build-decorators.spec.ts @@ -1,7 +1,12 @@ import { HALLink } from '../../shared/hal-link.model'; import { HALResource } from '../../shared/hal-resource.model'; import { ResourceType } from '../../shared/resource-type'; -import { dataService, getDataServiceFor, getLinkDefinition, link } from './build-decorators'; +import { + dataService, + getDataServiceFor, + getLinkDefinition, + link, +} from './build-decorators'; class TestHALResource implements HALResource { _links: { diff --git a/src/app/core/cache/builders/build-decorators.ts b/src/app/core/cache/builders/build-decorators.ts index f1e42323d5..be3ffc0f4d 100644 --- a/src/app/core/cache/builders/build-decorators.ts +++ b/src/app/core/cache/builders/build-decorators.ts @@ -1,20 +1,23 @@ import { InjectionToken } from '@angular/core'; -import { hasNoValue, hasValue } from '../../../shared/empty.util'; +import { + hasNoValue, + hasValue, +} from '../../../shared/empty.util'; import { GenericConstructor } from '../../shared/generic-constructor'; import { HALResource } from '../../shared/hal-resource.model'; import { ResourceType } from '../../shared/resource-type'; -import { getResourceTypeValueFor } from '../object-cache.reducer'; import { CacheableObject } from '../cacheable-object.model'; +import { getResourceTypeValueFor } from '../object-cache.reducer'; import { TypedObject } from '../typed-object.model'; export const DATA_SERVICE_FACTORY = new InjectionToken<(resourceType: ResourceType) => GenericConstructor>('getDataServiceFor', { providedIn: 'root', - factory: () => getDataServiceFor + factory: () => getDataServiceFor, }); export const LINK_DEFINITION_FACTORY = new InjectionToken<(source: GenericConstructor, linkName: keyof T['_links']) => LinkDefinition>('getLinkDefinition', { providedIn: 'root', - factory: () => getLinkDefinition + factory: () => getLinkDefinition, }); export const LINK_DEFINITION_MAP_FACTORY = new InjectionToken<(source: GenericConstructor) => Map>>('getLinkDefinitions', { providedIn: 'root', diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index b8dad613c4..e5a6114872 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -1,23 +1,50 @@ import { Injectable } from '@angular/core'; -import { AsyncSubject, combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; -import { distinctUntilKeyChanged, filter, map, startWith, switchMap } from 'rxjs/operators'; +import { + AsyncSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, +} from 'rxjs'; +import { + distinctUntilKeyChanged, + filter, + map, + startWith, + switchMap, +} from 'rxjs/operators'; -import { hasNoValue, hasValue, isEmpty, isNotEmpty, isUndefined } from '../../../shared/empty.util'; +import { + hasNoValue, + hasValue, + isEmpty, + isNotEmpty, + isUndefined, +} from '../../../shared/empty.util'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { followLink, FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { + followLink, + FollowLinkConfig, +} from '../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../data/paginated-list.model'; import { PAGINATED_LIST } from '../../data/paginated-list.resource-type'; import { RemoteData } from '../../data/remote-data'; import { RequestService } from '../../data/request.service'; import { RequestEntry } from '../../data/request-entry.model'; -import { hasSucceeded, isStale, RequestEntryState } from '../../data/request-entry-state.model'; +import { + hasSucceeded, + isStale, + RequestEntryState, +} from '../../data/request-entry-state.model'; import { ResponseState } from '../../data/response-state.model'; import { getUrlWithoutEmbedParams } from '../../index/index.selectors'; import { GenericConstructor } from '../../shared/generic-constructor'; import { HALLink } from '../../shared/hal-link.model'; import { HALResource } from '../../shared/hal-resource.model'; import { getFirstCompletedRemoteData } from '../../shared/operators'; -import { getRequestFromRequestHref, getRequestFromRequestUUID } from '../../shared/request.operators'; +import { + getRequestFromRequestHref, + getRequestFromRequestUUID, +} from '../../shared/request.operators'; import { getResourceTypeValueFor } from '../object-cache.reducer'; import { ObjectCacheService } from '../object-cache.service'; import { getClassForType } from './build-decorators'; diff --git a/src/app/core/cache/object-cache.reducer.spec.ts b/src/app/core/cache/object-cache.reducer.spec.ts index 7ad9c068c3..7dda02a0f5 100644 --- a/src/app/core/cache/object-cache.reducer.spec.ts +++ b/src/app/core/cache/object-cache.reducer.spec.ts @@ -3,7 +3,15 @@ import * as deepFreeze from 'deep-freeze'; import { Operation } from 'fast-json-patch'; import { Item } from '../shared/item.model'; -import { AddDependentsObjectCacheAction, AddPatchObjectCacheAction, AddToObjectCacheAction, ApplyPatchObjectCacheAction, RemoveDependentsObjectCacheAction, RemoveFromObjectCacheAction, ResetObjectCacheTimestampsAction } from './object-cache.actions'; +import { + AddDependentsObjectCacheAction, + AddPatchObjectCacheAction, + AddToObjectCacheAction, + ApplyPatchObjectCacheAction, + RemoveDependentsObjectCacheAction, + RemoveFromObjectCacheAction, + ResetObjectCacheTimestampsAction, +} from './object-cache.actions'; import { objectCacheReducer } from './object-cache.reducer'; class NullAction extends RemoveFromObjectCacheAction { diff --git a/src/app/core/cache/server-sync-buffer.reducer.spec.ts b/src/app/core/cache/server-sync-buffer.reducer.spec.ts index 8dc8fd2195..d986581ce2 100644 --- a/src/app/core/cache/server-sync-buffer.reducer.spec.ts +++ b/src/app/core/cache/server-sync-buffer.reducer.spec.ts @@ -3,7 +3,10 @@ import * as deepFreeze from 'deep-freeze'; import { RestRequestMethod } from '../data/rest-request-method'; import { RemoveFromObjectCacheAction } from './object-cache.actions'; -import { AddToSSBAction, EmptySSBAction } from './server-sync-buffer.actions'; +import { + AddToSSBAction, + EmptySSBAction, +} from './server-sync-buffer.actions'; import { serverSyncBufferReducer } from './server-sync-buffer.reducer'; class NullAction extends RemoveFromObjectCacheAction { diff --git a/src/app/core/coar-notify/notify-info/notify-info.component.spec.ts b/src/app/core/coar-notify/notify-info/notify-info.component.spec.ts index 881e1b67fb..e91b065dfc 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.component.spec.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.component.spec.ts @@ -1,9 +1,12 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; import { NotifyInfoComponent } from './notify-info.component'; import { NotifyInfoService } from './notify-info.service'; -import { TranslateModule } from '@ngx-translate/core'; -import { of } from 'rxjs'; describe('NotifyInfoComponent', () => { let component: NotifyInfoComponent; @@ -17,10 +20,10 @@ describe('NotifyInfoComponent', () => { imports: [TranslateModule.forRoot()], declarations: [ NotifyInfoComponent ], providers: [ - { provide: NotifyInfoService, useValue: notifyInfoServiceSpy } - ] + { provide: NotifyInfoService, useValue: notifyInfoServiceSpy }, + ], }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { diff --git a/src/app/core/coar-notify/notify-info/notify-info.component.ts b/src/app/core/coar-notify/notify-info/notify-info.component.ts index ee3e1b9d57..bfa268440b 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.component.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.component.ts @@ -1,6 +1,14 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + map, + Observable, + of, +} from 'rxjs'; + import { NotifyInfoService } from './notify-info.service'; -import { map, Observable, of } from 'rxjs'; @Component({ selector: 'ds-notify-info', @@ -33,7 +41,7 @@ export class NotifyInfoComponent implements OnInit { return urls.map(url => ` ${url} `).join(','); - }) + }), ); } } diff --git a/src/app/core/coar-notify/notify-info/notify-info.guard.spec.ts b/src/app/core/coar-notify/notify-info/notify-info.guard.spec.ts index 81ac0db8d8..7c8cc3f320 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.guard.spec.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.guard.spec.ts @@ -1,9 +1,9 @@ import { TestBed } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { of } from 'rxjs'; import { NotifyInfoGuard } from './notify-info.guard'; -import { Router } from '@angular/router'; import { NotifyInfoService } from './notify-info.service'; -import { of } from 'rxjs'; describe('NotifyInfoGuard', () => { let guard: NotifyInfoGuard; @@ -16,9 +16,9 @@ describe('NotifyInfoGuard', () => { TestBed.configureTestingModule({ providers: [ NotifyInfoGuard, - { provide: NotifyInfoService, useValue: notifyInfoServiceSpy}, - { provide: Router, useValue: router} - ] + { provide: NotifyInfoService, useValue: notifyInfoServiceSpy }, + { provide: Router, useValue: router }, + ], }); guard = TestBed.inject(NotifyInfoGuard); }); diff --git a/src/app/core/coar-notify/notify-info/notify-info.guard.ts b/src/app/core/coar-notify/notify-info/notify-info.guard.ts index 7af0821618..91f3bf6cde 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.guard.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.guard.ts @@ -1,30 +1,37 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { + ActivatedRouteSnapshot, + CanActivate, + Router, + RouterStateSnapshot, + UrlTree, +} from '@angular/router'; import { Observable } from 'rxjs'; -import { NotifyInfoService } from './notify-info.service'; import { map } from 'rxjs/operators'; +import { NotifyInfoService } from './notify-info.service'; + @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class NotifyInfoGuard implements CanActivate { - constructor( + constructor( private notifyInfoService: NotifyInfoService, - private router: Router - ) {} + private router: Router, + ) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot - ): Observable { - return this.notifyInfoService.isCoarConfigEnabled().pipe( - map(coarLdnEnabled => { - if (coarLdnEnabled) { - return true; - } else { - return this.router.parseUrl('/404'); - } - }) - ); - } + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable { + return this.notifyInfoService.isCoarConfigEnabled().pipe( + map(coarLdnEnabled => { + if (coarLdnEnabled) { + return true; + } else { + return this.router.parseUrl('/404'); + } + }), + ); + } } diff --git a/src/app/core/coar-notify/notify-info/notify-info.service.spec.ts b/src/app/core/coar-notify/notify-info/notify-info.service.spec.ts index 6d51c33c99..d32ad729dd 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.service.spec.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.service.spec.ts @@ -1,27 +1,28 @@ import { TestBed } from '@angular/core/testing'; -import { NotifyInfoService } from './notify-info.service'; -import { ConfigurationDataService } from '../../data/configuration-data.service'; import { of } from 'rxjs'; -import { AuthorizationDataService } from '../../data/feature-authorization/authorization-data.service'; + import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { ConfigurationDataService } from '../../data/configuration-data.service'; +import { AuthorizationDataService } from '../../data/feature-authorization/authorization-data.service'; +import { NotifyInfoService } from './notify-info.service'; describe('NotifyInfoService', () => { let service: NotifyInfoService; let configurationDataService: any; let authorizationDataService: any; - beforeEach(() => { - authorizationDataService = { - isAuthorized: jasmine.createSpy('isAuthorized').and.returnValue(of(true)), - }; - configurationDataService = { - findByPropertyName: jasmine.createSpy('findByPropertyName').and.returnValue(of({})), - }; + beforeEach(() => { + authorizationDataService = { + isAuthorized: jasmine.createSpy('isAuthorized').and.returnValue(of(true)), + }; + configurationDataService = { + findByPropertyName: jasmine.createSpy('findByPropertyName').and.returnValue(of({})), + }; TestBed.configureTestingModule({ providers: [ NotifyInfoService, { provide: ConfigurationDataService, useValue: configurationDataService }, - { provide: AuthorizationDataService, useValue: authorizationDataService } - ] + { provide: AuthorizationDataService, useValue: authorizationDataService }, + ], }); service = TestBed.inject(NotifyInfoService); authorizationDataService = TestBed.inject(AuthorizationDataService); diff --git a/src/app/core/coar-notify/notify-info/notify-info.service.ts b/src/app/core/coar-notify/notify-info/notify-info.service.ts index a15c64237c..a70a5d5cc0 100644 --- a/src/app/core/coar-notify/notify-info/notify-info.service.ts +++ b/src/app/core/coar-notify/notify-info/notify-info.service.ts @@ -1,52 +1,59 @@ import { Injectable } from '@angular/core'; -import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../shared/operators'; +import { + map, + Observable, +} from 'rxjs'; + import { ConfigurationDataService } from '../../data/configuration-data.service'; -import { map, Observable } from 'rxjs'; -import { ConfigurationProperty } from '../../shared/configuration-property.model'; import { AuthorizationDataService } from '../../data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../data/feature-authorization/feature-id'; +import { ConfigurationProperty } from '../../shared/configuration-property.model'; +import { + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../../shared/operators'; /** * Service to check COAR availability and LDN services information for the COAR Notify functionalities */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class NotifyInfoService { - /** + /** * The relation link for the inbox */ - private _inboxRelationLink = 'http://www.w3.org/ns/ldp#inbox'; + private _inboxRelationLink = 'http://www.w3.org/ns/ldp#inbox'; - constructor( + constructor( private configService: ConfigurationDataService, protected authorizationService: AuthorizationDataService, - ) {} + ) {} - isCoarConfigEnabled(): Observable { - return this.authorizationService.isAuthorized(FeatureID.CoarNotifyEnabled); - } + isCoarConfigEnabled(): Observable { + return this.authorizationService.isAuthorized(FeatureID.CoarNotifyEnabled); + } - /** + /** * Get the url of the local inbox from the REST configuration * @returns the url of the local inbox */ - getCoarLdnLocalInboxUrls(): Observable { - return this.configService.findByPropertyName('ldn.notify.inbox').pipe( - getFirstSucceededRemoteData(), - getRemoteDataPayload(), - map((response: ConfigurationProperty) => { - return response.values; - }) - ); - } + getCoarLdnLocalInboxUrls(): Observable { + return this.configService.findByPropertyName('ldn.notify.inbox').pipe( + getFirstSucceededRemoteData(), + getRemoteDataPayload(), + map((response: ConfigurationProperty) => { + return response.values; + }), + ); + } - /** + /** * Method to get the relation link for the inbox * @returns the relation link for the inbox */ - getInboxRelationLink(): string { - return this._inboxRelationLink; - } + getInboxRelationLink(): string { + return this._inboxRelationLink; + } } diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index c4824c604b..10433caa26 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,11 +1,26 @@ import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; -import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; +import { + ModuleWithProviders, + NgModule, + Optional, + SkipSelf, +} from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; -import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { + Action, + StoreConfig, + StoreModule, +} from '@ngrx/store'; import { environment } from '../../environments/environment'; +import { LdnItemfiltersService } from '../admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service'; +import { LdnServicesService } from '../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { Itemfilter } from '../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters'; +import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; +import { AdminNotifyMessage } from '../admin/admin-notify-dashboard/models/admin-notify-message.model'; import { storeModuleConfig } from '../app.reducer'; +import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model'; import { MyDSpaceGuard } from '../my-dspace-page/my-dspace.guard'; import { Process } from '../process-page/processes/process.model'; import { Script } from '../process-page/scripts/script.model'; @@ -14,7 +29,11 @@ import { isNotEmpty } from '../shared/empty.util'; import { HostWindowService } from '../shared/host-window.service'; import { MenuService } from '../shared/menu/menu.service'; import { EndpointMockingRestService } from '../shared/mocks/dspace-rest/endpoint-mocking-rest.service'; -import { MOCK_RESPONSE_MAP, mockResponseMap, ResponseMapMock } from '../shared/mocks/dspace-rest/mocks/response-map.mock'; +import { + MOCK_RESPONSE_MAP, + mockResponseMap, + ResponseMapMock, +} from '../shared/mocks/dspace-rest/mocks/response-map.mock'; import { NotificationsService } from '../shared/notifications/notifications.service'; import { AccessStatusObject } from '../shared/object-collection/shared/badges/access-status-badge/access-status.model'; import { IdentifierData } from '../shared/object-list/identifier-data/identifier-data.model'; @@ -23,6 +42,8 @@ import { ObjectSelectService } from '../shared/object-select/object-select.servi import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; import { SidebarService } from '../shared/sidebar/sidebar.service'; import { Subscription } from '../shared/subscriptions/models/subscription.model'; +import { CoarNotifyConfigDataService } from '../submission/sections/section-coar-notify/coar-notify-config-data.service'; +import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config'; import { AuthenticatedGuard } from './auth/authenticated.guard'; import { AuthStatus } from './auth/models/auth-status.model'; import { ShortLivedToken } from './auth/models/short-lived-token.model'; @@ -69,6 +90,7 @@ import { LookupRelationService } from './data/lookup-relation.service'; import { MetadataFieldDataService } from './data/metadata-field-data.service'; import { MetadataSchemaDataService } from './data/metadata-schema-data.service'; import { MyDSpaceResponseParsingService } from './data/mydspace-response-parsing.service'; +import { NotifyRequestsStatusDataService } from './data/notify-services-status-data.service'; import { ObjectUpdatesService } from './data/object-updates/object-updates.service'; import { ProcessDataService } from './data/processes/process-data.service'; import { ScriptDataService } from './data/processes/script-data.service'; @@ -94,6 +116,8 @@ import { JsonPatchOperationsBuilder } from './json-patch/builder/json-patch-oper import { MetadataService } from './metadata/metadata.service'; import { MetadataField } from './metadata/metadata-field.model'; import { MetadataSchema } from './metadata/metadata-schema.model'; +import { SuggestionSource } from './notifications/models/suggestion-source.model'; +import { SuggestionTarget } from './notifications/models/suggestion-target.model'; import { QualityAssuranceEventObject } from './notifications/qa/models/quality-assurance-event.model'; import { QualityAssuranceSourceObject } from './notifications/qa/models/quality-assurance-source.model'; import { QualityAssuranceTopicObject } from './notifications/qa/models/quality-assurance-topic.model'; @@ -111,7 +135,10 @@ import { ResourcePolicyDataService } from './resource-policy/resource-policy-dat import { RoleService } from './roles/role.service'; import { LinkHeadService } from './services/link-head.service'; import { ServerResponseService } from './services/server-response.service'; -import { NativeWindowFactory, NativeWindowService } from './services/window.service'; +import { + NativeWindowFactory, + NativeWindowService, +} from './services/window.service'; import { Authorization } from './shared/authorization.model'; import { Bitstream } from './shared/bitstream.model'; import { BitstreamFormat } from './shared/bitstream-format.model'; @@ -148,12 +175,14 @@ import { ValueListBrowseDefinition } from './shared/value-list-browse-definition import { Version } from './shared/version.model'; import { VersionHistory } from './shared/version-history.model'; import { UsageReport } from './statistics/models/usage-report.model'; +import { CorrectionTypeDataService } from './submission/correctiontype-data.service'; import { SubmissionCcLicence } from './submission/models/submission-cc-license.model'; import { SubmissionCcLicenceUrl } from './submission/models/submission-cc-license-url.model'; import { WorkflowItem } from './submission/models/workflowitem.model'; import { WorkspaceItem } from './submission/models/workspaceitem.model'; import { SubmissionCcLicenseDataService } from './submission/submission-cc-license-data.service'; import { SubmissionCcLicenseUrlDataService } from './submission/submission-cc-license-url-data.service'; +import { SubmissionDuplicateDataService } from './submission/submission-duplicate-data.service'; import { SubmissionJsonPatchOperationsService } from './submission/submission-json-patch-operations.service'; import { SubmissionResponseParsingService } from './submission/submission-response-parsing.service'; import { SubmissionRestService } from './submission/submission-rest.service'; @@ -176,19 +205,6 @@ import { TaskObject } from './tasks/models/task-object.model'; import { WorkflowAction } from './tasks/models/workflow-action-object.model'; import { PoolTaskDataService } from './tasks/pool-task-data.service'; import { TaskResponseParsingService } from './tasks/task-response-parsing.service'; -import { CorrectionTypeDataService } from './submission/correctiontype-data.service'; -import { LdnServicesService } from '../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; -import { LdnItemfiltersService } from '../admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service'; -import { CoarNotifyConfigDataService } from '../submission/sections/section-coar-notify/coar-notify-config-data.service'; -import { NotifyRequestsStatusDataService } from './data/notify-services-status-data.service'; -import { SuggestionTarget } from './notifications/models/suggestion-target.model'; -import { SuggestionSource } from './notifications/models/suggestion-source.model'; -import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model'; -import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; -import { Itemfilter } from '../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters'; -import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config'; -import { AdminNotifyMessage } from '../admin/admin-notify-dashboard/models/admin-notify-message.model'; -import { SubmissionDuplicateDataService } from './submission/submission-duplicate-data.service'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -317,7 +333,7 @@ const PROVIDERS = [ LdnServicesService, LdnItemfiltersService, CoarNotifyConfigDataService, - NotifyRequestsStatusDataService + NotifyRequestsStatusDataService, ]; /** @@ -403,7 +419,7 @@ export const models = Itemfilter, SubmissionCoarNotifyConfig, NotifyRequestsStatus, - AdminNotifyMessage + AdminNotifyMessage, ]; @NgModule({ 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 80738a02cf..3f44ad5e5a 100644 --- a/src/app/core/data/base/base-data.service.spec.ts +++ b/src/app/core/data/base/base-data.service.spec.ts @@ -5,27 +5,37 @@ * * http://www.dspace.org/license/ */ -import { fakeAsync, tick } from '@angular/core/testing'; -import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; +import { + fakeAsync, + tick, +} from '@angular/core/testing'; +import { + combineLatest as observableCombineLatest, + Observable, + of as observableOf, +} from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../../../shared/remote-data.utils'; import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { ObjectCacheServiceStub } from '../../../shared/testing/object-cache-service.stub'; +import { createPaginatedList } from '../../../shared/testing/utils.test'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheEntry } from '../../cache/object-cache.reducer'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { HALLink } from '../../shared/hal-link.model'; import { FindListOptions } from '../find-list-options.model'; import { RemoteData } from '../remote-data'; import { RequestService } from '../request.service'; import { RequestEntryState } from '../request-entry-state.model'; import { BaseDataService } from './base-data.service'; -import { ObjectCacheServiceStub } from '../../../shared/testing/object-cache-service.stub'; -import { ObjectCacheEntry } from '../../cache/object-cache.reducer'; -import { HALLink } from '../../shared/hal-link.model'; -import { createPaginatedList } from '../../../shared/testing/utils.test'; const endpoint = 'https://rest.api/core'; @@ -96,7 +106,7 @@ describe('BaseDataService', () => { href: 'follow-link-2-2', }), ], - } + }, }; const statusCodeSuccess = 200; const statusCodeError = 404; diff --git a/src/app/core/data/base/base-data.service.ts b/src/app/core/data/base/base-data.service.ts index f6e33b2325..d09ee21ee0 100644 --- a/src/app/core/data/base/base-data.service.ts +++ b/src/app/core/data/base/base-data.service.ts @@ -6,10 +6,27 @@ * http://www.dspace.org/license/ */ -import { AsyncSubject, from as observableFrom, Observable, of as observableOf } from 'rxjs'; -import { map, mergeMap, skipWhile, switchMap, take, tap, toArray } from 'rxjs/operators'; +import { + AsyncSubject, + from as observableFrom, + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + mergeMap, + skipWhile, + switchMap, + take, + tap, + toArray, +} from 'rxjs/operators'; -import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util'; +import { + hasValue, + isNotEmpty, + isNotEmptyOperator, +} from '../../../shared/empty.util'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { CacheableObject } from '../../cache/cacheable-object.model'; @@ -17,6 +34,7 @@ import { RequestParam } from '../../cache/models/request-param.model'; import { ObjectCacheEntry } from '../../cache/object-cache.reducer'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { HALLink } from '../../shared/hal-link.model'; import { getFirstCompletedRemoteData } from '../../shared/operators'; import { URLCombiner } from '../../url-combiner/url-combiner'; import { FindListOptions } from '../find-list-options.model'; @@ -25,7 +43,6 @@ import { RemoteData } from '../remote-data'; import { GetRequest } from '../request.models'; import { RequestService } from '../request.service'; import { HALDataService } from './hal-data-service.interface'; -import { HALLink } from '../../shared/hal-link.model'; export const EMBED_SEPARATOR = '%2F'; /** diff --git a/src/app/core/data/base/create-data.ts b/src/app/core/data/base/create-data.ts index 5e84b65402..13216f8796 100644 --- a/src/app/core/data/base/create-data.ts +++ b/src/app/core/data/base/create-data.ts @@ -6,9 +6,17 @@ * http://www.dspace.org/license/ */ import { Observable } from 'rxjs'; -import { distinctUntilChanged, map, take, takeWhile } from 'rxjs/operators'; +import { + distinctUntilChanged, + map, + take, + takeWhile, +} from 'rxjs/operators'; -import { hasValue, isNotEmptyOperator } from '../../../shared/empty.util'; +import { + hasValue, + isNotEmptyOperator, +} from '../../../shared/empty.util'; import { NotificationOptions } from '../../../shared/notifications/models/notification-options.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { getClassForType } from '../../cache/builders/build-decorators'; diff --git a/src/app/core/data/base/find-all-data.ts b/src/app/core/data/base/find-all-data.ts index 78d391676a..0d68689e61 100644 --- a/src/app/core/data/base/find-all-data.ts +++ b/src/app/core/data/base/find-all-data.ts @@ -7,7 +7,11 @@ */ import { Observable } from 'rxjs'; -import { distinctUntilChanged, filter, map } from 'rxjs/operators'; +import { + distinctUntilChanged, + filter, + map, +} from 'rxjs/operators'; import { isNotEmpty } from '../../../shared/empty.util'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; diff --git a/src/app/core/data/base/patch-data.ts b/src/app/core/data/base/patch-data.ts index f17e82e427..adcf98ef94 100644 --- a/src/app/core/data/base/patch-data.ts +++ b/src/app/core/data/base/patch-data.ts @@ -7,20 +7,34 @@ */ import { Operation } from 'fast-json-patch'; import { Observable } from 'rxjs'; -import { find, map, mergeMap } from 'rxjs/operators'; +import { + find, + map, + mergeMap, +} from 'rxjs/operators'; -import { hasNoValue, hasValue, isNotEmpty } from '../../../shared/empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../../../shared/empty.util'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { CacheableObject } from '../../cache/cacheable-object.model'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../shared/operators'; +import { + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../../shared/operators'; import { ChangeAnalyzer } from '../change-analyzer'; import { RemoteData } from '../remote-data'; import { PatchRequest } from '../request.models'; import { RequestService } from '../request.service'; import { RestRequestMethod } from '../rest-request-method'; -import { ConstructIdEndpoint, IdentifiableDataService } from './identifiable-data.service'; +import { + ConstructIdEndpoint, + IdentifiableDataService, +} from './identifiable-data.service'; /** * Interface for a data service that can patch and update objects. diff --git a/src/app/core/data/base/search-data.ts b/src/app/core/data/base/search-data.ts index 5647d1b0eb..f758affa28 100644 --- a/src/app/core/data/base/search-data.ts +++ b/src/app/core/data/base/search-data.ts @@ -6,9 +6,15 @@ * http://www.dspace.org/license/ */ import { Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { + filter, + map, +} from 'rxjs/operators'; -import { hasNoValue, isNotEmpty } from '../../../shared/empty.util'; +import { + hasNoValue, + isNotEmpty, +} from '../../../shared/empty.util'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { CacheableObject } from '../../cache/cacheable-object.model'; diff --git a/src/app/core/data/bitstream-data.service.spec.ts b/src/app/core/data/bitstream-data.service.spec.ts index 70cc3a40f3..95fe5f593f 100644 --- a/src/app/core/data/bitstream-data.service.spec.ts +++ b/src/app/core/data/bitstream-data.service.spec.ts @@ -1,31 +1,40 @@ import { TestBed } from '@angular/core/testing'; -import { Observable, of as observableOf } from 'rxjs'; +import { cold } from 'jasmine-marbles'; +import { + Observable, + of as observableOf, +} from 'rxjs'; +import { ItemMock } from 'src/app/shared/mocks/item.mock'; +import { + createFailedRemoteDataObject, + createSuccessfulRemoteDataObject, +} from 'src/app/shared/remote-data.utils'; import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { Bitstream } from '../shared/bitstream.model'; import { BitstreamFormat } from '../shared/bitstream-format.model'; import { BitstreamFormatSupportLevel } from '../shared/bitstream-format-support-level'; +import { Bundle } from '../shared/bundle.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { testDeleteDataImplementation } from './base/delete-data.spec'; import { testPatchDataImplementation } from './base/patch-data.spec'; import { testSearchDataImplementation } from './base/search-data.spec'; import { BitstreamDataService } from './bitstream-data.service'; import { BitstreamFormatDataService } from './bitstream-format-data.service'; -import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; -import { PatchRequest, PutRequest } from './request.models'; -import { RequestService } from './request.service'; -import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { RemoteData } from './remote-data'; import { BundleDataService } from './bundle-data.service'; -import { ItemMock } from 'src/app/shared/mocks/item.mock'; -import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject } from 'src/app/shared/remote-data.utils'; -import { Bundle } from '../shared/bundle.model'; -import { cold } from 'jasmine-marbles'; +import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; +import { RemoteData } from './remote-data'; +import { + PatchRequest, + PutRequest, +} from './request.models'; +import { RequestService } from './request.service'; import objectContaining = jasmine.objectContaining; describe('BitstreamDataService', () => { @@ -129,7 +138,7 @@ describe('BitstreamDataService', () => { describe('findPrimaryBitstreamByItemAndName', () => { it('should return primary bitstream', () => { - const exprected$ = cold('(a|)', { a: bitstream1} ); + const exprected$ = cold('(a|)', { a: bitstream1 } ); const bundle = Object.assign(new Bundle(), { primaryBitstream: observableOf(createSuccessfulRemoteDataObject(bitstream1)), }); @@ -138,7 +147,7 @@ describe('BitstreamDataService', () => { }); it('should return null if primary bitstream has not be succeeded ', () => { - const exprected$ = cold('(a|)', { a: null} ); + const exprected$ = cold('(a|)', { a: null } ); const bundle = Object.assign(new Bundle(), { primaryBitstream: observableOf(createFailedRemoteDataObject()), }); diff --git a/src/app/core/data/bitstream-data.service.ts b/src/app/core/data/bitstream-data.service.ts index c72d5431d0..bc89a54649 100644 --- a/src/app/core/data/bitstream-data.service.ts +++ b/src/app/core/data/bitstream-data.service.ts @@ -1,9 +1,28 @@ import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { combineLatest as observableCombineLatest, EMPTY, Observable } from 'rxjs'; -import { find, map, switchMap, take } from 'rxjs/operators'; +import { + Operation, + RemoveOperation, +} from 'fast-json-patch'; +import { + combineLatest as observableCombineLatest, + EMPTY, + Observable, +} from 'rxjs'; +import { + find, + map, + switchMap, + take, +} from 'rxjs/operators'; + import { hasValue } from '../../shared/empty.util'; -import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + followLink, + FollowLinkConfig, +} from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -15,26 +34,38 @@ import { Bundle } from '../shared/bundle.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; import { NoContent } from '../shared/NoContent.model'; +import { getFirstCompletedRemoteData } from '../shared/operators'; import { PageInfo } from '../shared/page-info.model'; import { sendRequest } from '../shared/request.operators'; import { dataService } from './base/data-service.decorator'; -import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { + DeleteData, + DeleteDataImpl, +} from './base/delete-data'; import { IdentifiableDataService } from './base/identifiable-data.service'; -import { PatchData, PatchDataImpl } from './base/patch-data'; -import { SearchData, SearchDataImpl } from './base/search-data'; +import { + PatchData, + PatchDataImpl, +} from './base/patch-data'; +import { + SearchData, + SearchDataImpl, +} from './base/search-data'; import { BitstreamFormatDataService } from './bitstream-format-data.service'; import { BundleDataService } from './bundle-data.service'; import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; import { FindListOptions } from './find-list-options.model'; -import { buildPaginatedList, PaginatedList } from './paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from './paginated-list.model'; import { RemoteData } from './remote-data'; -import { PatchRequest, PutRequest } from './request.models'; +import { + PatchRequest, + PutRequest, +} from './request.models'; import { RequestService } from './request.service'; import { RestRequestMethod } from './rest-request-method'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { Operation, RemoveOperation } from 'fast-json-patch'; -import { getFirstCompletedRemoteData } from '../shared/operators'; -import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; /** * A service to retrieve {@link Bitstream}s from the REST API @@ -227,9 +258,9 @@ export class BitstreamDataService extends IdentifiableDataService imp } return rd.payload.primaryBitstream.pipe( getFirstCompletedRemoteData(), - map((rdb: RemoteData) => rdb.hasSucceeded ? rdb.payload : null) + map((rdb: RemoteData) => rdb.hasSucceeded ? rdb.payload : null), ); - }) + }), ); } diff --git a/src/app/core/data/collection-data.service.spec.ts b/src/app/core/data/collection-data.service.spec.ts index ebc1bca747..431fe941bb 100644 --- a/src/app/core/data/collection-data.service.spec.ts +++ b/src/app/core/data/collection-data.service.spec.ts @@ -1,15 +1,27 @@ -import { fakeAsync, tick } from '@angular/core/testing'; +import { + fakeAsync, + tick, +} from '@angular/core/testing'; import { TranslateService } from '@ngx-translate/core'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { Observable } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { hasNoValue } from '../../shared/empty.util'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { getMockTranslateService } from '../../shared/mocks/translate.service.mock'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { Collection } from '../shared/collection.model'; @@ -19,12 +31,14 @@ import { testCreateDataImplementation } from './base/create-data.spec'; import { testDeleteDataImplementation } from './base/delete-data.spec'; import { testFindAllDataImplementation } from './base/find-all-data.spec'; import { testPatchDataImplementation } from './base/patch-data.spec'; -import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { testSearchDataImplementation } from './base/search-data.spec'; import { CollectionDataService } from './collection-data.service'; import { buildPaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; -import { ContentSourceRequest, UpdateContentSourceRequest } from './request.models'; +import { + ContentSourceRequest, + UpdateContentSourceRequest, +} from './request.models'; import { RequestService } from './request.service'; const url = 'fake-url'; diff --git a/src/app/core/data/notify-services-status-data.service.spec.ts b/src/app/core/data/notify-services-status-data.service.spec.ts index ade6ae4156..e336843505 100644 --- a/src/app/core/data/notify-services-status-data.service.spec.ts +++ b/src/app/core/data/notify-services-status-data.service.spec.ts @@ -1,17 +1,24 @@ -import { NotifyRequestsStatusDataService } from './notify-services-status-data.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { TestScheduler } from 'rxjs/testing'; -import { RequestService } from './request.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RequestEntry } from './request-entry.model'; -import { RemoteData } from './remote-data'; -import { RequestEntryState } from './request-entry-state.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; -import { RestResponse } from '../cache/response.models'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of } from 'rxjs'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { TestScheduler } from 'rxjs/testing'; + import { NotifyRequestsStatus } from '../../item-page/simple/notify-requests-status/notify-requests-status.model'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { RestResponse } from '../cache/response.models'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NotifyRequestsStatusDataService } from './notify-services-status-data.service'; +import { RemoteData } from './remote-data'; +import { RequestService } from './request.service'; +import { RequestEntry } from './request-entry.model'; +import { RequestEntryState } from './request-entry-state.model'; describe('NotifyRequestsStatusDataService test', () => { let scheduler: TestScheduler; @@ -55,13 +62,13 @@ describe('NotifyRequestsStatusDataService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: of(endpointURL) + getEndpoint: of(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), buildList: cold('a', { a: remoteDataMocks.Success }), - buildFromHref: createSuccessfulRemoteDataObject$({test: 'test'}) + buildFromHref: createSuccessfulRemoteDataObject$({ test: 'test' }), }); @@ -73,7 +80,7 @@ describe('NotifyRequestsStatusDataService test', () => { service.getNotifyRequestsStatus(requestUUID).subscribe((status) => { expect(halService.getEndpoint).toHaveBeenCalled(); expect(requestService.generateRequestId).toHaveBeenCalled(); - expect(status).toEqual(createSuccessfulRemoteDataObject({test: 'test'} as unknown as NotifyRequestsStatus)); + expect(status).toEqual(createSuccessfulRemoteDataObject({ test: 'test' } as unknown as NotifyRequestsStatus)); done(); }); }); diff --git a/src/app/core/data/notify-services-status-data.service.ts b/src/app/core/data/notify-services-status-data.service.ts index 5e02982c6a..ad0c32fadd 100644 --- a/src/app/core/data/notify-services-status-data.service.ts +++ b/src/app/core/data/notify-services-status-data.service.ts @@ -1,15 +1,20 @@ import { Injectable } from '@angular/core'; -import { RequestService } from './request.service'; +import { + map, + Observable, + take, +} from 'rxjs'; + +import { NotifyRequestsStatus } from '../../item-page/simple/notify-requests-status/notify-requests-status.model'; +import { NOTIFYREQUEST } from '../../item-page/simple/notify-requests-status/notify-requests-status.resource-type'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { IdentifiableDataService } from './base/identifiable-data.service'; import { dataService } from './base/data-service.decorator'; -import { NotifyRequestsStatus } from '../../item-page/simple/notify-requests-status/notify-requests-status.model'; -import { NOTIFYREQUEST } from '../../item-page/simple/notify-requests-status/notify-requests-status.resource-type'; -import { map, Observable, take } from 'rxjs'; +import { IdentifiableDataService } from './base/identifiable-data.service'; import { RemoteData } from './remote-data'; import { GetRequest } from './request.models'; +import { RequestService } from './request.service'; @Injectable() @dataService(NOTIFYREQUEST) diff --git a/src/app/core/data/object-updates/object-updates.effects.spec.ts b/src/app/core/data/object-updates/object-updates.effects.spec.ts index 5482ee7812..10f37d78cb 100644 --- a/src/app/core/data/object-updates/object-updates.effects.spec.ts +++ b/src/app/core/data/object-updates/object-updates.effects.spec.ts @@ -1,15 +1,34 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; -import { Observable, Subject } from 'rxjs'; -import { take } from 'rxjs/operators'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { provideMockActions } from '@ngrx/effects/testing'; -import { cold, hot } from 'jasmine-marbles'; +import { Action } from '@ngrx/store'; +import { + cold, + hot, +} from 'jasmine-marbles'; +import { + Observable, + Subject, +} from 'rxjs'; +import { take } from 'rxjs/operators'; + import { NoOpAction } from '../../../shared/ngrx/no-op.action'; -import { INotification, Notification } from '../../../shared/notifications/models/notification.model'; +import { + INotification, + Notification, +} from '../../../shared/notifications/models/notification.model'; import { NotificationType } from '../../../shared/notifications/models/notification-type'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { DiscardObjectUpdatesAction, ObjectUpdatesAction, ReinstateObjectUpdatesAction, RemoveFieldUpdateAction, RemoveObjectUpdatesAction } from './object-updates.actions'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; -import { Action } from '@ngrx/store'; +import { + DiscardObjectUpdatesAction, + ObjectUpdatesAction, + ReinstateObjectUpdatesAction, + RemoveFieldUpdateAction, + RemoveObjectUpdatesAction, +} from './object-updates.actions'; import { ObjectUpdatesEffects } from './object-updates.effects'; describe('ObjectUpdatesEffects', () => { @@ -97,7 +116,7 @@ describe('ObjectUpdatesEffects', () => { // keep track of the current state let emittedAction: Action | undefined; updatesEffects.removeAfterDiscardOrReinstateOnUndo$.pipe( - take(2) + take(2), ).subscribe((action: Action | NoOpAction) => { emittedAction = action; }); diff --git a/src/app/core/data/object-updates/object-updates.reducer.spec.ts b/src/app/core/data/object-updates/object-updates.reducer.spec.ts index cf0aeb2946..1f2a15769b 100644 --- a/src/app/core/data/object-updates/object-updates.reducer.spec.ts +++ b/src/app/core/data/object-updates/object-updates.reducer.spec.ts @@ -3,8 +3,23 @@ import * as deepFreeze from 'deep-freeze'; import { Relationship } from '../../shared/item-relationships/relationship.model'; import { FieldChangeType } from './field-change-type.model'; -import { AddFieldUpdateAction, DiscardObjectUpdatesAction, InitializeFieldsAction, ReinstateObjectUpdatesAction, RemoveAllObjectUpdatesAction, RemoveFieldUpdateAction, RemoveObjectUpdatesAction, SelectVirtualMetadataAction, SetEditableFieldUpdateAction, SetValidFieldUpdateAction } from './object-updates.actions'; -import { OBJECT_UPDATES_TRASH_PATH, objectUpdatesReducer, ObjectUpdatesState } from './object-updates.reducer'; +import { + AddFieldUpdateAction, + DiscardObjectUpdatesAction, + InitializeFieldsAction, + ReinstateObjectUpdatesAction, + RemoveAllObjectUpdatesAction, + RemoveFieldUpdateAction, + RemoveObjectUpdatesAction, + SelectVirtualMetadataAction, + SetEditableFieldUpdateAction, + SetValidFieldUpdateAction, +} from './object-updates.actions'; +import { + OBJECT_UPDATES_TRASH_PATH, + objectUpdatesReducer, + ObjectUpdatesState, +} from './object-updates.reducer'; class NullAction extends RemoveFieldUpdateAction { type = null; diff --git a/src/app/core/data/object-updates/object-updates.reducer.ts b/src/app/core/data/object-updates/object-updates.reducer.ts index e5c66e9f72..e014889850 100644 --- a/src/app/core/data/object-updates/object-updates.reducer.ts +++ b/src/app/core/data/object-updates/object-updates.reducer.ts @@ -1,4 +1,7 @@ -import { hasNoValue, hasValue } from '../../../shared/empty.util'; +import { + hasNoValue, + hasValue, +} from '../../../shared/empty.util'; import { GenericConstructor } from '../../shared/generic-constructor'; import { Item } from '../../shared/item.model'; import { Relationship } from '../../shared/item-relationships/relationship.model'; @@ -6,7 +9,19 @@ import { RelationshipType } from '../../shared/item-relationships/relationship-t import { FieldChangeType } from './field-change-type.model'; import { FieldUpdates } from './field-updates.model'; import { Identifiable } from './identifiable.model'; -import { AddFieldUpdateAction, DiscardObjectUpdatesAction, InitializeFieldsAction, ObjectUpdatesAction, ObjectUpdatesActionTypes, ReinstateObjectUpdatesAction, RemoveFieldUpdateAction, RemoveObjectUpdatesAction, SelectVirtualMetadataAction, SetEditableFieldUpdateAction, SetValidFieldUpdateAction } from './object-updates.actions'; +import { + AddFieldUpdateAction, + DiscardObjectUpdatesAction, + InitializeFieldsAction, + ObjectUpdatesAction, + ObjectUpdatesActionTypes, + ReinstateObjectUpdatesAction, + RemoveFieldUpdateAction, + RemoveObjectUpdatesAction, + SelectVirtualMetadataAction, + SetEditableFieldUpdateAction, + SetValidFieldUpdateAction, +} from './object-updates.actions'; import { PatchOperationService } from './patch-operation-service/patch-operation.service'; /** diff --git a/src/app/core/data/processes/process-data.service.spec.ts b/src/app/core/data/processes/process-data.service.spec.ts index 78f614ebd8..46f84a1546 100644 --- a/src/app/core/data/processes/process-data.service.spec.ts +++ b/src/app/core/data/processes/process-data.service.spec.ts @@ -6,28 +6,37 @@ * http://www.dspace.org/license/ */ -import { testDeleteDataImplementation } from '../base/delete-data.spec'; -import { testFindAllDataImplementation } from '../base/find-all-data.spec'; -import { ProcessDataService, TIMER_FACTORY } from './process-data.service'; -import { fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; -import { RequestService } from '../request.service'; -import { RemoteData } from '../remote-data'; -import { RequestEntryState } from '../request-entry-state.model'; +import { + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { ReducerManager } from '@ngrx/store'; +import { of } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + import { Process } from '../../../process-page/processes/process.model'; import { ProcessStatus } from '../../../process-page/processes/process-status.model'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../cache/object-cache.service'; -import { ReducerManager } from '@ngrx/store'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { DSOChangeAnalyzer } from '../dso-change-analyzer.service'; -import { BitstreamFormatDataService } from '../bitstream-format-data.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { TestScheduler } from 'rxjs/testing'; +import { testDeleteDataImplementation } from '../base/delete-data.spec'; +import { testFindAllDataImplementation } from '../base/find-all-data.spec'; import { testSearchDataImplementation } from '../base/search-data.spec'; -import { PaginatedList } from '../paginated-list.model'; +import { BitstreamFormatDataService } from '../bitstream-format-data.service'; +import { DSOChangeAnalyzer } from '../dso-change-analyzer.service'; import { FindListOptions } from '../find-list-options.model'; -import { of } from 'rxjs'; -import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { PaginatedList } from '../paginated-list.model'; +import { RemoteData } from '../remote-data'; +import { RequestService } from '../request.service'; +import { RequestEntryState } from '../request-entry-state.model'; +import { + ProcessDataService, + TIMER_FACTORY, +} from './process-data.service'; describe('ProcessDataService', () => { let testScheduler; @@ -66,7 +75,7 @@ describe('ProcessDataService', () => { { provide: BitstreamFormatDataService, useValue: null }, { provide: NotificationsService, useValue: null }, { provide: TIMER_FACTORY, useValue: mockTimer }, - ] + ], }); processDataService = TestBed.inject(ProcessDataService); @@ -82,13 +91,13 @@ describe('ProcessDataService', () => { spyOn(processDataService, 'findById').and.returnValue( cold('c', { - 'c': completedProcessRD - }) + 'c': completedProcessRD, + }), ); let process$ = processDataService.autoRefreshUntilCompletion('instantly'); expectObservable(process$).toBe('c', { - c: completedProcessRD + c: completedProcessRD, }); }); @@ -101,9 +110,9 @@ describe('ProcessDataService', () => { const runningProcess = Object.assign(new Process(), { _links: { self: { - href: 'https://rest.api/processes/123' - } - } + href: 'https://rest.api/processes/123', + }, + }, }); runningProcess.processStatus = ProcessStatus.RUNNING; const completedProcess = new Process(); @@ -114,14 +123,14 @@ describe('ProcessDataService', () => { spyOn(processDataService, 'findById').and.returnValue( cold('r 150ms c', { 'r': runningProcessRD, - 'c': completedProcessRD - }) + 'c': completedProcessRD, + }), ); let process$ = processDataService.autoRefreshUntilCompletion('foo', 100); expectObservable(process$).toBe('r 150ms c', { 'r': runningProcessRD, - 'c': completedProcessRD + 'c': completedProcessRD, }); }); @@ -146,7 +155,7 @@ describe('ProcessDataService', () => { { provide: BitstreamFormatDataService, useValue: null }, { provide: NotificationsService, useValue: null }, { provide: TIMER_FACTORY, useValue: mockTimer }, - ] + ], }); processDataService = TestBed.inject(ProcessDataService); @@ -156,9 +165,9 @@ describe('ProcessDataService', () => { const runningProcess = Object.assign(new Process(), { _links: { self: { - href: 'https://rest.api/processes/123' - } - } + href: 'https://rest.api/processes/123', + }, + }, }); runningProcess.processStatus = ProcessStatus.RUNNING; @@ -166,15 +175,15 @@ describe('ProcessDataService', () => { page: [runningProcess], _links: { self: { - href: 'https://rest.api/processesList/456' - } - } + href: 'https://rest.api/processesList/456', + }, + }, }); const runningProcessRD = new RemoteData(0, 0, 0, RequestEntryState.Success, null, runningProcessPagination); spyOn(processDataService, 'searchBy').and.returnValue( - of(runningProcessRD) + of(runningProcessRD), ); expect(processDataService.searchBy).toHaveBeenCalledTimes(0); diff --git a/src/app/core/data/processes/process-data.service.ts b/src/app/core/data/processes/process-data.service.ts index 9aa204555a..ae0dfc11fa 100644 --- a/src/app/core/data/processes/process-data.service.ts +++ b/src/app/core/data/processes/process-data.service.ts @@ -1,29 +1,51 @@ -import { Inject, Injectable, InjectionToken, NgZone } from '@angular/core'; -import { RequestService } from '../request.service'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, find, switchMap } from 'rxjs/operators'; +import { + Inject, + Injectable, + InjectionToken, + NgZone, +} from '@angular/core'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + filter, + find, + switchMap, +} from 'rxjs/operators'; +import { ProcessStatus } from 'src/app/process-page/processes/process-status.model'; import { Process } from '../../../process-page/processes/process.model'; import { PROCESS } from '../../../process-page/processes/process.resource-type'; +import { hasValue } from '../../../shared/empty.util'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../cache/object-cache.service'; -import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { PaginatedList } from '../paginated-list.model'; import { Bitstream } from '../../shared/bitstream.model'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; import { NoContent } from '../../shared/NoContent.model'; +import { getAllCompletedRemoteData } from '../../shared/operators'; import { dataService } from '../base/data-service.decorator'; -import { DeleteData, DeleteDataImpl } from '../base/delete-data'; -import { FindAllData, FindAllDataImpl } from '../base/find-all-data'; +import { + DeleteData, + DeleteDataImpl, +} from '../base/delete-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../base/find-all-data'; import { IdentifiableDataService } from '../base/identifiable-data.service'; +import { + SearchData, + SearchDataImpl, +} from '../base/search-data'; import { BitstreamDataService } from '../bitstream-data.service'; import { FindListOptions } from '../find-list-options.model'; -import { getAllCompletedRemoteData } from '../../shared/operators'; -import { ProcessStatus } from 'src/app/process-page/processes/process-status.model'; -import { hasValue } from '../../../shared/empty.util'; -import { SearchData, SearchDataImpl } from '../base/search-data'; +import { PaginatedList } from '../paginated-list.model'; import { RemoteData } from '../remote-data'; +import { RequestService } from '../request.service'; /** * Create an InjectionToken for the default JS setTimeout function, purely so we can mock it during @@ -31,7 +53,7 @@ import { RemoteData } from '../remote-data'; */ export const TIMER_FACTORY = new InjectionToken<(callback: (...args: any[]) => void, ms?: number, ...args: any[]) => NodeJS.Timeout>('timer', { providedIn: 'root', - factory: () => setTimeout + factory: () => setTimeout, }); @Injectable() @@ -52,7 +74,7 @@ export class ProcessDataService extends IdentifiableDataService impleme protected bitstreamDataService: BitstreamDataService, protected notificationsService: NotificationsService, protected zone: NgZone, - @Inject(TIMER_FACTORY) protected timer: (callback: (...args: any[]) => void, ms?: number, ...args: any[]) => NodeJS.Timeout + @Inject(TIMER_FACTORY) protected timer: (callback: (...args: any[]) => void, ms?: number, ...args: any[]) => NodeJS.Timeout, ) { super('processes', requestService, rdbService, objectCache, halService); @@ -145,13 +167,13 @@ export class ProcessDataService extends IdentifiableDataService impleme autoRefreshingSearchBy(id: string, searchMethod: string, options?: FindListOptions, pollingIntervalInMs: number = 5000, ...linksToFollow: FollowLinkConfig[]): Observable>> { const result$ = this.searchBy(searchMethod, options, true, true, ...linksToFollow).pipe( - getAllCompletedRemoteData() + getAllCompletedRemoteData(), ); const sub = result$.pipe( filter(() => - !this.activelyBeingPolled.has(id) - ) + !this.activelyBeingPolled.has(id), + ), ).subscribe((processListRd: RemoteData>) => { this.clearCurrentTimeout(id); const nextTimeout = this.timer(() => { @@ -242,8 +264,8 @@ export class ProcessDataService extends IdentifiableDataService impleme const sub = process$.pipe( filter((processRD: RemoteData) => !ProcessDataService.hasCompletedOrFailed(processRD.payload) && - !this.activelyBeingPolled.has(processId) - ) + !this.activelyBeingPolled.has(processId), + ), ).subscribe((processRD: RemoteData) => { this.clearCurrentTimeout(processId); if (processRD.hasSucceeded) { @@ -262,7 +284,7 @@ export class ProcessDataService extends IdentifiableDataService impleme // observable) that unsubscribes the previous one, removes the processId from the list of // processes being polled and clears any running timeouts process$.pipe( - find((processRD: RemoteData) => ProcessDataService.hasCompletedOrFailed(processRD.payload)) + find((processRD: RemoteData) => ProcessDataService.hasCompletedOrFailed(processRD.payload)), ).subscribe(() => { this.stopAutoRefreshing(processId); }); @@ -270,7 +292,7 @@ export class ProcessDataService extends IdentifiableDataService impleme return process$.pipe( distinctUntilChanged((previous: RemoteData, current: RemoteData) => previous.payload?.processStatus === current.payload?.processStatus, - ) + ), ); } } diff --git a/src/app/core/data/relationship-data.service.spec.ts b/src/app/core/data/relationship-data.service.spec.ts index 52327e62c8..21365e52e1 100644 --- a/src/app/core/data/relationship-data.service.spec.ts +++ b/src/app/core/data/relationship-data.service.spec.ts @@ -2,8 +2,13 @@ import { of as observableOf } from 'rxjs'; import { getMockRemoteDataBuildServiceHrefMap } from '../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; +import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { followLink } from '../../shared/utils/follow-link-config.model'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -20,7 +25,6 @@ import { RelationshipDataService } from './relationship-data.service'; import { DeleteRequest } from './request.models'; import { RequestService } from './request.service'; import { RequestEntry } from './request-entry.model'; -import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; describe('RelationshipDataService', () => { let service: RelationshipDataService; diff --git a/src/app/core/data/relationship-type-data.service.spec.ts b/src/app/core/data/relationship-type-data.service.spec.ts index 906ed47ae6..c82a2789ce 100644 --- a/src/app/core/data/relationship-type-data.service.spec.ts +++ b/src/app/core/data/relationship-type-data.service.spec.ts @@ -3,15 +3,18 @@ import { of as observableOf } from 'rxjs'; import { hasValueOperator } from '../../shared/empty.util'; import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; +import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { ObjectCacheService } from '../cache/object-cache.service'; import { ItemType } from '../shared/item-relationships/item-type.model'; import { RelationshipType } from '../shared/item-relationships/relationship-type.model'; import { RelationshipTypeDataService } from './relationship-type-data.service'; import { RequestService } from './request.service'; -import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; describe('RelationshipTypeDataService', () => { let service: RelationshipTypeDataService; diff --git a/src/app/core/data/update-data.service.spec.ts b/src/app/core/data/update-data.service.spec.ts index 426fa87eb6..73ea07b84d 100644 --- a/src/app/core/data/update-data.service.spec.ts +++ b/src/app/core/data/update-data.service.spec.ts @@ -1,26 +1,34 @@ +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; + +import { getMockHrefOnlyDataService } from '../../shared/mocks/href-only-data.service.mock'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RequestService } from './request.service'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { HrefOnlyDataService } from './href-only-data.service'; -import { getMockHrefOnlyDataService } from '../../shared/mocks/href-only-data.service.mock'; import { RestResponse } from '../cache/response.models'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; import { Version } from '../shared/version.model'; import { VersionHistory } from '../shared/version-history.model'; -import { RequestEntry } from './request-entry.model'; -import { testPatchDataImplementation } from './base/patch-data.spec'; -import { UpdateDataServiceImpl } from './update-data.service'; -import { testSearchDataImplementation } from './base/search-data.spec'; -import { testDeleteDataImplementation } from './base/delete-data.spec'; import { testCreateDataImplementation } from './base/create-data.spec'; +import { testDeleteDataImplementation } from './base/delete-data.spec'; import { testFindAllDataImplementation } from './base/find-all-data.spec'; +import { testPatchDataImplementation } from './base/patch-data.spec'; import { testPutDataImplementation } from './base/put-data.spec'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { testSearchDataImplementation } from './base/search-data.spec'; +import { HrefOnlyDataService } from './href-only-data.service'; +import { RequestService } from './request.service'; +import { RequestEntry } from './request-entry.model'; +import { UpdateDataServiceImpl } from './update-data.service'; describe('VersionDataService test', () => { let scheduler: TestScheduler; @@ -42,28 +50,28 @@ describe('VersionDataService test', () => { 'dc.title': [ { language: 'en_US', - value: 'This is just another title' - } + value: 'This is just another title', + }, ], 'dc.type': [ { language: null, - value: 'Article' - } + value: 'Article', + }, ], 'dc.contributor.author': [ { language: 'en_US', - value: 'Smith, Donald' - } + value: 'Smith, Donald', + }, ], 'dc.date.issued': [ { language: null, - value: '2015-06-26' - } - ] - } + value: '2015-06-26', + }, + ], + }, }); const versionHistory = Object.assign(new VersionHistory(), { @@ -93,7 +101,7 @@ describe('VersionDataService test', () => { halService, notificationsService, comparatorEntry, - 10 * 1000 + 10 * 1000, ); } @@ -102,7 +110,7 @@ describe('VersionDataService test', () => { scheduler = getTestScheduler(); halService = jasmine.createSpyObj('halService', { - getEndpoint: cold('a', { a: endpointURL }) + getEndpoint: cold('a', { a: endpointURL }), }); responseCacheEntry = new RequestEntry(); responseCacheEntry.request = { href: 'https://rest.api/' } as any; @@ -117,8 +125,8 @@ describe('VersionDataService test', () => { }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: hot('(a|)', { - a: mockVersionRD - }) + a: mockVersionRD, + }), }); service = initTestService(); diff --git a/src/app/core/data/update-data.service.ts b/src/app/core/data/update-data.service.ts index 27ef1fa192..6a8a0c63e8 100644 --- a/src/app/core/data/update-data.service.ts +++ b/src/app/core/data/update-data.service.ts @@ -1,30 +1,63 @@ import { Operation } from 'fast-json-patch'; -import { AsyncSubject, from as observableFrom, Observable } from 'rxjs'; -import { find, map, mergeMap, switchMap, take, toArray } from 'rxjs/operators'; +import { + AsyncSubject, + from as observableFrom, + Observable, +} from 'rxjs'; +import { + find, + map, + mergeMap, + switchMap, + take, + toArray, +} from 'rxjs/operators'; + import { hasValue } from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { CacheableObject } from '../cache/cacheable-object.model'; import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheEntry } from '../cache/object-cache.reducer'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NoContent } from '../shared/NoContent.model'; +import { + CreateData, + CreateDataImpl, +} from './base/create-data'; +import { + DeleteData, + DeleteDataImpl, +} from './base/delete-data'; +import { + FindAllData, + FindAllDataImpl, +} from './base/find-all-data'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { + PatchData, + PatchDataImpl, +} from './base/patch-data'; +import { + PutData, + PutDataImpl, +} from './base/put-data'; +import { + SearchData, + SearchDataImpl, +} from './base/search-data'; import { ChangeAnalyzer } from './change-analyzer'; +import { FindListOptions } from './find-list-options.model'; import { PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; -import { DeleteByIDRequest, PostRequest } from './request.models'; +import { + DeleteByIDRequest, + PostRequest, +} from './request.models'; import { RequestService } from './request.service'; import { RestRequestMethod } from './rest-request-method'; -import { NoContent } from '../shared/NoContent.model'; -import { CacheableObject } from '../cache/cacheable-object.model'; -import { FindListOptions } from './find-list-options.model'; -import { FindAllData, FindAllDataImpl } from './base/find-all-data'; -import { SearchData, SearchDataImpl } from './base/search-data'; -import { CreateData, CreateDataImpl } from './base/create-data'; -import { PatchData, PatchDataImpl } from './base/patch-data'; -import { IdentifiableDataService } from './base/identifiable-data.service'; -import { PutData, PutDataImpl } from './base/put-data'; -import { DeleteData, DeleteDataImpl } from './base/delete-data'; /** * Interface to list the methods used by the injected service in components @@ -202,7 +235,7 @@ export class UpdateDataServiceImpl extends Identifiab const hrefObs = this.getIDHrefObs(itemId); hrefObs.pipe( - take(1) + take(1), ).subscribe((href: string) => { const request = new PostRequest(requestId, href + '/related?item=' + relatedItemId, body); if (hasValue(this.responseMsToLive)) { @@ -231,7 +264,7 @@ export class UpdateDataServiceImpl extends Identifiab request.responseMsToLive = this.responseMsToLive; } this.requestService.send(request); - }) + }), ).subscribe(); return this.rdbService.buildFromRequestUUID(requestId); @@ -244,7 +277,7 @@ export class UpdateDataServiceImpl extends Identifiab */ invalidate(objectId: string): Observable { return this.getIDHrefObs(objectId).pipe( - switchMap((href: string) => this.invalidateByHref(href)) + switchMap((href: string) => this.invalidateByHref(href)), ); } @@ -291,7 +324,7 @@ export class UpdateDataServiceImpl extends Identifiab * Only emits once all request related to the DSO has been invalidated. */ deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { - return this.deleteData.deleteByHref(href, copyVirtualMetadata); + return this.deleteData.deleteByHref(href, copyVirtualMetadata); } /** diff --git a/src/app/core/data/version-data.service.spec.ts b/src/app/core/data/version-data.service.spec.ts index 9551779925..54af9b8895 100644 --- a/src/app/core/data/version-data.service.spec.ts +++ b/src/app/core/data/version-data.service.spec.ts @@ -1,9 +1,16 @@ -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { getMockHrefOnlyDataService } from '../../shared/mocks/href-only-data.service.mock'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { followLink } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; diff --git a/src/app/core/eperson/eperson-data.service.spec.ts b/src/app/core/eperson/eperson-data.service.spec.ts index 1762c901a6..127f0a1d2c 100644 --- a/src/app/core/eperson/eperson-data.service.spec.ts +++ b/src/app/core/eperson/eperson-data.service.spec.ts @@ -1,32 +1,62 @@ -import { fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { Store } from '@ngrx/store'; +import { + MockStore, + provideMockStore, +} from '@ngrx/store/testing'; +import { + compare, + Operation, +} from 'fast-json-patch'; import { cold } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; -import { EPeopleRegistryCancelEPersonAction, EPeopleRegistryEditEPersonAction } from '../../access-control/epeople-registry/epeople-registry.actions'; + +import { + EPeopleRegistryCancelEPersonAction, + EPeopleRegistryEditEPersonAction, +} from '../../access-control/epeople-registry/epeople-registry.actions'; import { getMockRemoteDataBuildServiceHrefMap } from '../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../shared/mocks/request.service.mock'; -import { createNoContentRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { EPersonMock, EPersonMock2 } from '../../shared/testing/eperson.mock'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; +import { + EPersonMock, + EPersonMock2, +} from '../../shared/testing/eperson.mock'; import { GroupMock } from '../../shared/testing/group-mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; -import { createPaginatedList, createRequestEntry$ } from '../../shared/testing/utils.test'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { + createPaginatedList, + createRequestEntry$, +} from '../../shared/testing/utils.test'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; -import { PatchRequest, PostRequest } from '../data/request.models'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { CoreState } from '../core-state.model'; +import { ChangeAnalyzer } from '../data/change-analyzer'; +import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; +import { FindListOptions } from '../data/find-list-options.model'; +import { + PatchRequest, + PostRequest, +} from '../data/request.models'; import { RequestService } from '../data/request.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { editEPersonSelector, EPersonDataService } from './eperson-data.service'; -import { EPerson } from './models/eperson.model'; -import { CoreState } from '../core-state.model'; -import { FindListOptions } from '../data/find-list-options.model'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; -import { MockStore, provideMockStore } from '@ngrx/store/testing'; -import { compare, Operation } from 'fast-json-patch'; import { Item } from '../shared/item.model'; -import { ChangeAnalyzer } from '../data/change-analyzer'; +import { + editEPersonSelector, + EPersonDataService, +} from './eperson-data.service'; +import { EPerson } from './models/eperson.model'; describe('EPersonDataService', () => { let service: EPersonDataService; @@ -43,7 +73,7 @@ describe('EPersonDataService', () => { const initialState = { epeopleRegistry: { - editEPerson: null + editEPerson: null, }, }; diff --git a/src/app/core/eperson/eperson-data.service.ts b/src/app/core/eperson/eperson-data.service.ts index c346faf124..ef728cccd3 100644 --- a/src/app/core/eperson/eperson-data.service.ts +++ b/src/app/core/eperson/eperson-data.service.ts @@ -1,35 +1,70 @@ import { Injectable } from '@angular/core'; -import { createSelector, select, Store } from '@ngrx/store'; +import { + createSelector, + select, + Store, +} from '@ngrx/store'; import { Operation } from 'fast-json-patch'; import { Observable } from 'rxjs'; -import { find, map, take } from 'rxjs/operators'; +import { + find, + map, + take, +} from 'rxjs/operators'; import { getEPersonEditRoute } from '../../access-control/access-control-routing-paths'; -import { EPeopleRegistryCancelEPersonAction, EPeopleRegistryEditEPersonAction } from '../../access-control/epeople-registry/epeople-registry.actions'; +import { + EPeopleRegistryCancelEPersonAction, + EPeopleRegistryEditEPersonAction, +} from '../../access-control/epeople-registry/epeople-registry.actions'; import { EPeopleRegistryState } from '../../access-control/epeople-registry/epeople-registry.reducers'; import { AppState } from '../../app.reducer'; -import { hasNoValue, hasValue } from '../../shared/empty.util'; +import { + hasNoValue, + hasValue, +} from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { CreateData, CreateDataImpl } from '../data/base/create-data'; +import { + CreateData, + CreateDataImpl, +} from '../data/base/create-data'; import { dataService } from '../data/base/data-service.decorator'; -import { DeleteData, DeleteDataImpl } from '../data/base/delete-data'; +import { + DeleteData, + DeleteDataImpl, +} from '../data/base/delete-data'; import { IdentifiableDataService } from '../data/base/identifiable-data.service'; -import { PatchData, PatchDataImpl } from '../data/base/patch-data'; -import { SearchData, SearchDataImpl } from '../data/base/search-data'; +import { + PatchData, + PatchDataImpl, +} from '../data/base/patch-data'; +import { + SearchData, + SearchDataImpl, +} from '../data/base/search-data'; import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; import { FindListOptions } from '../data/find-list-options.model'; -import { buildPaginatedList, PaginatedList } from '../data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; -import { PatchRequest, PostRequest } from '../data/request.models'; +import { + PatchRequest, + PostRequest, +} from '../data/request.models'; import { RequestService } from '../data/request.service'; import { RestRequestMethod } from '../data/rest-request-method'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NoContent } from '../shared/NoContent.model'; -import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../shared/operators'; +import { + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../shared/operators'; import { PageInfo } from '../shared/page-info.model'; import { EPerson } from './models/eperson.model'; import { EPERSON } from './models/eperson.resource-type'; diff --git a/src/app/core/json-patch/builder/json-patch-operations-builder.ts b/src/app/core/json-patch/builder/json-patch-operations-builder.ts index f3f0156b66..b7db765b3b 100644 --- a/src/app/core/json-patch/builder/json-patch-operations-builder.ts +++ b/src/app/core/json-patch/builder/json-patch-operations-builder.ts @@ -1,13 +1,28 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; -import { dateToISOFormat, dateToString, isNgbDateStruct } from '../../../shared/date.util'; -import { hasNoValue, hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util'; +import { + dateToISOFormat, + dateToString, + isNgbDateStruct, +} from '../../../shared/date.util'; +import { + hasNoValue, + hasValue, + isEmpty, + isNotEmpty, +} from '../../../shared/empty.util'; import { FormFieldLanguageValueObject } from '../../../shared/form/builder/models/form-field-language-value.model'; import { FormFieldMetadataValueObject } from '../../../shared/form/builder/models/form-field-metadata-value.model'; import { CoreState } from '../../core-state.model'; import { VocabularyEntry } from '../../submission/vocabularies/models/vocabulary-entry.model'; -import { FlushPatchOperationAction, NewPatchAddOperationAction, NewPatchMoveOperationAction, NewPatchRemoveOperationAction, NewPatchReplaceOperationAction } from '../json-patch-operations.actions'; +import { + FlushPatchOperationAction, + NewPatchAddOperationAction, + NewPatchMoveOperationAction, + NewPatchRemoveOperationAction, + NewPatchReplaceOperationAction, +} from '../json-patch-operations.actions'; import { JsonPatchOperationPathObject } from './json-patch-operation-path-combiner'; /** @@ -103,10 +118,10 @@ export class JsonPatchOperationsBuilder { */ flushOperation(path: JsonPatchOperationPathObject) { this.store.dispatch( - new FlushPatchOperationAction( - path.rootElement, - path.subRootElement, - path.path)); + new FlushPatchOperationAction( + path.rootElement, + path.subRootElement, + path.path)); } protected prepareValue(value: any, plain: boolean, first: boolean) { diff --git a/src/app/core/json-patch/json-patch-operations.reducer.ts b/src/app/core/json-patch/json-patch-operations.reducer.ts index b33e9139fa..53466d284d 100644 --- a/src/app/core/json-patch/json-patch-operations.reducer.ts +++ b/src/app/core/json-patch/json-patch-operations.reducer.ts @@ -1,6 +1,28 @@ -import { hasValue, isNotEmpty, isNotUndefined, isNull } from '../../shared/empty.util'; -import { JsonPatchOperationModel, JsonPatchOperationType } from './json-patch.model'; -import { CommitPatchOperationsAction, DeletePendingJsonPatchOperationsAction, FlushPatchOperationAction, FlushPatchOperationsAction, JsonPatchOperationsActionTypes, NewPatchAddOperationAction, NewPatchCopyOperationAction, NewPatchMoveOperationAction, NewPatchRemoveOperationAction, NewPatchReplaceOperationAction, PatchOperationsActions, RollbacktPatchOperationsAction, StartTransactionPatchOperationsAction } from './json-patch-operations.actions'; +import { + hasValue, + isNotEmpty, + isNotUndefined, + isNull, +} from '../../shared/empty.util'; +import { + JsonPatchOperationModel, + JsonPatchOperationType, +} from './json-patch.model'; +import { + CommitPatchOperationsAction, + DeletePendingJsonPatchOperationsAction, + FlushPatchOperationAction, + FlushPatchOperationsAction, + JsonPatchOperationsActionTypes, + NewPatchAddOperationAction, + NewPatchCopyOperationAction, + NewPatchMoveOperationAction, + NewPatchRemoveOperationAction, + NewPatchReplaceOperationAction, + PatchOperationsActions, + RollbacktPatchOperationsAction, + StartTransactionPatchOperationsAction, +} from './json-patch-operations.actions'; /** * An interface to represent JSON-PATCH Operation objects to execute @@ -211,9 +233,9 @@ function flushOperation(state: JsonPatchOperationsState, action: FlushPatchOpera children: { [action.payload.resourceId]: { body: newBody, - } + }, }, - }) + }), }); } else { return state; diff --git a/src/app/core/notifications/models/suggestion-source.model.ts b/src/app/core/notifications/models/suggestion-source.model.ts index f06cf7633d..f8e7c70cf5 100644 --- a/src/app/core/notifications/models/suggestion-source.model.ts +++ b/src/app/core/notifications/models/suggestion-source.model.ts @@ -1,11 +1,14 @@ -import { autoserialize, deserialize } from 'cerialize'; +import { + autoserialize, + deserialize, +} from 'cerialize'; -import { SUGGESTION_SOURCE } from './suggestion-source-object.resource-type'; -import { excludeFromEquals } from '../../utilities/equals.decorators'; -import { ResourceType } from '../../shared/resource-type'; -import { HALLink } from '../../shared/hal-link.model'; import { typedObject } from '../../cache/builders/build-decorators'; import { CacheableObject } from '../../cache/cacheable-object.model'; +import { HALLink } from '../../shared/hal-link.model'; +import { ResourceType } from '../../shared/resource-type'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { SUGGESTION_SOURCE } from './suggestion-source-object.resource-type'; /** * The interface representing the Suggestion Source model @@ -21,26 +24,26 @@ export class SuggestionSource implements CacheableObject { * The Suggestion Target id */ @autoserialize - id: string; + id: string; /** * The total number of suggestions provided by Suggestion Target for */ @autoserialize - total: number; + total: number; /** * The type of this ConfigObject */ @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; /** * The links to all related resources returned by the rest api. */ @deserialize - _links: { + _links: { self: HALLink, suggestiontargets: HALLink }; diff --git a/src/app/core/notifications/models/suggestion-target.model.ts b/src/app/core/notifications/models/suggestion-target.model.ts index fd1cb3c715..1cbd78ae6b 100644 --- a/src/app/core/notifications/models/suggestion-target.model.ts +++ b/src/app/core/notifications/models/suggestion-target.model.ts @@ -1,11 +1,14 @@ -import { autoserialize, deserialize } from 'cerialize'; +import { + autoserialize, + deserialize, +} from 'cerialize'; -import { CacheableObject } from '../../cache/cacheable-object.model'; -import { SUGGESTION_TARGET } from './suggestion-target-object.resource-type'; -import { excludeFromEquals } from '../../utilities/equals.decorators'; -import { ResourceType } from '../../shared/resource-type'; -import { HALLink } from '../../shared/hal-link.model'; import { typedObject } from '../../cache/builders/build-decorators'; +import { CacheableObject } from '../../cache/cacheable-object.model'; +import { HALLink } from '../../shared/hal-link.model'; +import { ResourceType } from '../../shared/resource-type'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { SUGGESTION_TARGET } from './suggestion-target-object.resource-type'; /** * The interface representing the Suggestion Target model @@ -21,38 +24,38 @@ export class SuggestionTarget implements CacheableObject { * The Suggestion Target id */ @autoserialize - id: string; + id: string; /** * The Suggestion Target name to display */ @autoserialize - display: string; + display: string; /** * The Suggestion Target source to display */ @autoserialize - source: string; + source: string; /** * The total number of suggestions provided by Suggestion Target for */ @autoserialize - total: number; + total: number; /** * The type of this ConfigObject */ @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; /** * The links to all related resources returned by the rest api. */ @deserialize - _links: { + _links: { self: HALLink, suggestions: HALLink, target: HALLink diff --git a/src/app/core/notifications/models/suggestion.model.ts b/src/app/core/notifications/models/suggestion.model.ts index 99231c5219..a84fe9ffe2 100644 --- a/src/app/core/notifications/models/suggestion.model.ts +++ b/src/app/core/notifications/models/suggestion.model.ts @@ -1,12 +1,19 @@ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { + autoserialize, + autoserializeAs, + deserialize, +} from 'cerialize'; -import { SUGGESTION } from './suggestion-objects.resource-type'; -import { excludeFromEquals } from '../../utilities/equals.decorators'; -import { ResourceType } from '../../shared/resource-type'; -import { HALLink } from '../../shared/hal-link.model'; import { typedObject } from '../../cache/builders/build-decorators'; -import { MetadataMap, MetadataMapSerializer } from '../../shared/metadata.models'; import { CacheableObject } from '../../cache/cacheable-object.model'; +import { HALLink } from '../../shared/hal-link.model'; +import { + MetadataMap, + MetadataMapSerializer, +} from '../../shared/metadata.models'; +import { ResourceType } from '../../shared/resource-type'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { SUGGESTION } from './suggestion-objects.resource-type'; /** * The interface representing Suggestion Evidences such as scores (authorScore, datescore) @@ -31,57 +38,57 @@ export class Suggestion implements CacheableObject { * The Suggestion id */ @autoserialize - id: string; + id: string; /** * The Suggestion name to display */ @autoserialize - display: string; + display: string; /** * The Suggestion source to display */ @autoserialize - source: string; + source: string; /** * The Suggestion external source uri */ @autoserialize - externalSourceUri: string; + externalSourceUri: string; /** * The Total Score of the suggestion */ @autoserialize - score: string; + score: string; /** * The total number of suggestions provided by Suggestion Target for */ @autoserialize - evidences: SuggestionEvidences; + evidences: SuggestionEvidences; /** * All metadata of this suggestion object */ @excludeFromEquals @autoserializeAs(MetadataMapSerializer) - metadata: MetadataMap; + metadata: MetadataMap; /** * The type of this ConfigObject */ @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; /** * The links to all related resources returned by the rest api. */ @deserialize - _links: { + _links: { self: HALLink, target: HALLink }; diff --git a/src/app/core/notifications/qa/events/quality-assurance-event-data.service.spec.ts b/src/app/core/notifications/qa/events/quality-assurance-event-data.service.spec.ts index df378b8a32..847eea7c7e 100644 --- a/src/app/core/notifications/qa/events/quality-assurance-event-data.service.spec.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-data.service.spec.ts @@ -1,12 +1,20 @@ import { HttpClient } from '@angular/common/http'; import { ReplaceOperation } from 'fast-json-patch'; -import { cold, getTestScheduler } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { qualityAssuranceEventObjectMissingPid, qualityAssuranceEventObjectMissingPid2, qualityAssuranceEventObjectMissingProjectFound } from '../../../../shared/mocks/notifications.mock'; +import { + qualityAssuranceEventObjectMissingPid, + qualityAssuranceEventObjectMissingPid2, + qualityAssuranceEventObjectMissingProjectFound, +} from '../../../../shared/mocks/notifications.mock'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -17,7 +25,6 @@ import { RequestEntry } from '../../../data/request-entry.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { PageInfo } from '../../../shared/page-info.model'; import { QualityAssuranceEventDataService } from './quality-assurance-event-data.service'; -import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; describe('QualityAssuranceEventDataService', () => { let scheduler: TestScheduler; diff --git a/src/app/core/notifications/qa/events/quality-assurance-event-data.service.ts b/src/app/core/notifications/qa/events/quality-assurance-event-data.service.ts index 2d5b408262..8c299b83ce 100644 --- a/src/app/core/notifications/qa/events/quality-assurance-event-data.service.ts +++ b/src/app/core/notifications/qa/events/quality-assurance-event-data.service.ts @@ -1,32 +1,54 @@ +import { + HttpHeaders, + HttpParams, +} from '@angular/common/http'; import { Injectable } from '@angular/core'; import { ReplaceOperation } from 'fast-json-patch'; import { Observable } from 'rxjs'; -import { find, switchMap, take } from 'rxjs/operators'; +import { + find, + switchMap, + take, +} from 'rxjs/operators'; +import { QualityAssuranceEventData } from '../../../../notifications/qa/project-entry-import-modal/project-entry-import-modal.component'; import { hasValue } from '../../../../shared/empty.util'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; -import { CreateData, CreateDataImpl } from '../../../data/base/create-data'; +import { + CreateData, + CreateDataImpl, +} from '../../../data/base/create-data'; import { dataService } from '../../../data/base/data-service.decorator'; -import { DeleteData, DeleteDataImpl } from '../../../data/base/delete-data'; +import { + DeleteData, + DeleteDataImpl, +} from '../../../data/base/delete-data'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; -import { PatchData, PatchDataImpl } from '../../../data/base/patch-data'; -import { SearchData, SearchDataImpl } from '../../../data/base/search-data'; +import { + PatchData, + PatchDataImpl, +} from '../../../data/base/patch-data'; +import { + SearchData, + SearchDataImpl, +} from '../../../data/base/search-data'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { FindListOptions } from '../../../data/find-list-options.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { RemoteData } from '../../../data/remote-data'; -import { DeleteByIDRequest, PostRequest } from '../../../data/request.models'; +import { + DeleteByIDRequest, + PostRequest, +} from '../../../data/request.models'; import { RequestService } from '../../../data/request.service'; +import { HttpOptions } from '../../../dspace-rest/dspace-rest.service'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NoContent } from '../../../shared/NoContent.model'; import { QualityAssuranceEventObject } from '../models/quality-assurance-event.model'; import { QUALITY_ASSURANCE_EVENT_OBJECT } from '../models/quality-assurance-event-object.resource-type'; -import { HttpHeaders, HttpParams } from '@angular/common/http'; -import { HttpOptions } from '../../../dspace-rest/dspace-rest.service'; -import { QualityAssuranceEventData } from '../../../../notifications/qa/project-entry-import-modal/project-entry-import-modal.component'; /** * The service handling all Quality Assurance topic REST requests. @@ -230,20 +252,20 @@ export class QualityAssuranceEventDataService extends IdentifiableDataService(requestId); - }) + }), ); } public deleteQAEvent(qaEvent: QualityAssuranceEventData): Observable> { - return this.deleteData.delete(qaEvent.id); + return this.deleteData.delete(qaEvent.id); } } diff --git a/src/app/core/notifications/qa/models/quality-assurance-event.model.ts b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts index 2a42000daf..9210d8f6f9 100644 --- a/src/app/core/notifications/qa/models/quality-assurance-event.model.ts +++ b/src/app/core/notifications/qa/models/quality-assurance-event.model.ts @@ -1,8 +1,15 @@ /* eslint-disable max-classes-per-file */ -import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { + autoserialize, + autoserializeAs, + deserialize, +} from 'cerialize'; import { Observable } from 'rxjs'; -import { link, typedObject } from '../../../cache/builders/build-decorators'; +import { + link, + typedObject, +} from '../../../cache/builders/build-decorators'; import { CacheableObject } from '../../../cache/cacheable-object.model'; import { RemoteData } from '../../../data/remote-data'; import { HALLink } from '../../../shared/hal-link.model'; diff --git a/src/app/core/notifications/qa/source/quality-assurance-source-data.service.spec.ts b/src/app/core/notifications/qa/source/quality-assurance-source-data.service.spec.ts index 0b4395cb23..0fca119e8b 100644 --- a/src/app/core/notifications/qa/source/quality-assurance-source-data.service.spec.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-data.service.spec.ts @@ -1,11 +1,18 @@ import { HttpClient } from '@angular/common/http'; -import { cold, getTestScheduler } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { qualityAssuranceSourceObjectMoreAbstract, qualityAssuranceSourceObjectMorePid } from '../../../../shared/mocks/notifications.mock'; +import { + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid, +} from '../../../../shared/mocks/notifications.mock'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -15,7 +22,6 @@ import { RequestEntry } from '../../../data/request-entry.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { PageInfo } from '../../../shared/page-info.model'; import { QualityAssuranceSourceDataService } from './quality-assurance-source-data.service'; -import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; describe('QualityAssuranceSourceDataService', () => { let scheduler: TestScheduler; diff --git a/src/app/core/notifications/qa/source/quality-assurance-source-data.service.ts b/src/app/core/notifications/qa/source/quality-assurance-source-data.service.ts index 62bd075483..aad9ebc28b 100644 --- a/src/app/core/notifications/qa/source/quality-assurance-source-data.service.ts +++ b/src/app/core/notifications/qa/source/quality-assurance-source-data.service.ts @@ -6,8 +6,15 @@ import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.mo import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../data/base/data-service.decorator'; -import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../../../data/base/find-all-data'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; +import { + SearchData, + SearchDataImpl, +} from '../../../data/base/search-data'; import { FindListOptions } from '../../../data/find-list-options.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { RemoteData } from '../../../data/remote-data'; @@ -15,7 +22,6 @@ import { RequestService } from '../../../data/request.service'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { QualityAssuranceSourceObject } from '../models/quality-assurance-source.model'; import { QUALITY_ASSURANCE_SOURCE_OBJECT } from '../models/quality-assurance-source-object.resource-type'; -import { SearchData, SearchDataImpl } from '../../../data/base/search-data'; /** * The service handling all Quality Assurance source REST requests. diff --git a/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.spec.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.spec.ts index 5b51ef5bae..ede1563c30 100644 --- a/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.spec.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.spec.ts @@ -1,11 +1,18 @@ import { HttpClient } from '@angular/common/http'; -import { cold, getTestScheduler } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../../shared/mocks/notifications.mock'; +import { + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid, +} from '../../../../shared/mocks/notifications.mock'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { RestResponse } from '../../../cache/response.models'; @@ -15,7 +22,6 @@ import { RequestEntry } from '../../../data/request-entry.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { PageInfo } from '../../../shared/page-info.model'; import { QualityAssuranceTopicDataService } from './quality-assurance-topic-data.service'; -import { ObjectCacheServiceStub } from '../../../../shared/testing/object-cache-service.stub'; describe('QualityAssuranceTopicDataService', () => { let scheduler: TestScheduler; @@ -94,7 +100,7 @@ describe('QualityAssuranceTopicDataService', () => { 'byTarget', options, useCachedVersionIfAvailable, - reRequestOnStale + reRequestOnStale, ); }); diff --git a/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.ts b/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.ts index 5681667988..7b0a8b4d14 100644 --- a/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.ts +++ b/src/app/core/notifications/qa/topics/quality-assurance-topic-data.service.ts @@ -6,8 +6,15 @@ import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.mo import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../cache/object-cache.service'; import { dataService } from '../../../data/base/data-service.decorator'; -import { FindAllData, FindAllDataImpl } from '../../../data/base/find-all-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../../../data/base/find-all-data'; import { IdentifiableDataService } from '../../../data/base/identifiable-data.service'; +import { + SearchData, + SearchDataImpl, +} from '../../../data/base/search-data'; import { FindListOptions } from '../../../data/find-list-options.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { RemoteData } from '../../../data/remote-data'; @@ -15,7 +22,6 @@ import { RequestService } from '../../../data/request.service'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { QualityAssuranceTopicObject } from '../models/quality-assurance-topic.model'; import { QUALITY_ASSURANCE_TOPIC_OBJECT } from '../models/quality-assurance-topic-object.resource-type'; -import { SearchData, SearchDataImpl } from '../../../data/base/search-data'; /** * The service handling all Quality Assurance topic REST requests. diff --git a/src/app/core/notifications/source/suggestion-source-data.service.ts b/src/app/core/notifications/source/suggestion-source-data.service.ts index f00a84c95b..4909fd6494 100644 --- a/src/app/core/notifications/source/suggestion-source-data.service.ts +++ b/src/app/core/notifications/source/suggestion-source-data.service.ts @@ -1,23 +1,27 @@ -import { Injectable } from '@angular/core'; -import { dataService } from '../../data/base/data-service.decorator'; -import { SUGGESTION_SOURCE } from '../models/suggestion-source-object.resource-type'; -import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; -import { SuggestionSource } from '../models/suggestion-source.model'; -import { FindAllData, FindAllDataImpl } from '../../data/base/find-all-data'; -import { Store } from '@ngrx/store'; -import { RequestService } from '../../data/request.service'; -import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { CoreState } from '../../core-state.model'; -import { ObjectCacheService } from '../../cache/object-cache.service'; -import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { HttpClient } from '@angular/common/http'; -import { FindListOptions } from '../../data/find-list-options.model'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs/internal/Observable'; + +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { CoreState } from '../../core-state.model'; +import { dataService } from '../../data/base/data-service.decorator'; +import { + FindAllData, + FindAllDataImpl, +} from '../../data/base/find-all-data'; +import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; +import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; +import { FindListOptions } from '../../data/find-list-options.model'; import { PaginatedList } from '../../data/paginated-list.model'; import { RemoteData } from '../../data/remote-data'; -import { Observable } from 'rxjs/internal/Observable'; -import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; +import { RequestService } from '../../data/request.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { SuggestionSource } from '../models/suggestion-source.model'; +import { SUGGESTION_SOURCE } from '../models/suggestion-source-object.resource-type'; /** * Service that retrieves Suggestion Source data diff --git a/src/app/core/notifications/source/suggestions-source-data.service.spec.ts b/src/app/core/notifications/source/suggestions-source-data.service.spec.ts index 9e064bf6da..3026c2d8b4 100644 --- a/src/app/core/notifications/source/suggestions-source-data.service.spec.ts +++ b/src/app/core/notifications/source/suggestions-source-data.service.spec.ts @@ -1,25 +1,29 @@ +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; +import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { RequestService } from '../../data/request.service'; + +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../cache/object-cache.service'; -import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { RequestEntry } from '../../data/request-entry.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; import { RestResponse } from '../../cache/response.models'; -import { of as observableOf } from 'rxjs'; -import { Store } from '@ngrx/store'; import { CoreState } from '../../core-state.model'; -import { HttpClient } from '@angular/common/http'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; -import { testFindAllDataImplementation } from '../../data/base/find-all-data.spec'; import { FindAllData } from '../../data/base/find-all-data'; -import { GetRequest } from '../../data/request.models'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { testFindAllDataImplementation } from '../../data/base/find-all-data.spec'; +import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; import { RemoteData } from '../../data/remote-data'; +import { GetRequest } from '../../data/request.models'; +import { RequestService } from '../../data/request.service'; +import { RequestEntry } from '../../data/request-entry.model'; import { RequestEntryState } from '../../data/request-entry-state.model'; -import { SuggestionSourceDataService } from './suggestion-source-data.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; import { SuggestionSource } from '../models/suggestion-source.model'; +import { SuggestionSourceDataService } from './suggestion-source-data.service'; describe('SuggestionSourceDataService test', () => { let scheduler: TestScheduler; @@ -50,7 +54,7 @@ describe('SuggestionSourceDataService test', () => { halService, notificationsService, http, - comparator + comparator, ); } @@ -74,12 +78,12 @@ describe('SuggestionSourceDataService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf(endpointURL) + getEndpoint: observableOf(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) + buildList: cold('a', { a: remoteDataMocks.Success }), }); diff --git a/src/app/core/notifications/suggestion-data.service.spec.ts b/src/app/core/notifications/suggestion-data.service.spec.ts index c0bc97ea12..050f81914f 100644 --- a/src/app/core/notifications/suggestion-data.service.spec.ts +++ b/src/app/core/notifications/suggestion-data.service.spec.ts @@ -1,25 +1,32 @@ -import { TestScheduler } from 'rxjs/testing'; -import { SuggestionDataServiceImpl, SuggestionsDataService } from './suggestions-data.service'; -import { RequestService } from '../data/request.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; -import { Suggestion } from './models/suggestion.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; -import { RequestEntry } from '../data/request-entry.model'; -import { RestResponse } from '../cache/response.models'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + +import { NotificationsService } from '../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { RequestParam } from '../cache/models/request-param.model'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { RestResponse } from '../cache/response.models'; +import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { RemoteData } from '../data/remote-data'; +import { RequestService } from '../data/request.service'; +import { RequestEntry } from '../data/request-entry.model'; import { RequestEntryState } from '../data/request-entry-state.model'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { Suggestion } from './models/suggestion.model'; import { SuggestionSource } from './models/suggestion-source.model'; import { SuggestionTarget } from './models/suggestion-target.model'; import { SuggestionSourceDataService } from './source/suggestion-source-data.service'; +import { + SuggestionDataServiceImpl, + SuggestionsDataService, +} from './suggestions-data.service'; import { SuggestionTargetDataService } from './target/suggestion-target-data.service'; -import { RequestParam } from '../cache/models/request-param.model'; describe('SuggestionDataService test', () => { let scheduler: TestScheduler; @@ -57,7 +64,7 @@ describe('SuggestionDataService test', () => { http, comparatorSuggestion, comparatorSuggestionSource, - comparatorSuggestionTarget + comparatorSuggestionTarget, ); } @@ -80,16 +87,16 @@ describe('SuggestionDataService test', () => { removeByHrefSubstring: {}, getByHref: observableOf(responseCacheEntry), getByUUID: observableOf(responseCacheEntry), - setStaleByHrefSubstring: observableOf(true) + setStaleByHrefSubstring: observableOf(true), }); halService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf(endpointURL) + getEndpoint: observableOf(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) + buildList: cold('a', { a: remoteDataMocks.Success }), }); @@ -121,7 +128,7 @@ describe('SuggestionDataService test', () => { describe('Suggestion targets service', () => { it('should call suggestionSourcesDataService.getTargets', () => { const options = { - searchParams: [new RequestParam('source', testSource)] + searchParams: [new RequestParam('source', testSource)], }; service.getTargets(testSource); expect(suggestionTargetsDataService.getTargets).toHaveBeenCalledWith('findBySource', options); @@ -129,7 +136,7 @@ describe('SuggestionDataService test', () => { it('should call suggestionSourcesDataService.getTargetsByUser', () => { const options = { - searchParams: [new RequestParam('target', testUserId)] + searchParams: [new RequestParam('target', testUserId)], }; service.getTargetsByUser(testUserId); expect(suggestionTargetsDataService.getTargetsByUser).toHaveBeenCalledWith(testUserId, options); @@ -152,7 +159,7 @@ describe('SuggestionDataService test', () => { describe('Suggestion service', () => { it('should call suggestionsDataService.searchBy', () => { const options = { - searchParams: [new RequestParam('target', testUserId), new RequestParam('source', testSource)] + searchParams: [new RequestParam('target', testUserId), new RequestParam('source', testSource)], }; service.getSuggestionsByTargetAndSource(testUserId, testSource); expect(suggestionsDataService.searchBy).toHaveBeenCalledWith('findByTargetAndSource', options, false, true); diff --git a/src/app/core/notifications/suggestions-data.service.ts b/src/app/core/notifications/suggestions-data.service.ts index 17b1482578..372ea65e33 100644 --- a/src/app/core/notifications/suggestions-data.service.ts +++ b/src/app/core/notifications/suggestions-data.service.ts @@ -1,30 +1,29 @@ /* eslint-disable max-classes-per-file */ -import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; - import { Observable } from 'rxjs'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { dataService } from '../cache/builders/build-decorators'; -import { RequestService } from '../data/request.service'; -import { UpdateDataServiceImpl } from '../data/update-data.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { RequestParam } from '../cache/models/request-param.model'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { CoreState } from '../core-state.model'; import { ChangeAnalyzer } from '../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; -import { RemoteData } from '../data/remote-data'; -import { SUGGESTION } from './models/suggestion-objects.resource-type'; -import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { FindListOptions } from '../data/find-list-options.model'; import { PaginatedList } from '../data/paginated-list.model'; +import { RemoteData } from '../data/remote-data'; +import { RequestService } from '../data/request.service'; +import { UpdateDataServiceImpl } from '../data/update-data.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NoContent } from '../shared/NoContent.model'; +import { Suggestion } from './models/suggestion.model'; +import { SUGGESTION } from './models/suggestion-objects.resource-type'; import { SuggestionSource } from './models/suggestion-source.model'; import { SuggestionTarget } from './models/suggestion-target.model'; -import { Suggestion } from './models/suggestion.model'; -import { RequestParam } from '../cache/models/request-param.model'; -import { NoContent } from '../shared/NoContent.model'; -import {CoreState} from '../core-state.model'; -import {FindListOptions} from '../data/find-list-options.model'; import { SuggestionSourceDataService } from './source/suggestion-source-data.service'; import { SuggestionTargetDataService } from './target/suggestion-target-data.service'; @@ -214,7 +213,7 @@ export class SuggestionsDataService { ): Observable>> { options.searchParams = [ new RequestParam('target', target), - new RequestParam('source', source) + new RequestParam('source', source), ]; return this.suggestionsDataService.searchBy(this.searchFindByTargetAndSourceMethod, options, false, true, ...linksToFollow); diff --git a/src/app/core/notifications/target/suggestion-target-data.service.ts b/src/app/core/notifications/target/suggestion-target-data.service.ts index a2f1507b10..6bb84dde21 100644 --- a/src/app/core/notifications/target/suggestion-target-data.service.ts +++ b/src/app/core/notifications/target/suggestion-target-data.service.ts @@ -1,25 +1,31 @@ -import { Injectable } from '@angular/core'; -import { dataService } from '../../data/base/data-service.decorator'; - -import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; -import { SuggestionTarget } from '../models/suggestion-target.model'; -import { FindAllData, FindAllDataImpl } from '../../data/base/find-all-data'; -import { Store } from '@ngrx/store'; -import { RequestService } from '../../data/request.service'; -import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { CoreState } from '../../core-state.model'; -import { ObjectCacheService } from '../../cache/object-cache.service'; -import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { HttpClient } from '@angular/common/http'; -import { FindListOptions } from '../../data/find-list-options.model'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs/internal/Observable'; + +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { RequestParam } from '../../cache/models/request-param.model'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { CoreState } from '../../core-state.model'; +import { dataService } from '../../data/base/data-service.decorator'; +import { + FindAllData, + FindAllDataImpl, +} from '../../data/base/find-all-data'; +import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; +import { + SearchData, + SearchDataImpl, +} from '../../data/base/search-data'; +import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; +import { FindListOptions } from '../../data/find-list-options.model'; import { PaginatedList } from '../../data/paginated-list.model'; import { RemoteData } from '../../data/remote-data'; -import { Observable } from 'rxjs/internal/Observable'; -import { RequestParam } from '../../cache/models/request-param.model'; -import { SearchData, SearchDataImpl } from '../../data/base/search-data'; -import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; +import { RequestService } from '../../data/request.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { SuggestionTarget } from '../models/suggestion-target.model'; import { SUGGESTION_TARGET } from '../models/suggestion-target-object.resource-type'; @Injectable() diff --git a/src/app/core/notifications/target/suggestions-target-data.service.spec.ts b/src/app/core/notifications/target/suggestions-target-data.service.spec.ts index 3dce7ad36c..7b4ed3e82a 100644 --- a/src/app/core/notifications/target/suggestions-target-data.service.spec.ts +++ b/src/app/core/notifications/target/suggestions-target-data.service.spec.ts @@ -1,28 +1,32 @@ -import { TestScheduler } from 'rxjs/testing'; -import { RequestService } from '../../data/request.service'; -import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../../cache/object-cache.service'; -import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { RequestEntry } from '../../data/request-entry.model'; -import { cold, getTestScheduler } from 'jasmine-marbles'; -import { RestResponse } from '../../cache/response.models'; -import { of as observableOf } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { CoreState } from '../../core-state.model'; import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; +import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { RequestParam } from '../../cache/models/request-param.model'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { RestResponse } from '../../cache/response.models'; +import { CoreState } from '../../core-state.model'; +import { FindAllData } from '../../data/base/find-all-data'; +import { testFindAllDataImplementation } from '../../data/base/find-all-data.spec'; import { SearchData } from '../../data/base/search-data'; import { testSearchDataImplementation } from '../../data/base/search-data.spec'; -import { SuggestionTargetDataService } from './suggestion-target-data.service'; import { DefaultChangeAnalyzer } from '../../data/default-change-analyzer.service'; -import { SuggestionTarget } from '../models/suggestion-target.model'; -import { testFindAllDataImplementation } from '../../data/base/find-all-data.spec'; -import { FindAllData } from '../../data/base/find-all-data'; -import { GetRequest } from '../../data/request.models'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { RequestParam } from '../../cache/models/request-param.model'; import { RemoteData } from '../../data/remote-data'; +import { GetRequest } from '../../data/request.models'; +import { RequestService } from '../../data/request.service'; +import { RequestEntry } from '../../data/request-entry.model'; import { RequestEntryState } from '../../data/request-entry-state.model'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { SuggestionTarget } from '../models/suggestion-target.model'; +import { SuggestionTargetDataService } from './suggestion-target-data.service'; describe('SuggestionTargetDataService test', () => { let scheduler: TestScheduler; @@ -53,7 +57,7 @@ describe('SuggestionTargetDataService test', () => { halService, notificationsService, http, - comparator + comparator, ); } @@ -77,12 +81,12 @@ describe('SuggestionTargetDataService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf(endpointURL) + getEndpoint: observableOf(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) + buildList: cold('a', { a: remoteDataMocks.Success }), }); @@ -109,7 +113,7 @@ describe('SuggestionTargetDataService test', () => { describe('getTargetsByUser', () => { it('should send a new GetRequest', () => { const options = { - searchParams: [new RequestParam('target', 'testId')] + searchParams: [new RequestParam('target', 'testId')], }; const searchFindByTargetMethod = 'findByTarget'; const expected = new GetRequest(requestService.generateRequestId(), `${endpointURL}/search/${searchFindByTargetMethod}?target=testId`); @@ -123,7 +127,7 @@ describe('SuggestionTargetDataService test', () => { describe('getTargets', () => { it('should send a new GetRequest', () => { const options = { - searchParams: [new RequestParam('source', 'testId')] + searchParams: [new RequestParam('source', 'testId')], }; const searchFindBySourceMethod = 'findBySource'; const expected = new GetRequest(requestService.generateRequestId(), `${endpointURL}/search/${searchFindBySourceMethod}?source=testId`); diff --git a/src/app/core/resource-policy/resource-policy-data.service.spec.ts b/src/app/core/resource-policy/resource-policy-data.service.spec.ts index 56f0747b06..1af36c1254 100644 --- a/src/app/core/resource-policy/resource-policy-data.service.spec.ts +++ b/src/app/core/resource-policy/resource-policy-data.service.spec.ts @@ -1,9 +1,14 @@ -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -15,7 +20,6 @@ import { RequestEntry } from '../data/request-entry.model'; import { RestRequestMethod } from '../data/rest-request-method'; import { EPersonDataService } from '../eperson/eperson-data.service'; import { GroupDataService } from '../eperson/group-data.service'; -import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { PageInfo } from '../shared/page-info.model'; import { ActionType } from './models/action-type.model'; diff --git a/src/app/core/rest-property/forgot-password-check-guard.guard.ts b/src/app/core/rest-property/forgot-password-check-guard.guard.ts index 438a532c7b..cc74e8039f 100644 --- a/src/app/core/rest-property/forgot-password-check-guard.guard.ts +++ b/src/app/core/rest-property/forgot-password-check-guard.guard.ts @@ -1,15 +1,21 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; -import { Observable, of } from 'rxjs'; -import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; -import { FeatureID } from '../data/feature-authorization/feature-id'; import { - SingleFeatureAuthorizationGuard -} from '../data/feature-authorization/feature-authorization-guard/single-feature-authorization.guard'; + ActivatedRouteSnapshot, + Router, + RouterStateSnapshot, +} from '@angular/router'; +import { + Observable, + of, +} from 'rxjs'; + import { AuthService } from '../auth/auth.service'; +import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service'; +import { SingleFeatureAuthorizationGuard } from '../data/feature-authorization/feature-authorization-guard/single-feature-authorization.guard'; +import { FeatureID } from '../data/feature-authorization/feature-id'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) /** * Guard that checks if the forgot-password feature is enabled @@ -19,7 +25,7 @@ export class ForgotPasswordCheckGuard extends SingleFeatureAuthorizationGuard { constructor( protected readonly authorizationService: AuthorizationDataService, protected readonly router: Router, - protected readonly authService: AuthService + protected readonly authService: AuthService, ) { super(authorizationService, router, authService); } diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/browse-definition.model.ts index e8197490db..8e50a57bb5 100644 --- a/src/app/core/shared/browse-definition.model.ts +++ b/src/app/core/shared/browse-definition.model.ts @@ -1,7 +1,7 @@ import { autoserialize } from 'cerialize'; -import { CacheableObject } from '../cache/cacheable-object.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; +import { CacheableObject } from '../cache/cacheable-object.model'; /** * Base class for BrowseDefinition models diff --git a/src/app/core/shared/flat-browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts index b7dcf186c8..d9d59d1114 100644 --- a/src/app/core/shared/flat-browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,10 +1,13 @@ -import { deserialize, inheritSerialization } from 'cerialize'; +import { + deserialize, + inheritSerialization, +} from 'cerialize'; +import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { HALLink } from './hal-link.model'; -import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; import { ResourceType } from './resource-type'; diff --git a/src/app/core/shared/hierarchical-browse-definition.model.ts b/src/app/core/shared/hierarchical-browse-definition.model.ts index 8fa787c197..97d50c3ca6 100644 --- a/src/app/core/shared/hierarchical-browse-definition.model.ts +++ b/src/app/core/shared/hierarchical-browse-definition.model.ts @@ -1,12 +1,17 @@ -import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize'; +import { + autoserialize, + autoserializeAs, + deserialize, + inheritSerialization, +} from 'cerialize'; +import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { BrowseDefinition } from './browse-definition.model'; import { HALLink } from './hal-link.model'; import { HIERARCHICAL_BROWSE_DEFINITION } from './hierarchical-browse-definition.resource-type'; import { ResourceType } from './resource-type'; -import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; /** * BrowseDefinition model for browses of type 'hierarchicalBrowse' diff --git a/src/app/core/shared/non-hierarchical-browse-definition.ts b/src/app/core/shared/non-hierarchical-browse-definition.ts index 8724094f28..769d70629d 100644 --- a/src/app/core/shared/non-hierarchical-browse-definition.ts +++ b/src/app/core/shared/non-hierarchical-browse-definition.ts @@ -1,8 +1,12 @@ -import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize'; -import { SortOption } from './sort-option.model'; -import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; +import { + autoserialize, + autoserializeAs, + inheritSerialization, +} from 'cerialize'; +import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { BrowseDefinition } from './browse-definition.model'; +import { SortOption } from './sort-option.model'; /** * Super class for NonHierarchicalBrowseDefinition models, diff --git a/src/app/core/shared/value-list-browse-definition.model.ts b/src/app/core/shared/value-list-browse-definition.model.ts index e578e0dbfe..80ad73e761 100644 --- a/src/app/core/shared/value-list-browse-definition.model.ts +++ b/src/app/core/shared/value-list-browse-definition.model.ts @@ -1,9 +1,12 @@ -import { deserialize, inheritSerialization } from 'cerialize'; +import { + deserialize, + inheritSerialization, +} from 'cerialize'; +import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { HALLink } from './hal-link.model'; -import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type'; import { NonHierarchicalBrowseDefinition } from './non-hierarchical-browse-definition'; import { ResourceType } from './resource-type'; import { VALUE_LIST_BROWSE_DEFINITION } from './value-list-browse-definition.resource-type'; diff --git a/src/app/core/submission/correctiontype-data.service.ts b/src/app/core/submission/correctiontype-data.service.ts index 291079f08a..684da34c01 100644 --- a/src/app/core/submission/correctiontype-data.service.ts +++ b/src/app/core/submission/correctiontype-data.service.ts @@ -1,20 +1,26 @@ import { Injectable } from '@angular/core'; +import { + map, + Observable, +} from 'rxjs'; -import { dataService } from '../data/base/data-service.decorator'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { RequestService } from '../data/request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; +import { dataService } from '../data/base/data-service.decorator'; import { IdentifiableDataService } from '../data/base/identifiable-data.service'; import { SearchDataImpl } from '../data/base/search-data'; -import { CorrectionType } from './models/correctiontype.model'; -import { map, Observable } from 'rxjs'; -import { RemoteData } from '../data/remote-data'; -import { PaginatedList } from '../data/paginated-list.model'; import { FindListOptions } from '../data/find-list-options.model'; -import { RequestParam } from '../cache/models/request-param.model'; -import { getAllSucceededRemoteDataPayload, getPaginatedListPayload } from '../shared/operators'; +import { PaginatedList } from '../data/paginated-list.model'; +import { RemoteData } from '../data/remote-data'; +import { RequestService } from '../data/request.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { + getAllSucceededRemoteDataPayload, + getPaginatedListPayload, +} from '../shared/operators'; +import { CorrectionType } from './models/correctiontype.model'; /** * A service that provides methods to make REST requests with correctiontypes endpoint. @@ -83,7 +89,7 @@ export class CorrectionTypeDataService extends IdentifiableDataService { return list[0]; - }) + }), ); } } diff --git a/src/app/core/submission/models/correctiontype.model.ts b/src/app/core/submission/models/correctiontype.model.ts index 9329fa88d8..0b9dd75545 100644 --- a/src/app/core/submission/models/correctiontype.model.ts +++ b/src/app/core/submission/models/correctiontype.model.ts @@ -1,9 +1,13 @@ -import { autoserialize, deserialize } from 'cerialize'; +import { + autoserialize, + deserialize, +} from 'cerialize'; + import { typedObject } from '../../cache/builders/build-decorators'; import { CacheableObject } from '../../cache/cacheable-object.model'; +import { HALLink } from '../../shared/hal-link.model'; import { ResourceType } from '../../shared/resource-type'; import { excludeFromEquals } from '../../utilities/equals.decorators'; -import { HALLink } from '../../shared/hal-link.model'; @typedObject /** @@ -18,32 +22,32 @@ export class CorrectionType extends CacheableObject { */ @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; @autoserialize /** * The unique identifier for the correction type mode. */ - id: string; + id: string; @autoserialize /** * The topic of the correction type mode. */ - topic: string; + topic: string; @autoserialize /** * The discovery configuration for the correction type mode. */ - discoveryConfiguration: string; + discoveryConfiguration: string; @autoserialize /** * The form used for creating a correction type. */ - creationForm: string; + creationForm: string; @deserialize /** * Represents the links associated with the correction type mode. */ - _links: { + _links: { self: HALLink; }; } diff --git a/src/app/core/submission/models/workspaceitem-sections.model.ts b/src/app/core/submission/models/workspaceitem-sections.model.ts index 5e688819ea..46a0590977 100644 --- a/src/app/core/submission/models/workspaceitem-sections.model.ts +++ b/src/app/core/submission/models/workspaceitem-sections.model.ts @@ -1,10 +1,10 @@ import { WorkspaceitemSectionAccessesObject } from './workspaceitem-section-accesses.model'; import { WorkspaceitemSectionCcLicenseObject } from './workspaceitem-section-cc-license.model'; +import { WorkspaceitemSectionDuplicatesObject } from './workspaceitem-section-duplicates.model'; import { WorkspaceitemSectionFormObject } from './workspaceitem-section-form.model'; import { WorkspaceitemSectionIdentifiersObject } from './workspaceitem-section-identifiers.model'; import { WorkspaceitemSectionLicenseObject } from './workspaceitem-section-license.model'; import { WorkspaceitemSectionSherpaPoliciesObject } from './workspaceitem-section-sherpa-policies.model'; -import { WorkspaceitemSectionDuplicatesObject } from './workspaceitem-section-duplicates.model'; import { WorkspaceitemSectionUploadObject } from './workspaceitem-section-upload.model'; /** diff --git a/src/app/core/submission/submission-duplicate-data.service.spec.ts b/src/app/core/submission/submission-duplicate-data.service.spec.ts index fff4f3a0bc..88d02b74e7 100644 --- a/src/app/core/submission/submission-duplicate-data.service.spec.ts +++ b/src/app/core/submission/submission-duplicate-data.service.spec.ts @@ -1,6 +1,6 @@ -import { SubmissionDuplicateDataService } from './submission-duplicate-data.service'; -import { FindListOptions } from '../data/find-list-options.model'; import { RequestParam } from '../cache/models/request-param.model'; +import { FindListOptions } from '../data/find-list-options.model'; +import { SubmissionDuplicateDataService } from './submission-duplicate-data.service'; /** * Basic tests for the submission-duplicate-data.service.ts service diff --git a/src/app/core/submission/submission-duplicate-data.service.ts b/src/app/core/submission/submission-duplicate-data.service.ts index 6be0006182..50e6d83bd8 100644 --- a/src/app/core/submission/submission-duplicate-data.service.ts +++ b/src/app/core/submission/submission-duplicate-data.service.ts @@ -1,25 +1,29 @@ /* eslint-disable max-classes-per-file */ -import { Observable } from 'rxjs'; import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +import { Duplicate } from '../../shared/object-list/duplicate-data/duplicate.model'; +import { DUPLICATE } from '../../shared/object-list/duplicate-data/duplicate.resource-type'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { RequestParam } from '../cache/models/request-param.model'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { BaseDataService } from '../data/base/base-data.service'; +import { dataService } from '../data/base/data-service.decorator'; +import { + SearchData, + SearchDataImpl, +} from '../data/base/search-data'; +import { FindListOptions } from '../data/find-list-options.model'; +import { PaginatedList } from '../data/paginated-list.model'; import { ResponseParsingService } from '../data/parsing.service'; import { RemoteData } from '../data/remote-data'; import { GetRequest } from '../data/request.models'; import { RequestService } from '../data/request.service'; +import { RestRequest } from '../data/rest-request.model'; +import { SearchResponseParsingService } from '../data/search-response-parsing.service'; import { GenericConstructor } from '../shared/generic-constructor'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { SearchResponseParsingService } from '../data/search-response-parsing.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { RestRequest } from '../data/rest-request.model'; -import { BaseDataService } from '../data/base/base-data.service'; -import { FindListOptions } from '../data/find-list-options.model'; -import { Duplicate } from '../../shared/object-list/duplicate-data/duplicate.model'; -import { PaginatedList } from '../data/paginated-list.model'; -import { RequestParam } from '../cache/models/request-param.model'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { SearchData, SearchDataImpl } from '../data/base/search-data'; -import { DUPLICATE } from '../../shared/object-list/duplicate-data/duplicate.resource-type'; -import { dataService } from '../data/base/data-service.decorator'; /** * Service that handles search requests for potential duplicate items. diff --git a/src/app/core/submission/vocabularies/vocabulary.data.service.spec.ts b/src/app/core/submission/vocabularies/vocabulary.data.service.spec.ts index 2c80bf3a2f..68c7c3ff80 100644 --- a/src/app/core/submission/vocabularies/vocabulary.data.service.spec.ts +++ b/src/app/core/submission/vocabularies/vocabulary.data.service.spec.ts @@ -5,10 +5,11 @@ * * http://www.dspace.org/license/ */ +import { createSuccessfulRemoteDataObject$ } from 'src/app/shared/remote-data.utils'; + +import { RequestParam } from '../../cache/models/request-param.model'; import { testFindAllDataImplementation } from '../../data/base/find-all-data.spec'; import { FindListOptions } from '../../data/find-list-options.model'; -import { RequestParam } from '../../cache/models/request-param.model'; -import { createSuccessfulRemoteDataObject$ } from 'src/app/shared/remote-data.utils'; import { VocabularyDataService } from './vocabulary.data.service'; describe('VocabularyDataService', () => { @@ -33,7 +34,7 @@ describe('VocabularyDataService', () => { service.getVocabularyByMetadataAndCollection('dc.contributor.author', '1234-1234'); const options = Object.assign(new FindListOptions(), { searchParams: [Object.assign(new RequestParam('metadata', encodeURIComponent('dc.contributor.author'))), - Object.assign(new RequestParam('collection', encodeURIComponent('1234-1234')))] + Object.assign(new RequestParam('collection', encodeURIComponent('1234-1234')))], }); expect((service as any).searchData.getSearchByHref).toHaveBeenCalledWith('byMetadataAndCollection', options); expect(service.findByHref).toHaveBeenCalledWith(vocabularyByMetadataAndCollectionEndpoint, true, true); diff --git a/src/app/core/submission/vocabularies/vocabulary.data.service.ts b/src/app/core/submission/vocabularies/vocabulary.data.service.ts index ebad6e035f..2dd3b124b8 100644 --- a/src/app/core/submission/vocabularies/vocabulary.data.service.ts +++ b/src/app/core/submission/vocabularies/vocabulary.data.service.ts @@ -10,10 +10,15 @@ import { Observable } from 'rxjs'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { RequestParam } from '../../cache/models/request-param.model'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { dataService } from '../../data/base/data-service.decorator'; -import { FindAllData, FindAllDataImpl } from '../../data/base/find-all-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../../data/base/find-all-data'; import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; +import { SearchDataImpl } from '../../data/base/search-data'; import { FindListOptions } from '../../data/find-list-options.model'; import { PaginatedList } from '../../data/paginated-list.model'; import { RemoteData } from '../../data/remote-data'; @@ -21,8 +26,6 @@ import { RequestService } from '../../data/request.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; import { VOCABULARY } from './models/vocabularies.resource-type'; import { Vocabulary } from './models/vocabulary.model'; -import { SearchDataImpl } from '../../data/base/search-data'; -import { RequestParam } from '../../cache/models/request-param.model'; /** * Data service to retrieve vocabularies from the REST server. @@ -79,7 +82,7 @@ export class VocabularyDataService extends IdentifiableDataService i public getVocabularyByMetadataAndCollection(metadataField: string, collectionUUID: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { const findListOptions = new FindListOptions(); findListOptions.searchParams = [new RequestParam('metadata', encodeURIComponent(metadataField)), - new RequestParam('collection', encodeURIComponent(collectionUUID))]; + new RequestParam('collection', encodeURIComponent(collectionUUID))]; const href$ = this.searchData.getSearchByHref(this.searchByMetadataAndCollectionPath, findListOptions, ...linksToFollow); return this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } diff --git a/src/app/core/submission/vocabularies/vocabulary.service.spec.ts b/src/app/core/submission/vocabularies/vocabulary.service.spec.ts index f130014f1b..5e3fdeb034 100644 --- a/src/app/core/submission/vocabularies/vocabulary.service.spec.ts +++ b/src/app/core/submission/vocabularies/vocabulary.service.spec.ts @@ -1,11 +1,19 @@ -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { getMockHrefOnlyDataService } from '../../../shared/mocks/href-only-data.service.mock'; import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../../shared/testing/object-cache-service.stub'; import { createPaginatedList } from '../../../shared/testing/utils.test'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { RequestParam } from '../../cache/models/request-param.model'; @@ -22,7 +30,6 @@ import { VocabularyOptions } from './models/vocabulary-options.model'; import { VocabularyDataService } from './vocabulary.data.service'; import { VocabularyService } from './vocabulary.service'; import { VocabularyEntryDetailsDataService } from './vocabulary-entry-details.data.service'; -import { ObjectCacheServiceStub } from '../../../shared/testing/object-cache-service.stub'; describe('VocabularyService', () => { let scheduler: TestScheduler; @@ -323,7 +330,7 @@ describe('VocabularyService', () => { it('should return a RemoteData for the object with the given metadata and collection', () => { const result = service.getVocabularyByMetadataAndCollection(metadata, collectionUUID); const expected = cold('a|', { - a: vocabularyRD + a: vocabularyRD, }); expect(result).toBeObservable(expected); }); diff --git a/src/app/core/submission/workflowitem-data.service.spec.ts b/src/app/core/submission/workflowitem-data.service.spec.ts index 65fc9ea3d4..a07ac238cd 100644 --- a/src/app/core/submission/workflowitem-data.service.spec.ts +++ b/src/app/core/submission/workflowitem-data.service.spec.ts @@ -1,6 +1,10 @@ import { HttpClient } from '@angular/common/http'; import { Store } from '@ngrx/store'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; diff --git a/src/app/core/submission/workspaceitem-data.service.spec.ts b/src/app/core/submission/workspaceitem-data.service.spec.ts index 0f38f7be88..644cae85cb 100644 --- a/src/app/core/submission/workspaceitem-data.service.spec.ts +++ b/src/app/core/submission/workspaceitem-data.service.spec.ts @@ -1,31 +1,41 @@ -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { + HttpClient, + HttpHeaders, +} from '@angular/common/http'; import { Store } from '@ngrx/store'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { + cold, + getTestScheduler, + hot, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { getMockHrefOnlyDataService } from '../../shared/mocks/href-only-data.service.mock'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RequestService } from '../data/request.service'; -import { PageInfo } from '../shared/page-info.model'; -import { HrefOnlyDataService } from '../data/href-only-data.service'; -import { WorkspaceitemDataService } from './workspaceitem-data.service'; import { RestResponse } from '../cache/response.models'; import { CoreState } from '../core-state.model'; -import { testDeleteDataImplementation } from '../data/base/delete-data.spec'; -import { testSearchDataImplementation } from '../data/base/search-data.spec'; -import { RequestEntry } from '../data/request-entry.model'; -import { Item } from '../shared/item.model'; -import { WorkspaceItem } from './models/workspaceitem.model'; -import { SearchData } from '../data/base/search-data'; import { DeleteData } from '../data/base/delete-data'; -import { RequestParam } from '../cache/models/request-param.model'; +import { testDeleteDataImplementation } from '../data/base/delete-data.spec'; +import { SearchData } from '../data/base/search-data'; +import { testSearchDataImplementation } from '../data/base/search-data.spec'; +import { HrefOnlyDataService } from '../data/href-only-data.service'; import { PostRequest } from '../data/request.models'; +import { RequestService } from '../data/request.service'; +import { RequestEntry } from '../data/request-entry.model'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { Item } from '../shared/item.model'; +import { PageInfo } from '../shared/page-info.model'; +import { WorkspaceItem } from './models/workspaceitem.model'; +import { WorkspaceitemDataService } from './workspaceitem-data.service'; describe('WorkspaceitemDataService test', () => { let scheduler: TestScheduler; @@ -93,7 +103,7 @@ describe('WorkspaceitemDataService test', () => { requestService, rdbService, objectCache, - store + store, ); } @@ -126,9 +136,9 @@ describe('WorkspaceitemDataService test', () => { }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: hot('a|', { - a: wsiRD + a: wsiRD, }), - buildFromRequestUUID: createSuccessfulRemoteDataObject$({}) + buildFromRequestUUID: createSuccessfulRemoteDataObject$({}), }); service = initTestService(); diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts index 564f057a35..3332ef0785 100644 --- a/src/app/core/submission/workspaceitem-data.service.ts +++ b/src/app/core/submission/workspaceitem-data.service.ts @@ -1,30 +1,42 @@ +import { + HttpClient, + HttpHeaders, +} from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; - import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { + find, + map, +} from 'rxjs/operators'; + +import { hasValue } from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; -import { WorkspaceItem } from './models/workspaceitem.model'; -import { RemoteData } from '../data/remote-data'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; -import { dataService } from '../data/base/data-service.decorator'; -import { DeleteData, DeleteDataImpl } from '../data/base/delete-data'; -import { IdentifiableDataService } from '../data/base/identifiable-data.service'; -import { SearchData, SearchDataImpl } from '../data/base/search-data'; +import { ObjectCacheService } from '../cache/object-cache.service'; import { CoreState } from '../core-state.model'; +import { dataService } from '../data/base/data-service.decorator'; +import { + DeleteData, + DeleteDataImpl, +} from '../data/base/delete-data'; +import { IdentifiableDataService } from '../data/base/identifiable-data.service'; +import { + SearchData, + SearchDataImpl, +} from '../data/base/search-data'; +import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; import { FindListOptions } from '../data/find-list-options.model'; -import { HttpOptions } from '../dspace-rest/dspace-rest.service'; -import { find, map } from 'rxjs/operators'; -import { PostRequest } from '../data/request.models'; -import { hasValue } from '../../shared/empty.util'; -import { NoContent } from '../shared/NoContent.model'; import { PaginatedList } from '../data/paginated-list.model'; +import { RemoteData } from '../data/remote-data'; +import { PostRequest } from '../data/request.models'; import { RequestService } from '../data/request.service'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NoContent } from '../shared/NoContent.model'; +import { WorkspaceItem } from './models/workspaceitem.model'; /** * A service that provides methods to make REST requests with workspaceitems endpoint. @@ -104,7 +116,7 @@ export class WorkspaceitemDataService extends IdentifiableDataService { const request = new PostRequest(requestId, href, externalSourceEntryHref, options); this.requestService.send(request); - }) + }), ).subscribe(); return this.rdbService.buildFromRequestUUID(requestId); diff --git a/src/app/core/supervision-order/supervision-order-data.service.spec.ts b/src/app/core/supervision-order/supervision-order-data.service.spec.ts index a5158a3791..945a3f44e8 100644 --- a/src/app/core/supervision-order/supervision-order-data.service.spec.ts +++ b/src/app/core/supervision-order/supervision-order-data.service.spec.ts @@ -8,6 +8,7 @@ import { TestScheduler } from 'rxjs/testing'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; +import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestParam } from '../cache/models/request-param.model'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -17,7 +18,6 @@ import { buildPaginatedList } from '../data/paginated-list.model'; import { RequestService } from '../data/request.service'; import { RequestEntry } from '../data/request-entry.model'; import { GroupDataService } from '../eperson/group-data.service'; -import { ObjectCacheServiceStub } from '../../shared/testing/object-cache-service.stub'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { PageInfo } from '../shared/page-info.model'; import { ActionType } from './models/action-type.model'; diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-form.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-form.ts index d8119c3394..f45f43181b 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-form.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-form.ts @@ -423,7 +423,7 @@ export class DsoEditMetadataForm { value: value.newValue.value, language: value.newValue.language, authority: value.newValue.authority, - confidence: value.newValue.confidence + confidence: value.newValue.confidence, })); } } else if (value.change === DsoEditMetadataChangeType.REMOVE) { @@ -433,7 +433,7 @@ export class DsoEditMetadataForm { value: value.newValue.value, language: value.newValue.language, authority: value.newValue.authority, - confidence: value.newValue.confidence + confidence: value.newValue.confidence, })); } else { console.warn('Illegal metadata change state detected for', value); diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts index ba5376ffd2..61f2460bc7 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.spec.ts @@ -1,32 +1,48 @@ -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { Observable, of } from 'rxjs'; - -import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; -import { RelationshipDataService } from '../../../core/data/relationship-data.service'; -import { MetadataValue, VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; -import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; -import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form'; -import { ItemDataService } from '../../../core/data/item-data.service'; -import { Item } from '../../../core/shared/item.model'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { Collection } from '../../../core/shared/collection.model'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { Vocabulary } from 'src/app/core/submission/vocabularies/models/vocabulary.model'; -import { VocabularyServiceStub } from 'src/app/shared/testing/vocabulary-service.stub'; -import { VocabularyService } from 'src/app/core/submission/vocabularies/vocabulary.service'; -import { ConfidenceType } from 'src/app/core/shared/confidence-type'; -import { DynamicOneboxModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.model'; -import { DynamicScrollableDropdownModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model'; -import { RegistryService } from 'src/app/core/registry/registry.service'; -import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; -import { createPaginatedList } from 'src/app/shared/testing/utils.test'; +import { + Observable, + of, +} from 'rxjs'; import { MetadataField } from 'src/app/core/metadata/metadata-field.model'; import { MetadataSchema } from 'src/app/core/metadata/metadata-schema.model'; +import { RegistryService } from 'src/app/core/registry/registry.service'; +import { ConfidenceType } from 'src/app/core/shared/confidence-type'; +import { Vocabulary } from 'src/app/core/submission/vocabularies/models/vocabulary.model'; +import { VocabularyService } from 'src/app/core/submission/vocabularies/vocabulary.service'; +import { DynamicOneboxModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.model'; +import { DynamicScrollableDropdownModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model'; +import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; +import { createPaginatedList } from 'src/app/shared/testing/utils.test'; +import { VocabularyServiceStub } from 'src/app/shared/testing/vocabulary-service.stub'; + +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { ItemDataService } from '../../../core/data/item-data.service'; +import { RelationshipDataService } from '../../../core/data/relationship-data.service'; +import { Collection } from '../../../core/shared/collection.model'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Item } from '../../../core/shared/item.model'; +import { + MetadataValue, + VIRTUAL_METADATA_PREFIX, +} from '../../../core/shared/metadata.models'; +import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { VarDirective } from '../../../shared/utils/var.directive'; +import { + DsoEditMetadataChangeType, + DsoEditMetadataValue, +} from '../dso-edit-metadata-form'; import { DsoEditMetadataValueComponent } from './dso-edit-metadata-value.component'; const EDIT_BTN = 'edit'; @@ -51,16 +67,16 @@ describe('DsoEditMetadataValueComponent', () => { let dso: DSpaceObject; const collection = Object.assign(new Collection(), { - uuid: 'fake-uuid' + uuid: 'fake-uuid', }); const item = Object.assign(new Item(), { _links: { - self: { href: 'fake-item-url/item' } + self: { href: 'fake-item-url/item' }, }, id: 'item', uuid: 'item', - owningCollection: createSuccessfulRemoteDataObject$(collection) + owningCollection: createSuccessfulRemoteDataObject$(collection), }); const mockVocabularyScrollable: Vocabulary = { @@ -72,12 +88,12 @@ describe('DsoEditMetadataValueComponent', () => { type: 'vocabulary', _links: { self: { - href: 'self' + href: 'self', }, entries: { - href: 'entries' - } - } + href: 'entries', + }, + }, }; const mockVocabularyHierarchical: Vocabulary = { @@ -89,12 +105,12 @@ describe('DsoEditMetadataValueComponent', () => { type: 'vocabulary', _links: { self: { - href: 'self' + href: 'self', }, entries: { - href: 'entries' - } - } + href: 'entries', + }, + }, }; const mockVocabularySuggester: Vocabulary = { @@ -106,12 +122,12 @@ describe('DsoEditMetadataValueComponent', () => { type: 'vocabulary', _links: { self: { - href: 'self' + href: 'self', }, entries: { - href: 'entries' - } - } + href: 'entries', + }, + }, }; let metadataSchema: MetadataSchema; @@ -139,7 +155,7 @@ describe('DsoEditMetadataValueComponent', () => { getName: 'Related Name', }); itemService = jasmine.createSpyObj('itemService', { - findByHref: createSuccessfulRemoteDataObject$(item) + findByHref: createSuccessfulRemoteDataObject$(item), }); vocabularyServiceStub = new VocabularyServiceStub(); registryService = jasmine.createSpyObj('registryService', { @@ -158,7 +174,7 @@ describe('DsoEditMetadataValueComponent', () => { editMetadataValue = new DsoEditMetadataValue(metadataValue); dso = Object.assign(new DSpaceObject(), { _links: { - self: { href: 'fake-dso-url/dso' } + self: { href: 'fake-dso-url/dso' }, }, }); @@ -365,7 +381,7 @@ describe('DsoEditMetadataValueComponent', () => { language: 'en', place: 0, authority: 'authority-key', - confidence: ConfidenceType.CF_UNCERTAIN + confidence: ConfidenceType.CF_UNCERTAIN, }); editMetadataValue = new DsoEditMetadataValue(metadataValue); editMetadataValue.editing = true; diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts index c8e49032cb..76c10282d5 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts @@ -1,31 +1,69 @@ -import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; -import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form'; -import { EMPTY, Observable, of as observableOf } from 'rxjs'; -import { map, switchMap, take } from 'rxjs/operators'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnChanges, + OnInit, + Output, + SimpleChanges, +} from '@angular/core'; +import { + UntypedFormControl, + UntypedFormGroup, +} from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; +import { + EMPTY, + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + switchMap, + take, +} from 'rxjs/operators'; +import { RegistryService } from 'src/app/core/registry/registry.service'; +import { VocabularyService } from 'src/app/core/submission/vocabularies/vocabulary.service'; +import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; -import { RelationshipDataService } from '../../../core/data/relationship-data.service'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; -import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; -import { VocabularyService } from 'src/app/core/submission/vocabularies/vocabulary.service'; -import { Vocabulary } from '../../../core/submission/vocabularies/models/vocabulary.model'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model'; -import { ConfidenceType } from '../../../core/shared/confidence-type'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload, metadataFieldsToString } from '../../../core/shared/operators'; -import { DsDynamicOneboxModelConfig, DynamicOneboxModel } from '../../../shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.model'; -import { DynamicScrollableDropdownModel, DynamicScrollableDropdownModelConfig } from '../../../shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model'; import { ItemDataService } from '../../../core/data/item-data.service'; -import { followLink } from '../../../shared/utils/follow-link-config.model'; -import { Item } from '../../../core/shared/item.model'; +import { RelationshipDataService } from '../../../core/data/relationship-data.service'; import { Collection } from '../../../core/shared/collection.model'; -import { FormFieldMetadataValueObject } from '../../../shared/form/builder/models/form-field-metadata-value.model'; +import { ConfidenceType } from '../../../core/shared/confidence-type'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Item } from '../../../core/shared/item.model'; +import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; +import { + MetadataRepresentation, + MetadataRepresentationType, +} from '../../../core/shared/metadata-representation/metadata-representation.model'; +import { + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, + getRemoteDataPayload, + metadataFieldsToString, +} from '../../../core/shared/operators'; +import { Vocabulary } from '../../../core/submission/vocabularies/models/vocabulary.model'; +import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model'; +import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; import { isNotEmpty } from '../../../shared/empty.util'; -import { RegistryService } from 'src/app/core/registry/registry.service'; -import { TranslateService } from '@ngx-translate/core'; -import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; -import { MetadataRepresentation, MetadataRepresentationType } from '../../../core/shared/metadata-representation/metadata-representation.model'; +import { + DsDynamicOneboxModelConfig, + DynamicOneboxModel, +} from '../../../shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.model'; +import { + DynamicScrollableDropdownModel, + DynamicScrollableDropdownModelConfig, +} from '../../../shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model'; +import { FormFieldMetadataValueObject } from '../../../shared/form/builder/models/form-field-metadata-value.model'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { + DsoEditMetadataChangeType, + DsoEditMetadataValue, +} from '../dso-edit-metadata-form'; @Component({ selector: 'ds-dso-edit-metadata-value', @@ -131,7 +169,7 @@ export class DsoEditMetadataValueComponent implements OnInit, OnChanges { * Field group used by authority field * @type {UntypedFormGroup} */ - group = new UntypedFormGroup({ authorityField : new UntypedFormControl()}); + group = new UntypedFormGroup({ authorityField : new UntypedFormControl() }); /** * Observable property of the model to use for editinf authorities values @@ -198,83 +236,83 @@ export class DsoEditMetadataValueComponent implements OnInit, OnChanges { getRemoteDataPayload(), switchMap((item: Item) => item.owningCollection), getFirstSucceededRemoteData(), - getRemoteDataPayload() + getRemoteDataPayload(), ); this.vocabulary$ = owningCollection$.pipe( switchMap((c: Collection) => this.vocabularyService .getVocabularyByMetadataAndCollection(this.mdField, c.uuid) - .pipe( - getFirstSucceededRemoteDataPayload() - )) + .pipe( + getFirstSucceededRemoteDataPayload(), + )), ); } else { this.vocabulary$ = observableOf(undefined); } this.isAuthorityControlled$ = this.vocabulary$.pipe( - map((result: Vocabulary) => isNotEmpty(result)) + map((result: Vocabulary) => isNotEmpty(result)), ); this.isHierarchicalVocabulary$ = this.vocabulary$.pipe( - map((result: Vocabulary) => isNotEmpty(result) && result.hierarchical) + map((result: Vocabulary) => isNotEmpty(result) && result.hierarchical), ); this.isScrollableVocabulary$ = this.vocabulary$.pipe( - map((result: Vocabulary) => isNotEmpty(result) && result.scrollable) + map((result: Vocabulary) => isNotEmpty(result) && result.scrollable), ); this.isSuggesterVocabulary$ = this.vocabulary$.pipe( - map((result: Vocabulary) => isNotEmpty(result) && !result.hierarchical && !result.scrollable) + map((result: Vocabulary) => isNotEmpty(result) && !result.hierarchical && !result.scrollable), ); this.model$ = this.vocabulary$.pipe( - map((vocabulary: Vocabulary) => { - let formFieldValue; - if (isNotEmpty(this.mdValue.newValue.value)) { - formFieldValue = new FormFieldMetadataValueObject(); - formFieldValue.value = this.mdValue.newValue.value; - formFieldValue.display = this.mdValue.newValue.value; - if (this.mdValue.newValue.authority) { - formFieldValue.authority = this.mdValue.newValue.authority; - formFieldValue.confidence = this.mdValue.newValue.confidence; - } - } else { - formFieldValue = this.mdValue.newValue.value; + map((vocabulary: Vocabulary) => { + let formFieldValue; + if (isNotEmpty(this.mdValue.newValue.value)) { + formFieldValue = new FormFieldMetadataValueObject(); + formFieldValue.value = this.mdValue.newValue.value; + formFieldValue.display = this.mdValue.newValue.value; + if (this.mdValue.newValue.authority) { + formFieldValue.authority = this.mdValue.newValue.authority; + formFieldValue.confidence = this.mdValue.newValue.confidence; } + } else { + formFieldValue = this.mdValue.newValue.value; + } - let vocabularyOptions = vocabulary ? { - closed: false, - name: vocabulary.name - } as VocabularyOptions : null; + const vocabularyOptions = vocabulary ? { + closed: false, + name: vocabulary.name, + } as VocabularyOptions : null; - if (!vocabulary.scrollable) { - let model: DsDynamicOneboxModelConfig = { - id: 'authorityField', - label: `${this.dsoType}.edit.metadata.edit.value`, - vocabularyOptions: vocabularyOptions, - metadataFields: [this.mdField], - value: formFieldValue, - repeatable: false, - submissionId: 'edit-metadata', - hasSelectableMetadata: false, - }; - return new DynamicOneboxModel(model); - } else { - let model: DynamicScrollableDropdownModelConfig = { - id: 'authorityField', - label: `${this.dsoType}.edit.metadata.edit.value`, - placeholder: `${this.dsoType}.edit.metadata.edit.value`, - vocabularyOptions: vocabularyOptions, - metadataFields: [this.mdField], - value: formFieldValue, - repeatable: false, - submissionId: 'edit-metadata', - hasSelectableMetadata: false, - maxOptions: 10 - }; - return new DynamicScrollableDropdownModel(model); - } + if (!vocabulary.scrollable) { + const model: DsDynamicOneboxModelConfig = { + id: 'authorityField', + label: `${this.dsoType}.edit.metadata.edit.value`, + vocabularyOptions: vocabularyOptions, + metadataFields: [this.mdField], + value: formFieldValue, + repeatable: false, + submissionId: 'edit-metadata', + hasSelectableMetadata: false, + }; + return new DynamicOneboxModel(model); + } else { + const model: DynamicScrollableDropdownModelConfig = { + id: 'authorityField', + label: `${this.dsoType}.edit.metadata.edit.value`, + placeholder: `${this.dsoType}.edit.metadata.edit.value`, + vocabularyOptions: vocabularyOptions, + metadataFields: [this.mdField], + value: formFieldValue, + repeatable: false, + submissionId: 'edit-metadata', + hasSelectableMetadata: false, + maxOptions: 10, + }; + return new DynamicScrollableDropdownModel(model); + } })); } @@ -318,7 +356,7 @@ export class DsoEditMetadataValueComponent implements OnInit, OnChanges { return observableOf(rd).pipe( metadataFieldsToString(), take(1), - map((fields: string[]) => fields.indexOf(this.mdField) > -1) + map((fields: string[]) => fields.indexOf(this.mdField) > -1), ); } else { this.notificationsService.error(this.translate.instant(`${this.dsoType}.edit.metadata.metadatafield.error`), rd.errorMessage); diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts index 89a30db9bc..e48f1d4ebe 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts @@ -1,23 +1,42 @@ -import { Component, Inject, Injector, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Data } from '@angular/router'; +import { + Component, + Inject, + Injector, + Input, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; +import { + ActivatedRoute, + Data, +} from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + Subscription, +} from 'rxjs'; import { map } from 'rxjs/operators'; import { ArrayMoveChangeAnalyzer } from '../../core/data/array-move-change-analyzer.service'; import { DATA_SERVICE_FACTORY } from '../../core/data/base/data-service.decorator'; import { HALDataService } from '../../core/data/base/hal-data-service.interface'; import { RemoteData } from '../../core/data/remote-data'; -import { hasNoValue, hasValue } from '../../shared/empty.util'; +import { UpdateDataService } from '../../core/data/update-data.service'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { GenericConstructor } from '../../core/shared/generic-constructor'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { ResourceType } from '../../core/shared/resource-type'; import { AlertType } from '../../shared/alert/alert-type'; +import { + hasNoValue, + hasValue, +} from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { DsoEditMetadataForm } from './dso-edit-metadata-form'; import { MetadataFieldSelectorComponent } from './metadata-field-selector/metadata-field-selector.component'; -import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { UpdateDataService } from '../../core/data/update-data.service'; -import { DSpaceObject } from '../../core/shared/dspace-object.model'; @Component({ selector: 'ds-dso-edit-metadata', diff --git a/src/app/dso-shared/dso-shared.module.ts b/src/app/dso-shared/dso-shared.module.ts index 0affc48d55..d097e27f6c 100644 --- a/src/app/dso-shared/dso-shared.module.ts +++ b/src/app/dso-shared/dso-shared.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; +import { FormModule } from '../shared/form/form.module'; import { SharedModule } from '../shared/shared.module'; import { DsoEditMetadataComponent } from './dso-edit-metadata/dso-edit-metadata.component'; import { DsoEditMetadataFieldValuesComponent } from './dso-edit-metadata/dso-edit-metadata-field-values/dso-edit-metadata-field-values.component'; @@ -8,12 +9,11 @@ import { DsoEditMetadataValueComponent } from './dso-edit-metadata/dso-edit-meta import { DsoEditMetadataValueHeadersComponent } from './dso-edit-metadata/dso-edit-metadata-value-headers/dso-edit-metadata-value-headers.component'; import { MetadataFieldSelectorComponent } from './dso-edit-metadata/metadata-field-selector/metadata-field-selector.component'; import { ThemedDsoEditMetadataComponent } from './dso-edit-metadata/themed-dso-edit-metadata.component'; -import { FormModule } from '../shared/form/form.module'; @NgModule({ imports: [ SharedModule, - FormModule + FormModule, ], declarations: [ DsoEditMetadataComponent, diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-suggestions/org-unit-input-suggestions.component.spec.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-suggestions/org-unit-input-suggestions.component.spec.ts index cd78a800db..d2a1639d40 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-suggestions/org-unit-input-suggestions.component.spec.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-suggestions/org-unit-input-suggestions.component.spec.ts @@ -1,5 +1,12 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { TranslateModule } from '@ngx-translate/core'; diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index b7b9d30f6c..7a88c66eab 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -1,21 +1,30 @@ // ... test imports -import { ComponentFixture, fakeAsync, inject, TestBed, waitForAsync } from '@angular/core/testing'; - -import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core'; - import { CommonModule } from '@angular/common'; +import { + CUSTOM_ELEMENTS_SCHEMA, + DebugElement, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { StoreModule } from '@ngrx/store'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { of } from 'rxjs'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { environment } from 'src/environments/environment'; import { storeModuleConfig } from '../app.reducer'; +import { NotifyInfoService } from '../core/coar-notify/notify-info/notify-info.service'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; import { AuthorizationDataServiceStub } from '../shared/testing/authorization-service.stub'; -import { NotifyInfoService } from '../core/coar-notify/notify-info/notify-info.service'; -import { environment } from 'src/environments/environment'; - // Load the implementations that should be tested import { FooterComponent } from './footer.component'; @@ -26,7 +35,7 @@ let de: DebugElement; let el: HTMLElement; let notifyInfoService = { - isCoarConfigEnabled: () => of(true) + isCoarConfigEnabled: () => of(true), }; describe('Footer component', () => { @@ -42,7 +51,7 @@ describe('Footer component', () => { providers: [ FooterComponent, { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, - { provide: NotifyInfoService, useValue: notifyInfoService } + { provide: NotifyInfoService, useValue: notifyInfoService }, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }); diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index fdbf8c13b3..9012a2ccb2 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -1,11 +1,15 @@ -import { Component, Optional } from '@angular/core'; -import { hasValue } from '../shared/empty.util'; -import { KlaroService } from '../shared/cookies/klaro.service'; +import { + Component, + Optional, +} from '@angular/core'; +import { Observable } from 'rxjs'; + import { environment } from '../../environments/environment'; import { NotifyInfoService } from '../core/coar-notify/notify-info/notify-info.service'; -import { Observable } from 'rxjs'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; +import { KlaroService } from '../shared/cookies/klaro.service'; +import { hasValue } from '../shared/empty.util'; @Component({ selector: 'ds-footer', @@ -27,7 +31,7 @@ export class FooterComponent { constructor( @Optional() private cookies: KlaroService, private authorizationService: AuthorizationDataService, - private notifyInfoService: NotifyInfoService + private notifyInfoService: NotifyInfoService, ) { this.showSendFeedback$ = this.authorizationService.isAuthorized(FeatureID.CanSendFeedback); this.notifyInfoService.isCoarConfigEnabled().subscribe(coarLdnEnabled => { diff --git a/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts b/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts index a92c487bf5..c6c6bbe9f8 100644 --- a/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts +++ b/src/app/forgot-password/forgot-password-form/forgot-password-form.component.spec.ts @@ -1,9 +1,19 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ReactiveFormsModule, + UntypedFormBuilder, +} from '@angular/forms'; import { By } from '@angular/platform-browser'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { Store } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; @@ -14,10 +24,14 @@ import { CoreState } from '../../core/core-state.model'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { Registration } from '../../core/shared/registration.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { BrowserOnlyPipe } from '../../shared/utils/browser-only.pipe'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; import { RouterStub } from '../../shared/testing/router.stub'; +import { BrowserOnlyPipe } from '../../shared/utils/browser-only.pipe'; import { ForgotPasswordFormComponent } from './forgot-password-form.component'; describe('ForgotPasswordFormComponent', () => { diff --git a/src/app/header-nav-wrapper/header-navbar-wrapper.component.ts b/src/app/header-nav-wrapper/header-navbar-wrapper.component.ts index 0a32b3a70e..0bca2cef4b 100644 --- a/src/app/header-nav-wrapper/header-navbar-wrapper.component.ts +++ b/src/app/header-nav-wrapper/header-navbar-wrapper.component.ts @@ -1,8 +1,15 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; import { Observable } from 'rxjs'; + +import { + HostWindowService, + WidthCategory, +} from '../shared/host-window.service'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; -import { HostWindowService, WidthCategory } from '../shared/host-window.service'; /** * This component represents a wrapper for the horizontal navbar and the header diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 4ff01b8d86..6395a4701a 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -1,7 +1,13 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; import { Observable } from 'rxjs'; -import { HostWindowService, WidthCategory } from '../shared/host-window.service'; +import { + HostWindowService, + WidthCategory, +} from '../shared/host-window.service'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; diff --git a/src/app/home-page/home-page.component.ts b/src/app/home-page/home-page.component.ts index 1f382ce2ca..f607b1a2a9 100644 --- a/src/app/home-page/home-page.component.ts +++ b/src/app/home-page/home-page.component.ts @@ -1,18 +1,35 @@ -import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; -import { map, switchMap } from 'rxjs/operators'; +import { isPlatformServer } from '@angular/common'; +import { + Component, + Inject, + OnDestroy, + OnInit, + PLATFORM_ID, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Observable, of } from 'rxjs'; -import { Site } from '../core/shared/site.model'; +import { + Observable, + of, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; +import { + APP_CONFIG, + AppConfig, +} from 'src/config/app-config.interface'; import { environment } from '../../environments/environment'; -import { isPlatformServer } from '@angular/common'; -import { ServerResponseService } from '../core/services/server-response.service'; import { NotifyInfoService } from '../core/coar-notify/notify-info/notify-info.service'; -import { LinkDefinition, LinkHeadService } from '../core/services/link-head.service'; +import { + LinkDefinition, + LinkHeadService, +} from '../core/services/link-head.service'; +import { ServerResponseService } from '../core/services/server-response.service'; +import { Site } from '../core/shared/site.model'; import { isNotEmpty } from '../shared/empty.util'; -import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; - @Component({ selector: 'ds-home-page', styleUrls: ['./home-page.component.scss'], @@ -33,7 +50,7 @@ export class HomePageComponent implements OnInit, OnDestroy { private responseService: ServerResponseService, private notifyInfoService: NotifyInfoService, protected linkHeadService: LinkHeadService, - @Inject(PLATFORM_ID) private platformId: string + @Inject(PLATFORM_ID) private platformId: string, ) { this.recentSubmissionspageSize = environment.homePage.recentSubmissions.pageSize; // Get COAR REST API URLs from REST configuration @@ -45,7 +62,7 @@ export class HomePageComponent implements OnInit, OnDestroy { } else { return of([]); } - }) + }), ).subscribe((coarRestApiUrls: string[]) => { if (coarRestApiUrls.length > 0) { this.initPageLinks(coarRestApiUrls); @@ -68,9 +85,9 @@ export class HomePageComponent implements OnInit, OnDestroy { let links = ''; coarRestApiUrls.forEach((coarRestApiUrl: string) => { // Add link to head - let tag: LinkDefinition = { + const tag: LinkDefinition = { href: coarRestApiUrl, - rel: rel + rel: rel, }; this.inboxLinks.push(tag); this.linkHeadService.addTag(tag); diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts index a21383e5dc..5d86c7d433 100644 --- a/src/app/home-page/home-page.module.ts +++ b/src/app/home-page/home-page.module.ts @@ -3,18 +3,18 @@ import { NgModule } from '@angular/core'; import { JournalEntitiesModule } from '../entity-groups/journal-entities/journal-entities.module'; import { ResearchEntitiesModule } from '../entity-groups/research-entities/research-entities.module'; +import { NotificationsModule } from '../notifications/notifications.module'; +import { SearchModule } from '../shared/search/search.module'; import { SharedModule } from '../shared/shared.module'; import { StatisticsModule } from '../statistics/statistics.module'; import { HomeNewsComponent } from './home-news/home-news.component'; -import { HomePageRoutingModule } from './home-page-routing.module'; -import { HomePageComponent } from './home-page.component'; -import { TopLevelCommunityListComponent } from './top-level-community-list/top-level-community-list.component'; import { ThemedHomeNewsComponent } from './home-news/themed-home-news.component'; +import { HomePageComponent } from './home-page.component'; +import { HomePageRoutingModule } from './home-page-routing.module'; import { RecentItemListComponent } from './recent-item-list/recent-item-list.component'; import { ThemedHomePageComponent } from './themed-home-page.component'; import { ThemedTopLevelCommunityListComponent } from './top-level-community-list/themed-top-level-community-list.component'; -import { SearchModule } from '../shared/search/search.module'; -import { NotificationsModule } from '../notifications/notifications.module'; +import { TopLevelCommunityListComponent } from './top-level-community-list/top-level-community-list.component'; const DECLARATIONS = [ HomePageComponent, @@ -35,7 +35,7 @@ const DECLARATIONS = [ ResearchEntitiesModule.withEntryComponents(), HomePageRoutingModule, StatisticsModule.forRoot(), - NotificationsModule + NotificationsModule, ], declarations: [ ...DECLARATIONS, diff --git a/src/app/info/info-routing.module.ts b/src/app/info/info-routing.module.ts index 720b4a4aee..b43682d319 100644 --- a/src/app/info/info-routing.module.ts +++ b/src/app/info/info-routing.module.ts @@ -2,14 +2,18 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { environment } from '../../environments/environment'; +import { COAR_NOTIFY_SUPPORT } from '../app-routing-paths'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { NotifyInfoComponent } from '../core/coar-notify/notify-info/notify-info.component'; +import { NotifyInfoGuard } from '../core/coar-notify/notify-info/notify-info.guard'; import { FeedbackGuard } from '../core/feedback/feedback.guard'; import { ThemedEndUserAgreementComponent } from './end-user-agreement/themed-end-user-agreement.component'; import { ThemedFeedbackComponent } from './feedback/themed-feedback.component'; -import { COAR_NOTIFY_SUPPORT } from '../app-routing-paths'; -import { NotifyInfoComponent } from '../core/coar-notify/notify-info/notify-info.component'; -import { NotifyInfoGuard } from '../core/coar-notify/notify-info/notify-info.guard'; -import { END_USER_AGREEMENT_PATH, FEEDBACK_PATH, PRIVACY_PATH } from './info-routing-paths'; +import { + END_USER_AGREEMENT_PATH, + FEEDBACK_PATH, + PRIVACY_PATH, +} from './info-routing-paths'; import { ThemedPrivacyComponent } from './privacy/themed-privacy.component'; const imports = [ @@ -19,8 +23,8 @@ const imports = [ component: ThemedFeedbackComponent, resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { title: 'info.feedback.title', breadcrumbKey: 'info.feedback' }, - canActivate: [FeedbackGuard] - } + canActivate: [FeedbackGuard], + }, ]), RouterModule.forChild([ { @@ -28,9 +32,9 @@ const imports = [ component: NotifyInfoComponent, resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { title: 'info.coar-notify-support.title', breadcrumbKey: 'info.coar-notify' }, - canActivate: [NotifyInfoGuard] - } - ]) + canActivate: [NotifyInfoGuard], + }, + ]), ]; if (environment.info.enableEndUserAgreement) { diff --git a/src/app/info/info.module.ts b/src/app/info/info.module.ts index 0ef4c22612..fe7d76f6ed 100644 --- a/src/app/info/info.module.ts +++ b/src/app/info/info.module.ts @@ -1,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { NotifyInfoComponent } from '../core/coar-notify/notify-info/notify-info.component'; import { FeedbackGuard } from '../core/feedback/feedback.guard'; import { SharedModule } from '../shared/shared.module'; import { EndUserAgreementComponent } from './end-user-agreement/end-user-agreement.component'; @@ -10,7 +11,6 @@ import { FeedbackComponent } from './feedback/feedback.component'; import { FeedbackFormComponent } from './feedback/feedback-form/feedback-form.component'; import { ThemedFeedbackFormComponent } from './feedback/feedback-form/themed-feedback-form.component'; import { ThemedFeedbackComponent } from './feedback/themed-feedback.component'; -import { NotifyInfoComponent } from '../core/coar-notify/notify-info/notify-info.component'; import { InfoRoutingModule } from './info-routing.module'; import { PrivacyComponent } from './privacy/privacy.component'; import { PrivacyContentComponent } from './privacy/privacy-content/privacy-content.component'; @@ -27,7 +27,7 @@ const DECLARATIONS = [ FeedbackFormComponent, ThemedFeedbackFormComponent, ThemedFeedbackComponent, - NotifyInfoComponent + NotifyInfoComponent, ]; @NgModule({ diff --git a/src/app/item-page/alerts/item-alerts.component.spec.ts b/src/app/item-page/alerts/item-alerts.component.spec.ts index 00ad150c67..13a45f0626 100644 --- a/src/app/item-page/alerts/item-alerts.component.spec.ts +++ b/src/app/item-page/alerts/item-alerts.component.spec.ts @@ -1,17 +1,27 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; -import { DsoWithdrawnReinstateModalService, REQUEST_REINSTATE } from '../../shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; -import { CorrectionTypeDataService } from '../../core/submission/correctiontype-data.service'; -import { TestScheduler } from 'rxjs/testing'; -import { CorrectionType } from '../../core/submission/models/correctiontype.model'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { createPaginatedList } from '../../shared/testing/utils.test'; -import { of } from 'rxjs'; import { TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; +import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { Item } from '../../core/shared/item.model'; +import { CorrectionTypeDataService } from '../../core/submission/correctiontype-data.service'; +import { CorrectionType } from '../../core/submission/models/correctiontype.model'; +import { + DsoWithdrawnReinstateModalService, + REQUEST_REINSTATE, +} from '../../shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; +import { createPaginatedList } from '../../shared/testing/utils.test'; import { ItemAlertsComponent } from './item-alerts.component'; describe('ItemAlertsComponent', () => { @@ -38,7 +48,7 @@ describe('ItemAlertsComponent', () => { providers: [ { provide: AuthorizationDataService, useValue: authorizationService }, { provide: DsoWithdrawnReinstateModalService, useValue: dsoWithdrawnReinstateModalService }, - { provide: CorrectionTypeDataService, useValue: correctionTypeDataService } + { provide: CorrectionTypeDataService, useValue: correctionTypeDataService }, ], schemas: [NO_ERRORS_SCHEMA], }) @@ -117,7 +127,7 @@ describe('ItemAlertsComponent', () => { describe('when the item is reinstated', () => { const correctionType = Object.assign(new CorrectionType(), { - topic: REQUEST_REINSTATE + topic: REQUEST_REINSTATE, }); const correctionRD = createSuccessfulRemoteDataObject(createPaginatedList([correctionType])); @@ -126,7 +136,7 @@ describe('ItemAlertsComponent', () => { component.item = item; (correctionTypeDataService.findByItem).and.returnValue(of(correctionRD)); - testScheduler = new TestScheduler((actual, expected) => { + testScheduler = new TestScheduler((actual, expected) => { expect(actual).toEqual(expected); }); fixture.detectChanges(); diff --git a/src/app/item-page/alerts/item-alerts.component.ts b/src/app/item-page/alerts/item-alerts.component.ts index dbee9b22a9..a0ccb7406f 100644 --- a/src/app/item-page/alerts/item-alerts.component.ts +++ b/src/app/item-page/alerts/item-alerts.component.ts @@ -1,13 +1,27 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input, +} from '@angular/core'; +import { + combineLatest, + map, + Observable, +} from 'rxjs'; +import { + getFirstCompletedRemoteData, + getPaginatedListPayload, + getRemoteDataPayload, +} from 'src/app/core/shared/operators'; -import { Item } from '../../core/shared/item.model'; -import { AlertType } from '../../shared/alert/alert-type'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../core/data/feature-authorization/feature-id'; -import { combineLatest, map, Observable } from 'rxjs'; -import { DsoWithdrawnReinstateModalService, REQUEST_REINSTATE } from '../../shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; +import { Item } from '../../core/shared/item.model'; import { CorrectionTypeDataService } from '../../core/submission/correctiontype-data.service'; -import { getFirstCompletedRemoteData, getPaginatedListPayload, getRemoteDataPayload } from 'src/app/core/shared/operators'; +import { AlertType } from '../../shared/alert/alert-type'; +import { + DsoWithdrawnReinstateModalService, + REQUEST_REINSTATE, +} from '../../shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; @Component({ selector: 'ds-item-alerts', @@ -32,7 +46,7 @@ export class ItemAlertsComponent { constructor( private authService: AuthorizationDataService, private dsoWithdrawnReinstateModalService: DsoWithdrawnReinstateModalService, - private correctionTypeDataService: CorrectionTypeDataService + private correctionTypeDataService: CorrectionTypeDataService, ) { } @@ -42,17 +56,17 @@ export class ItemAlertsComponent { * @returns An Observable that emits a boolean value indicating whether to show the reinstate button. */ showReinstateButton$(): Observable { - const correction$ = this.correctionTypeDataService.findByItem(this.item.uuid, true).pipe( + const correction$ = this.correctionTypeDataService.findByItem(this.item.uuid, true).pipe( getFirstCompletedRemoteData(), getRemoteDataPayload(), - getPaginatedListPayload() - ); + getPaginatedListPayload(), + ); const isAdmin$ = this.authService.isAuthorized(FeatureID.AdministratorOf); return combineLatest([isAdmin$, correction$]).pipe( map(([isAdmin, correction]) => { return !isAdmin && correction.some((correctionType) => correctionType.topic === REQUEST_REINSTATE); - } - )); + }, + )); } /** diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts index 72c0a06925..52d8e8e0f7 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts @@ -1,4 +1,13 @@ -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ViewContainerRef } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, + ViewContainerRef, +} from '@angular/core'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { Bundle } from '../../../../core/shared/bundle.model'; diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component.ts index 5508bd3eff..8e3524dffb 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component.ts @@ -1,4 +1,10 @@ -import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, + ViewChild, + ViewContainerRef, +} from '@angular/core'; @Component({ selector: 'ds-item-edit-bitstream-drag-handle', diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.ts index d95ee6a064..b4e86d010d 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.ts @@ -1,5 +1,13 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core'; -import { Bitstream } from '../../../../core/shared/bitstream.model'; +import { + Component, + Input, + OnChanges, + OnDestroy, + OnInit, + SimpleChanges, + ViewChild, + ViewContainerRef, +} from '@angular/core'; import cloneDeep from 'lodash/cloneDeep'; import { Observable } from 'rxjs'; @@ -8,8 +16,12 @@ import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { FieldChangeType } from '../../../../core/data/object-updates/field-change-type.model'; import { FieldUpdate } from '../../../../core/data/object-updates/field-update.model'; import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service'; +import { Bitstream } from '../../../../core/shared/bitstream.model'; import { BitstreamFormat } from '../../../../core/shared/bitstream-format.model'; -import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../../../core/shared/operators'; +import { + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../../../../core/shared/operators'; import { ResponsiveTableSizes } from '../../../../shared/responsive-table-sizes/responsive-table-sizes'; @Component({ diff --git a/src/app/item-page/edit-item-page/item-status/item-status.component.ts b/src/app/item-page/edit-item-page/item-status/item-status.component.ts index 4c00cb4a48..1bd39c5215 100644 --- a/src/app/item-page/edit-item-page/item-status/item-status.component.ts +++ b/src/app/item-page/edit-item-page/item-status/item-status.component.ts @@ -1,23 +1,50 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { ItemOperation } from '../item-operation/itemOperation.model'; -import { concatMap, distinctUntilChanged, first, map, mergeMap, switchMap, toArray } from 'rxjs/operators'; -import { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { getItemEditRoute, getItemPageRoute } from '../../item-page-routing-paths'; +import { + BehaviorSubject, + combineLatest, + Observable, + of, + Subscription, +} from 'rxjs'; +import { + concatMap, + distinctUntilChanged, + first, + map, + mergeMap, + switchMap, + toArray, +} from 'rxjs/operators'; import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { IdentifierDataService } from '../../../core/data/identifier-data.service'; +import { RemoteData } from '../../../core/data/remote-data'; import { OrcidAuthService } from '../../../core/orcid/orcid-auth.service'; import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; import { Item } from '../../../core/shared/item.model'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { fadeIn, fadeInOut } from '../../../shared/animations/fade'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, +} from '../../../core/shared/operators'; +import { + fadeIn, + fadeInOut, +} from '../../../shared/animations/fade'; import { hasValue } from '../../../shared/empty.util'; import { Identifier } from '../../../shared/object-list/identifier-data/identifier.model'; import { IdentifierData } from '../../../shared/object-list/identifier-data/identifier-data.model'; +import { + getItemEditRoute, + getItemPageRoute, +} from '../../item-page-routing-paths'; +import { ItemOperation } from '../item-operation/itemOperation.model'; @Component({ selector: 'ds-item-status', @@ -108,19 +135,19 @@ export class ItemStatusComponent implements OnInit { // Observable for configuration determining whether the Register DOI feature is enabled const registerConfigEnabled$: Observable = this.configurationService.findByPropertyName('identifiers.item-status.register-doi').pipe( getFirstCompletedRemoteData(), - map((response: RemoteData) => { + map((response: RemoteData) => { // Return true if a successful response with a 'true' value was retrieved, otherwise return false - if (response.hasSucceeded) { - const payload = response.payload; - if (payload.values.length > 0 && hasValue(payload.values[0])) { - return payload.values[0] === 'true'; + if (response.hasSucceeded) { + const payload = response.payload; + if (payload.values.length > 0 && hasValue(payload.values[0])) { + return payload.values[0] === 'true'; + } else { + return false; + } } else { return false; } - } else { - return false; - } - }) + }), ); /** @@ -130,7 +157,7 @@ export class ItemStatusComponent implements OnInit { * The value is supposed to be a href for the button */ const currentUrl = this.getCurrentUrl(item); - const initialOperations: ItemOperation[] = [ + const initialOperations: ItemOperation[] = [ new ItemOperation('authorizations', `${currentUrl}/authorizations`, FeatureID.CanManagePolicies, true), new ItemOperation('mappedCollections', `${currentUrl}/mapper`, FeatureID.CanManageMappings, true), item.isWithdrawn @@ -143,7 +170,7 @@ export class ItemStatusComponent implements OnInit { new ItemOperation('delete', `${currentUrl}/delete`, FeatureID.CanDelete, true), ]; - this.operations$.next(initialOperations); + this.operations$.next(initialOperations); /** * When the identifier data stream changes, determine whether the register DOI button should be shown or not. diff --git a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts index 0b25939373..3819bd5654 100644 --- a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts +++ b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts @@ -10,12 +10,12 @@ import { APP_CONFIG, AppConfig, } from '../../../../config/app-config.interface'; +import { environment } from '../../../../environments/environment'; import { BrowseDefinition } from '../../../core/shared/browse-definition.model'; import { MetadataValue } from '../../../core/shared/metadata.models'; import { VALUE_LIST_BROWSE_DEFINITION } from '../../../core/shared/value-list-browse-definition.resource-type'; -import { ImageField } from '../../simple/field-components/specific-field/item-page-field.component'; -import { environment } from '../../../../environments/environment'; import { hasValue } from '../../../shared/empty.util'; +import { ImageField } from '../../simple/field-components/specific-field/item-page-field.component'; /** * This component renders the configured 'values' into the ds-metadata-field-wrapper component. diff --git a/src/app/item-page/full/full-item-page.component.spec.ts b/src/app/item-page/full/full-item-page.component.spec.ts index 32639eef32..516f2e94cd 100644 --- a/src/app/item-page/full/full-item-page.component.spec.ts +++ b/src/app/item-page/full/full-item-page.component.spec.ts @@ -1,24 +1,42 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA, PLATFORM_ID } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, + PLATFORM_ID, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { + BehaviorSubject, + of as observableOf, +} from 'rxjs'; import { AuthService } from '../../core/auth/auth.service'; +import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { ItemDataService } from '../../core/data/item-data.service'; import { RemoteData } from '../../core/data/remote-data'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; import { MetadataService } from '../../core/metadata/metadata.service'; import { LinkHeadService } from '../../core/services/link-head.service'; -import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { ServerResponseService } from '../../core/services/server-response.service'; import { Item } from '../../core/shared/item.model'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { TruncatePipe } from '../../shared/utils/truncate.pipe'; @@ -132,7 +150,7 @@ describe('FullItemPageComponent', () => { { provide: SignpostingDataService, useValue: signpostingDataService }, { provide: LinkHeadService, useValue: linkHeadService }, { provide: NotifyInfoService, useValue: notifyInfoService }, - { provide: PLATFORM_ID, useValue: 'server' } + { provide: PLATFORM_ID, useValue: 'server' }, ], schemas: [NO_ERRORS_SCHEMA], }).overrideComponent(FullItemPageComponent, { diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index 37417b377d..7a2520f072 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -1,10 +1,28 @@ import { Location } from '@angular/common'; -import { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; -import { ActivatedRoute, Data, Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { + ChangeDetectionStrategy, + Component, + Inject, + OnDestroy, + OnInit, + PLATFORM_ID, +} from '@angular/core'; +import { + ActivatedRoute, + Data, + Router, +} from '@angular/router'; +import { + BehaviorSubject, + Observable, +} from 'rxjs'; +import { + filter, + map, +} from 'rxjs/operators'; import { AuthService } from '../../core/auth/auth.service'; +import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { ItemDataService } from '../../core/data/item-data.service'; import { RemoteData } from '../../core/data/remote-data'; @@ -15,7 +33,6 @@ import { Item } from '../../core/shared/item.model'; import { MetadataMap } from '../../core/shared/metadata.models'; import { fadeInOut } from '../../shared/animations/fade'; import { hasValue } from '../../shared/empty.util'; -import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { ItemPageComponent } from '../simple/item-page.component'; /** diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index 71f30740bf..397cf76993 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -36,9 +36,6 @@ import { OrcidQueueComponent } from './orcid-page/orcid-queue/orcid-queue.compon import { OrcidSyncSettingsComponent } from './orcid-page/orcid-sync-settings/orcid-sync-settings.component'; import { AbstractIncrementalListComponent } from './simple/abstract-incremental-list/abstract-incremental-list.component'; import { FileSectionComponent } from './simple/field-components/file-section/file-section.component'; -import { QaEventNotificationComponent } from './simple/qa-event-notification/qa-event-notification.component'; -import { NotifyRequestsStatusComponent } from './simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component'; -import { RequestStatusAlertBoxComponent } from './simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component'; import { ThemedFileSectionComponent } from './simple/field-components/file-section/themed-file-section.component'; import { ItemPageAbstractFieldComponent } from './simple/field-components/specific-field/abstract/item-page-abstract-field.component'; import { ItemPageAuthorFieldComponent } from './simple/field-components/specific-field/author/item-page-author-field.component'; @@ -49,6 +46,9 @@ import { ItemPageComponent } from './simple/item-page.component'; import { PublicationComponent } from './simple/item-types/publication/publication.component'; import { ItemComponent } from './simple/item-types/shared/item.component'; import { UntypedItemComponent } from './simple/item-types/untyped-item/untyped-item.component'; +import { NotifyRequestsStatusComponent } from './simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component'; +import { RequestStatusAlertBoxComponent } from './simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component'; +import { QaEventNotificationComponent } from './simple/qa-event-notification/qa-event-notification.component'; import { ThemedItemPageComponent } from './simple/themed-item-page.component'; import { VersionPageComponent } from './version-page/version-page/version-page.component'; import { ItemVersionsModule } from './versions/item-versions.module'; @@ -97,7 +97,7 @@ const DECLARATIONS = [ BitstreamRequestACopyPageComponent, QaEventNotificationComponent, NotifyRequestsStatusComponent, - RequestStatusAlertBoxComponent + RequestStatusAlertBoxComponent, ]; @NgModule({ diff --git a/src/app/item-page/item-shared.module.ts b/src/app/item-page/item-shared.module.ts index 5180b8232c..36fe6ac3bd 100644 --- a/src/app/item-page/item-shared.module.ts +++ b/src/app/item-page/item-shared.module.ts @@ -1,26 +1,30 @@ -import { RelatedEntitiesSearchComponent } from './simple/related-entities/related-entities-search/related-entities-search.component'; +import { + CommonModule, + NgOptimizedImage, +} from '@angular/common'; import { NgModule } from '@angular/core'; -import { CommonModule, NgOptimizedImage } from '@angular/common'; +import { DYNAMIC_FORM_CONTROL_MAP_FN } from '@ng-dynamic-forms/core'; +import { TranslateModule } from '@ngx-translate/core'; + +import { ItemWithdrawnReinstateModalComponent } from '../shared/correction-suggestion/withdrawn-reinstate-modal.component'; +import { dsDynamicFormControlMapFn } from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component'; import { SearchModule } from '../shared/search/search.module'; import { SharedModule } from '../shared/shared.module'; -import { TranslateModule } from '@ngx-translate/core'; -import { DYNAMIC_FORM_CONTROL_MAP_FN } from '@ng-dynamic-forms/core'; -import { dsDynamicFormControlMapFn } from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component'; -import { TabbedRelatedEntitiesSearchComponent } from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component'; -import { ItemVersionsDeleteModalComponent } from './versions/item-versions-delete-modal/item-versions-delete-modal.component'; -import { ItemVersionsSummaryModalComponent } from './versions/item-versions-summary-modal/item-versions-summary-modal.component'; import { MetadataValuesComponent } from './field-components/metadata-values/metadata-values.component'; import { GenericItemPageFieldComponent } from './simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { ItemPageImgFieldComponent } from './simple/field-components/specific-field/img/item-page-img-field.component'; import { MetadataRepresentationListComponent } from './simple/metadata-representation-list/metadata-representation-list.component'; import { ThemedMetadataRepresentationListComponent } from './simple/metadata-representation-list/themed-metadata-representation-list.component'; +import { RelatedEntitiesSearchComponent } from './simple/related-entities/related-entities-search/related-entities-search.component'; +import { TabbedRelatedEntitiesSearchComponent } from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component'; import { RelatedItemsComponent } from './simple/related-items/related-items-component'; -import { ItemWithdrawnReinstateModalComponent } from '../shared/correction-suggestion/withdrawn-reinstate-modal.component'; -import { ItemPageImgFieldComponent } from './simple/field-components/specific-field/img/item-page-img-field.component'; +import { ItemVersionsDeleteModalComponent } from './versions/item-versions-delete-modal/item-versions-delete-modal.component'; +import { ItemVersionsSummaryModalComponent } from './versions/item-versions-summary-modal/item-versions-summary-modal.component'; const ENTRY_COMPONENTS = [ ItemVersionsDeleteModalComponent, ItemVersionsSummaryModalComponent, - ItemWithdrawnReinstateModalComponent + ItemWithdrawnReinstateModalComponent, ]; diff --git a/src/app/item-page/simple/field-components/file-section/file-section.component.spec.ts b/src/app/item-page/simple/field-components/file-section/file-section.component.spec.ts index 1c4b814895..1db82d3fb7 100644 --- a/src/app/item-page/simple/field-components/file-section/file-section.component.spec.ts +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.spec.ts @@ -1,8 +1,15 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; import { APP_CONFIG } from 'src/config/app-config.interface'; import { environment } from 'src/environments/environment'; @@ -27,7 +34,7 @@ describe('FileSectionComponent', () => { const bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { findAllByItemAndBundleName: createSuccessfulRemoteDataObject$(createPaginatedList([])), - findPrimaryBitstreamByItemAndName: observableOf(null) + findPrimaryBitstreamByItemAndName: observableOf(null), }); const mockBitstream: Bitstream = Object.assign(new Bitstream(), diff --git a/src/app/item-page/simple/field-components/file-section/file-section.component.ts b/src/app/item-page/simple/field-components/file-section/file-section.component.ts index 1c1cd8a6d5..28b21c0e55 100644 --- a/src/app/item-page/simple/field-components/file-section/file-section.component.ts +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.ts @@ -1,7 +1,15 @@ -import { Component, Inject, Input, OnInit } from '@angular/core'; +import { + Component, + Inject, + Input, + OnInit, +} from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject } from 'rxjs'; -import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; +import { + APP_CONFIG, + AppConfig, +} from 'src/config/app-config.interface'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; diff --git a/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.spec.ts b/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.spec.ts index b96daa47ad..00c029f838 100644 --- a/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.spec.ts +++ b/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.spec.ts @@ -1,18 +1,27 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; -import { ItemPageImgFieldComponent } from './item-page-img-field.component'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock'; import { APP_CONFIG } from '../../../../../../config/app-config.interface'; import { environment } from '../../../../../../environments/environment'; import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service'; import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub'; -import { GenericItemPageFieldComponent } from '../generic/generic-item-page-field.component'; +import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock'; import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component.spec'; -import { By } from '@angular/platform-browser'; +import { GenericItemPageFieldComponent } from '../generic/generic-item-page-field.component'; import { ImageField } from '../item-page-field.component'; +import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component.spec'; +import { ItemPageImgFieldComponent } from './item-page-img-field.component'; let component: ItemPageImgFieldComponent; let fixture: ComponentFixture; @@ -24,7 +33,7 @@ const mockUrlRegex = '(.*)ror.org'; const mockImg = { URI: './assets/images/ror-icon.svg', alt: 'item.page.image.alt.ROR', - heightVar: '--ds-item-page-img-field-ror-inline-height' + heightVar: '--ds-item-page-img-field-ror-inline-height', } as ImageField; describe('ItemPageImgFieldComponent', () => { @@ -34,19 +43,19 @@ describe('ItemPageImgFieldComponent', () => { imports: [TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: TranslateLoaderMock - } + useClass: TranslateLoaderMock, + }, })], providers: [ { provide: APP_CONFIG, useValue: environment }, - { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub } + { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, ], declarations: [ItemPageImgFieldComponent, GenericItemPageFieldComponent, MetadataValuesComponent], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) .overrideComponent(GenericItemPageFieldComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }) + set: { changeDetection: ChangeDetectionStrategy.Default }, + }) .compileComponents(); fixture = TestBed.createComponent(ItemPageImgFieldComponent); diff --git a/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.ts b/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.ts index d442323b53..891c5d70c8 100644 --- a/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.ts @@ -1,10 +1,17 @@ -import { Component, Input } from '@angular/core'; -import { ImageField, ItemPageFieldComponent } from '../item-page-field.component'; +import { + Component, + Input, +} from '@angular/core'; + import { Item } from '../../../../../core/shared/item.model'; +import { + ImageField, + ItemPageFieldComponent, +} from '../item-page-field.component'; @Component({ selector: 'ds-item-page-img-field', - templateUrl: '../item-page-field.component.html' + templateUrl: '../item-page-field.component.html', }) /** * Component that renders an inline image for a given field. diff --git a/src/app/item-page/simple/field-components/specific-field/item-page-field.component.spec.ts b/src/app/item-page/simple/field-components/specific-field/item-page-field.component.spec.ts index c854b93167..ad617d73b5 100644 --- a/src/app/item-page/simple/field-components/specific-field/item-page-field.component.spec.ts +++ b/src/app/item-page/simple/field-components/specific-field/item-page-field.component.spec.ts @@ -1,14 +1,27 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { APP_CONFIG } from '../../../../../config/app-config.interface'; import { environment } from '../../../../../environments/environment'; import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service'; import { Item } from '../../../../core/shared/item.model'; -import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models'; +import { + MetadataMap, + MetadataValue, +} from '../../../../core/shared/metadata.models'; import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; import { SharedModule } from '../../../../shared/shared.module'; diff --git a/src/app/item-page/simple/field-components/specific-field/item-page-field.component.ts b/src/app/item-page/simple/field-components/specific-field/item-page-field.component.ts index bfb0e144cc..423eb8c018 100644 --- a/src/app/item-page/simple/field-components/specific-field/item-page-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/item-page-field.component.ts @@ -1,4 +1,7 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input, +} from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; diff --git a/src/app/item-page/simple/item-page.component.spec.ts b/src/app/item-page/simple/item-page.component.spec.ts index 4d7090f21e..2e3ce5321b 100644 --- a/src/app/item-page/simple/item-page.component.spec.ts +++ b/src/app/item-page/simple/item-page.component.spec.ts @@ -1,25 +1,47 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA, PLATFORM_ID } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, + PLATFORM_ID, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute, Router } from '@angular/router'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; import { AuthService } from '../../core/auth/auth.service'; +import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { ItemDataService } from '../../core/data/item-data.service'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; import { SignpostingLink } from '../../core/data/signposting-links.model'; import { MetadataService } from '../../core/metadata/metadata.service'; -import { LinkDefinition, LinkHeadService } from '../../core/services/link-head.service'; +import { + LinkDefinition, + LinkHeadService, +} from '../../core/services/link-head.service'; import { ServerResponseService } from '../../core/services/server-response.service'; import { Item } from '../../core/shared/item.model'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { createFailedRemoteDataObject$, createPendingRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createPendingRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; -import { NotifyInfoService } from '../../core/coar-notify/notify-info/notify-info.service'; import { VarDirective } from '../../shared/utils/var.directive'; import { ItemPageComponent } from './item-page.component'; import { createRelationshipsObservable } from './item-types/shared/item.component.spec'; @@ -118,7 +140,7 @@ describe('ItemPageComponent', () => { { provide: ServerResponseService, useValue: serverResponseService }, { provide: SignpostingDataService, useValue: signpostingDataService }, { provide: LinkHeadService, useValue: linkHeadService }, - { provide: NotifyInfoService, useValue: notifyInfoService}, + { provide: NotifyInfoService, useValue: notifyInfoService }, { provide: PLATFORM_ID, useValue: 'server' }, ], diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index 10105aeff5..191c07f906 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -1,9 +1,26 @@ import { isPlatformServer } from '@angular/common'; - -import { combineLatest, Observable } from 'rxjs'; -import { map, switchMap, take } from 'rxjs/operators'; -import { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ChangeDetectionStrategy, + Component, + Inject, + OnDestroy, + OnInit, + PLATFORM_ID, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + combineLatest, + Observable, +} from 'rxjs'; +import { + map, + switchMap, + take, +} from 'rxjs/operators'; +import { NotifyInfoService } from 'src/app/core/coar-notify/notify-info/notify-info.service'; import { AuthService } from '../../core/auth/auth.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; @@ -12,7 +29,10 @@ import { ItemDataService } from '../../core/data/item-data.service'; import { RemoteData } from '../../core/data/remote-data'; import { SignpostingDataService } from '../../core/data/signposting-data.service'; import { SignpostingLink } from '../../core/data/signposting-links.model'; -import { LinkDefinition, LinkHeadService } from '../../core/services/link-head.service'; +import { + LinkDefinition, + LinkHeadService, +} from '../../core/services/link-head.service'; import { ServerResponseService } from '../../core/services/server-response.service'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; import { Item } from '../../core/shared/item.model'; @@ -20,7 +40,6 @@ import { getAllSucceededRemoteDataPayload } from '../../core/shared/operators'; import { ViewMode } from '../../core/shared/view-mode.model'; import { fadeInOut } from '../../shared/animations/fade'; import { isNotEmpty } from '../../shared/empty.util'; -import { NotifyInfoService } from 'src/app/core/coar-notify/notify-info/notify-info.service'; import { getItemPageRoute } from '../item-page-routing-paths'; /** @@ -86,7 +105,7 @@ export class ItemPageComponent implements OnInit, OnDestroy { protected signpostingDataService: SignpostingDataService, protected linkHeadService: LinkHeadService, protected notifyInfoService: NotifyInfoService, - @Inject(PLATFORM_ID) protected platformId: string + @Inject(PLATFORM_ID) protected platformId: string, ) { this.initPageLinks(); } @@ -116,33 +135,33 @@ export class ItemPageComponent implements OnInit, OnDestroy { private initPageLinks(): void { this.route.params.subscribe(params => { combineLatest([this.signpostingDataService.getLinks(params.id).pipe(take(1)), this.getCoarLdnLocalInboxUrls()]) - .subscribe(([signpostingLinks, coarRestApiUrls]) => { - let links = ''; - this.signpostingLinks = signpostingLinks; + .subscribe(([signpostingLinks, coarRestApiUrls]) => { + let links = ''; + this.signpostingLinks = signpostingLinks; - signpostingLinks.forEach((link: SignpostingLink) => { - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); - let tag: LinkDefinition = { - href: link.href, - rel: link.rel, - }; - if (isNotEmpty(link.type)) { - tag = Object.assign(tag, { - type: link.type, - }); + signpostingLinks.forEach((link: SignpostingLink) => { + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); + let tag: LinkDefinition = { + href: link.href, + rel: link.rel, + }; + if (isNotEmpty(link.type)) { + tag = Object.assign(tag, { + type: link.type, + }); + } + this.linkHeadService.addTag(tag); + }); + + if (coarRestApiUrls.length > 0) { + const inboxLinks = this.initPageInboxLinks(coarRestApiUrls); + links = links + (isNotEmpty(links) ? ', ' : '') + inboxLinks; + } + + if (isPlatformServer(this.platformId)) { + this.responseService.setHeader('Link', links); } - this.linkHeadService.addTag(tag); }); - - if (coarRestApiUrls.length > 0) { - let inboxLinks = this.initPageInboxLinks(coarRestApiUrls); - links = links + (isNotEmpty(links) ? ', ' : '') + inboxLinks; - } - - if (isPlatformServer(this.platformId)) { - this.responseService.setHeader('Link', links); - } - }); }); } @@ -151,12 +170,12 @@ export class ItemPageComponent implements OnInit, OnDestroy { * If the COAR LDN local inbox URL is retrieved successfully, initializes the page inbox links. */ private getCoarLdnLocalInboxUrls(): Observable { - return this.notifyInfoService.isCoarConfigEnabled().pipe( + return this.notifyInfoService.isCoarConfigEnabled().pipe( switchMap((coarLdnEnabled: boolean) => { if (coarLdnEnabled) { return this.notifyInfoService.getCoarLdnLocalInboxUrls(); } - }) + }), ); } @@ -170,9 +189,9 @@ export class ItemPageComponent implements OnInit, OnDestroy { coarRestApiUrls.forEach((coarRestApiUrl: string) => { // Add link to head - let tag: LinkDefinition = { + const tag: LinkDefinition = { href: coarRestApiUrl, - rel: rel + rel: rel, }; this.inboxTags.push(tag); this.linkHeadService.addTag(tag); diff --git a/src/app/item-page/simple/item-types/shared/item.component.ts b/src/app/item-page/simple/item-types/shared/item.component.ts index 8900666083..90b4c7b4c9 100644 --- a/src/app/item-page/simple/item-types/shared/item.component.ts +++ b/src/app/item-page/simple/item-types/shared/item.component.ts @@ -1,13 +1,24 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { + Component, + Input, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; -import { map, take } from 'rxjs/operators'; +import { + map, + take, +} from 'rxjs/operators'; import { environment } from '../../../../../environments/environment'; import { RouteService } from '../../../../core/services/route.service'; import { Item } from '../../../../core/shared/item.model'; import { getItemPageRoute } from '../../../item-page-routing-paths'; -import { getDSpaceQuery, isIiifEnabled, isIiifSearchEnabled } from './item-iiif-utils'; +import { + getDSpaceQuery, + isIiifEnabled, + isIiifSearchEnabled, +} from './item-iiif-utils'; @Component({ selector: 'ds-item', diff --git a/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.spec.ts b/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.spec.ts index 6146111c2c..5a92fe2782 100644 --- a/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.spec.ts +++ b/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.spec.ts @@ -1,10 +1,16 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { NotifyRequestsStatusComponent } from './notify-requests-status.component'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; import { NotifyRequestsStatusDataService } from 'src/app/core/data/notify-services-status-data.service'; + +import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; import { NotifyRequestsStatus } from '../notify-requests-status.model'; import { RequestStatusEnum } from '../notify-status.enum'; -import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; -import { TranslateModule } from '@ngx-translate/core'; +import { NotifyRequestsStatusComponent } from './notify-requests-status.component'; describe('NotifyRequestsStatusComponent', () => { let component: NotifyRequestsStatusComponent; @@ -13,19 +19,19 @@ describe('NotifyRequestsStatusComponent', () => { const mock: NotifyRequestsStatus = Object.assign(new NotifyRequestsStatus(), { notifyStatus: [], - itemuuid: 'testUuid' + itemuuid: 'testUuid', }); beforeEach(() => { notifyInfoServiceSpy = { - getNotifyRequestsStatus:() => createSuccessfulRemoteDataObject$(mock) + getNotifyRequestsStatus:() => createSuccessfulRemoteDataObject$(mock), }; TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], declarations: [NotifyRequestsStatusComponent], providers: [ - { provide: NotifyRequestsStatusDataService, useValue: notifyInfoServiceSpy } - ] + { provide: NotifyRequestsStatusDataService, useValue: notifyInfoServiceSpy }, + ], }); }); @@ -41,7 +47,7 @@ describe('NotifyRequestsStatusComponent', () => { it('should fetch data from the service on initialization', fakeAsync(() => { const mockData: NotifyRequestsStatus = Object.assign(new NotifyRequestsStatus(), { notifyStatus: [], - itemuuid: 'testUuid' + itemuuid: 'testUuid', }); component.itemUuid = mockData.itemuuid; spyOn(notifyInfoServiceSpy, 'getNotifyRequestsStatus').and.callThrough(); @@ -74,7 +80,7 @@ describe('NotifyRequestsStatusComponent', () => { status: RequestStatusEnum.ACCEPTED, }, ], - itemUuid: 'testUuid' + itemUuid: 'testUuid', }); spyOn(notifyInfoServiceSpy, 'getNotifyRequestsStatus').and.returnValue(createSuccessfulRemoteDataObject$(mockData)); fixture.detectChanges(); diff --git a/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.ts b/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.ts index 3bcab5e2a0..5df5b3b950 100644 --- a/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.ts +++ b/src/app/item-page/simple/notify-requests-status/notify-requests-status-component/notify-requests-status.component.ts @@ -1,10 +1,26 @@ -import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; -import { filter, map, Observable } from 'rxjs'; -import { NotifyRequestsStatus, NotifyStatuses } from '../notify-requests-status.model'; +import { + ChangeDetectionStrategy, + Component, + Input, + OnInit, +} from '@angular/core'; +import { + filter, + map, + Observable, +} from 'rxjs'; + import { NotifyRequestsStatusDataService } from '../../../../core/data/notify-services-status-data.service'; -import { RequestStatusEnum } from '../notify-status.enum'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../../core/shared/operators'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../../../core/shared/operators'; import { hasValue } from '../../../../shared/empty.util'; +import { + NotifyRequestsStatus, + NotifyStatuses, +} from '../notify-requests-status.model'; +import { RequestStatusEnum } from '../notify-status.enum'; @Component({ selector: 'ds-notify-requests-status', @@ -41,7 +57,7 @@ export class NotifyRequestsStatusComponent implements OnInit { filter((data: NotifyRequestsStatus) => hasValue(data)), map((data: NotifyRequestsStatus) => { return this.groupDataByStatus(data); - }) + }), ); } @@ -60,7 +76,7 @@ export class NotifyRequestsStatusComponent implements OnInit { } statusMap.get(status)?.push(notifyStatus); - } + }, ); return statusMap; diff --git a/src/app/item-page/simple/notify-requests-status/notify-requests-status.model.ts b/src/app/item-page/simple/notify-requests-status/notify-requests-status.model.ts index 95d8b0ba05..4685d609a5 100644 --- a/src/app/item-page/simple/notify-requests-status/notify-requests-status.model.ts +++ b/src/app/item-page/simple/notify-requests-status/notify-requests-status.model.ts @@ -1,11 +1,16 @@ // eslint-disable-next-line max-classes-per-file -import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; +import { + autoserialize, + deserialize, + inheritSerialization, +} from 'cerialize'; + import { typedObject } from '../../../core/cache/builders/build-decorators'; import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { HALLink } from '../../../core/shared/hal-link.model'; import { ResourceType } from '../../../core/shared/resource-type'; import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { NOTIFYREQUEST } from './notify-requests-status.resource-type'; -import { HALLink } from '../../../core/shared/hal-link.model'; import { RequestStatusEnum } from './notify-status.enum'; /** @@ -21,25 +26,25 @@ export class NotifyRequestsStatus implements CacheableObject { */ @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; /** * The notify statuses. */ @autoserialize - notifyStatus: NotifyStatuses[]; + notifyStatus: NotifyStatuses[]; /** * The UUID of the item. */ @autoserialize - itemuuid: string; + itemuuid: string; /** * The links associated with the notify requests status. */ @deserialize - _links: { + _links: { self: HALLink; [k: string]: HALLink | HALLink[]; }; diff --git a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.spec.ts b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.spec.ts index b379af657f..d3ed0f59be 100644 --- a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.spec.ts +++ b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.spec.ts @@ -1,7 +1,12 @@ -import { ComponentFixture, TestBed, fakeAsync } from '@angular/core/testing'; -import { RequestStatusAlertBoxComponent } from './request-status-alert-box.component'; +import { + ComponentFixture, + fakeAsync, + TestBed, +} from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; + import { RequestStatusEnum } from '../notify-status.enum'; +import { RequestStatusAlertBoxComponent } from './request-status-alert-box.component'; describe('RequestStatusAlertBoxComponent', () => { let component: RequestStatusAlertBoxComponent; @@ -13,13 +18,13 @@ describe('RequestStatusAlertBoxComponent', () => { serviceName: 'test', serviceUrl: 'test', status: RequestStatusEnum.ACCEPTED, - offerType: 'test' + offerType: 'test', }, { serviceName: 'test1', serviceUrl: 'test', status: RequestStatusEnum.REJECTED, - offerType: 'test' + offerType: 'test', }, ]; diff --git a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts index 355980836a..2a2dd03a86 100644 --- a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts +++ b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts @@ -4,6 +4,7 @@ import { Input, type OnInit, } from '@angular/core'; + import { NotifyStatuses } from '../notify-requests-status.model'; import { RequestStatusEnum } from '../notify-status.enum'; diff --git a/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.spec.ts b/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.spec.ts index ce231affee..05ad804207 100644 --- a/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.spec.ts +++ b/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.spec.ts @@ -1,22 +1,26 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { QaEventNotificationComponent } from './qa-event-notification.component'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { createPaginatedList } from '../../../shared/testing/utils.test'; -import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; import { CommonModule } from '@angular/common'; -import { TranslateModule } from '@ngx-translate/core'; -import { QualityAssuranceSourceDataService } from '../../../core/notifications/qa/source/quality-assurance-source-data.service'; -import { RequestService } from '../../../core/data/request.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { provideMockStore } from '@ngrx/store/testing'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; -import { of } from 'rxjs'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; +import { provideMockStore } from '@ngrx/store/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; import { SplitPipe } from 'src/app/shared/utils/split.pipe'; +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { RequestService } from '../../../core/data/request.service'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; +import { QualityAssuranceSourceDataService } from '../../../core/notifications/qa/source/quality-assurance-source-data.service'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { createPaginatedList } from '../../../shared/testing/utils.test'; +import { QaEventNotificationComponent } from './qa-event-notification.component'; + describe('QaEventNotificationComponent', () => { let component: QaEventNotificationComponent; let fixture: ComponentFixture; @@ -26,7 +30,7 @@ describe('QaEventNotificationComponent', () => { id: 'sourceName:target', source: 'sourceName', target: 'target', - totalEvents: 1 + totalEvents: 1, }); const objPL = createSuccessfulRemoteDataObject$(createPaginatedList([obj])); @@ -34,7 +38,7 @@ describe('QaEventNotificationComponent', () => { beforeEach(async () => { qualityAssuranceSourceDataServiceStub = { - getSourcesByTarget: () => objPL + getSourcesByTarget: () => objPL, }; await TestBed.configureTestingModule({ imports: [CommonModule, TranslateModule.forRoot()], @@ -46,7 +50,7 @@ describe('QaEventNotificationComponent', () => { { provide: HALEndpointService, useValue: new HALEndpointServiceStub('test') }, ObjectCacheService, RemoteDataBuildService, - provideMockStore({}) + provideMockStore({}), ], }) .compileComponents(); diff --git a/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.ts b/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.ts index 1557a65a0e..06f81d232e 100644 --- a/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.ts +++ b/src/app/item-page/simple/qa-event-notification/qa-event-notification.component.ts @@ -1,22 +1,32 @@ -import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + Input, + OnChanges, + SimpleChanges, +} from '@angular/core'; +import { Observable } from 'rxjs'; +import { + catchError, + map, +} from 'rxjs/operators'; + +import { getNotificatioQualityAssuranceRoute } from '../../../admin/admin-routing-paths'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; +import { QualityAssuranceSourceDataService } from '../../../core/notifications/qa/source/quality-assurance-source-data.service'; import { Item } from '../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { Observable } from 'rxjs'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { RequestParam } from '../../../core/cache/models/request-param.model'; -import { QualityAssuranceSourceDataService } from '../../../core/notifications/qa/source/quality-assurance-source-data.service'; -import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; -import { catchError, map } from 'rxjs/operators'; -import { RemoteData } from '../../../core/data/remote-data'; -import { getNotificatioQualityAssuranceRoute } from '../../../admin/admin-routing-paths'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; @Component({ selector: 'ds-qa-event-notification', templateUrl: './qa-event-notification.component.html', styleUrls: ['./qa-event-notification.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - providers: [QualityAssuranceSourceDataService] + providers: [QualityAssuranceSourceDataService], }) /** * Component for displaying quality assurance event notifications for an item. @@ -39,11 +49,11 @@ export class QaEventNotificationComponent implements OnChanges { /** * Detect changes to the item input and update the sources$ observable. */ - ngOnChanges(changes: SimpleChanges): void { + ngOnChanges(changes: SimpleChanges): void { if (changes.item && changes.item.currentValue.uuid !== changes.item.previousValue?.uuid) { this.sources$ = this.getQualityAssuranceSources$(); } - } + } /** * Returns an Observable of QualityAssuranceSourceObject[] for the current item. * @returns An Observable of QualityAssuranceSourceObject[] for the current item. @@ -51,7 +61,7 @@ export class QaEventNotificationComponent implements OnChanges { */ getQualityAssuranceSources$(): Observable { const findListTopicOptions: FindListOptions = { - searchParams: [new RequestParam('target', this.item.uuid)] + searchParams: [new RequestParam('target', this.item.uuid)], }; return this.qualityAssuranceSourceDataService.getSourcesByTarget(findListTopicOptions, false) .pipe( @@ -62,7 +72,7 @@ export class QaEventNotificationComponent implements OnChanges { } return []; }), - catchError(() => []) + catchError(() => []), ); } diff --git a/src/app/item-page/versions/item-versions.component.spec.ts b/src/app/item-page/versions/item-versions.component.spec.ts index e714c7c851..be003c049e 100644 --- a/src/app/item-page/versions/item-versions.component.spec.ts +++ b/src/app/item-page/versions/item-versions.component.spec.ts @@ -1,11 +1,29 @@ import { CommonModule } from '@angular/common'; -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; -import { BrowserModule, By } from '@angular/platform-browser'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, + UntypedFormBuilder, +} from '@angular/forms'; +import { + BrowserModule, + By, +} from '@angular/platform-browser'; import { Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { EMPTY, of as observableOf, of } from 'rxjs'; +import { + EMPTY, + of as observableOf, + of, +} from 'rxjs'; import { AuthService } from '../../core/auth/auth.service'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; diff --git a/src/app/menu.resolver.spec.ts b/src/app/menu.resolver.spec.ts index 4cb895a4b4..cfe35ef2ca 100644 --- a/src/app/menu.resolver.spec.ts +++ b/src/app/menu.resolver.spec.ts @@ -1,5 +1,8 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; @@ -9,17 +12,17 @@ import { of as observableOf } from 'rxjs'; import { AdminSidebarComponent } from './admin/admin-sidebar/admin-sidebar.component'; import { BrowseService } from './core/browse/browse.service'; +import { ConfigurationDataService } from './core/data/configuration-data.service'; import { AuthorizationDataService } from './core/data/feature-authorization/authorization-data.service'; import { FeatureID } from './core/data/feature-authorization/feature-id'; import { ScriptDataService } from './core/data/processes/script-data.service'; import { MenuResolver } from './menu.resolver'; import { MenuService } from './shared/menu/menu.service'; import { MenuID } from './shared/menu/menu-id.model'; -import { MenuServiceStub } from './shared/testing/menu-service.stub'; import { createSuccessfulRemoteDataObject$ } from './shared/remote-data.utils'; -import { createPaginatedList } from './shared/testing/utils.test'; -import { ConfigurationDataService } from './core/data/configuration-data.service'; import { ConfigurationDataServiceStub } from './shared/testing/configuration-data.service.stub'; +import { MenuServiceStub } from './shared/testing/menu-service.stub'; +import { createPaginatedList } from './shared/testing/utils.test'; import createSpy = jasmine.createSpy; const BOOLEAN = { t: true, f: false }; diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 18df997f7b..ea20e29498 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -1,20 +1,36 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { combineLatest, combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { filter, find, map, take } from 'rxjs/operators'; +import { + combineLatest, + combineLatest as observableCombineLatest, + Observable, +} from 'rxjs'; +import { + filter, + find, + map, + take, +} from 'rxjs/operators'; +import { PUBLICATION_CLAIMS_PATH } from './admin/admin-notifications/admin-notifications-routing-paths'; import { BrowseService } from './core/browse/browse.service'; +import { ConfigurationDataService } from './core/data/configuration-data.service'; import { AuthorizationDataService } from './core/data/feature-authorization/authorization-data.service'; import { FeatureID } from './core/data/feature-authorization/feature-id'; import { PaginatedList } from './core/data/paginated-list.model'; -import { METADATA_EXPORT_SCRIPT_NAME, METADATA_IMPORT_SCRIPT_NAME, ScriptDataService } from './core/data/processes/script-data.service'; -import { ExportBatchSelectorComponent } from './shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component'; -import { PUBLICATION_CLAIMS_PATH } from './admin/admin-notifications/admin-notifications-routing-paths'; -import { ConfigurationDataService } from './core/data/configuration-data.service'; -import { ConfigurationProperty } from './core/shared/configuration-property.model'; +import { + METADATA_EXPORT_SCRIPT_NAME, + METADATA_IMPORT_SCRIPT_NAME, + ScriptDataService, +} from './core/data/processes/script-data.service'; import { RemoteData } from './core/data/remote-data'; import { BrowseDefinition } from './core/shared/browse-definition.model'; +import { ConfigurationProperty } from './core/shared/configuration-property.model'; import { getFirstCompletedRemoteData } from './core/shared/operators'; import { ThemedCreateCollectionParentSelectorComponent } from './shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component'; import { ThemedCreateCommunityParentSelectorComponent } from './shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component'; @@ -22,6 +38,7 @@ import { ThemedCreateItemParentSelectorComponent } from './shared/dso-selector/m import { ThemedEditCollectionSelectorComponent } from './shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component'; import { ThemedEditCommunitySelectorComponent } from './shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component'; import { ThemedEditItemSelectorComponent } from './shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component'; +import { ExportBatchSelectorComponent } from './shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component'; import { ExportMetadataSelectorComponent } from './shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component'; import { hasValue } from './shared/empty.util'; import { MenuService } from './shared/menu/menu.service'; @@ -45,7 +62,7 @@ export class MenuResolver implements Resolve { protected authorizationService: AuthorizationDataService, protected modalService: NgbModal, protected scriptDataService: ScriptDataService, - protected configurationDataService: ConfigurationDataService + protected configurationDataService: ConfigurationDataService, ) { } @@ -218,7 +235,7 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.services_new', - link: '/admin/ldn/services/new' + link: '/admin/ldn/services/new', } as LinkMenuItemModel, icon: '', }, @@ -356,10 +373,10 @@ export class MenuResolver implements Resolve { visible: isSiteAdmin && isCoarNotifyEnabled, model: { type: MenuItemType.TEXT, - text: 'menu.section.coar_notify' + text: 'menu.section.coar_notify', } as TextMenuItemModel, icon: 'inbox', - index: 13 + index: 13, }, { id: 'notify_dashboard', @@ -369,7 +386,7 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.notify_dashboard', - link: '/admin/notify-dashboard' + link: '/admin/notify-dashboard', } as LinkMenuItemModel, }, /* LDN Services */ @@ -381,7 +398,7 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.services', - link: '/admin/ldn/services' + link: '/admin/ldn/services', } as LinkMenuItemModel, }, { @@ -403,10 +420,10 @@ export class MenuResolver implements Resolve { visible: canSeeQa || isSiteAdmin, model: { type: MenuItemType.TEXT, - text: 'menu.section.notifications' + text: 'menu.section.notifications', } as TextMenuItemModel, icon: 'bell', - index: 4 + index: 4, }, { id: 'notifications_quality-assurance', @@ -416,7 +433,7 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.quality-assurance', - link: '/notifications/quality-assurance' + link: '/notifications/quality-assurance', } as LinkMenuItemModel, }, { @@ -427,7 +444,7 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.notifications_publication-claim', - link: '/admin/notifications/' + PUBLICATION_CLAIMS_PATH + link: '/admin/notifications/' + PUBLICATION_CLAIMS_PATH, } as LinkMenuItemModel, }, /* Admin Search */ @@ -601,7 +618,7 @@ export class MenuResolver implements Resolve { */ createSiteAdministratorMenuSections() { this.authorizationService.isAuthorized(FeatureID.AdministratorOf) - .subscribe((authorized) => { + .subscribe((authorized) => { const menuList = [ { id: 'admin_search', @@ -777,9 +794,9 @@ export class MenuResolver implements Resolve { createReportMenuSections() { observableCombineLatest([ this.configurationDataService.findByPropertyName('contentreport.enable').pipe( - map((res: RemoteData) => res.hasSucceeded && res.payload && res.payload.values[0] === 'true') + map((res: RemoteData) => res.hasSucceeded && res.payload && res.payload.values[0] === 'true'), ), - this.authorizationService.isAuthorized(FeatureID.AdministratorOf) + this.authorizationService.isAuthorized(FeatureID.AdministratorOf), ]).subscribe(([isSiteAdmin]) => { const menuList = [ { @@ -788,10 +805,10 @@ export class MenuResolver implements Resolve { visible: isSiteAdmin, model: { type: MenuItemType.TEXT, - text: 'menu.section.reports' + text: 'menu.section.reports', } as TextMenuItemModel, icon: 'file-alt', - index: 5 + index: 5, }, /* Collections Report */ { @@ -802,9 +819,9 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.reports.collections', - link: '/admin/reports/collections' + link: '/admin/reports/collections', } as LinkMenuItemModel, - icon: 'user-check' + icon: 'user-check', }, /* Queries Report */ { @@ -815,14 +832,14 @@ export class MenuResolver implements Resolve { model: { type: MenuItemType.LINK, text: 'menu.section.reports.queries', - link: '/admin/reports/queries' + link: '/admin/reports/queries', } as LinkMenuItemModel, - icon: 'user-check' + icon: 'user-check', }, ]; menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, { - shouldPersistOnRouteChange: true + shouldPersistOnRouteChange: true, }))); }); } diff --git a/src/app/my-dspace-page/my-dspace-page.module.ts b/src/app/my-dspace-page/my-dspace-page.module.ts index 5c3d987ebc..2e7afce9ce 100644 --- a/src/app/my-dspace-page/my-dspace-page.module.ts +++ b/src/app/my-dspace-page/my-dspace-page.module.ts @@ -1,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { NotificationsModule } from '../notifications/notifications.module'; import { SearchModule } from '../shared/search/search.module'; import { SharedModule } from '../shared/shared.module'; import { UploadModule } from '../shared/upload/upload.module'; @@ -12,10 +13,9 @@ import { MyDSpaceNewSubmissionComponent } from './my-dspace-new-submission/my-ds import { MyDSpaceNewSubmissionDropdownComponent } from './my-dspace-new-submission/my-dspace-new-submission-dropdown/my-dspace-new-submission-dropdown.component'; import { MyDSpacePageComponent } from './my-dspace-page.component'; import { MyDspacePageRoutingModule } from './my-dspace-page-routing.module'; +import { MyDspaceQaEventsNotificationsComponent } from './my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component'; import { MyDspaceSearchModule } from './my-dspace-search.module'; import { ThemedMyDSpacePageComponent } from './themed-my-dspace-page.component'; -import { MyDspaceQaEventsNotificationsComponent } from './my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component'; -import { NotificationsModule } from '../notifications/notifications.module'; const DECLARATIONS = [ MyDSpacePageComponent, @@ -24,7 +24,7 @@ const DECLARATIONS = [ CollectionSelectorComponent, MyDSpaceNewSubmissionDropdownComponent, MyDSpaceNewExternalDropdownComponent, - MyDspaceQaEventsNotificationsComponent + MyDspaceQaEventsNotificationsComponent, ]; @NgModule({ @@ -35,7 +35,7 @@ const DECLARATIONS = [ MyDspacePageRoutingModule, MyDspaceSearchModule.withEntryComponents(), UploadModule, - NotificationsModule + NotificationsModule, ], declarations: DECLARATIONS, providers: [ diff --git a/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.spec.ts b/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.spec.ts index 99d2b601a2..8f059718a4 100644 --- a/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.spec.ts +++ b/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.spec.ts @@ -1,10 +1,13 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MyDspaceQaEventsNotificationsComponent } from './my-dspace-qa-events-notifications.component'; -import { QualityAssuranceSourceDataService } from '../../core/notifications/qa/source/quality-assurance-source-data.service'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { QualityAssuranceSourceObject } from 'src/app/core/notifications/qa/models/quality-assurance-source.model'; import { createSuccessfulRemoteDataObject$ } from 'src/app/shared/remote-data.utils'; import { createPaginatedList } from 'src/app/shared/testing/utils.test'; -import { QualityAssuranceSourceObject } from 'src/app/core/notifications/qa/models/quality-assurance-source.model'; + +import { QualityAssuranceSourceDataService } from '../../core/notifications/qa/source/quality-assurance-source-data.service'; +import { MyDspaceQaEventsNotificationsComponent } from './my-dspace-qa-events-notifications.component'; describe('MyDspaceQaEventsNotificationsComponent', () => { let component: MyDspaceQaEventsNotificationsComponent; @@ -15,15 +18,15 @@ describe('MyDspaceQaEventsNotificationsComponent', () => { beforeEach(async () => { qualityAssuranceSourceDataServiceStub = { - getSources: () => obj + getSources: () => obj, }; await TestBed.configureTestingModule({ declarations: [ MyDspaceQaEventsNotificationsComponent ], providers: [ - { provide: QualityAssuranceSourceDataService, useValue: qualityAssuranceSourceDataServiceStub } - ] + { provide: QualityAssuranceSourceDataService, useValue: qualityAssuranceSourceDataServiceStub }, + ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(MyDspaceQaEventsNotificationsComponent); component = fixture.componentInstance; diff --git a/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.ts b/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.ts index 2c5f34cbd7..625265c683 100644 --- a/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.ts +++ b/src/app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component.ts @@ -1,15 +1,28 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -import { QualityAssuranceSourceDataService } from '../../core/notifications/qa/source/quality-assurance-source-data.service'; -import { getFirstCompletedRemoteData, getPaginatedListPayload, getRemoteDataPayload } from '../../core/shared/operators'; -import { Observable, of, tap } from 'rxjs'; -import { getNotificatioQualityAssuranceRoute } from '../../admin/admin-routing-paths'; +import { + ChangeDetectionStrategy, + Component, + OnInit, +} from '@angular/core'; +import { + Observable, + of, + tap, +} from 'rxjs'; import { QualityAssuranceSourceObject } from 'src/app/core/notifications/qa/models/quality-assurance-source.model'; +import { getNotificatioQualityAssuranceRoute } from '../../admin/admin-routing-paths'; +import { QualityAssuranceSourceDataService } from '../../core/notifications/qa/source/quality-assurance-source-data.service'; +import { + getFirstCompletedRemoteData, + getPaginatedListPayload, + getRemoteDataPayload, +} from '../../core/shared/operators'; + @Component({ selector: 'ds-my-dspace-qa-events-notifications', templateUrl: './my-dspace-qa-events-notifications.component.html', styleUrls: ['./my-dspace-qa-events-notifications.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class MyDspaceQaEventsNotificationsComponent implements OnInit { @@ -31,16 +44,16 @@ export class MyDspaceQaEventsNotificationsComponent implements OnInit { */ getSources() { this.sources$ = this.qualityAssuranceSourceDataService.getSources() - .pipe( - getFirstCompletedRemoteData(), - tap((rd) => { - if (rd.hasFailed) { - throw new Error('Can\'t retrieve Quality Assurance sources'); - } - }), - getRemoteDataPayload(), - getPaginatedListPayload(), - ); + .pipe( + getFirstCompletedRemoteData(), + tap((rd) => { + if (rd.hasFailed) { + throw new Error('Can\'t retrieve Quality Assurance sources'); + } + }), + getRemoteDataPayload(), + getPaginatedListPayload(), + ); } /** diff --git a/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.spec.ts b/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.spec.ts index d3cc357a04..ee7732e4f1 100644 --- a/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.spec.ts +++ b/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.spec.ts @@ -1,5 +1,9 @@ import { Component } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf } from 'rxjs'; diff --git a/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.ts b/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.ts index 91189f3814..29bd205dd0 100644 --- a/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.ts +++ b/src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.ts @@ -1,11 +1,18 @@ -import { Component, HostListener, Inject, Injector, OnInit } from '@angular/core'; -import { NavbarSectionComponent } from '../navbar-section/navbar-section.component'; -import { MenuService } from '../../shared/menu/menu.service'; -import { slide } from '../../shared/animations/slide'; -import { first } from 'rxjs/operators'; -import { HostWindowService } from '../../shared/host-window.service'; -import { MenuID } from '../../shared/menu/menu-id.model'; +import { + Component, + HostListener, + Inject, + Injector, + OnInit, +} from '@angular/core'; import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; + +import { slide } from '../../shared/animations/slide'; +import { HostWindowService } from '../../shared/host-window.service'; +import { MenuService } from '../../shared/menu/menu.service'; +import { MenuID } from '../../shared/menu/menu-id.model'; +import { NavbarSectionComponent } from '../navbar-section/navbar-section.component'; /** * Represents an expandable section in the navbar @@ -40,7 +47,7 @@ export class ExpandableNavbarSectionComponent extends NavbarSectionComponent imp @HostListener('window:resize', ['$event']) onResize() { this.isMobile$.pipe( - first() + first(), ).subscribe((isMobile) => { // When switching between desktop and mobile active sections should be deactivated if (isMobile !== this.wasMobile) { @@ -71,7 +78,7 @@ export class ExpandableNavbarSectionComponent extends NavbarSectionComponent imp */ onMouseEnter($event: Event, isActive: boolean) { this.isMobile$.pipe( - first() + first(), ).subscribe((isMobile) => { if (!isMobile && !isActive && !this.mouseEntered) { this.activateSection($event); @@ -87,7 +94,7 @@ export class ExpandableNavbarSectionComponent extends NavbarSectionComponent imp */ onMouseLeave($event: Event, isActive: boolean) { this.isMobile$.pipe( - first() + first(), ).subscribe((isMobile) => { if (!isMobile && isActive && this.mouseEntered) { this.deactivateSection($event); diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index 737c13c91b..d24643944b 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -1,21 +1,34 @@ -import { Injector, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + Injector, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; -import { Store, StoreModule } from '@ngrx/store'; +import { + Store, + StoreModule, +} from '@ngrx/store'; import { provideMockStore } from '@ngrx/store/testing'; import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; -import { AppState, storeModuleConfig } from '../app.reducer'; +import { + AppState, + storeModuleConfig, +} from '../app.reducer'; +import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-data-type'; import { authReducer } from '../core/auth/auth.reducer'; import { AuthTokenInfo } from '../core/auth/models/auth-token-info.model'; import { BrowseService } from '../core/browse/browse.service'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { buildPaginatedList } from '../core/data/paginated-list.model'; -import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-data-type'; import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; import { HierarchicalBrowseDefinition } from '../core/shared/hierarchical-browse-definition.model'; import { Item } from '../core/shared/item.model'; @@ -23,7 +36,10 @@ import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-defi import { HostWindowService } from '../shared/host-window.service'; import { MenuService } from '../shared/menu/menu.service'; import { getMockThemeService } from '../shared/mocks/theme-service.mock'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../shared/remote-data.utils'; import { EPersonMock } from '../shared/testing/eperson.mock'; import { HostWindowServiceStub } from '../shared/testing/host-window-service.stub'; import { MenuServiceStub } from '../shared/testing/menu-service.stub'; diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts index cf67ffeb68..a883756da3 100644 --- a/src/app/navbar/navbar.component.ts +++ b/src/app/navbar/navbar.component.ts @@ -1,6 +1,13 @@ -import { Component, Injector, OnInit } from '@angular/core'; +import { + Component, + Injector, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { select, Store } from '@ngrx/store'; +import { + select, + Store, +} from '@ngrx/store'; import { Observable } from 'rxjs'; import { AppState } from '../app.reducer'; @@ -8,7 +15,10 @@ import { isAuthenticated } from '../core/auth/selectors'; import { BrowseService } from '../core/browse/browse.service'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { slideMobileNav } from '../shared/animations/slide'; -import { HostWindowService, WidthCategory } from '../shared/host-window.service'; +import { + HostWindowService, + WidthCategory, +} from '../shared/host-window.service'; import { MenuComponent } from '../shared/menu/menu.component'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; diff --git a/src/app/notifications/notifications-effects.ts b/src/app/notifications/notifications-effects.ts index 9c446cb66a..d06c9dae53 100644 --- a/src/app/notifications/notifications-effects.ts +++ b/src/app/notifications/notifications-effects.ts @@ -5,5 +5,5 @@ import { SuggestionTargetsEffects } from './suggestion-targets/suggestion-target export const notificationsEffects = [ QualityAssuranceTopicsEffects, QualityAssuranceSourceEffects, - SuggestionTargetsEffects + SuggestionTargetsEffects, ]; diff --git a/src/app/notifications/notifications-state.service.spec.ts b/src/app/notifications/notifications-state.service.spec.ts index c2fda8b195..5db3b98c23 100644 --- a/src/app/notifications/notifications-state.service.spec.ts +++ b/src/app/notifications/notifications-state.service.spec.ts @@ -1,9 +1,19 @@ import { TestBed } from '@angular/core/testing'; -import { Store, StoreModule } from '@ngrx/store'; +import { + Store, + StoreModule, +} from '@ngrx/store'; import { provideMockStore } from '@ngrx/store/testing'; import { cold } from 'jasmine-marbles'; -import { qualityAssuranceSourceObjectMissingPid, qualityAssuranceSourceObjectMoreAbstract, qualityAssuranceSourceObjectMorePid, qualityAssuranceTopicObjectMissingPid, qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../shared/mocks/notifications.mock'; +import { + qualityAssuranceSourceObjectMissingPid, + qualityAssuranceSourceObjectMoreAbstract, + qualityAssuranceSourceObjectMorePid, + qualityAssuranceTopicObjectMissingPid, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid, +} from '../shared/mocks/notifications.mock'; import { suggestionNotificationsReducers } from './notifications.reducer'; import { NotificationsStateService } from './notifications-state.service'; import { RetrieveAllSourceAction } from './qa/source/quality-assurance-source.actions'; diff --git a/src/app/notifications/notifications-state.service.ts b/src/app/notifications/notifications-state.service.ts index 96fa282b50..aab06519dd 100644 --- a/src/app/notifications/notifications-state.service.ts +++ b/src/app/notifications/notifications-state.service.ts @@ -1,5 +1,8 @@ import { Injectable } from '@angular/core'; -import { select, Store } from '@ngrx/store'; +import { + select, + Store, +} from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -8,7 +11,20 @@ import { QualityAssuranceTopicObject } from '../core/notifications/qa/models/qua import { SuggestionNotificationsState } from './notifications.reducer'; import { RetrieveAllSourceAction } from './qa/source/quality-assurance-source.actions'; import { RetrieveAllTopicsAction } from './qa/topics/quality-assurance-topics.actions'; -import { getQualityAssuranceSourceCurrentPageSelector, getQualityAssuranceSourceTotalPagesSelector, getQualityAssuranceSourceTotalsSelector, getQualityAssuranceTopicsCurrentPageSelector, getQualityAssuranceTopicsTotalPagesSelector, getQualityAssuranceTopicsTotalsSelector, isQualityAssuranceSourceLoadedSelector, isQualityAssuranceSourceProcessingSelector, isQualityAssuranceTopicsLoadedSelector, isQualityAssuranceTopicsProcessingSelector, qualityAssuranceSourceObjectSelector, qualityAssuranceTopicsObjectSelector } from './selectors'; +import { + getQualityAssuranceSourceCurrentPageSelector, + getQualityAssuranceSourceTotalPagesSelector, + getQualityAssuranceSourceTotalsSelector, + getQualityAssuranceTopicsCurrentPageSelector, + getQualityAssuranceTopicsTotalPagesSelector, + getQualityAssuranceTopicsTotalsSelector, + isQualityAssuranceSourceLoadedSelector, + isQualityAssuranceSourceProcessingSelector, + isQualityAssuranceTopicsLoadedSelector, + isQualityAssuranceTopicsProcessingSelector, + qualityAssuranceSourceObjectSelector, + qualityAssuranceTopicsObjectSelector, +} from './selectors'; /** * The service handling the Notifications State. diff --git a/src/app/notifications/notifications.module.ts b/src/app/notifications/notifications.module.ts index b491fa8062..70b3eed590 100644 --- a/src/app/notifications/notifications.module.ts +++ b/src/app/notifications/notifications.module.ts @@ -1,7 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; -import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { + Action, + StoreConfig, + StoreModule, +} from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { storeModuleConfig } from '../app.reducer'; @@ -9,30 +13,32 @@ import { CoreModule } from '../core/core.module'; import { QualityAssuranceEventDataService } from '../core/notifications/qa/events/quality-assurance-event-data.service'; import { QualityAssuranceSourceDataService } from '../core/notifications/qa/source/quality-assurance-source-data.service'; import { QualityAssuranceTopicDataService } from '../core/notifications/qa/topics/quality-assurance-topic-data.service'; +import { SuggestionSourceDataService } from '../core/notifications/source/suggestion-source-data.service'; +import { SuggestionsDataService } from '../core/notifications/suggestions-data.service'; +import { SuggestionTargetDataService } from '../core/notifications/target/suggestion-target-data.service'; import { SearchModule } from '../shared/search/search.module'; import { SharedModule } from '../shared/shared.module'; -import { suggestionNotificationsReducers, SuggestionNotificationsState } from './notifications.reducer'; +import { + suggestionNotificationsReducers, + SuggestionNotificationsState, +} from './notifications.reducer'; import { notificationsEffects } from './notifications-effects'; import { NotificationsStateService } from './notifications-state.service'; +import { EPersonDataComponent } from './qa/events/ePerson-data/ePerson-data.component'; import { QualityAssuranceEventsComponent } from './qa/events/quality-assurance-events.component'; import { ProjectEntryImportModalComponent } from './qa/project-entry-import-modal/project-entry-import-modal.component'; import { QualityAssuranceSourceComponent } from './qa/source/quality-assurance-source.component'; import { QualityAssuranceSourceService } from './qa/source/quality-assurance-source.service'; -import { EPersonDataComponent } from './qa/events/ePerson-data/ePerson-data.component'; -import { SuggestionActionsComponent } from './suggestion-actions/suggestion-actions.component'; -import { PublicationClaimComponent } from './suggestion-targets/publication-claim/publication-claim.component'; -import { SuggestionListElementComponent } from './suggestion-list-element/suggestion-list-element.component'; -import { SuggestionEvidencesComponent } from './suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; -import { SuggestionsPopupComponent } from './suggestions-popup/suggestions-popup.component'; -import { SuggestionsNotificationComponent } from './suggestions-notification/suggestions-notification.component'; -import { SuggestionsService } from './suggestions.service'; -import { SuggestionSourceDataService } from '../core/notifications/source/suggestion-source-data.service'; -import { SuggestionTargetDataService } from '../core/notifications/target/suggestion-target-data.service'; -import { SuggestionTargetsStateService } from './suggestion-targets/suggestion-targets.state.service'; -import { SuggestionsDataService } from '../core/notifications/suggestions-data.service'; - import { QualityAssuranceTopicsComponent } from './qa/topics/quality-assurance-topics.component'; import { QualityAssuranceTopicsService } from './qa/topics/quality-assurance-topics.service'; +import { SuggestionActionsComponent } from './suggestion-actions/suggestion-actions.component'; +import { SuggestionEvidencesComponent } from './suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; +import { SuggestionListElementComponent } from './suggestion-list-element/suggestion-list-element.component'; +import { PublicationClaimComponent } from './suggestion-targets/publication-claim/publication-claim.component'; +import { SuggestionTargetsStateService } from './suggestion-targets/suggestion-targets.state.service'; +import { SuggestionsService } from './suggestions.service'; +import { SuggestionsNotificationComponent } from './suggestions-notification/suggestions-notification.component'; +import { SuggestionsPopupComponent } from './suggestions-popup/suggestions-popup.component'; const MODULES = [ CommonModule, @@ -54,7 +60,7 @@ const COMPONENTS = [ SuggestionListElementComponent, SuggestionEvidencesComponent, SuggestionsPopupComponent, - SuggestionsNotificationComponent + SuggestionsNotificationComponent, ]; const DIRECTIVES = [ ]; @@ -74,7 +80,7 @@ const PROVIDERS = [ SuggestionSourceDataService, SuggestionTargetDataService, SuggestionTargetsStateService, - SuggestionsDataService + SuggestionsDataService, ]; @NgModule({ @@ -95,7 +101,7 @@ const PROVIDERS = [ exports: [ ...COMPONENTS, ...DIRECTIVES, - ] + ], }) /** diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index 9f41089959..14ca6c0347 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -1,7 +1,20 @@ -import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; -import { qualityAssuranceSourceReducer, QualityAssuranceSourceState } from './qa/source/quality-assurance-source.reducer'; -import { qualityAssuranceTopicsReducer, QualityAssuranceTopicState } from './qa/topics/quality-assurance-topics.reducer'; -import { SuggestionTargetsReducer, SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer'; +import { + ActionReducerMap, + createFeatureSelector, +} from '@ngrx/store'; + +import { + qualityAssuranceSourceReducer, + QualityAssuranceSourceState, +} from './qa/source/quality-assurance-source.reducer'; +import { + qualityAssuranceTopicsReducer, + QualityAssuranceTopicState, +} from './qa/topics/quality-assurance-topics.reducer'; +import { + SuggestionTargetsReducer, + SuggestionTargetState, +} from './suggestion-targets/suggestion-targets.reducer'; /** * The OpenAIRE State @@ -15,7 +28,7 @@ export interface SuggestionNotificationsState { export const suggestionNotificationsReducers: ActionReducerMap = { qaTopic: qualityAssuranceTopicsReducer, qaSource: qualityAssuranceSourceReducer, - suggestionTarget: SuggestionTargetsReducer + suggestionTarget: SuggestionTargetsReducer, }; export const suggestionNotificationsSelector = createFeatureSelector('suggestionNotifications'); diff --git a/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.spec.ts b/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.spec.ts index 6fad8dbc92..6407dc6df6 100644 --- a/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.spec.ts +++ b/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.spec.ts @@ -1,11 +1,15 @@ /* tslint:disable:no-unused-variable */ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { EPersonDataComponent } from './ePerson-data.component'; -import { EPersonDataService } from './../../../../core/eperson/eperson-data.service'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { EPerson } from 'src/app/core/eperson/models/eperson.model'; import { createSuccessfulRemoteDataObject$ } from 'src/app/shared/remote-data.utils'; +import { EPersonDataService } from './../../../../core/eperson/eperson-data.service'; +import { EPersonDataComponent } from './ePerson-data.component'; + describe('EPersonDataComponent', () => { let component: EPersonDataComponent; let fixture: ComponentFixture; @@ -16,10 +20,10 @@ describe('EPersonDataComponent', () => { declarations: [ EPersonDataComponent ], providers: [ { provide: EPersonDataService, - useValue: ePersonDataService - } ] + useValue: ePersonDataService, + } ], }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -40,13 +44,13 @@ describe('EPersonDataComponent', () => { metadata: [ { key: 'eperson.firstname', - value: 'John' + value: 'John', }, { key: 'eperson.lastname', - value: 'Doe' - } - ] + value: 'Doe', + }, + ], }); const ePersonDataRD$ = createSuccessfulRemoteDataObject$(ePersonData); ePersonDataService.findById.and.returnValue(ePersonDataRD$); diff --git a/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.ts b/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.ts index f1a9c8c592..e058e70b42 100644 --- a/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.ts +++ b/src/app/notifications/qa/events/ePerson-data/ePerson-data.component.ts @@ -1,13 +1,20 @@ -import { Component, Input } from '@angular/core'; -import { EPersonDataService } from '../../../../core/eperson/eperson-data.service'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../../core/shared/operators'; +import { + Component, + Input, +} from '@angular/core'; import { Observable } from 'rxjs'; + +import { EPersonDataService } from '../../../../core/eperson/eperson-data.service'; import { EPerson } from '../../../../core/eperson/models/eperson.model'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../../../core/shared/operators'; @Component({ selector: 'ds-eperson-data', templateUrl: './ePerson-data.component.html', - styleUrls: ['./ePerson-data.component.scss'] + styleUrls: ['./ePerson-data.component.scss'], }) /** * Represents the component for displaying ePerson data. @@ -38,7 +45,7 @@ export class EPersonDataComponent { if (this.ePersonId) { return this.ePersonDataService.findById(this.ePersonId, true).pipe( getFirstCompletedRemoteData(), - getRemoteDataPayload() + getRemoteDataPayload(), ); } } diff --git a/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts b/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts index 46afa54d08..0346982760 100644 --- a/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts +++ b/src/app/notifications/qa/events/quality-assurance-events.component.spec.ts @@ -1,30 +1,59 @@ import { CommonModule } from '@angular/common'; -import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { cold, getTestScheduler } from 'jasmine-marbles'; +import { + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; +import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; +import { ItemDataService } from 'src/app/core/data/item-data.service'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceEventDataService } from '../../../core/notifications/qa/events/quality-assurance-event-data.service'; import { QualityAssuranceEventObject } from '../../../core/notifications/qa/models/quality-assurance-event.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { PageInfo } from '../../../core/shared/page-info.model'; -import { getMockQualityAssuranceEventRestService, ItemMockPid10, ItemMockPid8, ItemMockPid9, NotificationsMockDspaceObject, qualityAssuranceEventObjectMissingProjectFound, qualityAssuranceEventObjectMissingProjectNotFound } from '../../../shared/mocks/notifications.mock'; +import { + getMockQualityAssuranceEventRestService, + ItemMockPid8, + ItemMockPid9, + ItemMockPid10, + NotificationsMockDspaceObject, + qualityAssuranceEventObjectMissingProjectFound, + qualityAssuranceEventObjectMissingProjectNotFound, +} from '../../../shared/mocks/notifications.mock'; import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { createNoContentRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -import { ItemDataService } from 'src/app/core/data/item-data.service'; -import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { QualityAssuranceEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; @@ -107,7 +136,7 @@ describe('QualityAssuranceEventsComponent test suite', () => { { provide: PaginationService, useValue: paginationService }, { provide: ItemDataService, useValue: {} }, { provide: AuthorizationDataService, useValue: {} }, - QualityAssuranceEventsComponent + QualityAssuranceEventsComponent, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents().then(); diff --git a/src/app/notifications/qa/events/quality-assurance-events.component.ts b/src/app/notifications/qa/events/quality-assurance-events.component.ts index 91142fb961..cd6bf28f34 100644 --- a/src/app/notifications/qa/events/quality-assurance-events.component.ts +++ b/src/app/notifications/qa/events/quality-assurance-events.component.ts @@ -1,32 +1,64 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, combineLatest, from, Observable, of, Subscription } from 'rxjs'; -import { distinctUntilChanged, last, map, mergeMap, scan, switchMap, take, tap } from 'rxjs/operators'; +import { + BehaviorSubject, + combineLatest, + from, + Observable, + of, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + last, + map, + mergeMap, + scan, + switchMap, + take, + tap, +} from 'rxjs/operators'; import { environment } from '../../../../environments/environment'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { ItemDataService } from '../../../core/data/item-data.service'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { QualityAssuranceEventDataService } from '../../../core/notifications/qa/events/quality-assurance-event-data.service'; -import { QualityAssuranceEventObject, SourceQualityAssuranceEventMessageObject } from '../../../core/notifications/qa/models/quality-assurance-event.model'; +import { + QualityAssuranceEventObject, + SourceQualityAssuranceEventMessageObject, +} from '../../../core/notifications/qa/models/quality-assurance-event.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { Item } from '../../../core/shared/item.model'; import { Metadata } from '../../../core/shared/metadata.utils'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../core/shared/operators'; +import { NoContent } from '../../../core/shared/NoContent.model'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../../core/shared/operators'; +import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; import { hasValue } from '../../../shared/empty.util'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { followLink } from '../../../shared/utils/follow-link-config.model'; -import { ProjectEntryImportModalComponent, QualityAssuranceEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; -import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; -import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; -import { NoContent } from '../../../core/shared/NoContent.model'; -import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; -import { ItemDataService } from '../../../core/data/item-data.service'; +import { + ProjectEntryImportModalComponent, + QualityAssuranceEventData, +} from '../project-entry-import-modal/project-entry-import-modal.component'; /** * Component to display the Quality Assurance event list. @@ -178,17 +210,17 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { this.selectedTopicName = splitList[1]; this.sourceId = splitList[0]; return this.getQualityAssuranceEvents(); - }) + }), ).subscribe( { next: (events: QualityAssuranceEventData[]) => { this.eventsUpdated$.next(events); this.isEventPageLoading.next(false); }, - error: (error) => { + error: (error: unknown) => { this.isEventPageLoading.next(false); - } - } + }, + }, ); } @@ -501,7 +533,7 @@ export class QualityAssuranceEventsComponent implements OnInit, OnDestroy { getFirstCompletedRemoteData(), getRemoteDataPayload(), tap((item: Item) => this.itemPageUrl = getItemPageRoute(item)), - map((item: Item) => item.firstMetadataValue('dc.title')) + map((item: Item) => item.firstMetadataValue('dc.title')), ); } } diff --git a/src/app/notifications/qa/source/quality-assurance-source.component.ts b/src/app/notifications/qa/source/quality-assurance-source.component.ts index 6be3a5e42a..8818a3f9e4 100644 --- a/src/app/notifications/qa/source/quality-assurance-source.component.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.component.ts @@ -1,13 +1,23 @@ -import { Component, OnInit } from '@angular/core'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, take } from 'rxjs/operators'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + take, +} from 'rxjs/operators'; + import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { QualityAssuranceSourceObject } from '../../../core/notifications/qa/models/quality-assurance-source.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { QualityAssuranceSourcePageParams } from '../../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service'; import { hasValue } from '../../../shared/empty.util'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { NotificationsStateService } from '../../notifications-state.service'; -import { QualityAssuranceSourcePageParams } from '../../../quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service'; /** * Component to display the Quality Assurance source list. diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts b/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts index 52e09a1b64..670fd7b52a 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.actions.ts @@ -43,7 +43,7 @@ export class RetrieveAllTopicsAction implements Action { elementsPerPage, currentPage, source, - target + target, }; } } diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts index feb6805271..2791e69dd4 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.component.spec.ts @@ -1,18 +1,30 @@ /* eslint-disable no-empty, @typescript-eslint/no-empty-function */ import { CommonModule } from '@angular/common'; -import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { cold } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; +import { ItemDataService } from 'src/app/core/data/item-data.service'; import { PaginationService } from '../../../core/pagination/pagination.service'; -import { getMockNotificationsStateService, qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; +import { + getMockNotificationsStateService, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid, +} from '../../../shared/mocks/notifications.mock'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { NotificationsStateService } from '../../notifications-state.service'; -import { ItemDataService } from 'src/app/core/data/item-data.service'; import { QualityAssuranceTopicsComponent } from './quality-assurance-topics.component'; describe('QualityAssuranceTopicsComponent test suite', () => { @@ -43,7 +55,7 @@ describe('QualityAssuranceTopicsComponent test suite', () => { { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), snapshot: { params: { sourceId: 'openaire', - targetId: null + targetId: null, }, } } }, { provide: PaginationService, useValue: paginationService }, diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.component.ts b/src/app/notifications/qa/topics/quality-assurance-topics.component.ts index 858073b019..4778daa962 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.component.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.component.ts @@ -1,19 +1,39 @@ -import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, take, tap } from 'rxjs/operators'; +import { + AfterViewInit, + Component, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + map, + take, + tap, +} from 'rxjs/operators'; + +import { getNotificatioQualityAssuranceRoute } from '../../../admin/admin-routing-paths'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { ItemDataService } from '../../../core/data/item-data.service'; import { QualityAssuranceTopicObject } from '../../../core/notifications/qa/models/quality-assurance-topic.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { Item } from '../../../core/shared/item.model'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../../core/shared/operators'; +import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; +import { QualityAssuranceTopicsPageParams } from '../../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; import { hasValue } from '../../../shared/empty.util'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { NotificationsStateService } from '../../notifications-state.service'; -import { ItemDataService } from '../../../core/data/item-data.service'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../../core/shared/operators'; -import { Item } from '../../../core/shared/item.model'; -import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; -import { getNotificatioQualityAssuranceRoute } from '../../../admin/admin-routing-paths'; -import { QualityAssuranceTopicsPageParams } from '../../../quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; /** * Component to display the Quality Assurance topic list. @@ -99,7 +119,7 @@ export class QualityAssuranceTopicsComponent implements OnInit, OnDestroy, After // If there is only one topic, navigate to the first topic automatically this.router.navigate([this.getQualityAssuranceRoute(), this.sourceId, topics[0].id]); } - }) + }), ); this.totalElements$ = this.notificationsStateService.getQualityAssuranceTopicsTotals(); } @@ -113,7 +133,7 @@ export class QualityAssuranceTopicsComponent implements OnInit, OnDestroy, After take(1), ).subscribe(() => { this.getQualityAssuranceTopics(this.sourceId, this.targetId); - }) + }), ); } @@ -148,7 +168,7 @@ export class QualityAssuranceTopicsComponent implements OnInit, OnDestroy, After options.pageSize, options.currentPage, source, - target + target, ); })); } @@ -184,7 +204,7 @@ export class QualityAssuranceTopicsComponent implements OnInit, OnDestroy, After getFirstCompletedRemoteData(), getRemoteDataPayload(), tap((item: Item) => this.itemPageUrl = getItemPageRoute(item)), - map((item: Item) => item.firstMetadataValue('dc.title')) + map((item: Item) => item.firstMetadataValue('dc.title')), ); } diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts b/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts index 244feb9686..0009df0ef5 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.effects.ts @@ -44,7 +44,7 @@ export class QualityAssuranceTopicsEffects { action.payload.elementsPerPage, action.payload.currentPage, action.payload.source, - action.payload.target + action.payload.target, ).pipe( map((topics: PaginatedList) => new AddTopicsAction(topics.page, topics.totalPages, topics.currentPage, topics.totalElements), diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts index 8c1798da60..06da2969fa 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.reducer.spec.ts @@ -1,6 +1,16 @@ -import { qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; -import { AddTopicsAction, RetrieveAllTopicsAction, RetrieveAllTopicsErrorAction } from './quality-assurance-topics.actions'; -import { qualityAssuranceTopicsReducer, QualityAssuranceTopicState } from './quality-assurance-topics.reducer'; +import { + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid, +} from '../../../shared/mocks/notifications.mock'; +import { + AddTopicsAction, + RetrieveAllTopicsAction, + RetrieveAllTopicsErrorAction, +} from './quality-assurance-topics.actions'; +import { + qualityAssuranceTopicsReducer, + QualityAssuranceTopicState, +} from './quality-assurance-topics.reducer'; describe('qualityAssuranceTopicsReducer test suite', () => { let qualityAssuranceTopicInitialState: QualityAssuranceTopicState; diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts b/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts index ffe619a787..a1ae542352 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.service.spec.ts @@ -3,12 +3,19 @@ import { cold } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; import { RequestParam } from '../../../core/cache/models/request-param.model'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { QualityAssuranceTopicDataService } from '../../../core/notifications/qa/topics/quality-assurance-topic-data.service'; import { PageInfo } from '../../../core/shared/page-info.model'; -import { getMockQualityAssuranceTopicRestService, qualityAssuranceTopicObjectMoreAbstract, qualityAssuranceTopicObjectMorePid } from '../../../shared/mocks/notifications.mock'; +import { + getMockQualityAssuranceTopicRestService, + qualityAssuranceTopicObjectMoreAbstract, + qualityAssuranceTopicObjectMorePid, +} from '../../../shared/mocks/notifications.mock'; import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { QualityAssuranceTopicsService } from './quality-assurance-topics.service'; @@ -50,7 +57,7 @@ describe('QualityAssuranceTopicsService', () => { elementsPerPage: elementsPerPage, currentPage: currentPage, sort: sortOptions, - searchParams: [new RequestParam('source', 'openaire')] + searchParams: [new RequestParam('source', 'openaire')], }; service.getTopics(elementsPerPage, currentPage, 'openaire'); expect((service as any).qualityAssuranceTopicRestService.searchTopicsBySource).toHaveBeenCalledWith(findListOptions); diff --git a/src/app/notifications/qa/topics/quality-assurance-topics.service.ts b/src/app/notifications/qa/topics/quality-assurance-topics.service.ts index fb527ffbdb..3c737990e0 100644 --- a/src/app/notifications/qa/topics/quality-assurance-topics.service.ts +++ b/src/app/notifications/qa/topics/quality-assurance-topics.service.ts @@ -3,7 +3,10 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { RequestParam } from '../../../core/cache/models/request-param.model'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; @@ -43,7 +46,7 @@ export class QualityAssuranceTopicsService { elementsPerPage: elementsPerPage, currentPage: currentPage, sort: sortOptions, - searchParams: [new RequestParam('source', source)] + searchParams: [new RequestParam('source', source)], }; let request$: Observable>>; diff --git a/src/app/notifications/suggestion-actions/suggestion-actions.component.ts b/src/app/notifications/suggestion-actions/suggestion-actions.component.ts index 5f1443794c..d25d21510c 100644 --- a/src/app/notifications/suggestion-actions/suggestion-actions.component.ts +++ b/src/app/notifications/suggestion-actions/suggestion-actions.component.ts @@ -1,11 +1,16 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { ItemType } from '../../core/shared/item-relationships/item-type.model'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { Collection } from '../../core/shared/collection.model'; import { take } from 'rxjs/operators'; -import { CreateItemParentSelectorComponent } from '../../shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; + import { Suggestion } from '../../core/notifications/models/suggestion.model'; +import { Collection } from '../../core/shared/collection.model'; +import { ItemType } from '../../core/shared/item-relationships/item-type.model'; +import { CreateItemParentSelectorComponent } from '../../shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; import { SuggestionApproveAndImport } from '../suggestion-list-element/suggestion-list-element.component'; /** @@ -14,7 +19,7 @@ import { SuggestionApproveAndImport } from '../suggestion-list-element/suggestio @Component({ selector: 'ds-suggestion-actions', styleUrls: [ './suggestion-actions.component.scss' ], - templateUrl: './suggestion-actions.component.html' + templateUrl: './suggestion-actions.component.html', }) export class SuggestionActionsComponent { @@ -59,7 +64,7 @@ export class SuggestionActionsComponent { .subscribe((collection: Collection) => { this.approveAndImport.emit({ suggestion: this.isBulk ? undefined : this.object, - collectionId: collection.id + collectionId: collection.id, }); }); } @@ -67,7 +72,7 @@ export class SuggestionActionsComponent { approveAndImportCollectionFixed() { this.approveAndImport.emit({ suggestion: this.isBulk ? undefined : this.object, - collectionId: null + collectionId: null, }); } diff --git a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts b/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts index 2eb3af02f3..31f6405a2c 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts +++ b/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts @@ -1,6 +1,10 @@ -import { Component, Input } from '@angular/core'; -import { fadeIn } from '../../../shared/animations/fade'; +import { + Component, + Input, +} from '@angular/core'; + import { SuggestionEvidences } from '../../../core/notifications/models/suggestion.model'; +import { fadeIn } from '../../../shared/animations/fade'; /** * Show suggestion evidences such as score (authorScore, dateScore) @@ -9,7 +13,7 @@ import { SuggestionEvidences } from '../../../core/notifications/models/suggesti selector: 'ds-suggestion-evidences', styleUrls: [ './suggestion-evidences.component.scss' ], templateUrl: './suggestion-evidences.component.html', - animations: [fadeIn] + animations: [fadeIn], }) export class SuggestionEvidencesComponent { diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts index b9339f35d2..b2b053e254 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts +++ b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts @@ -1,12 +1,17 @@ -import { SuggestionListElementComponent } from './suggestion-list-element.component'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { TranslateModule } from '@ngx-translate/core'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + async, + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { TestScheduler } from 'rxjs/testing'; +import { TranslateModule } from '@ngx-translate/core'; import { getTestScheduler } from 'jasmine-marbles'; -import { mockSuggestionPublicationOne } from '../../shared/mocks/publication-claim.mock'; +import { TestScheduler } from 'rxjs/testing'; + import { Item } from '../../core/shared/item.model'; +import { mockSuggestionPublicationOne } from '../../shared/mocks/publication-claim.mock'; +import { SuggestionListElementComponent } from './suggestion-list-element.component'; describe('SuggestionListElementComponent', () => { let component: SuggestionListElementComponent; @@ -17,13 +22,13 @@ describe('SuggestionListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ - TranslateModule.forRoot() + TranslateModule.forRoot(), ], declarations: [SuggestionListElementComponent], providers: [ - NgbModal + NgbModal, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }).compileComponents().then(); })); @@ -42,7 +47,7 @@ describe('SuggestionListElementComponent', () => { scheduler.flush(); const expectedIndexableObject = Object.assign(new Item(), { id: mockSuggestionPublicationOne.id, - metadata: mockSuggestionPublicationOne.metadata + metadata: mockSuggestionPublicationOne.metadata, }); expect(component).toBeTruthy(); expect(component.listableObject.hitHighlights).toEqual({}); @@ -60,7 +65,7 @@ describe('SuggestionListElementComponent', () => { it('should emit selection', () => { spyOn(component.selected, 'next'); - component.changeSelected({target: { checked: true}}); + component.changeSelected({ target: { checked: true } }); expect(component.selected.next).toHaveBeenCalledWith(true); }); @@ -71,7 +76,7 @@ describe('SuggestionListElementComponent', () => { }); it('should emit for approve and import', () => { - const event = {collectionId:'1234', suggestion: mockSuggestionPublicationOne}; + const event = { collectionId:'1234', suggestion: mockSuggestionPublicationOne }; spyOn(component.approveAndImport, 'emit'); component.onApproveAndImport(event); expect(component.approveAndImport.emit).toHaveBeenCalledWith(event); diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts index f9728ec20e..22e212525a 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts +++ b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts @@ -1,9 +1,15 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; - +import { + Component, + EventEmitter, + Input, + OnInit, + Output, +} from '@angular/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { Suggestion } from 'src/app/core/notifications/models/suggestion.model'; -import { fadeIn } from '../../shared/animations/fade'; + import { Item } from '../../core/shared/item.model'; +import { fadeIn } from '../../shared/animations/fade'; import { isNotEmpty } from '../../shared/empty.util'; /** @@ -21,7 +27,7 @@ export interface SuggestionApproveAndImport { selector: 'ds-suggestion-list-item', styleUrls: ['./suggestion-list-element.component.scss'], templateUrl: './suggestion-list-element.component.html', - animations: [fadeIn] + animations: [fadeIn], }) export class SuggestionListElementComponent implements OnInit { @@ -59,8 +65,8 @@ export class SuggestionListElementComponent implements OnInit { ngOnInit() { this.listableObject = { - indexableObject: Object.assign(new Item(), {id: this.object.id, metadata: this.object.metadata}), - hitHighlights: {} + indexableObject: Object.assign(new Item(), { id: this.object.id, metadata: this.object.metadata }), + hitHighlights: {}, }; } diff --git a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts b/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts index 240c3b410b..9290f808bb 100644 --- a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts +++ b/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts @@ -1,16 +1,25 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { + Component, + Input, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + take, +} from 'rxjs/operators'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, take } from 'rxjs/operators'; - +import { SuggestionTarget } from '../../../core/notifications/models/suggestion-target.model'; +import { PaginationService } from '../../../core/pagination/pagination.service'; import { hasValue } from '../../../shared/empty.util'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { getSuggestionPageRoute } from '../../../suggestions-page/suggestions-page-routing-paths'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { SuggestionTarget } from '../../../core/notifications/models/suggestion-target.model'; -import { SuggestionTargetsStateService } from '../suggestion-targets.state.service'; import { SuggestionsService } from '../../suggestions.service'; +import { SuggestionTargetsStateService } from '../suggestion-targets.state.service'; /** * Component to display the Suggestion Target list. @@ -33,7 +42,7 @@ export class PublicationClaimComponent implements OnInit { */ public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { id: 'stp', - pageSizeOptions: [5, 10, 20, 40, 60] + pageSizeOptions: [5, 10, 20, 40, 60], }); /** @@ -61,7 +70,7 @@ export class PublicationClaimComponent implements OnInit { private paginationService: PaginationService, private suggestionTargetsStateService: SuggestionTargetsStateService, private suggestionService: SuggestionsService, - private router: Router + private router: Router, ) { } @@ -74,10 +83,10 @@ export class PublicationClaimComponent implements OnInit { this.subs.push( this.suggestionTargetsStateService.isSuggestionTargetsLoaded().pipe( - take(1) + take(1), ).subscribe(() => { this.getSuggestionTargets(); - }) + }), ); } @@ -127,12 +136,12 @@ export class PublicationClaimComponent implements OnInit { public getSuggestionTargets(): void { this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( distinctUntilChanged(), - take(1) + take(1), ).subscribe((options: PaginationComponentOptions) => { this.suggestionTargetsStateService.dispatchRetrieveSuggestionTargets( this.source, options.pageSize, - options.currentPage + options.currentPage, ); }); } diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts b/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts index fd4804c47b..9f63654b4b 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts +++ b/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts @@ -1,7 +1,8 @@ /* eslint-disable max-classes-per-file */ import { Action } from '@ngrx/store'; -import { type } from '../../shared/ngrx/type'; + import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; +import { type } from '../../shared/ngrx/type'; /** * For each action type in an action group, make a simple @@ -18,7 +19,7 @@ export const SuggestionTargetActionTypes = { RETRIEVE_TARGETS_BY_SOURCE_ERROR: type('dspace/integration/openaire/suggestions/target/RETRIEVE_TARGETS_BY_SOURCE_ERROR'), ADD_USER_SUGGESTIONS: type('dspace/integration/openaire/suggestions/target/ADD_USER_SUGGESTIONS'), REFRESH_USER_SUGGESTIONS: type('dspace/integration/openaire/suggestions/target/REFRESH_USER_SUGGESTIONS'), - MARK_USER_SUGGESTIONS_AS_VISITED: type('dspace/integration/openaire/suggestions/target/MARK_USER_SUGGESTIONS_AS_VISITED') + MARK_USER_SUGGESTIONS_AS_VISITED: type('dspace/integration/openaire/suggestions/target/MARK_USER_SUGGESTIONS_AS_VISITED'), }; /* tslint:disable:max-classes-per-file */ @@ -48,7 +49,7 @@ export class RetrieveTargetsBySourceAction implements Action { this.payload = { source, elementsPerPage, - currentPage + currentPage, }; } } @@ -89,7 +90,7 @@ export class AddTargetAction implements Action { targets, totalPages, currentPage, - totalElements + totalElements, }; } diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts b/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts index c9371241a3..5a4beaddef 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts +++ b/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts @@ -1,16 +1,30 @@ import { Injectable } from '@angular/core'; - +import { + Actions, + createEffect, + ofType, +} from '@ngrx/effects'; import { Store } from '@ngrx/store'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; import { TranslateService } from '@ngx-translate/core'; -import { catchError, map, switchMap, tap } from 'rxjs/operators'; import { of } from 'rxjs'; +import { + catchError, + map, + switchMap, + tap, +} from 'rxjs/operators'; -import { AddTargetAction, AddUserSuggestionsAction, RetrieveAllTargetsErrorAction, RetrieveTargetsBySourceAction, SuggestionTargetActionTypes } from './suggestion-targets.actions'; import { PaginatedList } from '../../core/data/paginated-list.model'; -import { SuggestionsService } from '../suggestions.service'; import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { SuggestionsService } from '../suggestions.service'; +import { + AddTargetAction, + AddUserSuggestionsAction, + RetrieveAllTargetsErrorAction, + RetrieveTargetsBySourceAction, + SuggestionTargetActionTypes, +} from './suggestion-targets.actions'; /** * Provides effect methods for the Suggestion Targets actions. @@ -27,19 +41,19 @@ export class SuggestionTargetsEffects { return this.suggestionsService.getTargets( action.payload.source, action.payload.elementsPerPage, - action.payload.currentPage + action.payload.currentPage, ).pipe( map((targets: PaginatedList) => - new AddTargetAction(targets.page, targets.totalPages, targets.currentPage, targets.totalElements) + new AddTargetAction(targets.page, targets.totalPages, targets.currentPage, targets.totalElements), ), catchError((error: Error) => { if (error) { console.error(error.message); } return of(new RetrieveAllTargetsErrorAction()); - }) + }), ); - }) + }), )); /** @@ -49,7 +63,7 @@ export class SuggestionTargetsEffects { ofType(SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR), tap(() => { this.notificationsService.error(null, this.translate.get('suggestion.target.error.service.retrieve')); - }) + }), ), { dispatch: false }); /** @@ -64,12 +78,12 @@ export class SuggestionTargetsEffects { return this.suggestionsService.retrieveCurrentUserSuggestions(userId) .pipe( map((suggestionTargets: SuggestionTarget[]) => new AddUserSuggestionsAction(suggestionTargets)), - catchError((errors) => of(errors)) + catchError((errors: unknown) => of(errors)), ); }), - catchError((errors) => of(errors)) + catchError((errors: unknown) => of(errors)), ); - })) + })), ); /** @@ -85,7 +99,7 @@ export class SuggestionTargetsEffects { private store$: Store, private translate: TranslateService, private notificationsService: NotificationsService, - private suggestionsService: SuggestionsService + private suggestionsService: SuggestionsService, ) { } } diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts b/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts index 9d618db795..0fcf4c5fe2 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts +++ b/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts @@ -1,5 +1,8 @@ import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; -import { SuggestionTargetActionTypes, SuggestionTargetsActions } from './suggestion-targets.actions'; +import { + SuggestionTargetActionTypes, + SuggestionTargetsActions, +} from './suggestion-targets.actions'; /** * The interface representing the OpenAIRE suggestion targets state. @@ -26,7 +29,7 @@ const SuggestionTargetInitialState: SuggestionTargetState = { currentPage: 0, totalElements: 0, currentUserTargets: null, - currentUserTargetsVisited: false + currentUserTargetsVisited: false, }; /** @@ -44,7 +47,7 @@ export function SuggestionTargetsReducer(state = SuggestionTargetInitialState, a case SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE: { return Object.assign({}, state, { targets: [], - processing: true + processing: true, }); } @@ -55,7 +58,7 @@ export function SuggestionTargetsReducer(state = SuggestionTargetInitialState, a loaded: true, totalPages: action.payload.totalPages, currentPage: state.currentPage, - totalElements: action.payload.totalElements + totalElements: action.payload.totalElements, }); } @@ -72,13 +75,13 @@ export function SuggestionTargetsReducer(state = SuggestionTargetInitialState, a case SuggestionTargetActionTypes.ADD_USER_SUGGESTIONS: { return Object.assign({}, state, { - currentUserTargets: action.payload.suggestionTargets + currentUserTargets: action.payload.suggestionTargets, }); } case SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED: { return Object.assign({}, state, { - currentUserTargetsVisited: true + currentUserTargetsVisited: true, }); } diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts b/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts index 1ca01b10f2..b6ea910dce 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts +++ b/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts @@ -1,26 +1,28 @@ import { Injectable } from '@angular/core'; - -import { select, Store } from '@ngrx/store'; +import { + select, + Store, +} from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; - -import { - ClearSuggestionTargetsAction, - MarkUserSuggestionsAsVisitedAction, - RefreshUserSuggestionsAction, - RetrieveTargetsBySourceAction -} from './suggestion-targets.actions'; -import { SuggestionNotificationsState } from '../../notifications/notifications.reducer'; import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; +import { SuggestionNotificationsState } from '../../notifications/notifications.reducer'; import { - getCurrentUserSuggestionTargetsSelector, getCurrentUserSuggestionTargetsVisitedSelector, + getCurrentUserSuggestionTargetsSelector, + getCurrentUserSuggestionTargetsVisitedSelector, getSuggestionTargetCurrentPageSelector, getSuggestionTargetTotalsSelector, isReciterSuggestionTargetProcessingSelector, isSuggestionTargetLoadedSelector, - suggestionTargetObjectSelector + suggestionTargetObjectSelector, } from '../../suggestion-notifications/selectors'; +import { + ClearSuggestionTargetsAction, + MarkUserSuggestionsAsVisitedAction, + RefreshUserSuggestionsAction, + RetrieveTargetsBySourceAction, +} from './suggestion-targets.actions'; /** * The service handling the Suggestion targets State. @@ -53,7 +55,7 @@ export class SuggestionTargetsStateService { public isSuggestionTargetsLoading(): Observable { return this.store.pipe( select(isSuggestionTargetLoadedSelector), - map((loaded: boolean) => !loaded) + map((loaded: boolean) => !loaded), ); } diff --git a/src/app/notifications/suggestion.service.spec.ts b/src/app/notifications/suggestion.service.spec.ts index ed0fb57445..aee00c8bf4 100644 --- a/src/app/notifications/suggestion.service.spec.ts +++ b/src/app/notifications/suggestion.service.spec.ts @@ -1,19 +1,22 @@ -import { SuggestionsService } from './suggestions.service'; -import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; - -import { TestScheduler } from 'rxjs/testing'; import { getTestScheduler } from 'jasmine-marbles'; import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + +import { + SortDirection, + SortOptions, +} from '../core/cache/models/sort-options.model'; import { FindListOptions } from '../core/data/find-list-options.model'; -import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model'; -import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; -import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { mockSuggestionPublicationOne } from '../shared/mocks/publication-claim.mock'; -import { ResourceType } from '../core/shared/resource-type'; +import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; import { SuggestionsDataService } from '../core/notifications/suggestions-data.service'; import { SuggestionTargetDataService } from '../core/notifications/target/suggestion-target-data.service'; -import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; +import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; +import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; +import { ResourceType } from '../core/shared/resource-type'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { mockSuggestionPublicationOne } from '../shared/mocks/publication-claim.mock'; +import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { SuggestionsService } from './suggestions.service'; describe('SuggestionsService test', () => { let scheduler: TestScheduler; @@ -29,13 +32,13 @@ describe('SuggestionsService test', () => { display: 'display', source: 'source', total: 8, - type: new ResourceType('suggestiontarget') + type: new ResourceType('suggestiontarget'), }; const mockResercherProfile = { id: '1234', uuid: '1234', - visible: true + visible: true, }; function initTestService() { @@ -43,7 +46,7 @@ describe('SuggestionsService test', () => { researcherProfileService, suggestionsDataService, suggestionTargetDataService, - translateService + translateService, ); } @@ -83,7 +86,7 @@ describe('SuggestionsService test', () => { const findListOptions: FindListOptions = { elementsPerPage: 10, currentPage: 1, - sort: sortOptions + sort: sortOptions, }; service.getTargets('source', 10, 1); expect(suggestionTargetDataService.getTargets).toHaveBeenCalledWith('source', findListOptions); @@ -94,7 +97,7 @@ describe('SuggestionsService test', () => { const findListOptions: FindListOptions = { elementsPerPage: 10, currentPage: 1, - sort: sortOptions + sort: sortOptions, }; service.getSuggestions('source:target', 10, 1, sortOptions); expect(suggestionsDataService.getSuggestionsByTargetAndSource).toHaveBeenCalledWith('target', 'source', findListOptions); @@ -117,14 +120,14 @@ describe('SuggestionsService test', () => { it('should approve and import suggestion', () => { spyOn(service, 'resolveCollectionId'); - const workspaceitemService = {importExternalSourceEntry: (x,y) => observableOf(null)}; + const workspaceitemService = { importExternalSourceEntry: (x,y) => observableOf(null) }; service.approveAndImport(workspaceitemService as unknown as WorkspaceitemDataService, mockSuggestionPublicationOne, '1234'); expect(service.resolveCollectionId).toHaveBeenCalled(); }); it('should approve and import suggestions', () => { spyOn(service, 'approveAndImport'); - const workspaceitemService = {importExternalSourceEntry: (x,y) => observableOf(null)}; + const workspaceitemService = { importExternalSourceEntry: (x,y) => observableOf(null) }; service.approveAndImportMultiple(workspaceitemService as unknown as WorkspaceitemDataService, [mockSuggestionPublicationOne], '1234'); expect(service.approveAndImport).toHaveBeenCalledWith(workspaceitemService as unknown as WorkspaceitemDataService, mockSuggestionPublicationOne, '1234'); }); @@ -143,7 +146,7 @@ describe('SuggestionsService test', () => { it('should get target Uuid', () => { expect(service.getTargetUuid(suggestionTarget as SuggestionTarget)).toBe('4321'); - expect(service.getTargetUuid({id: ''} as SuggestionTarget)).toBe(null); + expect(service.getTargetUuid({ id: '' } as SuggestionTarget)).toBe(null); }); it('should get suggestion interpolation', () => { @@ -156,19 +159,19 @@ describe('SuggestionsService test', () => { }); it('should translate suggestion type', () => { - expect(service.translateSuggestionType('source')).toEqual('suggestion.type.source'); + expect(service.translateSuggestionType('source')).toEqual('suggestion.type.source'); }); it('should translate suggestion source', () => { - expect(service.translateSuggestionSource('source')).toEqual('suggestion.source.source'); + expect(service.translateSuggestionSource('source')).toEqual('suggestion.source.source'); }); it('should resolve collection id', () => { - expect(service.resolveCollectionId(mockSuggestionPublicationOne, '1234')).toEqual('1234'); + expect(service.resolveCollectionId(mockSuggestionPublicationOne, '1234')).toEqual('1234'); }); it('should check if collection is fixed', () => { - expect(service.isCollectionFixed([mockSuggestionPublicationOne])).toBeFalse(); + expect(service.isCollectionFixed([mockSuggestionPublicationOne])).toBeFalse(); }); }); }); diff --git a/src/app/notifications/suggestions-notification/suggestions-notification.component.ts b/src/app/notifications/suggestions-notification/suggestions-notification.component.ts index 107da67fce..a3b22e982c 100644 --- a/src/app/notifications/suggestions-notification/suggestions-notification.component.ts +++ b/src/app/notifications/suggestions-notification/suggestions-notification.component.ts @@ -1,9 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; +import { Observable } from 'rxjs'; +import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; import { SuggestionsService } from '../suggestions.service'; -import { Observable } from 'rxjs'; -import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; /** * Show suggestions notification, used on myDSpace and Profile pages @@ -11,7 +14,7 @@ import { SuggestionTarget } from '../../core/notifications/models/suggestion-tar @Component({ selector: 'ds-suggestions-notification', templateUrl: './suggestions-notification.component.html', - styleUrls: ['./suggestions-notification.component.scss'] + styleUrls: ['./suggestions-notification.component.scss'], }) export class SuggestionsNotificationComponent implements OnInit { @@ -22,7 +25,7 @@ export class SuggestionsNotificationComponent implements OnInit { constructor( private suggestionTargetsStateService: SuggestionTargetsStateService, - private suggestionsService: SuggestionsService + private suggestionsService: SuggestionsService, ) { } ngOnInit() { diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts b/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts index c8d59115d8..12c3280837 100644 --- a/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts +++ b/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts @@ -1,12 +1,16 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SuggestionsPopupComponent } from './suggestions-popup.component'; -import { TranslateModule } from '@ngx-translate/core'; -import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + async, + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; + import { mockSuggestionTargetsObjectOne } from '../../shared/mocks/publication-claim-targets.mock'; +import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; import { SuggestionsService } from '../suggestions.service'; +import { SuggestionsPopupComponent } from './suggestions-popup.component'; describe('SuggestionsPopupComponent', () => { let component: SuggestionsPopupComponent; @@ -16,13 +20,13 @@ describe('SuggestionsPopupComponent', () => { hasUserVisitedSuggestions: jasmine.createSpy('hasUserVisitedSuggestions'), getCurrentUserSuggestionTargets: jasmine.createSpy('getCurrentUserSuggestionTargets'), dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction'), - dispatchRefreshUserSuggestionsAction: jasmine.createSpy('dispatchRefreshUserSuggestionsAction') + dispatchRefreshUserSuggestionsAction: jasmine.createSpy('dispatchRefreshUserSuggestionsAction'), }); const mockNotificationInterpolation = { count: 12, source: 'source', suggestionId: 'id', displayName: 'displayName' }; const suggestionService = jasmine.createSpyObj('SuggestionService', { getNotificationSuggestionInterpolation: - jasmine.createSpy('getNotificationSuggestionInterpolation').and.returnValue(mockNotificationInterpolation) + jasmine.createSpy('getNotificationSuggestionInterpolation').and.returnValue(mockNotificationInterpolation), }); beforeEach(async(() => { @@ -33,10 +37,10 @@ describe('SuggestionsPopupComponent', () => { { provide: SuggestionTargetsStateService, useValue: suggestionStateService }, { provide: SuggestionsService, useValue: suggestionService }, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); })); describe('should create', () => { diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.ts b/src/app/notifications/suggestions-popup/suggestions-popup.component.ts index 7466c1138c..f3ccc70cbd 100644 --- a/src/app/notifications/suggestions-popup/suggestions-popup.component.ts +++ b/src/app/notifications/suggestions-popup/suggestions-popup.component.ts @@ -1,13 +1,25 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { trigger } from '@angular/animations'; +import { + Component, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + combineLatest, + Observable, + of, + Subject, +} from 'rxjs'; +import { + take, + takeUntil, +} from 'rxjs/operators'; + +import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; +import { fromTopEnter } from '../../shared/animations/fromTop'; +import { isNotEmpty } from '../../shared/empty.util'; import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; import { SuggestionsService } from '../suggestions.service'; -import { take, takeUntil } from 'rxjs/operators'; -import { isNotEmpty } from '../../shared/empty.util'; -import { combineLatest, Observable, of, Subject } from 'rxjs'; -import { trigger } from '@angular/animations'; - -import { fromTopEnter } from '../../shared/animations/fromTop'; -import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; /** * Show suggestions on a popover window, used on the homepage @@ -18,8 +30,8 @@ import { SuggestionTarget } from '../../core/notifications/models/suggestion-tar styleUrls: ['./suggestions-popup.component.scss'], animations: [ trigger('enterLeave', [ - fromTopEnter - ]) + fromTopEnter, + ]), ], }) export class SuggestionsPopupComponent implements OnInit, OnDestroy { @@ -33,7 +45,7 @@ export class SuggestionsPopupComponent implements OnInit, OnDestroy { constructor( private suggestionTargetsStateService: SuggestionTargetsStateService, - private suggestionsService: SuggestionsService + private suggestionsService: SuggestionsService, ) { } ngOnInit() { @@ -44,7 +56,7 @@ export class SuggestionsPopupComponent implements OnInit, OnDestroy { const notifier = new Subject(); this.subscription = combineLatest([ this.suggestionTargetsStateService.getCurrentUserSuggestionTargets().pipe(take(2)), - this.suggestionTargetsStateService.hasUserVisitedSuggestions() + this.suggestionTargetsStateService.hasUserVisitedSuggestions(), ]).pipe(takeUntil(notifier)).subscribe(([suggestions, visited]) => { this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); if (isNotEmpty(suggestions)) { diff --git a/src/app/notifications/suggestions.service.ts b/src/app/notifications/suggestions.service.ts index a265e8d727..bcd3ac1342 100644 --- a/src/app/notifications/suggestions.service.ts +++ b/src/app/notifications/suggestions.service.ts @@ -1,27 +1,47 @@ import { Injectable } from '@angular/core'; - -import { forkJoin, Observable, of } from 'rxjs'; -import { catchError, map, mergeMap, take } from 'rxjs/operators'; - -import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model'; -import { RemoteData } from '../core/data/remote-data'; -import { PaginatedList } from '../core/data/paginated-list.model'; -import { hasValue, isNotEmpty } from '../shared/empty.util'; -import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; -import { getAllSucceededRemoteDataPayload, getFinishedRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload, getFirstSucceededRemoteListPayload } from '../core/shared/operators'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; import { TranslateService } from '@ngx-translate/core'; -import { NoContent } from '../core/shared/NoContent.model'; -import { environment } from '../../environments/environment'; -import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; -import { FindListOptions } from '../core/data/find-list-options.model'; +import { + forkJoin, + Observable, + of, +} from 'rxjs'; +import { + catchError, + map, + mergeMap, + take, +} from 'rxjs/operators'; + import { SuggestionConfig } from '../../config/suggestion-config.interfaces'; -import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; -import { getSuggestionPageRoute } from '../suggestions-page/suggestions-page-routing-paths'; +import { environment } from '../../environments/environment'; +import { + SortDirection, + SortOptions, +} from '../core/cache/models/sort-options.model'; +import { FindListOptions } from '../core/data/find-list-options.model'; +import { PaginatedList } from '../core/data/paginated-list.model'; +import { RemoteData } from '../core/data/remote-data'; +import { Suggestion } from '../core/notifications/models/suggestion.model'; +import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; import { SuggestionsDataService } from '../core/notifications/suggestions-data.service'; import { SuggestionTargetDataService } from '../core/notifications/target/suggestion-target-data.service'; -import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; -import { Suggestion } from '../core/notifications/models/suggestion.model'; +import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; +import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; +import { NoContent } from '../core/shared/NoContent.model'; +import { + getAllSucceededRemoteDataPayload, + getFinishedRemoteData, + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload, + getFirstSucceededRemoteListPayload, +} from '../core/shared/operators'; +import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { + hasValue, + isNotEmpty, +} from '../shared/empty.util'; +import { getSuggestionPageRoute } from '../suggestions-page/suggestions-page-routing-paths'; /** * useful for multiple approvals and ignores operation @@ -48,7 +68,7 @@ export class SuggestionsService { private researcherProfileService: ResearcherProfileDataService, private suggestionsDataService: SuggestionsDataService, private suggestionTargetDataService: SuggestionTargetDataService, - private translateService: TranslateService + private translateService: TranslateService, ) { } @@ -70,7 +90,7 @@ export class SuggestionsService { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, }; return this.suggestionTargetDataService.getTargets(source, findListOptions).pipe( @@ -82,7 +102,7 @@ export class SuggestionsService { } else { throw new Error('Can\'t retrieve Suggestion Target from the Search Target REST service'); } - }) + }), ); } @@ -106,11 +126,11 @@ export class SuggestionsService { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, }; return this.suggestionsDataService.getSuggestionsByTargetAndSource(target, source, findListOptions).pipe( - getAllSucceededRemoteDataPayload() + getAllSucceededRemoteDataPayload(), ); } @@ -134,7 +154,7 @@ export class SuggestionsService { throw new Error('Can\'t delete Suggestion from the Search Target REST service'); } }), - take(1) + take(1), ); } @@ -152,15 +172,15 @@ export class SuggestionsService { return this.researcherProfileService.findRelatedItemId(profile.payload).pipe( mergeMap((itemId: string) => { return this.suggestionsDataService.getTargetsByUser(itemId).pipe( - getFirstSucceededRemoteListPayload() + getFirstSucceededRemoteListPayload(), ); - }) + }), ); } else { return of([]); } }), - catchError(() => of([])) + catchError(() => of([])), ); } @@ -172,14 +192,14 @@ export class SuggestionsService { * @private */ public approveAndImport(workspaceitemService: WorkspaceitemDataService, - suggestion: Suggestion, - collectionId: string): Observable { + suggestion: Suggestion, + collectionId: string): Observable { const resolvedCollectionId = this.resolveCollectionId(suggestion, collectionId); return workspaceitemService.importExternalSourceEntry(suggestion.externalSourceUri, resolvedCollectionId) .pipe( getFirstSucceededRemoteDataPayload(), - catchError(() => of(null)) + catchError(() => of(null)), ); } @@ -189,7 +209,7 @@ export class SuggestionsService { */ public ignoreSuggestion(suggestionId): Observable> { return this.deleteReviewedSuggestion(suggestionId).pipe( - catchError(() => of(null)) + catchError(() => of(null)), ); } @@ -200,15 +220,15 @@ export class SuggestionsService { * @param collectionId the collectionId */ public approveAndImportMultiple(workspaceitemService: WorkspaceitemDataService, - suggestions: Suggestion[], - collectionId: string): Observable { + suggestions: Suggestion[], + collectionId: string): Observable { return forkJoin(suggestions.map((suggestion: Suggestion) => this.approveAndImport(workspaceitemService, suggestion, collectionId))) .pipe(map((results: WorkspaceItem[]) => { return { success: results.filter((result) => result != null).length, - fails: results.filter((result) => result == null).length + fails: results.filter((result) => result == null).length, }; }), take(1)); } @@ -222,7 +242,7 @@ export class SuggestionsService { .pipe(map((results: RemoteData[]) => { return { success: results.filter((result) => result != null).length, - fails: results.filter((result) => result == null).length + fails: results.filter((result) => result == null).length, }; }), take(1)); } @@ -249,7 +269,7 @@ export class SuggestionsService { type: this.translateService.instant(this.translateSuggestionType(suggestionTarget.source)), suggestionId: suggestionTarget.id, displayName: suggestionTarget.display, - url: getSuggestionPageRoute(suggestionTarget.id) + url: getSuggestionPageRoute(suggestionTarget.id), }; } diff --git a/src/app/process-page/detail/process-detail.component.spec.ts b/src/app/process-page/detail/process-detail.component.spec.ts index f427d3170e..e9f64752f6 100644 --- a/src/app/process-page/detail/process-detail.component.spec.ts +++ b/src/app/process-page/detail/process-detail.component.spec.ts @@ -1,8 +1,21 @@ import { HttpClient } from '@angular/common/http'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ComponentFixture, discardPeriodicTasks, fakeAsync, flush, flushMicrotasks, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + discardPeriodicTasks, + fakeAsync, + flush, + flushMicrotasks, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; @@ -10,23 +23,25 @@ import { of as observableOf } from 'rxjs'; import { AuthService } from '../../core/auth/auth.service'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../../core/data/bitstream-data.service'; +import { PaginatedList } from '../../core/data/paginated-list.model'; import { ProcessDataService } from '../../core/data/processes/process-data.service'; import { Bitstream } from '../../core/shared/bitstream.model'; import { AuthServiceMock } from '../../shared/mocks/auth.service.mock'; import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../../shared/remote-data.utils'; +import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { RouterStub } from '../../shared/testing/router.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { FileSizePipe } from '../../shared/utils/file-size-pipe'; import { VarDirective } from '../../shared/utils/var.directive'; import { getProcessListRoute } from '../process-page-routing.paths'; -import { PaginatedList } from '../../core/data/paginated-list.model'; -import { RouterTestingModule } from '@angular/router/testing'; -import { RouterStub } from '../../shared/testing/router.stub'; -import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { Process } from '../processes/process.model'; import { ProcessDetailComponent } from './process-detail.component'; import { ProcessDetailFieldComponent } from './process-detail-field/process-detail-field.component'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; describe('ProcessDetailComponent', () => { let component: ProcessDetailComponent; @@ -56,14 +71,14 @@ describe('ProcessDetailComponent', () => { 'dc.title': [ { value: fileName, - language: null - } - ] + language: null, + }, + ], }, _links: { - content: { href: 'file-selflink' } - } - }) + content: { href: 'file-selflink' }, + }, + }), ]; processOutput = 'Process Started'; process = Object.assign(new Process(), { @@ -88,8 +103,8 @@ describe('ProcessDetailComponent', () => { href: 'https://rest.api/processes/1', }, output: { - href: 'https://rest.api/processes/1/output' - } + href: 'https://rest.api/processes/1/output', + }, }, }); const logBitstream = Object.assign(new Bitstream(), { @@ -102,7 +117,7 @@ describe('ProcessDetailComponent', () => { getFiles: createSuccessfulRemoteDataObject$(createPaginatedList(files)), delete: createSuccessfulRemoteDataObject$(null), findById: createSuccessfulRemoteDataObject$(process), - autoRefreshUntilCompletion: createSuccessfulRemoteDataObject$(process) + autoRefreshUntilCompletion: createSuccessfulRemoteDataObject$(process), }); bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { findByHref: createSuccessfulRemoteDataObject$(logBitstream), diff --git a/src/app/process-page/detail/process-detail.component.ts b/src/app/process-page/detail/process-detail.component.ts index aa0b871c4f..ab7d527aab 100644 --- a/src/app/process-page/detail/process-detail.component.ts +++ b/src/app/process-page/detail/process-detail.component.ts @@ -1,9 +1,37 @@ import { isPlatformBrowser } from '@angular/common'; import { HttpClient } from '@angular/common/http'; -import { Component, Inject, NgZone, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { filter, finalize, find, map, startWith, switchMap, take, tap } from 'rxjs/operators'; +import { + Component, + Inject, + NgZone, + OnDestroy, + OnInit, + PLATFORM_ID, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + NgbModal, + NgbModalRef, +} from '@ng-bootstrap/ng-bootstrap'; +import { TranslateService } from '@ngx-translate/core'; +import { + BehaviorSubject, + Observable, +} from 'rxjs'; +import { + filter, + finalize, + find, + map, + startWith, + switchMap, + take, + tap, +} from 'rxjs/operators'; + import { AuthService } from '../../core/auth/auth.service'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../../core/data/bitstream-data.service'; @@ -13,17 +41,20 @@ import { RemoteData } from '../../core/data/remote-data'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; import { Bitstream } from '../../core/shared/bitstream.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; -import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; +import { + getAllSucceededRemoteDataPayload, + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, +} from '../../core/shared/operators'; import { URLCombiner } from '../../core/url-combiner/url-combiner'; import { AlertType } from '../../shared/alert/alert-type'; import { hasValue } from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { TranslateService } from '@ngx-translate/core'; import { PROCESS_PAGE_FOLLOW_LINKS } from '../process-page.resolver'; import { getProcessListRoute } from '../process-page-routing.paths'; import { Process } from '../processes/process.model'; import { ProcessStatus } from '../processes/process-status.model'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @Component({ selector: 'ds-process-detail', @@ -121,7 +152,7 @@ export class ProcessDetailComponent implements OnInit, OnDestroy { this.isRefreshing$ = this.processRD$.pipe( find((processRD: RemoteData) => ProcessDataService.hasCompletedOrFailed(processRD.payload)), map(() => false), - startWith(true) + startWith(true), ); this.filesRD$ = this.processRD$.pipe( diff --git a/src/app/process-page/form/process-form.component.ts b/src/app/process-page/form/process-form.component.ts index 95c2b90e67..eea83f9e93 100644 --- a/src/app/process-page/form/process-form.component.ts +++ b/src/app/process-page/form/process-form.component.ts @@ -1,18 +1,28 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { ControlContainer, NgForm } from '@angular/forms'; -import { NavigationExtras, Router } from '@angular/router'; +import { + Component, + Input, + OnInit, +} from '@angular/core'; +import { + ControlContainer, + NgForm, +} from '@angular/forms'; +import { + NavigationExtras, + Router, +} from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; -import { ScriptParameter } from '../scripts/script-parameter.model'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { RemoteData } from '../../core/data/remote-data'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { isEmpty } from '../../shared/empty.util'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; import { getProcessListRoute } from '../process-page-routing.paths'; import { Process } from '../processes/process.model'; import { ProcessParameter } from '../processes/process-parameter.model'; import { Script } from '../scripts/script.model'; +import { ScriptParameter } from '../scripts/script-parameter.model'; /** * Component to create a new script diff --git a/src/app/process-page/overview/process-overview.component.spec.ts b/src/app/process-page/overview/process-overview.component.spec.ts index cf882df52e..ffc6bd23af 100644 --- a/src/app/process-page/overview/process-overview.component.spec.ts +++ b/src/app/process-page/overview/process-overview.component.spec.ts @@ -1,14 +1,22 @@ -import { ProcessOverviewComponent } from './process-overview.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { VarDirective } from '../../shared/utils/var.directive'; -import { TranslateModule } from '@ngx-translate/core'; -import { RouterTestingModule } from '@angular/router/testing'; -import { NO_ERRORS_SCHEMA, TemplateRef } from '@angular/core'; -import { ProcessDataService } from '../../core/data/processes/process-data.service'; +import { + NO_ERRORS_SCHEMA, + TemplateRef, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { BehaviorSubject } from 'rxjs'; -import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { RouterTestingModule } from '@angular/router/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { BehaviorSubject } from 'rxjs'; + +import { ProcessDataService } from '../../core/data/processes/process-data.service'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { ProcessOverviewComponent } from './process-overview.component'; import { ProcessOverviewService } from './process-overview.service'; describe('ProcessOverviewComponent', () => { diff --git a/src/app/process-page/overview/process-overview.component.ts b/src/app/process-page/overview/process-overview.component.ts index 7699f7e9bc..3681ddf0a1 100644 --- a/src/app/process-page/overview/process-overview.component.ts +++ b/src/app/process-page/overview/process-overview.component.ts @@ -1,10 +1,19 @@ -import { Component, OnDestroy, OnInit, TemplateRef } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { + Component, + OnDestroy, + OnInit, + TemplateRef, +} from '@angular/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Subscription } from 'rxjs'; + import { hasValue } from '../../shared/empty.util'; -import { ProcessOverviewService, ProcessSortField } from './process-overview.service'; import { ProcessStatus } from '../processes/process-status.model'; +import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { + ProcessOverviewService, + ProcessSortField, +} from './process-overview.service'; @Component({ selector: 'ds-process-overview', diff --git a/src/app/process-page/overview/process-overview.service.ts b/src/app/process-page/overview/process-overview.service.ts index 47dc899288..fc573d5160 100644 --- a/src/app/process-page/overview/process-overview.service.ts +++ b/src/app/process-page/overview/process-overview.service.ts @@ -1,16 +1,20 @@ -import { Injectable } from '@angular/core'; -import { ProcessDataService } from '../../core/data/processes/process-data.service'; -import { FindListOptions } from '../../core/data/find-list-options.model'; -import { Observable } from 'rxjs'; -import { RemoteData } from '../../core/data/remote-data'; -import { PaginatedList } from '../../core/data/paginated-list.model'; -import { Process } from '../processes/process.model'; -import { RequestParam } from '../../core/cache/models/request-param.model'; -import { ProcessStatus } from '../processes/process-status.model'; import { DatePipe } from '@angular/common'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +import { RequestParam } from '../../core/cache/models/request-param.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../core/data/find-list-options.model'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { ProcessDataService } from '../../core/data/processes/process-data.service'; +import { RemoteData } from '../../core/data/remote-data'; import { hasValue } from '../../shared/empty.util'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { Process } from '../processes/process.model'; +import { ProcessStatus } from '../processes/process-status.model'; /** * The sortable fields for processes @@ -55,8 +59,8 @@ export class ProcessOverviewService { * Leave empty or set to null to only retrieve the processes once. */ getProcessesByProcessStatus(processStatus: ProcessStatus, findListOptions?: FindListOptions, autoRefreshingIntervalInMs: number = null): Observable>> { - let requestParam = new RequestParam('processStatus', processStatus); - let options: FindListOptions = Object.assign(new FindListOptions(), { + const requestParam = new RequestParam('processStatus', processStatus); + const options: FindListOptions = Object.assign(new FindListOptions(), { searchParams: [requestParam], elementsPerPage: 5, }, findListOptions); @@ -83,14 +87,14 @@ export class ProcessOverviewService { * @param sortField the field on which the processes are sorted */ getFindListOptions(paginationOptions: PaginationComponentOptions, sortField: ProcessSortField): FindListOptions { - let sortOptions = new SortOptions(sortField, SortDirection.DESC); + const sortOptions = new SortOptions(sortField, SortDirection.DESC); return Object.assign( new FindListOptions(), { currentPage: paginationOptions.currentPage, elementsPerPage: paginationOptions.pageSize, sort: sortOptions, - } + }, ); } diff --git a/src/app/process-page/overview/table/process-overview-table.component.spec.ts b/src/app/process-page/overview/table/process-overview-table.component.spec.ts index 91dfb1ec35..1cbb246082 100644 --- a/src/app/process-page/overview/table/process-overview-table.component.spec.ts +++ b/src/app/process-page/overview/table/process-overview-table.component.spec.ts @@ -1,27 +1,35 @@ -import { ProcessOverviewTableComponent } from './process-overview-table.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { + NgbCollapse, + NgbModal, +} from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { BehaviorSubject } from 'rxjs'; +import { take } from 'rxjs/operators'; + +import { AuthService } from '../../../core/auth/auth.service'; import { ProcessDataService } from '../../../core/data/processes/process-data.service'; import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; -import { Process } from '../../processes/process.model'; import { EPerson } from '../../../core/eperson/models/eperson.model'; -import { ProcessBulkDeleteService } from '../process-bulk-delete.service'; -import { ProcessStatus } from '../../processes/process-status.model'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { createPaginatedList } from '../../../shared/testing/utils.test'; -import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -import { BehaviorSubject } from 'rxjs'; -import { NgbCollapse, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { VarDirective } from '../../../shared/utils/var.directive'; -import { TranslateModule } from '@ngx-translate/core'; -import { RouterTestingModule } from '@angular/router/testing'; import { PaginationService } from '../../../core/pagination/pagination.service'; -import { By } from '@angular/platform-browser'; -import { AuthService } from '../../../core/auth/auth.service'; -import { AuthServiceMock } from '../../../shared/mocks/auth.service.mock'; import { RouteService } from '../../../core/services/route.service'; +import { AuthServiceMock } from '../../../shared/mocks/auth.service.mock'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { routeServiceStub } from '../../../shared/testing/route-service.stub'; +import { createPaginatedList } from '../../../shared/testing/utils.test'; +import { VarDirective } from '../../../shared/utils/var.directive'; +import { Process } from '../../processes/process.model'; +import { ProcessStatus } from '../../processes/process-status.model'; +import { ProcessBulkDeleteService } from '../process-bulk-delete.service'; import { ProcessOverviewService } from '../process-overview.service'; -import { take } from 'rxjs/operators'; +import { ProcessOverviewTableComponent } from './process-overview-table.component'; describe('ProcessOverviewTableComponent', () => { let component: ProcessOverviewTableComponent; @@ -46,21 +54,21 @@ describe('ProcessOverviewTableComponent', () => { scriptName: 'script-a', startTime: '2020-03-19 00:30:00', endTime: '2020-03-19 23:30:00', - processStatus: ProcessStatus.COMPLETED + processStatus: ProcessStatus.COMPLETED, }), Object.assign(new Process(), { processId: 2, scriptName: 'script-b', startTime: '2020-03-20 00:30:00', endTime: '2020-03-20 23:30:00', - processStatus: ProcessStatus.FAILED + processStatus: ProcessStatus.FAILED, }), Object.assign(new Process(), { processId: 3, scriptName: 'script-c', startTime: '2020-03-21 00:30:00', endTime: '2020-03-21 23:30:00', - processStatus: ProcessStatus.RUNNING + processStatus: ProcessStatus.RUNNING, }), ]; ePerson = Object.assign(new EPerson(), { @@ -68,30 +76,30 @@ describe('ProcessOverviewTableComponent', () => { 'eperson.firstname': [ { value: 'John', - language: null - } + language: null, + }, ], 'eperson.lastname': [ { value: 'Doe', - language: null - } - ] - } + language: null, + }, + ], + }, }); processOverviewService = jasmine.createSpyObj('processOverviewService', { getFindListOptions: { currentPage: 1, elementsPerPage: 5, - sort: 'creationTime' + sort: 'creationTime', }, - getProcessesByProcessStatus: createSuccessfulRemoteDataObject$(createPaginatedList(processes)).pipe(take(1)) + getProcessesByProcessStatus: createSuccessfulRemoteDataObject$(createPaginatedList(processes)).pipe(take(1)), }); processService = jasmine.createSpyObj('processService', { - searchBy: createSuccessfulRemoteDataObject$(createPaginatedList(processes)).pipe(take(1)) + searchBy: createSuccessfulRemoteDataObject$(createPaginatedList(processes)).pipe(take(1)), }); ePersonService = jasmine.createSpyObj('ePersonService', { - findById: createSuccessfulRemoteDataObject$(ePerson) + findById: createSuccessfulRemoteDataObject$(ePerson), }); paginationService = new PaginationServiceStub(); @@ -103,7 +111,7 @@ describe('ProcessOverviewTableComponent', () => { hasSelected: true, isToBeDeleted: true, toggleDelete: {}, - getAmountOfSelectedProcesses: 5 + getAmountOfSelectedProcesses: 5, }); @@ -112,7 +120,7 @@ describe('ProcessOverviewTableComponent', () => { }); modalService = jasmine.createSpyObj('modalService', { - open: {} + open: {}, }); authService = new AuthServiceMock(); @@ -187,11 +195,11 @@ describe('ProcessOverviewTableComponent', () => { it('should display a delete button in the fifth column', () => { rowElements.forEach((rowElement, index) => { - const el = rowElement.query(By.css('td:nth-child(5)')); - expect(el.nativeElement.innerHTML).toContain('fas fa-trash'); + const el = rowElement.query(By.css('td:nth-child(5)')); + expect(el.nativeElement.innerHTML).toContain('fas fa-trash'); - el.query(By.css('button')).triggerEventHandler('click', null); - expect(processBulkDeleteService.toggleDelete).toHaveBeenCalledWith(processes[index].processId); + el.query(By.css('button')).triggerEventHandler('click', null); + expect(processBulkDeleteService.toggleDelete).toHaveBeenCalledWith(processes[index].processId); }); }); diff --git a/src/app/process-page/overview/table/process-overview-table.component.ts b/src/app/process-page/overview/table/process-overview-table.component.ts index a060654ca9..102ff7226d 100644 --- a/src/app/process-page/overview/table/process-overview-table.component.ts +++ b/src/app/process-page/overview/table/process-overview-table.component.ts @@ -1,25 +1,51 @@ -import { Component, Inject, Input, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; -import { ProcessStatus } from '../../processes/process-status.model'; -import { BehaviorSubject, from as observableFrom, mergeMap, Observable, Subscription } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { Process } from '../../processes/process.model'; -import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { ProcessOverviewService, ProcessSortField } from '../process-overview.service'; -import { ProcessBulkDeleteService } from '../process-bulk-delete.service'; -import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; -import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; -import { getAllCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; -import { filter, map, switchMap, take, toArray } from 'rxjs/operators'; -import { EPerson } from '../../../core/eperson/models/eperson.model'; -import { PaginationService } from 'src/app/core/pagination/pagination.service'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { redirectOn4xx } from '../../../core/shared/authorized.operators'; -import { Router } from '@angular/router'; -import { AuthService } from '../../../core/auth/auth.service'; import { isPlatformBrowser } from '@angular/common'; +import { + Component, + Inject, + Input, + OnDestroy, + OnInit, + PLATFORM_ID, +} from '@angular/core'; +import { Router } from '@angular/router'; +import { + BehaviorSubject, + from as observableFrom, + mergeMap, + Observable, + Subscription, +} from 'rxjs'; +import { + filter, + map, + switchMap, + take, + toArray, +} from 'rxjs/operators'; +import { PaginationService } from 'src/app/core/pagination/pagination.service'; + +import { AuthService } from '../../../core/auth/auth.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { RouteService } from '../../../core/services/route.service'; +import { redirectOn4xx } from '../../../core/shared/authorized.operators'; +import { + getAllCompletedRemoteData, + getFirstSucceededRemoteDataPayload, +} from '../../../core/shared/operators'; import { hasValue } from '../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { Process } from '../../processes/process.model'; +import { ProcessStatus } from '../../processes/process-status.model'; +import { ProcessBulkDeleteService } from '../process-bulk-delete.service'; +import { + ProcessOverviewService, + ProcessSortField, +} from '../process-overview.service'; const NEW_PROCESS_PARAM = 'new_process_id'; @@ -36,7 +62,7 @@ export interface ProcessOverviewTableEntry { @Component({ selector: 'ds-process-overview-table', styleUrls: ['./process-overview-table.component.scss'], - templateUrl: './process-overview-table.component.html' + templateUrl: './process-overview-table.component.html', }) export class ProcessOverviewTableComponent implements OnInit, OnDestroy { @@ -107,7 +133,7 @@ export class ProcessOverviewTableComponent implements OnInit, OnDestroy { protected router: Router, protected auth: AuthService, @Inject(PLATFORM_ID) protected platformId: object, - ) { + ) { } ngOnInit() { @@ -125,7 +151,7 @@ export class ProcessOverviewTableComponent implements OnInit, OnDestroy { // increase the number of characters until the ids are distinct. this.paginationId = this.processStatus.toLowerCase().substring(0,2); - let defaultPaginationOptions = Object.assign(new PaginationComponentOptions(), { + const defaultPaginationOptions = Object.assign(new PaginationComponentOptions(), { id: this.paginationId, pageSize: 5, }); @@ -157,7 +183,7 @@ export class ProcessOverviewTableComponent implements OnInit, OnDestroy { // Use the findListOptions to retrieve the relevant processes every interval switchMap((findListOptions: FindListOptions) => this.processOverviewService.getProcessesByProcessStatus( - this.processStatus, findListOptions, this.useAutoRefreshingSearchBy ? this.autoRefreshInterval : null) + this.processStatus, findListOptions, this.useAutoRefreshingSearchBy ? this.autoRefreshInterval : null), ), // Redirect the user when he is logged out redirectOn4xx(this.router, this.auth), @@ -204,7 +230,7 @@ export class ProcessOverviewTableComponent implements OnInit, OnDestroy { if (!(processesRD.payload.totalElements > 0)) { this.isCollapsed = true; } - } + }, )); } @@ -241,4 +267,4 @@ export class ProcessOverviewTableComponent implements OnInit, OnDestroy { this.processOverviewService.stopAutoRefreshing(this.processStatus); } - } +} diff --git a/src/app/process-page/process-breadcrumb.resolver.ts b/src/app/process-page/process-breadcrumb.resolver.ts index 0058c96b50..dc91dd15e4 100644 --- a/src/app/process-page/process-breadcrumb.resolver.ts +++ b/src/app/process-page/process-breadcrumb.resolver.ts @@ -1,14 +1,18 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { BreadcrumbConfig } from '../breadcrumbs/breadcrumb/breadcrumb-config.model'; -import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { ProcessDataService } from '../core/data/processes/process-data.service'; +import { RemoteData } from '../core/data/remote-data'; +import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { followLink } from '../shared/utils/follow-link-config.model'; import { ProcessBreadcrumbsService } from './process-breadcrumbs.service'; -import { RemoteData } from '../core/data/remote-data'; import { Process } from './processes/process.model'; /** @@ -35,7 +39,7 @@ export class ProcessBreadcrumbResolver implements Resolve>>; + files?: Observable>>; /** * The filetypes present in this Process * Will be undefined unless the output {@link HALLink} has been resolved. */ @link(FILETYPES) - filetypes?: Observable>; + filetypes?: Observable>; } diff --git a/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts b/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts index b86b34c55b..eb6d40bcfc 100644 --- a/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts +++ b/src/app/profile-page/profile-page-metadata-form/profile-page-metadata-form.component.ts @@ -1,6 +1,15 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { + Component, + Input, + OnInit, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { DynamicFormControlModel, DynamicFormValueControlModel, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; +import { + DynamicFormControlModel, + DynamicFormValueControlModel, + DynamicInputModel, + DynamicSelectModel, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; import cloneDeep from 'lodash/cloneDeep'; @@ -8,8 +17,14 @@ import { LangConfig } from '../../../config/lang-config.interface'; import { environment } from '../../../environments/environment'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { EPerson } from '../../core/eperson/models/eperson.model'; -import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { + getFirstSucceededRemoteData, + getRemoteDataPayload, +} from '../../core/shared/operators'; +import { + hasValue, + isNotEmpty, +} from '../../shared/empty.util'; import { FormBuilderService } from '../../shared/form/builder/form-builder.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; diff --git a/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts b/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts index 9223a3ba11..dc6ecab63b 100644 --- a/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts +++ b/src/app/profile-page/profile-page-security-form/profile-page-security-form.component.ts @@ -1,13 +1,26 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnInit, + Output, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core'; +import { + DynamicFormControlModel, + DynamicFormService, + DynamicInputModel, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { debounceTimeWorkaround as debounceTime } from '../../core/shared/operators'; -import { hasValue, isEmpty } from '../../shared/empty.util'; +import { + hasValue, + isEmpty, +} from '../../shared/empty.util'; import { NotificationsService } from '../../shared/notifications/notifications.service'; @Component({ @@ -48,7 +61,7 @@ export class ProfilePageSecurityFormComponent implements OnInit { name: 'passwordrepeat', inputType: 'password', autoComplete: 'new-password', - }) + }), ]; /** diff --git a/src/app/profile-page/profile-page.module.ts b/src/app/profile-page/profile-page.module.ts index 088e63c761..8420b5baa2 100644 --- a/src/app/profile-page/profile-page.module.ts +++ b/src/app/profile-page/profile-page.module.ts @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { UiSwitchModule } from 'ngx-ui-switch'; +import { NotificationsModule } from '../notifications/notifications.module'; import { FormModule } from '../shared/form/form.module'; import { SharedModule } from '../shared/shared.module'; import { ProfileClaimItemModalComponent } from './profile-claim-item-modal/profile-claim-item-modal.component'; @@ -11,7 +12,6 @@ import { ProfilePageResearcherFormComponent } from './profile-page-researcher-fo import { ProfilePageRoutingModule } from './profile-page-routing.module'; import { ProfilePageSecurityFormComponent } from './profile-page-security-form/profile-page-security-form.component'; import { ThemedProfilePageComponent } from './themed-profile-page.component'; -import { NotificationsModule } from '../notifications/notifications.module'; @NgModule({ imports: [ @@ -20,7 +20,7 @@ import { NotificationsModule } from '../notifications/notifications.module'; SharedModule, FormModule, UiSwitchModule, - NotificationsModule + NotificationsModule, ], exports: [ ProfilePageComponent, diff --git a/src/app/quality-assurance-notifications-pages/notifications-pages-routing.module.ts b/src/app/quality-assurance-notifications-pages/notifications-pages-routing.module.ts index c98f697eaf..71847a83f5 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-pages-routing.module.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-pages-routing.module.ts @@ -4,18 +4,21 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; -import { NOTIFICATIONS_RECITER_SUGGESTION_PATH, QUALITY_ASSURANCE_EDIT_PATH } from './notifications-pages-routing-paths'; -import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page.component'; -import { AdminNotificationsPublicationClaimPageResolver } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service'; -import { QualityAssuranceTopicsPageComponent } from './quality-assurance-topics-page/quality-assurance-topics-page.component'; -import { QualityAssuranceEventsPageComponent } from './quality-assurance-events-page/quality-assurance-events-page.component'; -import { QualityAssuranceTopicsPageResolver } from './quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; -import { QualityAssuranceEventsPageResolver } from './quality-assurance-events-page/quality-assurance-events-page.resolver'; -import { QualityAssuranceSourcePageComponent } from './quality-assurance-source-page-component/quality-assurance-source-page.component'; -import { QualityAssuranceSourcePageResolver } from './quality-assurance-source-page-component/quality-assurance-source-page-resolver.service'; import { QualityAssuranceBreadcrumbResolver } from '../core/breadcrumbs/quality-assurance-breadcrumb.resolver'; import { QualityAssuranceBreadcrumbService } from '../core/breadcrumbs/quality-assurance-breadcrumb.service'; +import { + NOTIFICATIONS_RECITER_SUGGESTION_PATH, + QUALITY_ASSURANCE_EDIT_PATH, +} from './notifications-pages-routing-paths'; +import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page.component'; +import { AdminNotificationsPublicationClaimPageResolver } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service'; +import { QualityAssuranceEventsPageComponent } from './quality-assurance-events-page/quality-assurance-events-page.component'; +import { QualityAssuranceEventsPageResolver } from './quality-assurance-events-page/quality-assurance-events-page.resolver'; import { SourceDataResolver } from './quality-assurance-source-page-component/quality-assurance-source-data.resolver'; +import { QualityAssuranceSourcePageComponent } from './quality-assurance-source-page-component/quality-assurance-source-page.component'; +import { QualityAssuranceSourcePageResolver } from './quality-assurance-source-page-component/quality-assurance-source-page-resolver.service'; +import { QualityAssuranceTopicsPageComponent } from './quality-assurance-topics-page/quality-assurance-topics-page.component'; +import { QualityAssuranceTopicsPageResolver } from './quality-assurance-topics-page/quality-assurance-topics-page-resolver.service'; @NgModule({ imports: [ @@ -27,13 +30,13 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - reciterSuggestionTargetParams: AdminNotificationsPublicationClaimPageResolver + reciterSuggestionTargetParams: AdminNotificationsPublicationClaimPageResolver, }, data: { title: 'admin.notifications.recitersuggestion.page.title', breadcrumbKey: 'admin.notifications.recitersuggestion', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ AuthenticatedGuard ], @@ -42,13 +45,13 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu pathMatch: 'full', resolve: { breadcrumb: QualityAssuranceBreadcrumbResolver, - openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver + openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { title: 'admin.quality-assurance.page.title', breadcrumbKey: 'admin.quality-assurance', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ AuthenticatedGuard ], @@ -57,13 +60,13 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver + openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { title: 'admin.quality-assurance.page.title', breadcrumbKey: 'admin.quality-assurance', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ AuthenticatedGuard ], @@ -73,13 +76,13 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu resolve: { breadcrumb: I18nBreadcrumbResolver, openaireQualityAssuranceSourceParams: QualityAssuranceSourcePageResolver, - sourceData: SourceDataResolver + sourceData: SourceDataResolver, }, data: { title: 'admin.notifications.source.breadcrumbs', breadcrumbKey: 'admin.notifications.source', - showBreadcrumbsFluid: false - } + showBreadcrumbsFluid: false, + }, }, { canActivate: [ AuthenticatedGuard ], @@ -88,15 +91,15 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu pathMatch: 'full', resolve: { breadcrumb: QualityAssuranceBreadcrumbResolver, - openaireQualityAssuranceEventsParams: QualityAssuranceEventsPageResolver + openaireQualityAssuranceEventsParams: QualityAssuranceEventsPageResolver, }, data: { title: 'admin.notifications.event.page.title', breadcrumbKey: 'admin.notifications.event', - showBreadcrumbsFluid: false - } - } - ]) + showBreadcrumbsFluid: false, + }, + }, + ]), ], providers: [ I18nBreadcrumbResolver, @@ -108,8 +111,8 @@ import { SourceDataResolver } from './quality-assurance-source-page-component/qu QualityAssuranceEventsPageResolver, QualityAssuranceSourcePageResolver, QualityAssuranceBreadcrumbResolver, - QualityAssuranceBreadcrumbService - ] + QualityAssuranceBreadcrumbService, + ], }) /** * Routing module for the Notifications section of the admin sidebar diff --git a/src/app/quality-assurance-notifications-pages/notifications-pages.module.ts b/src/app/quality-assurance-notifications-pages/notifications-pages.module.ts index 2c16696719..baf4f8357f 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-pages.module.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-pages.module.ts @@ -1,13 +1,14 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { NotificationsPageRoutingModule } from './notifications-pages-routing.module'; -import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page.component'; -import { QualityAssuranceTopicsPageComponent } from './quality-assurance-topics-page/quality-assurance-topics-page.component'; -import { QualityAssuranceEventsPageComponent } from './quality-assurance-events-page/quality-assurance-events-page.component'; -import { QualityAssuranceSourcePageComponent } from './quality-assurance-source-page-component/quality-assurance-source-page.component'; + +import { CoreModule } from '../core/core.module'; import { NotificationsModule } from '../notifications/notifications.module'; import { SharedModule } from '../shared/shared.module'; -import { CoreModule } from '../core/core.module'; +import { NotificationsPageRoutingModule } from './notifications-pages-routing.module'; +import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page/notifications-suggestion-targets-page.component'; +import { QualityAssuranceEventsPageComponent } from './quality-assurance-events-page/quality-assurance-events-page.component'; +import { QualityAssuranceSourcePageComponent } from './quality-assurance-source-page-component/quality-assurance-source-page.component'; +import { QualityAssuranceTopicsPageComponent } from './quality-assurance-topics-page/quality-assurance-topics-page.component'; @NgModule({ imports: [ @@ -15,15 +16,15 @@ import { CoreModule } from '../core/core.module'; SharedModule, CoreModule.forRoot(), NotificationsPageRoutingModule, - NotificationsModule + NotificationsModule, ], declarations: [ NotificationsSuggestionTargetsPageComponent, QualityAssuranceTopicsPageComponent, QualityAssuranceEventsPageComponent, - QualityAssuranceSourcePageComponent + QualityAssuranceSourcePageComponent, ], - entryComponents: [] + entryComponents: [], }) /** * This module handles all components related to the notifications pages diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service.ts index 783387281e..13bcffbd5c 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; /** * Interface for the route parameters. @@ -29,7 +33,7 @@ export class AdminNotificationsPublicationClaimPageResolver implements Resolve { let component: NotificationsSuggestionTargetsPageComponent; @@ -16,17 +18,17 @@ describe('NotificationsSuggestionTargetsPageComponent', () => { TestBed.configureTestingModule({ imports: [ CommonModule, - TranslateModule.forRoot() + TranslateModule.forRoot(), ], declarations: [ - NotificationsSuggestionTargetsPageComponent + NotificationsSuggestionTargetsPageComponent, ], providers: [ - AdminNotificationsPublicationClaimPageComponent + AdminNotificationsPublicationClaimPageComponent, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts index 65b7f7667e..fcf583657b 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts @@ -3,7 +3,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'ds-notifications-reciter-page', templateUrl: './notifications-suggestion-targets-page.component.html', - styleUrls: ['./notifications-suggestion-targets-page.component.scss'] + styleUrls: ['./notifications-suggestion-targets-page.component.scss'], }) export class NotificationsSuggestionTargetsPageComponent { diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.spec.ts index 8f504c4bdf..7915c8d7e6 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.spec.ts @@ -1,5 +1,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { + async, + ComponentFixture, + TestBed, +} from '@angular/core/testing'; + import { QualityAssuranceEventsPageComponent } from './quality-assurance-events-page.component'; describe('QualityAssuranceEventsPageComponent', () => { @@ -9,7 +14,7 @@ describe('QualityAssuranceEventsPageComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ QualityAssuranceEventsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) .compileComponents(); })); diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.ts index 0f9ddd509f..9959f1190d 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component.ts @@ -5,7 +5,7 @@ import { Component } from '@angular/core'; */ @Component({ selector: 'ds-quality-assurance-events-page', - templateUrl: './quality-assurance-events-page.component.html' + templateUrl: './quality-assurance-events-page.component.html', }) export class QualityAssuranceEventsPageComponent { diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver.ts index 75b5678f79..6feaa4ac1d 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; /** * Interface for the route parameters. diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts index 290616c4eb..5228a77b62 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts @@ -1,11 +1,17 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + Router, + RouterStateSnapshot, +} from '@angular/router'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; + +import { environment } from '../../../environments/environment'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { QualityAssuranceSourceObject } from '../../core/notifications/qa/models/quality-assurance-source.model'; import { QualityAssuranceSourceService } from '../../notifications/qa/source/quality-assurance-source.service'; -import { environment } from '../../../environments/environment'; /** * This class represents a resolver that retrieve the route data before the route is activated. diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service.ts index 0c41a63642..55278f86d5 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page-resolver.service.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; /** * Interface for the route parameters. diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page.component.spec.ts index 8fa34d84d9..3a89aaa385 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-page.component.spec.ts @@ -1,5 +1,8 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { QualityAssuranceSourcePageComponent } from './quality-assurance-source-page.component'; @@ -10,9 +13,9 @@ describe('QualityAssuranceSourcePageComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ QualityAssuranceSourcePageComponent ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service.ts index 87c35faf74..b8f2cda536 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page-resolver.service.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; /** * Interface for the route parameters. diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.spec.ts index fe3614a770..c95f8cc8ec 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.spec.ts @@ -1,5 +1,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { + async, + ComponentFixture, + TestBed, +} from '@angular/core/testing'; + import { QualityAssuranceTopicsPageComponent } from './quality-assurance-topics-page.component'; describe('QualityAssuranceTopicsPageComponent', () => { @@ -9,9 +14,9 @@ describe('QualityAssuranceTopicsPageComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ QualityAssuranceTopicsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.ts index af0c8085af..5db1d3de02 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-topics-page/quality-assurance-topics-page.component.ts @@ -5,7 +5,7 @@ import { Component } from '@angular/core'; */ @Component({ selector: 'ds-notification-qa-page', - templateUrl: './quality-assurance-topics-page.component.html' + templateUrl: './quality-assurance-topics-page.component.html', }) export class QualityAssuranceTopicsPageComponent { diff --git a/src/app/root/root.component.ts b/src/app/root/root.component.ts index c7dd106121..6cfa095dbf 100644 --- a/src/app/root/root.component.ts +++ b/src/app/root/root.component.ts @@ -1,17 +1,30 @@ -import { first, map, skipWhile, startWith } from 'rxjs/operators'; -import { Component, Input, OnInit } from '@angular/core'; +import { + Component, + Input, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; +import { + combineLatest as combineLatestObservable, + Observable, + of, +} from 'rxjs'; +import { + first, + map, + skipWhile, + startWith, +} from 'rxjs/operators'; +import { INotificationBoardOptions } from 'src/config/notifications-config.interfaces'; -import { combineLatest as combineLatestObservable, Observable, of } from 'rxjs'; -import { CSSVariableService } from '../shared/sass-helper/css-variable.service'; -import { MenuService } from '../shared/menu/menu.service'; -import { HostWindowService } from '../shared/host-window.service'; import { ThemeConfig } from '../../config/theme.config'; import { environment } from '../../environments/environment'; import { getPageInternalServerErrorRoute } from '../app-routing-paths'; -import { INotificationBoardOptions } from 'src/config/notifications-config.interfaces'; import { slideSidebarPadding } from '../shared/animations/slide'; +import { HostWindowService } from '../shared/host-window.service'; +import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; +import { CSSVariableService } from '../shared/sass-helper/css-variable.service'; @Component({ selector: 'ds-root', diff --git a/src/app/search-navbar/search-navbar.component.spec.ts b/src/app/search-navbar/search-navbar.component.spec.ts index 35a9757b43..2a0a59ac16 100644 --- a/src/app/search-navbar/search-navbar.component.spec.ts +++ b/src/app/search-navbar/search-navbar.component.spec.ts @@ -1,10 +1,25 @@ -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; import { By } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NavigationExtras, Router } from '@angular/router'; +import { + NavigationExtras, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { SearchService } from '../core/shared/search/search.service'; import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; diff --git a/src/app/search-navbar/search-navbar.component.ts b/src/app/search-navbar/search-navbar.component.ts index 16a7609897..b1ddc52f97 100644 --- a/src/app/search-navbar/search-navbar.component.ts +++ b/src/app/search-navbar/search-navbar.component.ts @@ -1,4 +1,8 @@ -import { Component, ElementRef, ViewChild } from '@angular/core'; +import { + Component, + ElementRef, + ViewChild, +} from '@angular/core'; import { UntypedFormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; @@ -67,7 +71,7 @@ export class SearchNavbarComponent { this.searchForm.reset(); this.router.navigate(linkToNavigateTo, { - queryParams: queryParams + queryParams: queryParams, }); } } diff --git a/src/app/search-page/configuration-search-page.component.ts b/src/app/search-page/configuration-search-page.component.ts index 1b47ca60b7..e919bcb396 100644 --- a/src/app/search-page/configuration-search-page.component.ts +++ b/src/app/search-page/configuration-search-page.component.ts @@ -5,6 +5,10 @@ import { } from '@angular/core'; import { Router } from '@angular/router'; +import { + APP_CONFIG, + AppConfig, +} from '../../config/app-config.interface'; import { RouteService } from '../core/services/route.service'; import { SearchService } from '../core/shared/search/search.service'; import { SearchConfigurationService } from '../core/shared/search/search-configuration.service'; @@ -13,7 +17,6 @@ import { pushInOut } from '../shared/animations/push'; import { HostWindowService } from '../shared/host-window.service'; import { SearchComponent } from '../shared/search/search.component'; import { SidebarService } from '../shared/sidebar/sidebar.service'; -import { APP_CONFIG, AppConfig } from '../../config/app-config.interface'; /** * This component renders a search page using a configuration as input. diff --git a/src/app/shared/abstract-component-loader/abstract-component-loader.component.ts b/src/app/shared/abstract-component-loader/abstract-component-loader.component.ts index 76b30fa10b..5b52ed7b48 100644 --- a/src/app/shared/abstract-component-loader/abstract-component-loader.component.ts +++ b/src/app/shared/abstract-component-loader/abstract-component-loader.component.ts @@ -1,8 +1,21 @@ -import { Component, ComponentRef, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core'; -import { ThemeService } from '../theme-support/theme.service'; -import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { hasValue, isNotEmpty } from '../empty.util'; +import { + Component, + ComponentRef, + OnChanges, + OnDestroy, + OnInit, + SimpleChanges, + ViewChild, + ViewContainerRef, +} from '@angular/core'; import { Subscription } from 'rxjs'; + +import { GenericConstructor } from '../../core/shared/generic-constructor'; +import { + hasValue, + isNotEmpty, +} from '../empty.util'; +import { ThemeService } from '../theme-support/theme.service'; import { DynamicComponentLoaderDirective } from './dynamic-component-loader.directive'; /** diff --git a/src/app/shared/abstract-component-loader/dynamic-component-loader.directive.ts b/src/app/shared/abstract-component-loader/dynamic-component-loader.directive.ts index 8c77df1cdb..b670b7bea4 100644 --- a/src/app/shared/abstract-component-loader/dynamic-component-loader.directive.ts +++ b/src/app/shared/abstract-component-loader/dynamic-component-loader.directive.ts @@ -1,10 +1,13 @@ -import { Directive, ViewContainerRef } from '@angular/core'; +import { + Directive, + ViewContainerRef, +} from '@angular/core'; /** * Directive used as a hook to know where to inject the dynamic loaded component */ @Directive({ - selector: '[dsDynamicComponentLoader]' + selector: '[dsDynamicComponentLoader]', }) export class DynamicComponentLoaderDirective { diff --git a/src/app/shared/animations/slide.ts b/src/app/shared/animations/slide.ts index 659e9c873e..92e5084d81 100644 --- a/src/app/shared/animations/slide.ts +++ b/src/app/shared/animations/slide.ts @@ -1,4 +1,11 @@ -import { animate, group, state, style, transition, trigger } from '@angular/animations'; +import { + animate, + group, + state, + style, + transition, + trigger, +} from '@angular/animations'; export const slide = trigger('slide', [ state('expanded', style({ height: '*' })), diff --git a/src/app/shared/auth-nav-menu/auth-nav-menu.component.spec.ts b/src/app/shared/auth-nav-menu/auth-nav-menu.component.spec.ts index acc026bc7e..f14979ecba 100644 --- a/src/app/shared/auth-nav-menu/auth-nav-menu.component.spec.ts +++ b/src/app/shared/auth-nav-menu/auth-nav-menu.component.spec.ts @@ -1,18 +1,32 @@ -import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { + CUSTOM_ELEMENTS_SCHEMA, + DebugElement, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { Store, StoreModule } from '@ngrx/store'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { + Store, + StoreModule, +} from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { of } from 'rxjs'; import { AppState } from '../../app.reducer'; -import { authReducer, AuthState } from '../../core/auth/auth.reducer'; +import { + authReducer, + AuthState, +} from '../../core/auth/auth.reducer'; import { AuthService } from '../../core/auth/auth.service'; import { AuthTokenInfo } from '../../core/auth/models/auth-token-info.model'; import { HostWindowService } from '../host-window.service'; import { BrowserOnlyMockPipe } from '../testing/browser-only-mock.pipe'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { EPersonMock } from '../testing/eperson.mock'; import { HostWindowServiceStub } from '../testing/host-window-service.stub'; import { AuthNavMenuComponent } from './auth-nav-menu.component'; diff --git a/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts b/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts index ece29901bd..878ffa9e03 100644 --- a/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts +++ b/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts @@ -1,14 +1,40 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; import { RouterReducerState } from '@ngrx/router-store'; -import { select, Store } from '@ngrx/store'; -import { Observable, of as observableOf, Subscription } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { + select, + Store, +} from '@ngrx/store'; +import { + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + filter, + map, +} from 'rxjs/operators'; -import { AppState, routerStateSelector } from '../../app.reducer'; -import { AuthService, LOGIN_ROUTE, LOGOUT_ROUTE } from '../../core/auth/auth.service'; -import { isAuthenticated, isAuthenticationLoading } from '../../core/auth/selectors'; +import { + AppState, + routerStateSelector, +} from '../../app.reducer'; +import { + AuthService, + LOGIN_ROUTE, + LOGOUT_ROUTE, +} from '../../core/auth/auth.service'; +import { + isAuthenticated, + isAuthenticationLoading, +} from '../../core/auth/selectors'; import { EPerson } from '../../core/eperson/models/eperson.model'; -import { fadeInOut, fadeOut } from '../animations/fade'; +import { + fadeInOut, + fadeOut, +} from '../animations/fade'; import { isNotUndefined } from '../empty.util'; import { HostWindowService } from '../host-window.service'; diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts index 5c69987003..20f8657211 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts @@ -1,13 +1,30 @@ -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { Store, StoreModule } from '@ngrx/store'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + Store, + StoreModule, +} from '@ngrx/store'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { cold } from 'jasmine-marbles'; import { of } from 'rxjs'; import { AppState } from '../../../app.reducer'; -import { authReducer, AuthState } from '../../../core/auth/auth.reducer'; +import { + authReducer, + AuthState, +} from '../../../core/auth/auth.reducer'; import { AuthService } from '../../../core/auth/auth.service'; import { AuthTokenInfo } from '../../../core/auth/models/auth-token-info.model'; import { TranslateLoaderMock } from '../../mocks/translate-loader.mock'; diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts index 77c1098495..d171eb7d01 100644 --- a/src/app/shared/browse-by/browse-by.component.spec.ts +++ b/src/app/shared/browse-by/browse-by.component.spec.ts @@ -1,12 +1,30 @@ import { CommonModule } from '@angular/common'; -import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; + +import { AccessControlRoutingModule } from '../../access-control/access-control-routing.module'; +import { BrowseByRoutingModule } from '../../browse-by/browse-by-routing.module'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; import { buildPaginatedList } from '../../core/data/paginated-list.model'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { PaginationService } from '../../core/pagination/pagination.service'; @@ -21,7 +39,10 @@ import { ViewMode } from '../../core/shared/view-mode.model'; import { HostWindowService } from '../host-window.service'; import { getMockThemeService } from '../mocks/theme-service.mock'; import { TranslateLoaderMock } from '../mocks/translate-loader.mock'; -import { DEFAULT_CONTEXT, listableObjectComponent } from '../object-collection/shared/listable-object/listable-object.decorator'; +import { + DEFAULT_CONTEXT, + listableObjectComponent, +} from '../object-collection/shared/listable-object/listable-object.decorator'; import { ListableObjectComponentLoaderComponent } from '../object-collection/shared/listable-object/listable-object-component-loader.component'; import { BrowseEntryListElementComponent } from '../object-list/browse-entry-list-element/browse-entry-list-element.component'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; @@ -36,16 +57,11 @@ import { createPaginatedList } from '../testing/utils.test'; import { ThemeService } from '../theme-support/theme.service'; import { BrowseByComponent } from './browse-by.component'; -import { AccessControlRoutingModule } from '../../access-control/access-control-routing.module'; -import { BrowseByRoutingModule } from '../../browse-by/browse-by-routing.module'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { ConfigurationDataService } from '../../core/data/configuration-data.service'; - @listableObjectComponent(BrowseEntry, ViewMode.ListElement, DEFAULT_CONTEXT, 'dspace') @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'ds-browse-entry-list-element', - template: '' + template: '', }) class MockThemedBrowseEntryListElementComponent { } @@ -199,12 +215,12 @@ describe('BrowseByComponent', () => { }); it('should use the themed component to render browse entries', () => { - const componentLoaders = fixture.debugElement.queryAll(By.directive(ListableObjectComponentLoaderComponent)); - expect(componentLoaders.length).toEqual(browseEntries.length); - componentLoaders.forEach((componentLoader) => { - const browseEntry = componentLoader.query(By.css('ds-browse-entry-list-element')); - expect(browseEntry.componentInstance).toBeInstanceOf(MockThemedBrowseEntryListElementComponent); - }); + const componentLoaders = fixture.debugElement.queryAll(By.directive(ListableObjectComponentLoaderComponent)); + expect(componentLoaders.length).toEqual(browseEntries.length); + componentLoaders.forEach((componentLoader) => { + const browseEntry = componentLoader.query(By.css('ds-browse-entry-list-element')); + expect(browseEntry.componentInstance).toBeInstanceOf(MockThemedBrowseEntryListElementComponent); + }); }); }); }); diff --git a/src/app/shared/browse-by/browse-by.component.ts b/src/app/shared/browse-by/browse-by.component.ts index 7b8699dc05..e24e410dec 100644 --- a/src/app/shared/browse-by/browse-by.component.ts +++ b/src/app/shared/browse-by/browse-by.component.ts @@ -1,18 +1,39 @@ -import { Component, EventEmitter, Injector, Input, OnChanges, OnDestroy, OnInit, Output } from '@angular/core'; -import { RemoteData } from '../../core/data/remote-data'; +import { + Component, + EventEmitter, + Injector, + Input, + OnChanges, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../core/data/paginated-list.model'; -import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { fadeIn, fadeInOut } from '../animations/fade'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; -import { ListableObject } from '../object-collection/shared/listable-object.model'; -import { StartsWithType } from '../starts-with/starts-with-decorator'; +import { RemoteData } from '../../core/data/remote-data'; import { PaginationService } from '../../core/pagination/pagination.service'; import { RouteService } from '../../core/services/route.service'; import { ViewMode } from '../../core/shared/view-mode.model'; +import { + fadeIn, + fadeInOut, +} from '../animations/fade'; import { hasValue } from '../empty.util'; -import { map } from 'rxjs/operators'; -import { TranslateService } from '@ngx-translate/core'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; +import { StartsWithType } from '../starts-with/starts-with-decorator'; @Component({ selector: 'ds-browse-by', diff --git a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts index 4316196b34..920ca07f99 100644 --- a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts +++ b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts @@ -1,9 +1,27 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { map, take } from 'rxjs/operators'; -import { EventType, Router, Scroll } from '@angular/router'; -import { getCommunityPageRoute } from '../../../community-page/community-page-routing-paths'; +import { + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + EventType, + Router, + Scroll, +} from '@angular/router'; +import { + BehaviorSubject, + combineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + map, + take, +} from 'rxjs/operators'; + import { getCollectionPageRoute } from '../../../collection-page/collection-page-routing-paths'; +import { getCommunityPageRoute } from '../../../community-page/community-page-routing-paths'; import { BrowseService } from '../../../core/browse/browse.service'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; @@ -88,7 +106,7 @@ export class ComcolPageBrowseByComponent implements OnDestroy, OnInit { this.router.events, ]).subscribe(([navOptions, scrollEvent]: [ComColPageNavOption[], Scroll]) => { if (scrollEvent.type === EventType.Scroll) { - for (let option of navOptions) { + for (const option of navOptions) { if (option.routerLink === scrollEvent.routerEvent.urlAfterRedirects.split('?')[0]) { this.currentOption$.next(option); } @@ -105,7 +123,7 @@ export class ComcolPageBrowseByComponent implements OnDestroy, OnInit { this.allOptions$.pipe( take(1), ).subscribe((allOptions: ComColPageNavOption[]) => { - for (let option of allOptions) { + for (const option of allOptions) { if (option.id === event.target.value) { this.currentOption$.next(option[0]); void this.router.navigate([option.routerLink], { queryParams: option.params }); diff --git a/src/app/shared/comcol/comcol.module.ts b/src/app/shared/comcol/comcol.module.ts index 69e14ab7a1..36bfb5b43f 100644 --- a/src/app/shared/comcol/comcol.module.ts +++ b/src/app/shared/comcol/comcol.module.ts @@ -1,7 +1,9 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { BrowseByModule } from '../../browse-by/browse-by.module'; import { FormModule } from '../form/form.module'; +import { SearchModule } from '../search/search.module'; import { SharedModule } from '../shared.module'; import { UploadModule } from '../upload/upload.module'; import { ComColFormComponent } from './comcol-forms/comcol-form/comcol-form.component'; @@ -11,15 +13,13 @@ import { ComcolRoleComponent } from './comcol-forms/edit-comcol-page/comcol-role import { EditComColPageComponent } from './comcol-forms/edit-comcol-page/edit-comcol-page.component'; import { ComcolPageBrowseByComponent } from './comcol-page-browse-by/comcol-page-browse-by.component'; import { ThemedComcolPageBrowseByComponent } from './comcol-page-browse-by/themed-comcol-page-browse-by.component'; -import { ComcolBrowseByComponent } from './sections/comcol-browse-by/comcol-browse-by.component'; -import { BrowseByModule } from '../../browse-by/browse-by.module'; -import { SearchModule } from '../search/search.module'; -import { ComcolSearchSectionComponent } from './sections/comcol-search-section/comcol-search-section.component'; import { ComcolPageContentComponent } from './comcol-page-content/comcol-page-content.component'; import { ComcolPageHandleComponent } from './comcol-page-handle/comcol-page-handle.component'; +import { ThemedComcolPageHandleComponent } from './comcol-page-handle/themed-comcol-page-handle.component'; import { ComcolPageHeaderComponent } from './comcol-page-header/comcol-page-header.component'; import { ComcolPageLogoComponent } from './comcol-page-logo/comcol-page-logo.component'; -import { ThemedComcolPageHandleComponent } from './comcol-page-handle/themed-comcol-page-handle.component'; +import { ComcolBrowseByComponent } from './sections/comcol-browse-by/comcol-browse-by.component'; +import { ComcolSearchSectionComponent } from './sections/comcol-search-section/comcol-search-section.component'; const COMPONENTS = [ ComcolPageContentComponent, diff --git a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts index 92db93b6ab..e5b8c2dbbb 100644 --- a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts +++ b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts @@ -1,17 +1,21 @@ // eslint-disable-next-line max-classes-per-file -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ComcolBrowseByComponent } from './comcol-browse-by.component'; -import { rendersBrowseBy } from '../../../../browse-by/browse-by-switcher/browse-by-decorator'; -import { BrowseByDataType } from '../../../../browse-by/browse-by-switcher/browse-by-data-type'; import { Component } from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; + +import { BrowseByDataType } from '../../../../browse-by/browse-by-switcher/browse-by-data-type'; +import { rendersBrowseBy } from '../../../../browse-by/browse-by-switcher/browse-by-decorator'; +import { BrowseBySwitcherComponent } from '../../../../browse-by/browse-by-switcher/browse-by-switcher.component'; import { BrowseDefinition } from '../../../../core/shared/browse-definition.model'; +import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; +import { getMockThemeService } from '../../../mocks/theme-service.mock'; import { ActivatedRouteStub } from '../../../testing/active-router.stub'; import { ThemeService } from '../../../theme-support/theme.service'; -import { getMockThemeService } from '../../../mocks/theme-service.mock'; -import { BrowseBySwitcherComponent } from '../../../../browse-by/browse-by-switcher/browse-by-switcher.component'; -import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; -import { ActivatedRoute } from '@angular/router'; -import { By } from '@angular/platform-browser'; +import { ComcolBrowseByComponent } from './comcol-browse-by.component'; @rendersBrowseBy('ComcolBrowseByComponent' as BrowseByDataType) @Component({ diff --git a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.ts b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.ts index 76aa6c6981..0712632318 100644 --- a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.ts +++ b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.ts @@ -1,8 +1,15 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Data, +} from '@angular/router'; import { Observable } from 'rxjs'; -import { BrowseByDataType } from '../../../../browse-by/browse-by-switcher/browse-by-data-type'; -import { ActivatedRoute, Data } from '@angular/router'; import { map } from 'rxjs/operators'; + +import { BrowseByDataType } from '../../../../browse-by/browse-by-switcher/browse-by-data-type'; import { BrowseDefinition } from '../../../../core/shared/browse-definition.model'; @Component({ diff --git a/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.spec.ts b/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.spec.ts index 6b1f9236b1..9a64cbc59d 100644 --- a/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.spec.ts +++ b/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.spec.ts @@ -1,9 +1,13 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ComcolSearchSectionComponent } from './comcol-search-section.component'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; -import { ActivatedRouteStub } from '../../../testing/active-router.stub'; + import { APP_CONFIG } from '../../../../../config/app-config.interface'; import { environment } from '../../../../../environments/environment.test'; +import { ActivatedRouteStub } from '../../../testing/active-router.stub'; +import { ComcolSearchSectionComponent } from './comcol-search-section.component'; describe('ComcolSearchSectionComponent', () => { let component: ComcolSearchSectionComponent; diff --git a/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.ts b/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.ts index 107cacc74e..7e68610045 100644 --- a/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.ts +++ b/src/app/shared/comcol/sections/comcol-search-section/comcol-search-section.component.ts @@ -1,13 +1,24 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { + Component, + Inject, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Data, +} from '@angular/router'; import { Observable } from 'rxjs'; -import { ActivatedRoute, Data } from '@angular/router'; import { map } from 'rxjs/operators'; -import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; -import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; + +import { + APP_CONFIG, + AppConfig, +} from '../../../../../config/app-config.interface'; import { RemoteData } from '../../../../core/data/remote-data'; -import { Community } from '../../../../core/shared/community.model'; import { Collection } from '../../../../core/shared/collection.model'; -import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; +import { Community } from '../../../../core/shared/community.model'; +import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; import { hasValue } from '../../../empty.util'; /** diff --git a/src/app/shared/confirmation-modal/confirmation-modal.component.ts b/src/app/shared/confirmation-modal/confirmation-modal.component.ts index 600c1582a8..53db9ce402 100644 --- a/src/app/shared/confirmation-modal/confirmation-modal.component.ts +++ b/src/app/shared/confirmation-modal/confirmation-modal.component.ts @@ -1,4 +1,9 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; @Component({ diff --git a/src/app/shared/context-help.directive.ts b/src/app/shared/context-help.directive.ts index f3ee24f0cc..b5a5739348 100644 --- a/src/app/shared/context-help.directive.ts +++ b/src/app/shared/context-help.directive.ts @@ -1,4 +1,12 @@ -import { ComponentRef, Directive, Input, OnChanges, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core'; +import { + ComponentRef, + Directive, + Input, + OnChanges, + OnDestroy, + TemplateRef, + ViewContainerRef, +} from '@angular/core'; import { PlacementArray } from '@ng-bootstrap/ng-bootstrap/util/positioning'; import { ContextHelpService } from './context-help.service'; diff --git a/src/app/shared/correction-suggestion/withdrawn-reinstate-modal.component.ts b/src/app/shared/correction-suggestion/withdrawn-reinstate-modal.component.ts index de842eb1e5..6fb0963511 100644 --- a/src/app/shared/correction-suggestion/withdrawn-reinstate-modal.component.ts +++ b/src/app/shared/correction-suggestion/withdrawn-reinstate-modal.component.ts @@ -1,13 +1,18 @@ -import { Component, EventEmitter, Output } from '@angular/core'; -import { ModalBeforeDismiss } from '../interfaces/modal-before-dismiss.interface'; +import { + Component, + EventEmitter, + Output, +} from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { BehaviorSubject } from 'rxjs'; + import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; +import { ModalBeforeDismiss } from '../interfaces/modal-before-dismiss.interface'; @Component({ selector: 'ds-item-withdrawn-reinstate-modal', templateUrl: './item-withdrawn-reinstate-modal.component.html', - styleUrls: ['./item-withdrawn-reinstate-modal.component.scss'] + styleUrls: ['./item-withdrawn-reinstate-modal.component.scss'], }) /** * Represents a modal component for withdrawing or reinstating an item. diff --git a/src/app/shared/dso-page/dso-edit-menu.resolver.spec.ts b/src/app/shared/dso-page/dso-edit-menu.resolver.spec.ts index 4673de1413..318a41ce25 100644 --- a/src/app/shared/dso-page/dso-edit-menu.resolver.spec.ts +++ b/src/app/shared/dso-page/dso-edit-menu.resolver.spec.ts @@ -1,11 +1,22 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import flatten from 'lodash/flatten'; -import { combineLatest, map, of as observableOf } from 'rxjs'; +import { + combineLatest, + map, + of as observableOf, +} from 'rxjs'; +import { CorrectionTypeDataService } from 'src/app/core/submission/correctiontype-data.service'; import { AdminSidebarComponent } from '../../admin/admin-sidebar/admin-sidebar.component'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; @@ -20,13 +31,15 @@ import { MenuID } from '../menu/menu-id.model'; import { LinkMenuItemModel } from '../menu/menu-item/models/link.model'; import { MenuItemType } from '../menu/menu-item-type.model'; import { NotificationsService } from '../notifications/notifications.service'; -import { DsoWithdrawnReinstateModalService } from './dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; -import { CorrectionTypeDataService } from 'src/app/core/submission/correctiontype-data.service'; -import { createPaginatedList } from '../testing/utils.test'; -import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../remote-data.utils'; import { MenuServiceStub } from '../testing/menu-service.stub'; +import { createPaginatedList } from '../testing/utils.test'; import { DSOEditMenuResolver } from './dso-edit-menu.resolver'; import { DsoVersioningModalService } from './dso-versioning-modal-service/dso-versioning-modal.service'; +import { DsoWithdrawnReinstateModalService } from './dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; describe('DSOEditMenuResolver', () => { @@ -159,15 +172,15 @@ describe('DSOEditMenuResolver', () => { imports: [TranslateModule.forRoot(), NoopAnimationsModule, RouterTestingModule], declarations: [AdminSidebarComponent], providers: [ - {provide: DSpaceObjectDataService, useValue: dSpaceObjectDataService}, - {provide: MenuService, useValue: menuService}, - {provide: AuthorizationDataService, useValue: authorizationService}, - {provide: DsoVersioningModalService, useValue: dsoVersioningModalService}, - {provide: ResearcherProfileDataService, useValue: researcherProfileService}, - {provide: TranslateService, useValue: translate}, - {provide: NotificationsService, useValue: notificationsService}, - {provide: DsoWithdrawnReinstateModalService, useValue: dsoWithdrawnReinstateModalService}, - {provide: CorrectionTypeDataService, useValue: correctionsDataService}, + { provide: DSpaceObjectDataService, useValue: dSpaceObjectDataService }, + { provide: MenuService, useValue: menuService }, + { provide: AuthorizationDataService, useValue: authorizationService }, + { provide: DsoVersioningModalService, useValue: dsoVersioningModalService }, + { provide: ResearcherProfileDataService, useValue: researcherProfileService }, + { provide: TranslateService, useValue: translate }, + { provide: NotificationsService, useValue: notificationsService }, + { provide: DsoWithdrawnReinstateModalService, useValue: dsoWithdrawnReinstateModalService }, + { provide: CorrectionTypeDataService, useValue: correctionsDataService }, { provide: NgbModal, useValue: { open: () => {/*comment*/ diff --git a/src/app/shared/dso-page/dso-edit-menu.resolver.ts b/src/app/shared/dso-page/dso-edit-menu.resolver.ts index cfd8090868..a40cabf6b0 100644 --- a/src/app/shared/dso-page/dso-edit-menu.resolver.ts +++ b/src/app/shared/dso-page/dso-edit-menu.resolver.ts @@ -1,9 +1,20 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { combineLatest, Observable, of as observableOf } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { + combineLatest, + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; import { getDSORoute } from '../../app-routing-paths'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; @@ -13,9 +24,17 @@ import { ResearcherProfileDataService } from '../../core/profile/researcher-prof import { Collection } from '../../core/shared/collection.model'; import { Community } from '../../core/shared/community.model'; import { Item } from '../../core/shared/item.model'; -import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from '../../core/shared/operators'; +import { CorrectionTypeDataService } from '../../core/submission/correctiontype-data.service'; import { URLCombiner } from '../../core/url-combiner/url-combiner'; -import { hasNoValue, hasValue, isNotEmpty } from '../empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../empty.util'; import { MenuService } from '../menu/menu.service'; import { MenuID } from '../menu/menu-id.model'; import { LinkMenuItemModel } from '../menu/menu-item/models/link.model'; @@ -25,8 +44,11 @@ import { MenuSection } from '../menu/menu-section.model'; import { NotificationsService } from '../notifications/notifications.service'; import { SubscriptionModalComponent } from '../subscriptions/subscription-modal/subscription-modal.component'; import { DsoVersioningModalService } from './dso-versioning-modal-service/dso-versioning-modal.service'; -import { DsoWithdrawnReinstateModalService, REQUEST_REINSTATE, REQUEST_WITHDRAWN } from './dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; -import { CorrectionTypeDataService } from '../../core/submission/correctiontype-data.service'; +import { + DsoWithdrawnReinstateModalService, + REQUEST_REINSTATE, + REQUEST_WITHDRAWN, +} from './dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service'; /** * Creates the menus for the dspace object pages @@ -46,7 +68,7 @@ export class DSOEditMenuResolver implements Resolve<{ [key: string]: MenuSection protected notificationsService: NotificationsService, protected translate: TranslateService, protected dsoWithdrawnReinstateModalService: DsoWithdrawnReinstateModalService, - private correctionTypeDataService: CorrectionTypeDataService + private correctionTypeDataService: CorrectionTypeDataService, ) { } @@ -136,7 +158,7 @@ export class DSOEditMenuResolver implements Resolve<{ [key: string]: MenuSection this.authorizationService.isAuthorized(FeatureID.CanClaimItem, dso.self), this.correctionTypeDataService.findByItem(dso.uuid, false).pipe( getFirstCompletedRemoteData(), - getRemoteDataPayload()) + getRemoteDataPayload()), ]).pipe( map(([canCreateVersion, disableVersioning, versionTooltip, canSynchronizeWithOrcid, canClaimItem, correction]) => { const isPerson = this.getDsoType(dso) === 'person'; @@ -191,10 +213,10 @@ export class DSOEditMenuResolver implements Resolve<{ [key: string]: MenuSection text:'item.page.withdrawn', function: () => { this.dsoWithdrawnReinstateModalService.openCreateWithdrawnReinstateModal(dso, 'request-withdrawn', dso.isArchived); - } + }, } as OnClickMenuItemModel, icon: 'eye-slash', - index: 4 + index: 4, }, { id: 'reinstate-item', @@ -205,11 +227,11 @@ export class DSOEditMenuResolver implements Resolve<{ [key: string]: MenuSection text:'item.page.reinstate', function: () => { this.dsoWithdrawnReinstateModalService.openCreateWithdrawnReinstateModal(dso, 'request-reinstate', dso.isArchived); - } + }, } as OnClickMenuItemModel, icon: 'eye', - index: 5 - } + index: 5, + }, ]; }), ); diff --git a/src/app/shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service.ts b/src/app/shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service.ts index 9e6071c3ad..c52b435af4 100644 --- a/src/app/shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service.ts +++ b/src/app/shared/dso-page/dso-withdrawn-reinstate-service/dso-withdrawn-reinstate-modal.service.ts @@ -1,23 +1,24 @@ import { Injectable } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { Router } from '@angular/router'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateService } from '@ngx-translate/core'; +import { take } from 'rxjs/operators'; +import { Item } from 'src/app/core/shared/item.model'; + +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { ItemDataService } from '../../../core/data/item-data.service'; -import { ItemWithdrawnReinstateModalComponent } from '../../correction-suggestion/withdrawn-reinstate-modal.component'; +import { RemoteData } from '../../../core/data/remote-data'; import { QualityAssuranceEventDataService } from '../../../core/notifications/qa/events/quality-assurance-event-data.service'; import { QualityAssuranceEventObject } from '../../../core/notifications/qa/models/quality-assurance-event.model'; -import { RemoteData } from '../../../core/data/remote-data'; -import { TranslateService } from '@ngx-translate/core'; -import { NotificationsService } from '../../notifications/notifications.service'; -import { take } from 'rxjs/operators'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; -import { Item } from 'src/app/core/shared/item.model'; +import { ItemWithdrawnReinstateModalComponent } from '../../correction-suggestion/withdrawn-reinstate-modal.component'; +import { NotificationsService } from '../../notifications/notifications.service'; export const REQUEST_WITHDRAWN = 'REQUEST/WITHDRAWN'; export const REQUEST_REINSTATE = 'REQUEST/REINSTATE'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) /** * Service for managing the withdrawn/reinstate modal for a DSO. @@ -43,14 +44,14 @@ export class DsoWithdrawnReinstateModalService { const activeModal = this.modalService.open(ItemWithdrawnReinstateModalComponent); (activeModal.componentInstance as ItemWithdrawnReinstateModalComponent).setWithdraw(state); (activeModal.componentInstance as ItemWithdrawnReinstateModalComponent).createQAEvent - .pipe( - take(1) - ).subscribe( - (reasone) => { - this.sendQARequest(target, correctionType, reasone); - activeModal.close(); - } - ); + .pipe( + take(1), + ).subscribe( + (reasone) => { + this.sendQARequest(target, correctionType, reasone); + activeModal.close(); + }, + ); } /** @@ -63,15 +64,15 @@ export class DsoWithdrawnReinstateModalService { * and desplay a notification box. */ sendQARequest(target: string, correctionType: 'request-reinstate' | 'request-withdrawn', reason: string): void { - this.qaEventDataService.postData(target, correctionType, '', reason) - .pipe ( - getFirstCompletedRemoteData() - ) - .subscribe((res: RemoteData) => { - if (res.hasSucceeded) { - const message = (correctionType === 'request-withdrawn') - ? 'correction-type.manage-relation.action.notification.withdrawn' - : 'correction-type.manage-relation.action.notification.reinstate'; + this.qaEventDataService.postData(target, correctionType, '', reason) + .pipe ( + getFirstCompletedRemoteData(), + ) + .subscribe((res: RemoteData) => { + if (res.hasSucceeded) { + const message = (correctionType === 'request-withdrawn') + ? 'correction-type.manage-relation.action.notification.withdrawn' + : 'correction-type.manage-relation.action.notification.reinstate'; this.notificationsService.success(this.translateService.get(message)); this.authorizationService.invalidateAuthorizationsRequestCache(); diff --git a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts index f1b565bb07..58ce2ed3aa 100644 --- a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts +++ b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts @@ -1,20 +1,53 @@ -import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, QueryList, ViewChildren } from '@angular/core'; +import { + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + QueryList, + ViewChildren, +} from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + debounceTime, + map, + startWith, + switchMap, + tap, +} from 'rxjs/operators'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; -import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { Context } from '../../../core/shared/context.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload, +} from '../../../core/shared/operators'; import { SearchService } from '../../../core/shared/search/search.service'; import { ViewMode } from '../../../core/shared/view-mode.model'; -import { hasNoValue, hasValue, isEmpty, isNotEmpty } from '../../empty.util'; +import { + hasNoValue, + hasValue, + isEmpty, + isNotEmpty, +} from '../../empty.util'; import { NotificationType } from '../../notifications/models/notification-type'; import { NotificationsService } from '../../notifications/notifications.service'; import { CollectionElementLinkType } from '../../object-collection/collection-element-link.type'; diff --git a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.spec.ts b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.spec.ts index 4d4271e4e9..63143e5299 100644 --- a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.spec.ts +++ b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.spec.ts @@ -1,7 +1,19 @@ -import { Component, DebugElement, NO_ERRORS_SCHEMA, OnInit } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + Component, + DebugElement, + NO_ERRORS_SCHEMA, + OnInit, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; +import { + ActivatedRoute, + ActivatedRouteSnapshot, +} from '@angular/router'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; import { MockComponent } from 'ng-mocks'; @@ -9,11 +21,14 @@ import { MockComponent } from 'ng-mocks'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model'; import { Item } from '../../../core/shared/item.model'; -import { DSOSelectorModalWrapperComponent, SelectorActionType } from './dso-selector-modal-wrapper.component'; -import { DSOSelectorComponent } from '../dso-selector/dso-selector.component'; import { MetadataValue } from '../../../core/shared/metadata.models'; -import { createSuccessfulRemoteDataObject } from '../../remote-data.utils'; import { hasValue } from '../../empty.util'; +import { createSuccessfulRemoteDataObject } from '../../remote-data.utils'; +import { DSOSelectorComponent } from '../dso-selector/dso-selector.component'; +import { + DSOSelectorModalWrapperComponent, + SelectorActionType, +} from './dso-selector-modal-wrapper.component'; describe('DSOSelectorModalWrapperComponent', () => { let component: DSOSelectorModalWrapperComponent; diff --git a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts index 2fba005d48..51e520df18 100644 --- a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.ts @@ -1,12 +1,24 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { RemoteData } from '../../../core/data/remote-data'; +import { + Component, + EventEmitter, + Input, + OnInit, + Output, +} from '@angular/core'; +import { + ActivatedRoute, + ActivatedRouteSnapshot, +} from '@angular/router'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model'; -import { hasValue, isNotEmpty } from '../../empty.util'; +import { + hasValue, + isNotEmpty, +} from '../../empty.util'; export enum SelectorActionType { CREATE = 'create', diff --git a/src/app/shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component.ts index 730c83e258..645f8d95f6 100644 --- a/src/app/shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/export-batch-selector/export-batch-selector.component.ts @@ -1,13 +1,32 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + NgbActiveModal, + NgbModal, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../../core/data/feature-authorization/feature-id'; -import { BATCH_EXPORT_SCRIPT_NAME, ScriptDataService } from '../../../../core/data/processes/script-data.service'; +import { + BATCH_EXPORT_SCRIPT_NAME, + ScriptDataService, +} from '../../../../core/data/processes/script-data.service'; import { RemoteData } from '../../../../core/data/remote-data'; import { Collection } from '../../../../core/shared/collection.model'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; @@ -20,8 +39,10 @@ import { ConfirmationModalComponent } from '../../../confirmation-modal/confirma import { isNotEmpty } from '../../../empty.util'; import { NotificationsService } from '../../../notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils'; -import { DSOSelectorModalWrapperComponent, SelectorActionType } from '../dso-selector-modal-wrapper.component'; -import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { + DSOSelectorModalWrapperComponent, + SelectorActionType, +} from '../dso-selector-modal-wrapper.component'; /** * Component to wrap a list of existing dso's inside a modal diff --git a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts index 11cb029e2a..3d8708072c 100644 --- a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts @@ -1,13 +1,32 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + NgbActiveModal, + NgbModal, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, of as observableOf } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { + Observable, + of as observableOf, +} from 'rxjs'; +import { + map, + switchMap, +} from 'rxjs/operators'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../../core/data/feature-authorization/feature-id'; -import { METADATA_EXPORT_SCRIPT_NAME, ScriptDataService } from '../../../../core/data/processes/script-data.service'; +import { + METADATA_EXPORT_SCRIPT_NAME, + ScriptDataService, +} from '../../../../core/data/processes/script-data.service'; import { RemoteData } from '../../../../core/data/remote-data'; import { Collection } from '../../../../core/shared/collection.model'; import { Community } from '../../../../core/shared/community.model'; @@ -21,8 +40,10 @@ import { ConfirmationModalComponent } from '../../../confirmation-modal/confirma import { isNotEmpty } from '../../../empty.util'; import { NotificationsService } from '../../../notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils'; -import { DSOSelectorModalWrapperComponent, SelectorActionType } from '../dso-selector-modal-wrapper.component'; -import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { + DSOSelectorModalWrapperComponent, + SelectorActionType, +} from '../dso-selector-modal-wrapper.component'; /** * Component to wrap a list of existing dso's inside a modal diff --git a/src/app/shared/entity-dropdown/entity-dropdown.component.spec.ts b/src/app/shared/entity-dropdown/entity-dropdown.component.spec.ts index cdb59c4fe3..8f4aa57723 100644 --- a/src/app/shared/entity-dropdown/entity-dropdown.component.spec.ts +++ b/src/app/shared/entity-dropdown/entity-dropdown.component.spec.ts @@ -1,5 +1,14 @@ -import { ChangeDetectorRef, NO_ERRORS_SCHEMA, Pipe, PipeTransform } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectorRef, + NO_ERRORS_SCHEMA, + Pipe, + PipeTransform, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { getTestScheduler } from 'jasmine-marbles'; import { TestScheduler } from 'rxjs/testing'; diff --git a/src/app/shared/eperson-group-list/eperson-group-list.component.ts b/src/app/shared/eperson-group-list/eperson-group-list.component.ts index e6f2c48a9a..879a1ad687 100644 --- a/src/app/shared/eperson-group-list/eperson-group-list.component.ts +++ b/src/app/shared/eperson-group-list/eperson-group-list.component.ts @@ -1,6 +1,18 @@ -import { Component, EventEmitter, Injector, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Injector, + Input, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; import uniqueId from 'lodash/uniqueId'; -import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { + BehaviorSubject, + Observable, + Subscription, +} from 'rxjs'; import { map } from 'rxjs/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; @@ -17,7 +29,10 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { ResourceType } from '../../core/shared/resource-type'; import { fadeInOut } from '../animations/fade'; -import { hasValue, isNotEmpty } from '../empty.util'; +import { + hasValue, + isNotEmpty, +} from '../empty.util'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; export interface SearchEvent { diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts index 9e87fb4d7b..66dad034ed 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.component.spec.ts @@ -1,12 +1,23 @@ -import { DynamicFormsCoreModule, DynamicFormService } from '@ng-dynamic-forms/core'; -import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ReactiveFormsModule, + UntypedFormGroup, +} from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { + DynamicFormsCoreModule, + DynamicFormService, +} from '@ng-dynamic-forms/core'; +import { TranslateModule } from '@ngx-translate/core'; import { CustomSwitchComponent } from './custom-switch.component'; import { DynamicCustomSwitchModel } from './custom-switch.model'; -import { TranslateModule } from '@ngx-translate/core'; describe('CustomSwitchComponent', () => { diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts index 405e66b487..c846f053ef 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/dynamic-vocabulary.component.ts @@ -1,7 +1,19 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { DynamicFormControlComponent, DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; -import { Observable, of as observableOf } from 'rxjs'; +import { + DynamicFormControlComponent, + DynamicFormLayoutService, + DynamicFormValidationService, +} from '@ng-dynamic-forms/core'; +import { + Observable, + of as observableOf, +} from 'rxjs'; import { map } from 'rxjs/operators'; import { PageInfo } from '../../../../../core/shared/page-info.model'; @@ -59,7 +71,7 @@ export abstract class DsDynamicVocabularyComponent extends DynamicFormControlCom initValue$ = initEntry$.pipe(map((initEntry: VocabularyEntry) => { if (isNotEmpty(initEntry)) { // Integrate FormFieldMetadataValueObject with retrieved information - let formField = new FormFieldMetadataValueObject( + const formField = new FormFieldMetadataValueObject( initEntry.value, null, initEntry.authority, diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts index 6c4d6aa72f..3712dc25a3 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/onebox/dynamic-onebox.component.ts @@ -1,11 +1,45 @@ -import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; -import { NgbModal, NgbModalRef, NgbTypeahead, NgbTypeaheadSelectItemEvent } from '@ng-bootstrap/ng-bootstrap'; -import { DynamicFormLayoutService, DynamicFormValidationService } from '@ng-dynamic-forms/core'; -import { Observable, of as observableOf, Subject, Subscription } from 'rxjs'; -import { catchError, debounceTime, distinctUntilChanged, filter, map, merge, switchMap, take, tap } from 'rxjs/operators'; +import { + NgbModal, + NgbModalRef, + NgbTypeahead, + NgbTypeaheadSelectItemEvent, +} from '@ng-bootstrap/ng-bootstrap'; +import { + DynamicFormLayoutService, + DynamicFormValidationService, +} from '@ng-dynamic-forms/core'; +import { + Observable, + of as observableOf, + Subject, + Subscription, +} from 'rxjs'; +import { + catchError, + debounceTime, + distinctUntilChanged, + filter, + map, + merge, + switchMap, + take, + tap, +} from 'rxjs/operators'; -import { buildPaginatedList, PaginatedList } from '../../../../../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../../../../../core/data/paginated-list.model'; import { ConfidenceType } from '../../../../../../core/shared/confidence-type'; import { getFirstSucceededRemoteDataPayload } from '../../../../../../core/shared/operators'; import { PageInfo } from '../../../../../../core/shared/page-info.model'; @@ -13,7 +47,12 @@ import { Vocabulary } from '../../../../../../core/submission/vocabularies/model import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry.model'; import { VocabularyEntryDetail } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { VocabularyService } from '../../../../../../core/submission/vocabularies/vocabulary.service'; -import { hasValue, isEmpty, isNotEmpty, isNotNull } from '../../../../../empty.util'; +import { + hasValue, + isEmpty, + isNotEmpty, + isNotNull, +} from '../../../../../empty.util'; import { VocabularyTreeviewModalComponent } from '../../../../vocabulary-treeview-modal/vocabulary-treeview-modal.component'; import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model'; import { DsDynamicVocabularyComponent } from '../dynamic-vocabulary.component'; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts index 9e04c311d9..e90ffb0b81 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.ts @@ -1,12 +1,12 @@ import { ChangeDetectorRef, Component, + ElementRef, EventEmitter, Input, OnInit, Output, ViewChild, - ElementRef } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; @@ -80,9 +80,9 @@ export class DsDynamicScrollableDropdownComponent extends DsDynamicVocabularyCom this.updatePageInfo(this.model.maxOptions, 1); this.loadOptions(true); this.group.get(this.model.id).valueChanges.pipe(distinctUntilChanged()) - .subscribe((value) => { - this.setCurrentValue(value); - }); + .subscribe((value) => { + this.setCurrentValue(value); + }); } loadOptions(fromInit: boolean) { @@ -90,18 +90,18 @@ export class DsDynamicScrollableDropdownComponent extends DsDynamicVocabularyCom this.vocabularyService.getVocabularyEntriesByValue(this.inputText, false, this.model.vocabularyOptions, this.pageInfo).pipe( getFirstSucceededRemoteDataPayload(), catchError(() => observableOf(buildPaginatedList(new PageInfo(), []))), - tap(() => this.loading = false) + tap(() => this.loading = false), ).subscribe((list: PaginatedList) => { this.optionsList = list.page; - if (fromInit && this.model.value) { - this.setCurrentValue(this.model.value, true); - } + if (fromInit && this.model.value) { + this.setCurrentValue(this.model.value, true); + } this.updatePageInfo( list.pageInfo.elementsPerPage, list.pageInfo.currentPage, list.pageInfo.totalElements, - list.pageInfo.totalPages, + list.pageInfo.totalPages, ); this.selectedIndex = 0; this.cdr.detectChanges(); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts index a09b95b595..d3a4c347d4 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts @@ -1,34 +1,61 @@ -import { Component, EventEmitter, NgZone, OnDestroy, OnInit, Output } from '@angular/core'; +import { + Component, + EventEmitter, + NgZone, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; import { Router } from '@angular/router'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { Store } from '@ngrx/store'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; -import { map, skip, switchMap, take } from 'rxjs/operators'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + map, + skip, + switchMap, + take, +} from 'rxjs/operators'; import { AppState } from '../../../../../app.reducer'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; +import { RequestParam } from '../../../../../core/cache/models/request-param.model'; import { ExternalSourceDataService } from '../../../../../core/data/external-source-data.service'; +import { FindListOptions } from '../../../../../core/data/find-list-options.model'; import { LookupRelationService } from '../../../../../core/data/lookup-relation.service'; +import { PaginatedList } from '../../../../../core/data/paginated-list.model'; import { RelationshipDataService } from '../../../../../core/data/relationship-data.service'; import { RelationshipTypeDataService } from '../../../../../core/data/relationship-type-data.service'; import { Context } from '../../../../../core/shared/context.model'; import { ExternalSource } from '../../../../../core/shared/external-source.model'; import { Item } from '../../../../../core/shared/item.model'; import { RelationshipType } from '../../../../../core/shared/item-relationships/relationship-type.model'; -import { getAllSucceededRemoteDataPayload, getFirstSucceededRemoteDataPayload } from '../../../../../core/shared/operators'; +import { + getAllSucceededRemoteDataPayload, + getFirstSucceededRemoteDataPayload, +} from '../../../../../core/shared/operators'; import { SearchConfigurationService } from '../../../../../core/shared/search/search-configuration.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; -import { hasValue, isNotEmpty } from '../../../../empty.util'; +import { + hasValue, + isNotEmpty, +} from '../../../../empty.util'; import { ListableObject } from '../../../../object-collection/shared/listable-object.model'; import { SelectableListState } from '../../../../object-list/selectable-list/selectable-list.reducer'; import { SelectableListService } from '../../../../object-list/selectable-list/selectable-list.service'; import { SearchResult } from '../../../../search/models/search-result.model'; import { followLink } from '../../../../utils/follow-link-config.model'; import { RelationshipOptions } from '../../models/relationship-options.model'; -import { AddRelationshipAction, RemoveRelationshipAction, UpdateRelationshipNameVariantAction } from './relationship.actions'; -import { FindListOptions } from '../../../../../core/data/find-list-options.model'; -import { RequestParam } from '../../../../../core/cache/models/request-param.model'; -import { PaginatedList } from '../../../../../core/data/paginated-list.model'; +import { + AddRelationshipAction, + RemoveRelationshipAction, + UpdateRelationshipNameVariantAction, +} from './relationship.actions'; @Component({ selector: 'ds-dynamic-lookup-relation-modal', @@ -207,8 +234,8 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy elementsPerPage: 5, currentPage: 1, searchParams: [ - new RequestParam('entityType', this.relationshipOptions.relationshipType) - ] + new RequestParam('entityType', this.relationshipOptions.relationshipType), + ], }); this.externalSourcesRD$ = this.externalSourceService.searchBy('findByEntityType', findListOptions, true, true, followLink('entityTypes')) diff --git a/src/app/shared/form/directives/authority-confidence-state.directive.ts b/src/app/shared/form/directives/authority-confidence-state.directive.ts index 22e9ef5631..38eda18a61 100644 --- a/src/app/shared/form/directives/authority-confidence-state.directive.ts +++ b/src/app/shared/form/directives/authority-confidence-state.directive.ts @@ -6,17 +6,31 @@ * http://www.dspace.org/license/ */ -import { AfterViewInit, Directive, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output, Renderer2, SimpleChanges } from '@angular/core'; +import { + AfterViewInit, + Directive, + ElementRef, + EventEmitter, + HostListener, + Input, + OnChanges, + Output, + Renderer2, + SimpleChanges, +} from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; import findIndex from 'lodash/findIndex'; import { ConfidenceIconConfig } from '../../../../config/submission-config.interface'; import { environment } from '../../../../environments/environment'; import { ConfidenceType } from '../../../core/shared/confidence-type'; +import { MetadataValue } from '../../../core/shared/metadata.models'; import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model'; import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; -import { MetadataValue } from '../../../core/shared/metadata.models'; -import { TranslateService } from '@ngx-translate/core'; -import { isNotEmpty, isNull } from '../../empty.util'; +import { + isNotEmpty, + isNull, +} from '../../empty.util'; import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model'; /** @@ -90,7 +104,7 @@ export class AuthorityConfidenceStateDirective implements OnChanges, AfterViewIn this.previousClass = this.getClassByConfidence(this.getConfidenceByValue(changes.authorityValue.previousValue)); } this.newClass = this.getClassByConfidence(this.getConfidenceByValue(changes.authorityValue.currentValue)); - let confidenceName = this.getNameByConfidence(this.getConfidenceByValue(changes.authorityValue.currentValue)); + const confidenceName = this.getNameByConfidence(this.getConfidenceByValue(changes.authorityValue.currentValue)); if (isNull(this.previousClass)) { this.renderer.addClass(this.elem.nativeElement, this.newClass); @@ -178,7 +192,7 @@ export class AuthorityConfidenceStateDirective implements OnChanges, AfterViewIn * @returns */ private getNameByConfidence(confidence: any): string { - let confidenceText = ConfidenceType[confidence]; + const confidenceText = ConfidenceType[confidence]; if (isNotEmpty(confidenceText)) { return confidenceText.replace('CF_', '').toLowerCase(); } else { diff --git a/src/app/shared/form/number-picker/number-picker.component.spec.ts b/src/app/shared/form/number-picker/number-picker.component.spec.ts index c06ae30b8a..4257a0371f 100644 --- a/src/app/shared/form/number-picker/number-picker.component.spec.ts +++ b/src/app/shared/form/number-picker/number-picker.component.spec.ts @@ -1,13 +1,25 @@ // Load the implementations that should be tested -import { ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + ChangeDetectorRef, + Component, + CUSTOM_ELEMENTS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; import { By } from '@angular/platform-browser'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; import { createTestComponent } from '../../testing/utils.test'; import { NumberPickerComponent } from './number-picker.component'; -import { TranslateModule } from '@ngx-translate/core'; describe('NumberPickerComponent test suite', () => { @@ -25,7 +37,7 @@ describe('NumberPickerComponent test suite', () => { FormsModule, ReactiveFormsModule, NgbModule, - TranslateModule.forRoot() + TranslateModule.forRoot(), ], declarations: [ NumberPickerComponent, diff --git a/src/app/shared/form/number-picker/number-picker.component.ts b/src/app/shared/form/number-picker/number-picker.component.ts index dba53f6329..353e8c820a 100644 --- a/src/app/shared/form/number-picker/number-picker.component.ts +++ b/src/app/shared/form/number-picker/number-picker.component.ts @@ -1,5 +1,17 @@ -import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR, UntypedFormBuilder } from '@angular/forms'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnInit, + Output, + SimpleChanges, +} from '@angular/core'; +import { + ControlValueAccessor, + NG_VALUE_ACCESSOR, + UntypedFormBuilder, +} from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { isEmpty } from '../../empty.util'; diff --git a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts index 9884e7c793..2bfc84542a 100644 --- a/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts +++ b/src/app/shared/form/vocabulary-treeview-modal/vocabulary-treeview-modal.component.ts @@ -1,4 +1,9 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; diff --git a/src/app/shared/host-window.service.ts b/src/app/shared/host-window.service.ts index 8462739730..f029ca1d6a 100644 --- a/src/app/shared/host-window.service.ts +++ b/src/app/shared/host-window.service.ts @@ -1,7 +1,18 @@ import { Injectable } from '@angular/core'; -import { createSelector, select, Store } from '@ngrx/store'; -import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { distinctUntilChanged, filter, map } from 'rxjs/operators'; +import { + createSelector, + select, + Store, +} from '@ngrx/store'; +import { + combineLatest as observableCombineLatest, + Observable, +} from 'rxjs'; +import { + distinctUntilChanged, + filter, + map, +} from 'rxjs/operators'; import { AppState } from '../app.reducer'; import { hasValue } from './empty.util'; @@ -103,35 +114,35 @@ export class HostWindowService { is(exactWidthCat: WidthCategory): Observable { return this.widthCategory.pipe( map((widthCat: WidthCategory) => widthCat === exactWidthCat), - distinctUntilChanged() + distinctUntilChanged(), ); } isIn(widthCatArray: [WidthCategory]): Observable { return this.widthCategory.pipe( map((widthCat: WidthCategory) => widthCatArray.includes(widthCat)), - distinctUntilChanged() + distinctUntilChanged(), ); } isUpTo(maxWidthCat: WidthCategory): Observable { return this.widthCategory.pipe( map((widthCat: WidthCategory) => widthCat <= maxWidthCat), - distinctUntilChanged() + distinctUntilChanged(), ); } isMobile(): Observable { return this.widthCategory.pipe( map((widthCat: WidthCategory) => widthCat <= maxMobileWidth), - distinctUntilChanged() + distinctUntilChanged(), ); } isDesktop(): Observable { return this.widthCategory.pipe( map((widthCat: WidthCategory) => widthCat > maxMobileWidth), - distinctUntilChanged() + distinctUntilChanged(), ); } diff --git a/src/app/shared/input-suggestions/filter-suggestions/filter-input-suggestions.component.spec.ts b/src/app/shared/input-suggestions/filter-suggestions/filter-input-suggestions.component.spec.ts index 9126a33094..ebc508c90c 100644 --- a/src/app/shared/input-suggestions/filter-suggestions/filter-input-suggestions.component.spec.ts +++ b/src/app/shared/input-suggestions/filter-suggestions/filter-input-suggestions.component.spec.ts @@ -65,7 +65,7 @@ describe('FilterInputSuggestionsComponent', () => { describe('component methods', () => { const testData = { - value: 'test-field' + value: 'test-field', } as unknown as any; beforeEach(() => { diff --git a/src/app/shared/loading/themed-loading.component.ts b/src/app/shared/loading/themed-loading.component.ts index a78684f19b..75ea39660d 100644 --- a/src/app/shared/loading/themed-loading.component.ts +++ b/src/app/shared/loading/themed-loading.component.ts @@ -1,7 +1,12 @@ -import { ChangeDetectorRef, Component, Input } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + Input, +} from '@angular/core'; + +import { ThemeService } from '../theme-support/theme.service'; import { ThemedComponent } from '../theme-support/themed.component'; import { LoadingComponent } from './loading.component'; -import { ThemeService } from '../theme-support/theme.service'; /** * Themed wrapper for LoadingComponent diff --git a/src/app/shared/log-in/methods/password/log-in-password.component.ts b/src/app/shared/log-in/methods/password/log-in-password.component.ts index dce822e940..17a870042b 100644 --- a/src/app/shared/log-in/methods/password/log-in-password.component.ts +++ b/src/app/shared/log-in/methods/password/log-in-password.component.ts @@ -1,16 +1,42 @@ -import { combineLatest, Observable, shareReplay } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import { Component, Inject, OnInit } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { + Component, + Inject, + OnInit, +} from '@angular/core'; +import { + UntypedFormBuilder, + UntypedFormGroup, + Validators, +} from '@angular/forms'; +import { + select, + Store, +} from '@ngrx/store'; +import { + combineLatest, + Observable, + shareReplay, +} from 'rxjs'; +import { + filter, + map, +} from 'rxjs/operators'; -import { select, Store } from '@ngrx/store'; -import { AuthenticateAction, ResetAuthenticationMessagesAction } from '../../../../core/auth/auth.actions'; - -import { getForgotPasswordRoute, getRegisterRoute } from '../../../../app-routing-paths'; +import { + getForgotPasswordRoute, + getRegisterRoute, +} from '../../../../app-routing-paths'; +import { + AuthenticateAction, + ResetAuthenticationMessagesAction, +} from '../../../../core/auth/auth.actions'; import { AuthService } from '../../../../core/auth/auth.service'; import { AuthMethod } from '../../../../core/auth/models/auth.method'; import { AuthMethodType } from '../../../../core/auth/models/auth.method-type'; -import { getAuthenticationError, getAuthenticationInfo } from '../../../../core/auth/selectors'; +import { + getAuthenticationError, + getAuthenticationInfo, +} from '../../../../core/auth/selectors'; import { CoreState } from '../../../../core/core-state.model'; import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../../core/data/feature-authorization/feature-id'; @@ -130,10 +156,10 @@ export class LogInPasswordComponent implements OnInit { this.canForgot$ = this.authorizationService.isAuthorized(FeatureID.EPersonForgotPassword).pipe(shareReplay(1)); this.canShowDivider$ = combineLatest([this.canRegister$, this.canForgot$]) - .pipe( - map(([canRegister, canForgot]) => canRegister || canForgot), - filter(Boolean) - ); + .pipe( + map(([canRegister, canForgot]) => canRegister || canForgot), + filter(Boolean), + ); } getRegisterRoute() { diff --git a/src/app/shared/menu/menu-item/external-link-menu-item.component.ts b/src/app/shared/menu/menu-item/external-link-menu-item.component.ts index 0e3afc8ffa..124bf4595e 100644 --- a/src/app/shared/menu/menu-item/external-link-menu-item.component.ts +++ b/src/app/shared/menu/menu-item/external-link-menu-item.component.ts @@ -1,4 +1,8 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { + Component, + Inject, + OnInit, +} from '@angular/core'; import { isNotEmpty } from '../../empty.util'; import { rendersMenuItemForType } from '../menu-item.decorator'; diff --git a/src/app/shared/menu/menu-item/link-menu-item.component.ts b/src/app/shared/menu/menu-item/link-menu-item.component.ts index 9b38b6e5ac..6d3424cb77 100644 --- a/src/app/shared/menu/menu-item/link-menu-item.component.ts +++ b/src/app/shared/menu/menu-item/link-menu-item.component.ts @@ -1,4 +1,8 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { + Component, + Inject, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; import { isNotEmpty } from '../../empty.util'; diff --git a/src/app/shared/menu/menu-item/onclick-menu-item.component.spec.ts b/src/app/shared/menu/menu-item/onclick-menu-item.component.spec.ts index 9d9a7ec4e1..3f9514adc8 100644 --- a/src/app/shared/menu/menu-item/onclick-menu-item.component.spec.ts +++ b/src/app/shared/menu/menu-item/onclick-menu-item.component.spec.ts @@ -1,5 +1,12 @@ -import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; diff --git a/src/app/shared/menu/menu-item/onclick-menu-item.component.ts b/src/app/shared/menu/menu-item/onclick-menu-item.component.ts index 7707ec3bb1..a067f2e5cb 100644 --- a/src/app/shared/menu/menu-item/onclick-menu-item.component.ts +++ b/src/app/shared/menu/menu-item/onclick-menu-item.component.ts @@ -13,7 +13,7 @@ import { OnClickMenuItemModel } from './models/onclick.model'; @Component({ selector: 'ds-onclick-menu-item', styleUrls: ['./menu-item.component.scss', './onclick-menu-item.component.scss'], - templateUrl: './onclick-menu-item.component.html' + templateUrl: './onclick-menu-item.component.html', }) @rendersMenuItemForType(MenuItemType.ONCLICK) export class OnClickMenuItemComponent { diff --git a/src/app/shared/menu/menu.reducer.spec.ts b/src/app/shared/menu/menu.reducer.spec.ts index 95e1db9de0..da837f2062 100644 --- a/src/app/shared/menu/menu.reducer.spec.ts +++ b/src/app/shared/menu/menu.reducer.spec.ts @@ -2,7 +2,23 @@ import * as deepFreeze from 'deep-freeze'; import { initialMenusState } from './initial-menus-state'; -import { ActivateMenuSectionAction, AddMenuSectionAction, CollapseMenuAction, CollapseMenuPreviewAction, DeactivateMenuSectionAction, ExpandMenuAction, ExpandMenuPreviewAction, HideMenuAction, HideMenuSectionAction, ReinitMenuAction, RemoveMenuSectionAction, ShowMenuAction, ShowMenuSectionAction, ToggleActiveMenuSectionAction, ToggleMenuAction } from './menu.actions'; +import { + ActivateMenuSectionAction, + AddMenuSectionAction, + CollapseMenuAction, + CollapseMenuPreviewAction, + DeactivateMenuSectionAction, + ExpandMenuAction, + ExpandMenuPreviewAction, + HideMenuAction, + HideMenuSectionAction, + ReinitMenuAction, + RemoveMenuSectionAction, + ShowMenuAction, + ShowMenuSectionAction, + ToggleActiveMenuSectionAction, + ToggleMenuAction, +} from './menu.actions'; import { menusReducer } from './menu.reducer'; import { MenuID } from './menu-id.model'; import { MenuSectionIndex } from './menu-section-Index.model'; diff --git a/src/app/shared/metadata-representation/metadata-representation-loader.component.spec.ts b/src/app/shared/metadata-representation/metadata-representation-loader.component.spec.ts index b0dc52f3bc..8c9bf77f52 100644 --- a/src/app/shared/metadata-representation/metadata-representation-loader.component.spec.ts +++ b/src/app/shared/metadata-representation/metadata-representation-loader.component.spec.ts @@ -1,14 +1,24 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { Context } from '../../core/shared/context.model'; -import { MetadataRepresentation, MetadataRepresentationType } from '../../core/shared/metadata-representation/metadata-representation.model'; -import { MetadataRepresentationLoaderComponent } from './metadata-representation-loader.component'; +import { + MetadataRepresentation, + MetadataRepresentationType, +} from '../../core/shared/metadata-representation/metadata-representation.model'; import { DynamicComponentLoaderDirective } from '../abstract-component-loader/dynamic-component-loader.directive'; -import { METADATA_REPRESENTATION_COMPONENT_FACTORY } from './metadata-representation.decorator'; +import { getMockThemeService } from '../mocks/theme-service.mock'; import { PlainTextMetadataListElementComponent } from '../object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component'; import { ThemeService } from '../theme-support/theme.service'; -import { getMockThemeService } from '../mocks/theme-service.mock'; +import { METADATA_REPRESENTATION_COMPONENT_FACTORY } from './metadata-representation.decorator'; +import { MetadataRepresentationLoaderComponent } from './metadata-representation-loader.component'; const testType = 'TestType'; const testContext = Context.Search; diff --git a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts index a55fd9f8e0..084ca8c32c 100644 --- a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts +++ b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts @@ -1,11 +1,18 @@ -import { Component, Inject, Input } from '@angular/core'; +import { + Component, + Inject, + Input, +} from '@angular/core'; import { Context } from '../../core/shared/context.model'; import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { MetadataRepresentation, MetadataRepresentationType } from '../../core/shared/metadata-representation/metadata-representation.model'; +import { + MetadataRepresentation, + MetadataRepresentationType, +} from '../../core/shared/metadata-representation/metadata-representation.model'; +import { AbstractComponentLoaderComponent } from '../abstract-component-loader/abstract-component-loader.component'; import { MetadataRepresentationListElementComponent } from '../object-list/metadata-representation-list-element/metadata-representation-list-element.component'; import { ThemeService } from '../theme-support/theme.service'; -import { AbstractComponentLoaderComponent } from '../abstract-component-loader/abstract-component-loader.component'; import { METADATA_REPRESENTATION_COMPONENT_FACTORY } from './metadata-representation.decorator'; @Component({ diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index b8adbdbf7d..30237b6b79 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -8,7 +8,11 @@ import { QualityAssuranceTopicDataService } from '../../core/notifications/qa/to import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { Item } from '../../core/shared/item.model'; import { ResourceType } from '../../core/shared/resource-type'; -import { createNoContentRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; // REST Mock --------------------------------------------------------------------- @@ -1470,7 +1474,7 @@ export const qualityAssuranceEventObjectMissingPid: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing PID' + reason: 'Missing PID', }, _links: { self: { @@ -1508,7 +1512,7 @@ export const qualityAssuranceEventObjectMissingPid2: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing PID' + reason: 'Missing PID', }, _links: { self: { @@ -1546,7 +1550,7 @@ export const qualityAssuranceEventObjectMissingPid3: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing PID' + reason: 'Missing PID', }, _links: { self: { @@ -1584,7 +1588,7 @@ export const qualityAssuranceEventObjectMissingPid4: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing DOI' + reason: 'Missing DOI', }, _links: { self: { @@ -1622,7 +1626,7 @@ export const qualityAssuranceEventObjectMissingPid5: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing PID' + reason: 'Missing PID', }, _links: { self: { @@ -1660,7 +1664,7 @@ export const qualityAssuranceEventObjectMissingPid6: QualityAssuranceEventObject fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing PID' + reason: 'Missing PID', }, _links: { self: { @@ -1698,7 +1702,7 @@ export const qualityAssuranceEventObjectMissingAbstract: QualityAssuranceEventOb fundingProgram: null, jurisdiction: null, title: null, - reason: 'Missing abstract' + reason: 'Missing abstract', }, _links: { self: { @@ -1736,7 +1740,7 @@ export const qualityAssuranceEventObjectMissingProjectFound: QualityAssuranceEve fundingProgram: 'H2020', jurisdiction: 'EU', reason: 'Project found', - title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage', }, _links: { self: { @@ -1774,7 +1778,7 @@ export const qualityAssuranceEventObjectMissingProjectNotFound: QualityAssurance fundingProgram: 'H2021', jurisdiction: 'EU', title: 'Tracking Unknown Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage', - reason: 'Project not found' + reason: 'Project not found', }, _links: { self: { diff --git a/src/app/shared/mocks/publication-claim-targets.mock.ts b/src/app/shared/mocks/publication-claim-targets.mock.ts index 932a98bee5..0b3c3bc9b0 100644 --- a/src/app/shared/mocks/publication-claim-targets.mock.ts +++ b/src/app/shared/mocks/publication-claim-targets.mock.ts @@ -1,5 +1,5 @@ -import { ResourceType } from '../../core/shared/resource-type'; import { SuggestionTarget } from '../../core/notifications/models/suggestion-target.model'; +import { ResourceType } from '../../core/shared/resource-type'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -11,15 +11,15 @@ export const mockSuggestionTargetsObjectOne: SuggestionTarget = { total: 31, _links: { target: { - href: 'https://rest.api/rest/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + href: 'https://rest.api/rest/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26', }, suggestions: { - href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=gf3d657-9d6d-4a87-b905-fef0f8cae26c&source=reciter' + href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=gf3d657-9d6d-4a87-b905-fef0f8cae26c&source=reciter', }, self: { - href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26' - } - } + href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26', + }, + }, }; export const mockSuggestionTargetsObjectTwo: SuggestionTarget = { @@ -30,13 +30,13 @@ export const mockSuggestionTargetsObjectTwo: SuggestionTarget = { total: 12, _links: { target: { - href: 'https://rest.api/rest/api/core/items/nhy567-9d6d-ty67-b905-fef0f8cae26' + href: 'https://rest.api/rest/api/core/items/nhy567-9d6d-ty67-b905-fef0f8cae26', }, suggestions: { - href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=nhy567-9d6d-ty67-b905-fef0f8cae26&source=reciter' + href: 'https://rest.api/rest/api/integration/suggestions/search/findByTargetAndSource?target=nhy567-9d6d-ty67-b905-fef0f8cae26&source=reciter', }, self: { - href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:nhy567-9d6d-ty67-b905-fef0f8cae26' - } - } + href: 'https://rest.api/rest/api/integration/suggestiontargets/reciter:nhy567-9d6d-ty67-b905-fef0f8cae26', + }, + }, }; diff --git a/src/app/shared/mocks/publication-claim.mock.ts b/src/app/shared/mocks/publication-claim.mock.ts index 8bf0685bd4..41866a47f9 100644 --- a/src/app/shared/mocks/publication-claim.mock.ts +++ b/src/app/shared/mocks/publication-claim.mock.ts @@ -14,40 +14,40 @@ export const mockSuggestionPublicationOne: Suggestion = { evidences: { acceptedRejectedEvidence: { score: '2.7', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, authorNameEvidence: { score: '0', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, journalCategoryEvidence: { score: '6', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, affiliationEvidence: { score: 'xxx', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, relationshipEvidence: { score: '9', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, educationYearEvidence: { score: '3.6', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, personTypeEvidence: { score: '4', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, articleCountEvidence: { score: '6.7', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, averageClusteringEvidence: { score: '7', - notes: 'some notes, eventually empty or null' - } + notes: 'some notes, eventually empty or null', + }, }, metadata: { 'dc.identifier.uri': [ @@ -56,24 +56,24 @@ export const mockSuggestionPublicationOne: Suggestion = { language: null, authority: null, confidence: -1, - place: -1 - } as any + place: -1, + } as any, ], 'dc.title': [ { value: 'publication one', language: null, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dc.date.issued': [ { value: '2010-11-03', language: null, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dspace.entity.type': [ { @@ -82,8 +82,8 @@ export const mockSuggestionPublicationOne: Suggestion = { value: 'OrgUnit', place: 0, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dc.description': [ { @@ -92,19 +92,19 @@ export const mockSuggestionPublicationOne: Suggestion = { value: "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).", place: 0, authority: null, - confidence: -1 - } as any - ] + confidence: -1, + } as any, + ], }, type: SUGGESTION, _links: { target: { - href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26', }, self: { - href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772' - } - } + href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772', + }, + }, }; export const mockSuggestionPublicationTwo: Suggestion = { @@ -116,40 +116,40 @@ export const mockSuggestionPublicationTwo: Suggestion = { evidences: { acceptedRejectedEvidence: { score: '2.7', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, authorNameEvidence: { score: '0', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, journalCategoryEvidence: { score: '6', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, affiliationEvidence: { score: 'xxx', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, relationshipEvidence: { score: '9', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, educationYearEvidence: { score: '3.6', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, personTypeEvidence: { score: '4', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, articleCountEvidence: { score: '6.7', - notes: 'some notes, eventually empty or null' + notes: 'some notes, eventually empty or null', }, averageClusteringEvidence: { score: '7', - notes: 'some notes, eventually empty or null' - } + notes: 'some notes, eventually empty or null', + }, }, metadata: { 'dc.identifier.uri': [ @@ -158,24 +158,24 @@ export const mockSuggestionPublicationTwo: Suggestion = { language: null, authority: null, confidence: -1, - place: -1 - } as any + place: -1, + } as any, ], 'dc.title': [ { value: 'publication one', language: null, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dc.date.issued': [ { value: '2010-11-03', language: null, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dspace.entity.type': [ { @@ -184,8 +184,8 @@ export const mockSuggestionPublicationTwo: Suggestion = { value: 'OrgUnit', place: 0, authority: null, - confidence: -1 - } as any + confidence: -1, + } as any, ], 'dc.description': [ { @@ -194,17 +194,17 @@ export const mockSuggestionPublicationTwo: Suggestion = { value: "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).", place: 0, authority: null, - confidence: -1 - } as any - ] + confidence: -1, + } as any, + ], }, type: SUGGESTION, _links: { target: { - href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26' + href: 'https://dspace7.4science.cloud/server/api/core/items/gf3d657-9d6d-4a87-b905-fef0f8cae26', }, self: { - href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772' - } - } + href: 'https://dspace7.4science.cloud/server/api/integration/suggestions/reciter:gf3d657-9d6d-4a87-b905-fef0f8cae26c:24694772', + }, + }, }; diff --git a/src/app/shared/mocks/submission.mock.ts b/src/app/shared/mocks/submission.mock.ts index e0d0265986..df31dc96f3 100644 --- a/src/app/shared/mocks/submission.mock.ts +++ b/src/app/shared/mocks/submission.mock.ts @@ -1113,10 +1113,10 @@ export const mockSubmissionState: SubmissionObjectState = Object.assign({}, { errorsToShow: [], isLoading: false, isValid: false, - removePending: false + removePending: false, } as any, 'duplicates': { - potentialDuplicates: [] + potentialDuplicates: [], } as any, }, isLoading: false, @@ -1617,7 +1617,7 @@ export const mockUploadFiles = [ export const mockUploadFilesData = { primary: null, - files: JSON.parse(JSON.stringify(mockUploadFiles)) + files: JSON.parse(JSON.stringify(mockUploadFiles)), }; export const mockFileFormData = { diff --git a/src/app/shared/mocks/suggestion.mock.ts b/src/app/shared/mocks/suggestion.mock.ts index ed7f9045d5..90226841ef 100644 --- a/src/app/shared/mocks/suggestion.mock.ts +++ b/src/app/shared/mocks/suggestion.mock.ts @@ -1,7 +1,8 @@ +import { of as observableOf } from 'rxjs'; + import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { Item } from '../../core/shared/item.model'; import { SearchResult } from '../search/models/search-result.model'; -import { of as observableOf } from 'rxjs'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -19,8 +20,8 @@ const ItemMockPid1: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174001', uuid: 'ITEM4567-e89b-12d3-a456-426614174001', @@ -29,103 +30,103 @@ const ItemMockPid1: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Index nominum et rerum' - } + value: 'Index nominum et rerum', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid2: Item = Object.assign( @@ -138,8 +139,8 @@ const ItemMockPid2: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174004', uuid: 'ITEM4567-e89b-12d3-a456-426614174004', @@ -148,103 +149,103 @@ const ItemMockPid2: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI' - } + value: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid3: Item = Object.assign( @@ -257,8 +258,8 @@ const ItemMockPid3: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174005', uuid: 'ITEM4567-e89b-12d3-a456-426614174005', @@ -267,103 +268,103 @@ const ItemMockPid3: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Sustainable development' - } + value: 'Sustainable development', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid4: Item = Object.assign( @@ -376,8 +377,8 @@ const ItemMockPid4: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174006', uuid: 'ITEM4567-e89b-12d3-a456-426614174006', @@ -386,103 +387,103 @@ const ItemMockPid4: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Reply to Critics' - } + value: 'Reply to Critics', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid5: Item = Object.assign( @@ -495,8 +496,8 @@ const ItemMockPid5: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174007', uuid: 'ITEM4567-e89b-12d3-a456-426614174007', @@ -505,103 +506,103 @@ const ItemMockPid5: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI' - } + value: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid6: Item = Object.assign( @@ -614,8 +615,8 @@ const ItemMockPid6: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174008', uuid: 'ITEM4567-e89b-12d3-a456-426614174008', @@ -624,103 +625,103 @@ const ItemMockPid6: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Donald Davidson' - } + value: 'Donald Davidson', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); const ItemMockPid7: Item = Object.assign( @@ -733,8 +734,8 @@ const ItemMockPid7: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174009', uuid: 'ITEM4567-e89b-12d3-a456-426614174009', @@ -743,103 +744,103 @@ const ItemMockPid7: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Missing abstract article' - } + value: 'Missing abstract article', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); export const ItemMockPid8: Item = Object.assign( @@ -852,8 +853,8 @@ export const ItemMockPid8: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174002', uuid: 'ITEM4567-e89b-12d3-a456-426614174002', @@ -862,103 +863,103 @@ export const ItemMockPid8: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' - } + value: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); export const ItemMockPid9: Item = Object.assign( @@ -971,8 +972,8 @@ export const ItemMockPid9: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'ITEM4567-e89b-12d3-a456-426614174003', uuid: 'ITEM4567-e89b-12d3-a456-426614174003', @@ -981,103 +982,103 @@ export const ItemMockPid9: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' - } + value: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); export const ItemMockPid10: Item = Object.assign( @@ -1090,8 +1091,8 @@ export const ItemMockPid10: Item = Object.assign( isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'P23e4567-e89b-12d3-a456-426614174002', uuid: 'P23e4567-e89b-12d3-a456-426614174002', @@ -1100,103 +1101,103 @@ export const ItemMockPid10: Item = Object.assign( 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' - } + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); export const OpenaireMockDspaceObject: SearchResult = Object.assign( @@ -1209,8 +1210,8 @@ export const OpenaireMockDspaceObject: SearchResult = Object.assig isWithdrawn: false, _links:{ self: { - href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' - } + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', + }, }, id: 'P23e4567-e89b-12d3-a456-426614174002', uuid: 'P23e4567-e89b-12d3-a456-426614174002', @@ -1219,103 +1220,103 @@ export const OpenaireMockDspaceObject: SearchResult = Object.assig 'dc.creator': [ { language: 'en_US', - value: 'Doe, Jane' - } + value: 'Doe, Jane', + }, ], 'dc.date.accessioned': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.available': [ { language: null, - value: '1650-06-26T19:58:25Z' - } + value: '1650-06-26T19:58:25Z', + }, ], 'dc.date.issued': [ { language: null, - value: '1650-06-26' - } + value: '1650-06-26', + }, ], 'dc.identifier.issn': [ { language: 'en_US', - value: '123456789' - } + value: '123456789', + }, ], 'dc.identifier.uri': [ { language: null, - value: 'http://dspace7.4science.it/xmlui/handle/10673/6' - } + value: 'http://dspace7.4science.it/xmlui/handle/10673/6', + }, ], 'dc.description.abstract': [ { language: 'en_US', - value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' - } + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!', + }, ], 'dc.description.provenance': [ { language: 'en', - value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).', }, { language: 'en', - value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' - } + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).', + }, ], 'dc.language': [ { language: 'en_US', - value: 'en' - } + value: 'en', + }, ], 'dc.rights': [ { language: 'en_US', - value: '© Jane Doe' - } + value: '© Jane Doe', + }, ], 'dc.subject': [ { language: 'en_US', - value: 'keyword1' + value: 'keyword1', }, { language: 'en_US', - value: 'keyword2' + value: 'keyword2', }, { language: 'en_US', - value: 'keyword3' - } + value: 'keyword3', + }, ], 'dc.title': [ { language: 'en_US', - value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' - } + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage', + }, ], 'dc.type': [ { language: 'en_US', - value: 'text' - } - ] - } - } + value: 'text', + }, + ], + }, + }, ); // Classes @@ -1335,7 +1336,7 @@ export function getMockSuggestionNotificationsStateService(): any { getOpenaireBrokerTopicsTotals: jasmine.createSpy('getOpenaireBrokerTopicsTotals'), dispatchRetrieveOpenaireBrokerTopics: jasmine.createSpy('dispatchRetrieveOpenaireBrokerTopics'), dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction'), - dispatchRefreshUserSuggestionsAction: undefined + dispatchRefreshUserSuggestionsAction: undefined, }); } /** @@ -1350,9 +1351,9 @@ export function getMockSuggestionsService(): any { retrieveCurrentUserSuggestions: jasmine.createSpy('retrieveCurrentUserSuggestions'), getTargetUuid: jasmine.createSpy('getTargetUuid'), ignoreSuggestion: observableOf(null), - ignoreSuggestionMultiple: observableOf({success: 1, fails: 0}), - approveAndImportMultiple: observableOf({success: 1, fails: 0}), - approveAndImport: observableOf({id: '1234'}), + ignoreSuggestionMultiple: observableOf({ success: 1, fails: 0 }), + approveAndImportMultiple: observableOf({ success: 1, fails: 0 }), + approveAndImport: observableOf({ id: '1234' }), isCollectionFixed: false, translateSuggestionSource: 'testSource', translateSuggestionType: 'testType', diff --git a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.spec.ts b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.spec.ts index 29310bf2ce..d9f31aef75 100644 --- a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.spec.ts +++ b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.spec.ts @@ -1,25 +1,33 @@ -import { ClaimedTaskActionsLoaderComponent } from './claimed-task-actions-loader.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; -import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; -import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; +import { + ChangeDetectionStrategy, + Injector, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; +import { ThemeService } from 'src/app/shared/theme-support/theme.service'; import { RequestService } from '../../../../core/data/request.service'; import { Item } from '../../../../core/shared/item.model'; import { SearchService } from '../../../../core/shared/search/search.service'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { ClaimedTaskDataService } from '../../../../core/tasks/claimed-task-data.service'; +import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; import { PoolTaskDataService } from '../../../../core/tasks/pool-task-data.service'; +import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; import { getMockRequestService } from '../../../mocks/request.service.mock'; import { getMockSearchService } from '../../../mocks/search-service.mock'; +import { getMockThemeService } from '../../../mocks/theme-service.mock'; import { NotificationsService } from '../../../notifications/notifications.service'; import { NotificationsServiceStub } from '../../../testing/notifications-service.stub'; import { RouterStub } from '../../../testing/router.stub'; -import { ThemeService } from 'src/app/shared/theme-support/theme.service'; -import { getMockThemeService } from '../../../mocks/theme-service.mock'; -import { Router } from '@angular/router'; import { ClaimedTaskActionsEditMetadataComponent } from '../edit-metadata/claimed-task-actions-edit-metadata.component'; +import { ClaimedTaskActionsLoaderComponent } from './claimed-task-actions-loader.component'; const searchService = getMockSearchService(); @@ -84,7 +92,7 @@ describe('ClaimedTaskActionsLoaderComponent', () => { { provide: RequestService, useValue: requestService }, { provide: PoolTaskDataService, useValue: {} }, { provide: ThemeService, useValue: themeService }, - ] + ], }).overrideComponent(ClaimedTaskActionsLoaderComponent, { set: { changeDetection: ChangeDetectionStrategy.Default, diff --git a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts index 109aafe3ef..f05dc75cf3 100644 --- a/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts @@ -1,12 +1,18 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { getComponentByWorkflowTaskOption } from './claimed-task-actions-decorator'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; + +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; +import { Item } from '../../../../core/shared/item.model'; +import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; +import { AbstractComponentLoaderComponent } from '../../../abstract-component-loader/abstract-component-loader.component'; import { MyDSpaceActionsResult } from '../../mydspace-actions'; import { ClaimedTaskActionsAbstractComponent } from '../abstract/claimed-task-actions-abstract.component'; -import { AbstractComponentLoaderComponent } from '../../../abstract-component-loader/abstract-component-loader.component'; -import { GenericConstructor } from '../../../../core/shared/generic-constructor'; -import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; -import { Item } from '../../../../core/shared/item.model'; +import { getComponentByWorkflowTaskOption } from './claimed-task-actions-decorator'; @Component({ selector: 'ds-claimed-task-actions-loader', diff --git a/src/app/shared/notification-box/notification-box.component.spec.ts b/src/app/shared/notification-box/notification-box.component.spec.ts index 1583e3e7f3..f78cf5c332 100644 --- a/src/app/shared/notification-box/notification-box.component.spec.ts +++ b/src/app/shared/notification-box/notification-box.component.spec.ts @@ -1,10 +1,11 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NotificationBoxComponent } from './notification-box.component'; -import { TranslateModule } from '@ngx-translate/core'; import { - AdminNotifyMetricsBox -} from '../../admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; + +import { AdminNotifyMetricsBox } from '../../admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; +import { NotificationBoxComponent } from './notification-box.component'; describe('NotificationBoxComponent', () => { let component: NotificationBoxComponent; @@ -17,14 +18,14 @@ describe('NotificationBoxComponent', () => { 'title': 'admin-notify-dashboard.delivered', 'config': 'NOTIFY.outgoing.delivered', 'count': 79, - 'description': 'box description' + 'description': 'box description', }; await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], - declarations: [ NotificationBoxComponent ] + declarations: [ NotificationBoxComponent ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(NotificationBoxComponent); component = fixture.componentInstance; diff --git a/src/app/shared/notification-box/notification-box.component.ts b/src/app/shared/notification-box/notification-box.component.ts index f79f1b08f5..f444c1e932 100644 --- a/src/app/shared/notification-box/notification-box.component.ts +++ b/src/app/shared/notification-box/notification-box.component.ts @@ -1,14 +1,20 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; + import { AdminNotifyMetricsBox } from '../../admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; -import { listableObjectComponent } from '../object-collection/shared/listable-object/listable-object.decorator'; import { AdminNotifySearchResult } from '../../admin/admin-notify-dashboard/models/admin-notify-message-search-result.model'; import { ViewMode } from '../../core/shared/view-mode.model'; +import { listableObjectComponent } from '../object-collection/shared/listable-object/listable-object.decorator'; @listableObjectComponent(AdminNotifySearchResult, ViewMode.ListElement) @Component({ selector: 'ds-notification-box', templateUrl: './notification-box.component.html', - styleUrls: ['./notification-box.component.scss'] + styleUrls: ['./notification-box.component.scss'], }) /** * Component to display the count of notifications for each type of LDN message and to access the related filtered search diff --git a/src/app/shared/notifications/notifications.reducers.spec.ts b/src/app/shared/notifications/notifications.reducers.spec.ts index 6fdd0e2655..7bfebf2a65 100644 --- a/src/app/shared/notifications/notifications.reducers.spec.ts +++ b/src/app/shared/notifications/notifications.reducers.spec.ts @@ -1,9 +1,5 @@ -import { notificationsReducer } from './notifications.reducers'; -import { NewNotificationAction, RemoveAllNotificationsAction, RemoveNotificationAction } from './notifications.actions'; -import { NotificationsService } from './notifications.service'; -import { TestBed } from '@angular/core/testing'; -import { NotificationsBoardComponent } from './notifications-board/notifications-board.component'; import { ChangeDetectorRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { StoreModule } from '@ngrx/store'; import uniqueId from 'lodash/uniqueId'; @@ -13,6 +9,14 @@ import { NotificationAnimationsType } from './models/notification-animations-typ import { NotificationOptions } from './models/notification-options.model'; import { NotificationType } from './models/notification-type'; import { NotificationComponent } from './notification/notification.component'; +import { + NewNotificationAction, + RemoveAllNotificationsAction, + RemoveNotificationAction, +} from './notifications.actions'; +import { notificationsReducer } from './notifications.reducers'; +import { NotificationsService } from './notifications.service'; +import { NotificationsBoardComponent } from './notifications-board/notifications-board.component'; describe('Notifications reducer', () => { diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts index 7d9664edaa..929644661b 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts @@ -1,17 +1,26 @@ -import { ItemListElementComponent } from '../../../object-list/item-list-element/item-types/item/item-list-element.component'; -import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; -import { TranslateModule } from '@ngx-translate/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { provideMockStore } from '@ngrx/store/testing'; +import { TranslateModule } from '@ngx-translate/core'; import { Context } from '../../../../core/shared/context.model'; import { GenericConstructor } from '../../../../core/shared/generic-constructor'; import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; +import { ItemListElementComponent } from '../../../object-list/item-list-element/item-types/item/item-list-element.component'; import { ThemeService } from '../../../theme-support/theme.service'; import { ListableObject } from '../listable-object.model'; import { ListableObjectComponentLoaderComponent } from './listable-object-component-loader.component'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; const testType = 'TestType'; const testContext = Context.Search; diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts index c1579f4e13..0f3d95e5cd 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts @@ -1,15 +1,21 @@ -import { ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { take } from 'rxjs/operators'; -import { ListableObject } from '../listable-object.model'; -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { getListableObjectComponent } from './listable-object.decorator'; -import { GenericConstructor } from '../../../../core/shared/generic-constructor'; -import { CollectionElementLinkType } from '../../collection-element-link.type'; import { Context } from '../../../../core/shared/context.model'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; import { AbstractComponentLoaderComponent } from '../../../abstract-component-loader/abstract-component-loader.component'; import { ThemeService } from '../../../theme-support/theme.service'; +import { CollectionElementLinkType } from '../../collection-element-link.type'; +import { ListableObject } from '../listable-object.model'; +import { getListableObjectComponent } from './listable-object.decorator'; @Component({ selector: 'ds-listable-object-component-loader', diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts index 299d65b1d3..8038833902 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts @@ -5,7 +5,11 @@ import { environment } from '../../../../../environments/environment'; import { Context } from '../../../../core/shared/context.model'; import { GenericConstructor } from '../../../../core/shared/generic-constructor'; import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { hasNoValue, hasValue, isNotEmpty } from '../../../empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../../../empty.util'; import { ListableObject } from '../listable-object.model'; export const DEFAULT_VIEW_MODE = ViewMode.ListElement; diff --git a/src/app/shared/object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component.ts b/src/app/shared/object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component.ts index 528506cfd1..84042358b3 100644 --- a/src/app/shared/object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component.ts +++ b/src/app/shared/object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component.ts @@ -1,10 +1,16 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { ListableObject } from '../listable-object.model'; -import { CollectionElementLinkType } from '../../collection-element-link.type'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; + +import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../../core/data/remote-data'; import { Context } from '../../../../core/shared/context.model'; import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { RemoteData } from '../../../../core/data/remote-data'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { CollectionElementLinkType } from '../../collection-element-link.type'; +import { ListableObject } from '../listable-object.model'; @Component({ selector: 'ds-objects-collection-tabulatable', diff --git a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.spec.ts b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.spec.ts index e500bbe9f3..d5fd3fd7b8 100644 --- a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.spec.ts +++ b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.spec.ts @@ -1,21 +1,22 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; - -import { TabulatableObjectsLoaderComponent } from './tabulatable-objects-loader.component'; -import { ThemeService } from '../../../theme-support/theme.service'; +import { ChangeDetectionStrategy } from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { provideMockStore } from '@ngrx/store/testing'; -import { ListableObject } from '../listable-object.model'; + import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { Context } from '../../../../core/shared/context.model'; -import { TabulatableObjectsDirective } from './tabulatable-objects.directive'; -import { ChangeDetectionStrategy } from '@angular/core'; - - -import { - TabulatableResultListElementsComponent -} from '../../../object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; -import { TestType } from '../listable-object/listable-object-component-loader.component.spec'; -import { By } from '@angular/platform-browser'; import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { TabulatableResultListElementsComponent } from '../../../object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; +import { ThemeService } from '../../../theme-support/theme.service'; +import { ListableObject } from '../listable-object.model'; +import { TestType } from '../listable-object/listable-object-component-loader.component.spec'; +import { TabulatableObjectsDirective } from './tabulatable-objects.directive'; +import { TabulatableObjectsLoaderComponent } from './tabulatable-objects-loader.component'; const testType = 'TestType'; @@ -42,12 +43,12 @@ describe('TabulatableObjectsLoaderComponent', () => { providers: [ provideMockStore({}), { provide: ThemeService, useValue: themeService }, - ] + ], }).overrideComponent(TabulatableObjectsLoaderComponent, { set: { changeDetection: ChangeDetectionStrategy.Default, - entryComponents: [TabulatableResultListElementsComponent] - } + entryComponents: [TabulatableResultListElementsComponent], + }, }).compileComponents(); fixture = TestBed.createComponent(TabulatableObjectsLoaderComponent); diff --git a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.ts b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.ts index 54f7602bea..7b8e45a17a 100644 --- a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.ts +++ b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component.ts @@ -1,20 +1,42 @@ -import { ChangeDetectorRef, Component, ComponentRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; -import { ListableObject } from '../listable-object.model'; -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { Context } from '../../../../core/shared/context.model'; -import { CollectionElementLinkType } from '../../collection-element-link.type'; -import { combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { ThemeService } from '../../../theme-support/theme.service'; -import { hasNoValue, hasValue, isNotEmpty } from '../../../empty.util'; +import { + ChangeDetectorRef, + Component, + ComponentRef, + EventEmitter, + Input, + OnChanges, + OnDestroy, + OnInit, + Output, + SimpleChanges, + ViewChild, +} from '@angular/core'; +import { + combineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; import { take } from 'rxjs/operators'; -import { GenericConstructor } from '../../../../core/shared/generic-constructor'; -import { TabulatableObjectsDirective } from './tabulatable-objects.directive'; + import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { Context } from '../../../../core/shared/context.model'; +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../../../empty.util'; +import { ThemeService } from '../../../theme-support/theme.service'; +import { CollectionElementLinkType } from '../../collection-element-link.type'; +import { ListableObject } from '../listable-object.model'; import { getTabulatableObjectsComponent } from './tabulatable-objects.decorator'; +import { TabulatableObjectsDirective } from './tabulatable-objects.directive'; @Component({ selector: 'ds-tabulatable-objects-loader', - templateUrl: './tabulatable-objects-loader.component.html' + templateUrl: './tabulatable-objects-loader.component.html', }) /** * Component to load the matching component flagged by the tabulatableObjectsComponent decorator. @@ -145,8 +167,8 @@ export class TabulatableObjectsLoaderComponent implements OnInit, OnChanges, OnD this.compRef = viewContainerRef.createComponent( component, { index: 0, - injector: undefined - } + injector: undefined, + }, ); if (hasValue(changes)) { @@ -176,8 +198,8 @@ export class TabulatableObjectsLoaderComponent implements OnInit, OnChanges, OnD * @returns {GenericConstructor} */ getComponent(renderTypes: (string | GenericConstructor)[], - viewMode: ViewMode, - context: Context): GenericConstructor { + viewMode: ViewMode, + context: Context): GenericConstructor { return getTabulatableObjectsComponent(renderTypes, viewMode, context, this.themeService.getThemeName()); } diff --git a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.spec.ts b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.spec.ts index f33ed2e49f..a972c02907 100644 --- a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.spec.ts +++ b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.spec.ts @@ -1,7 +1,10 @@ -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { getTabulatableObjectsComponent, tabulatableObjectsComponent } from './tabulatable-objects.decorator'; -import { Context } from '../../../../core/shared/context.model'; import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { Context } from '../../../../core/shared/context.model'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { + getTabulatableObjectsComponent, + tabulatableObjectsComponent, +} from './tabulatable-objects.decorator'; const type = 'TestType'; diff --git a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.ts b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.ts index 54bb95371c..fe40a99d9c 100644 --- a/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.ts +++ b/src/app/shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator.ts @@ -1,10 +1,19 @@ -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { Context } from '../../../../core/shared/context.model'; -import { hasNoValue, hasValue } from '../../../empty.util'; -import { GenericConstructor } from '../../../../core/shared/generic-constructor'; -import { ListableObject } from '../listable-object.model'; -import { DEFAULT_CONTEXT, DEFAULT_THEME, DEFAULT_VIEW_MODE, getMatch, MatchRelevancy } from '../listable-object/listable-object.decorator'; import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { Context } from '../../../../core/shared/context.model'; +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { + hasNoValue, + hasValue, +} from '../../../empty.util'; +import { ListableObject } from '../listable-object.model'; +import { + DEFAULT_CONTEXT, + DEFAULT_THEME, + DEFAULT_VIEW_MODE, + getMatch, + MatchRelevancy, +} from '../listable-object/listable-object.decorator'; const map = new Map(); diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts index 0cdafdc413..ccbb927f03 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts @@ -1,16 +1,19 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; import { Params } from '@angular/router'; -import { RouteService } from 'src/app/core/services/route.service'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { RouteService } from 'src/app/core/services/route.service'; +import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata/browse-by-metadata.component'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { BrowseEntry } from '../../../core/shared/browse-entry.model'; import { ViewMode } from '../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; -import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata/browse-by-metadata.component'; @Component({ selector: 'ds-browse-entry-list-element', diff --git a/src/app/shared/object-list/duplicate-data/duplicate.model.ts b/src/app/shared/object-list/duplicate-data/duplicate.model.ts index 93f9ebdc56..9aba0c6871 100644 --- a/src/app/shared/object-list/duplicate-data/duplicate.model.ts +++ b/src/app/shared/object-list/duplicate-data/duplicate.model.ts @@ -1,9 +1,13 @@ -import { autoserialize, deserialize } from 'cerialize'; -import { MetadataMap } from '../../../core/shared/metadata.models'; -import { HALLink } from '../../../core/shared/hal-link.model'; +import { + autoserialize, + deserialize, +} from 'cerialize'; + import { CacheableObject } from '../../../core/cache/cacheable-object.model'; -import { DUPLICATE } from './duplicate.resource-type'; +import { HALLink } from '../../../core/shared/hal-link.model'; +import { MetadataMap } from '../../../core/shared/metadata.models'; import { ResourceType } from '../../../core/shared/resource-type'; +import { DUPLICATE } from './duplicate.resource-type'; /** * This implements the model of a duplicate preview stub, to be displayed to submitters or reviewers @@ -17,41 +21,41 @@ export class Duplicate implements CacheableObject { * The item title */ @autoserialize - title: string; + title: string; /** * The item uuid */ @autoserialize - uuid: string; + uuid: string; /** * The workfow item ID, if any */ @autoserialize - workflowItemId: number; + workflowItemId: number; /** * The workspace item ID, if any */ @autoserialize - workspaceItemId: number; + workspaceItemId: number; /** * The owning collection of the item */ @autoserialize - owningCollection: string; + owningCollection: string; /** * Metadata for the preview item (e.g. dc.title) */ @autoserialize - metadata: MetadataMap; + metadata: MetadataMap; @autoserialize - type: ResourceType; + type: ResourceType; /** * The {@link HALLink}s for the URL that generated this item (in context of search results) */ @deserialize - _links: { + _links: { self: HALLink; }; } diff --git a/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.spec.ts index 544ab0e3fa..a6c0a55977 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.spec.ts @@ -1,9 +1,17 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { BrowseLinkMetadataListElementComponent } from './browse-link-metadata-list-element.component'; -import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; + import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model'; +import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model'; import { ValueListBrowseDefinition } from '../../../../core/shared/value-list-browse-definition.model'; +import { BrowseLinkMetadataListElementComponent } from './browse-link-metadata-list-element.component'; const mockMetadataRepresentation = Object.assign(new MetadatumRepresentation('type'), { key: 'dc.contributor.author', diff --git a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.spec.ts index 683b7dbf52..bcd972eb29 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.spec.ts @@ -1,5 +1,12 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { MetadatumRepresentation } from '../../../core/shared/metadata-representation/metadatum/metadatum-representation.model'; import { mockData } from '../../testing/browse-definition-data-service.stub'; diff --git a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts index e957f1a8b0..24f066a2c1 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts @@ -1,4 +1,7 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input, +} from '@angular/core'; import { Context } from '../../../core/shared/context.model'; import { MetadataRepresentation } from '../../../core/shared/metadata-representation/metadata-representation.model'; diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts index 01c5e3f8b1..3ba3862812 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts @@ -1,5 +1,15 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, flush, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + flush, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf } from 'rxjs'; @@ -9,20 +19,23 @@ import { environment } from '../../../../../environments/environment'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { Context } from '../../../../core/shared/context.model'; import { Item } from '../../../../core/shared/item.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; +import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../remote-data.utils'; +import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { getMockLinkService } from '../../../mocks/link-service.mock'; import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../../remote-data.utils'; +import { createPaginatedList } from '../../../testing/utils.test'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { VarDirective } from '../../../utils/var.directive'; -import { getMockLinkService } from '../../../mocks/link-service.mock'; -import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; -import { createPaginatedList } from '../../../testing/utils.test'; -import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; -import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; -import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; import { ClaimedSearchResultListElementComponent } from './claimed-search-result-list-element.component'; let component: ClaimedSearchResultListElementComponent; @@ -37,9 +50,9 @@ const configurationDataService = jasmine.createSpyObj('configurationDataService' findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { name: 'duplicate.enable', values: [ - 'true' - ] - })) + 'true', + ], + })), }); const duplicateDataServiceStub = { findListByHref: () => observableOf(emptyList), diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts index 6b91c26f42..0dddacdf58 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts @@ -1,29 +1,49 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs'; -import { map, mergeMap, tap } from 'rxjs/operators'; +import { + Component, + Inject, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + BehaviorSubject, + combineLatest, + EMPTY, + Observable, +} from 'rxjs'; +import { + map, + mergeMap, + tap, +} from 'rxjs/operators'; -import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; +import { + APP_CONFIG, + AppConfig, +} from '../../../../../config/app-config.interface'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; +import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { Context } from '../../../../core/shared/context.model'; import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; +import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; -import { hasValue, isNotEmpty } from '../../../empty.util'; +import { + hasValue, + isNotEmpty, +} from '../../../empty.util'; import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model'; import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { followLink } from '../../../utils/follow-link-config.model'; -import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; import { Duplicate } from '../../duplicate-data/duplicate.model'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; -import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; -import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; @Component({ selector: 'ds-claimed-search-result-list-element', @@ -114,14 +134,14 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle */ initializeDuplicateDetectionIfEnabled() { return combineLatest([ - this.configService.findByPropertyName('duplicate.enable').pipe( - getFirstCompletedRemoteData(), - map((remoteData: RemoteData) => { - return (remoteData.isSuccess && remoteData.payload && remoteData.payload.values[0] === 'true'); - }) - ), - this.item$.pipe(), - ] + this.configService.findByPropertyName('duplicate.enable').pipe( + getFirstCompletedRemoteData(), + map((remoteData: RemoteData) => { + return (remoteData.isSuccess && remoteData.payload && remoteData.payload.values[0] === 'true'); + }), + ), + this.item$.pipe(), + ], ).pipe( map(([enabled, rd]) => { if (enabled) { @@ -133,7 +153,7 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle return remoteData.payload.page; } } - }) + }), ); } else { return [] as Duplicate[]; diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts index aee3d82ea9..ba2cc0b537 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts @@ -1,5 +1,15 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, flush, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + flush, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf } from 'rxjs'; @@ -8,20 +18,23 @@ import { APP_CONFIG } from '../../../../../config/app-config.interface'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { Context } from '../../../../core/shared/context.model'; import { Item } from '../../../../core/shared/item.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; +import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../remote-data.utils'; -import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; import { getMockLinkService } from '../../../mocks/link-service.mock'; +import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../../../remote-data.utils'; +import { createPaginatedList } from '../../../testing/utils.test'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { VarDirective } from '../../../utils/var.directive'; -import { createPaginatedList } from '../../../testing/utils.test'; -import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; -import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; -import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; import { PoolSearchResultListElementComponent } from './pool-search-result-list-element.component'; let component: PoolSearchResultListElementComponent; @@ -36,9 +49,9 @@ const configurationDataService = jasmine.createSpyObj('configurationDataService' findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { name: 'duplicate.enable', values: [ - 'true' - ] - })) + 'true', + ], + })), }); const duplicateDataServiceStub = { findListByHref: () => observableOf(emptyList), @@ -103,7 +116,7 @@ describe('PoolSearchResultListElementComponent', () => { { provide: APP_CONFIG, useValue: environmentUseThumbs }, { provide: ObjectCacheService, useValue: objectCacheServiceMock }, { provide: ConfigurationDataService, useValue: configurationDataService }, - { provide: SubmissionDuplicateDataService, useValue: duplicateDataServiceStub } + { provide: SubmissionDuplicateDataService, useValue: duplicateDataServiceStub }, ], schemas: [NO_ERRORS_SCHEMA], }).overrideComponent(PoolSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts index 6a4218791b..e623ce19a8 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts @@ -1,28 +1,48 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs'; -import { map, mergeMap, tap } from 'rxjs/operators'; +import { + Component, + Inject, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + BehaviorSubject, + combineLatest, + EMPTY, + Observable, +} from 'rxjs'; +import { + map, + mergeMap, + tap, +} from 'rxjs/operators'; -import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; +import { + APP_CONFIG, + AppConfig, +} from '../../../../../config/app-config.interface'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; +import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { Context } from '../../../../core/shared/context.model'; import { Item } from '../../../../core/shared/item.model'; import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; +import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; -import { hasValue, isNotEmpty } from '../../../empty.util'; +import { + hasValue, + isNotEmpty, +} from '../../../empty.util'; import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { followLink } from '../../../utils/follow-link-config.model'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { Duplicate } from '../../duplicate-data/duplicate.model'; -import { SubmissionDuplicateDataService } from '../../../../core/submission/submission-duplicate-data.service'; -import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; -import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; /** @@ -79,7 +99,7 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen protected objectCache: ObjectCacheService, protected configService: ConfigurationDataService, protected duplicateDataService: SubmissionDuplicateDataService, - @Inject(APP_CONFIG) protected appConfig: AppConfig + @Inject(APP_CONFIG) protected appConfig: AppConfig, ) { super(truncatableService, dsoNameService, appConfig); } @@ -127,10 +147,10 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen getFirstCompletedRemoteData(), map((remoteData: RemoteData) => { return (remoteData.isSuccess && remoteData.payload && remoteData.payload.values[0] === 'true'); - }) + }), ), this.item$.pipe(), - ] + ], ).pipe( map(([enabled, rd]) => { if (enabled) { @@ -142,7 +162,7 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen return remoteData.payload.page; } } - }) + }), ); } else { return [] as Duplicate[]; diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts index 75b55d0e7e..4788f8ecbd 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts @@ -1,8 +1,15 @@ -import { CollectionSearchResultListElementComponent } from './collection-search-result-list-element.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { of as observableOf } from 'rxjs'; -import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ChangeDetectionStrategy, + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; +import { of as observableOf } from 'rxjs'; import { APP_CONFIG } from '../../../../../config/app-config.interface'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; @@ -11,6 +18,7 @@ import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model'; import { TruncatableService } from '../../../truncatable/truncatable.service'; import { TruncatePipe } from '../../../utils/truncate.pipe'; +import { CollectionSearchResultListElementComponent } from './collection-search-result-list-element.component'; let collectionSearchResultListElementComponent: CollectionSearchResultListElementComponent; let fixture: ComponentFixture; diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts index 6d5969e4a6..f434d9d756 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts @@ -1,15 +1,24 @@ -import { CommunitySearchResultListElementComponent } from './community-search-result-list-element.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { of as observableOf } from 'rxjs'; -import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ChangeDetectionStrategy, + DebugElement, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { TruncatePipe } from '../../../utils/truncate.pipe'; -import { Community } from '../../../../core/shared/community.model'; -import { TruncatableService } from '../../../truncatable/truncatable.service'; -import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model'; -import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; -import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { of as observableOf } from 'rxjs'; + import { APP_CONFIG } from '../../../../../config/app-config.interface'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { Community } from '../../../../core/shared/community.model'; +import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; +import { TruncatePipe } from '../../../utils/truncate.pipe'; +import { CommunitySearchResultListElementComponent } from './community-search-result-list-element.component'; let communitySearchResultListElementComponent: CommunitySearchResultListElementComponent; let fixture: ComponentFixture; diff --git a/src/app/shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component.ts b/src/app/shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component.ts index e1048463d4..262df49bbf 100644 --- a/src/app/shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component.ts +++ b/src/app/shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component.ts @@ -1,11 +1,12 @@ import { Component } from '@angular/core'; -import { AbstractTabulatableElementComponent } from '../../../object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component'; + import { PaginatedList } from '../../../../core/data/paginated-list.model'; +import { AbstractTabulatableElementComponent } from '../../../object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component'; import { SearchResult } from '../../../search/models/search-result.model'; @Component({ selector: 'ds-search-result-table-element', - template: `` + template: ``, }) /** * Component that describes the implementations and interfaces needed from any extension of this class to be used in search results for visualization in ViewMode.Table diff --git a/src/app/shared/object-table/object-table.component.spec.ts b/src/app/shared/object-table/object-table.component.spec.ts index bfd3c769cf..de4719fc2e 100644 --- a/src/app/shared/object-table/object-table.component.spec.ts +++ b/src/app/shared/object-table/object-table.component.spec.ts @@ -1,6 +1,11 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; - +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; + import { ObjectTableComponent } from './object-table.component'; describe('ObjectTableComponent', () => { @@ -11,9 +16,9 @@ describe('ObjectTableComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ObjectTableComponent ] + declarations: [ ObjectTableComponent ], }) - .compileComponents(); + .compileComponents(); fixture = TestBed.createComponent(ObjectTableComponent); component = fixture.componentInstance; diff --git a/src/app/shared/object-table/object-table.component.ts b/src/app/shared/object-table/object-table.component.ts index 69e85a0f79..94e2a9d093 100644 --- a/src/app/shared/object-table/object-table.component.ts +++ b/src/app/shared/object-table/object-table.component.ts @@ -1,14 +1,25 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; -import { ViewMode } from '../../core/shared/view-mode.model'; -import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; -import { Context } from '../../core/shared/context.model'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, + ViewEncapsulation, +} from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -import { RemoteData } from '../../core/data/remote-data'; + +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../core/data/paginated-list.model'; -import { ListableObject } from '../object-collection/shared/listable-object.model'; +import { RemoteData } from '../../core/data/remote-data'; +import { Context } from '../../core/shared/context.model'; +import { ViewMode } from '../../core/shared/view-mode.model'; import { fadeIn } from '../animations/fade'; +import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; @Component({ changeDetection: ChangeDetectionStrategy.Default, @@ -16,7 +27,7 @@ import { fadeIn } from '../animations/fade'; selector: 'ds-object-table', templateUrl: './object-table.component.html', styleUrls: ['./object-table.component.scss'], - animations: [fadeIn] + animations: [fadeIn], }) /** diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 4bb74fc9ef..04f7e446e6 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -1,8 +1,28 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core'; -import { Observable, of as observableOf, Subscription } from 'rxjs'; -import { map, take } from 'rxjs/operators'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewEncapsulation, +} from '@angular/core'; +import { + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + map, + take, +} from 'rxjs/operators'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { PaginationService } from '../../core/pagination/pagination.service'; diff --git a/src/app/shared/search-form/search-form.component.ts b/src/app/shared/search-form/search-form.component.ts index dbe68190f7..8f06b73a35 100644 --- a/src/app/shared/search-form/search-form.component.ts +++ b/src/app/shared/search-form/search-form.component.ts @@ -1,18 +1,27 @@ -import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnChanges, + Output, +} from '@angular/core'; import { Router } from '@angular/router'; -import { hasValue, isNotEmpty } from '../empty.util'; -import { SearchService } from '../../core/shared/search/search.service'; -import { currentPath } from '../utils/route.utils'; -import { PaginationService } from '../../core/pagination/pagination.service'; -import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { BehaviorSubject } from 'rxjs'; import { take } from 'rxjs/operators'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; +import { PaginationService } from '../../core/pagination/pagination.service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; +import { SearchService } from '../../core/shared/search/search.service'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { + hasValue, + isNotEmpty, +} from '../empty.util'; +import { currentPath } from '../utils/route.utils'; import { ScopeSelectorModalComponent } from './scope-selector-modal/scope-selector-modal.component'; @Component({ diff --git a/src/app/shared/search-form/themed-search-form.component.ts b/src/app/shared/search-form/themed-search-form.component.ts index c3b1fe9b74..adddf29de6 100644 --- a/src/app/shared/search-form/themed-search-form.component.ts +++ b/src/app/shared/search-form/themed-search-form.component.ts @@ -1,4 +1,9 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { ThemedComponent } from '../theme-support/themed.component'; import { SearchFormComponent } from './search-form.component'; diff --git a/src/app/shared/search/advanced-search/advanced-search.component.spec.ts b/src/app/shared/search/advanced-search/advanced-search.component.spec.ts index f115451c55..0832b61efe 100644 --- a/src/app/shared/search/advanced-search/advanced-search.component.spec.ts +++ b/src/app/shared/search/advanced-search/advanced-search.component.spec.ts @@ -1,21 +1,32 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; -import { AdvancedSearchComponent } from './advanced-search.component'; -import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; -import { SearchService } from '../../../core/shared/search/search.service'; -import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; -import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { APP_CONFIG } from '../../../../config/app-config.interface'; -import { environment } from '../../../../environments/environment'; -import { RouterStub } from '../../testing/router.stub'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { + FormBuilder, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { BrowserOnlyMockPipe } from '../../testing/browser-only-mock.pipe'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { APP_CONFIG } from '../../../../config/app-config.interface'; +import { environment } from '../../../../environments/environment'; +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { SearchService } from '../../../core/shared/search/search.service'; +import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; +import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; +import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; +import { BrowserOnlyMockPipe } from '../../testing/browser-only-mock.pipe'; +import { RouterStub } from '../../testing/router.stub'; +import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; +import { AdvancedSearchComponent } from './advanced-search.component'; describe('AdvancedSearchComponent', () => { let component: AdvancedSearchComponent; @@ -45,9 +56,9 @@ describe('AdvancedSearchComponent', () => { { provide: RemoteDataBuildService, useValue: {} }, { provide: SearchService, useValue: searchServiceStub }, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }).overrideComponent(AdvancedSearchComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } + set: { changeDetection: ChangeDetectionStrategy.Default }, }).compileComponents(); }); @@ -67,7 +78,7 @@ describe('AdvancedSearchComponent', () => { component.onSubmit(data); expect(router.navigate).toHaveBeenCalledWith([undefined], { queryParams: { ['f.' + data.filter]: data.textsearch + ',' + data.operator }, - queryParamsHandling: 'merge' + queryParamsHandling: 'merge', }); }); diff --git a/src/app/shared/search/advanced-search/advanced-search.component.ts b/src/app/shared/search/advanced-search/advanced-search.component.ts index f25ea6fe8d..f00748afa3 100644 --- a/src/app/shared/search/advanced-search/advanced-search.component.ts +++ b/src/app/shared/search/advanced-search/advanced-search.component.ts @@ -1,11 +1,25 @@ -import { Component, Inject, Input, OnInit } from '@angular/core'; +import { + Component, + Inject, + Input, + OnInit, +} from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; import { Router } from '@angular/router'; -import { slide } from '../../animations/slide'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { + APP_CONFIG, + AppConfig, +} from 'src/config/app-config.interface'; + import { SearchService } from '../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; -import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; +import { slide } from '../../animations/slide'; @Component({ selector: 'ds-advanced-search', @@ -13,11 +27,11 @@ import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; styleUrls: ['./advanced-search.component.scss'], animations: [slide], }) - /** +/** * This component represents the part of the search sidebar that contains advanced filters. */ export class AdvancedSearchComponent implements OnInit { - /** + /** * True when the search component should show results on the current page */ @Input() inPlaceSearch; @@ -51,7 +65,7 @@ export class AdvancedSearchComponent implements OnInit { validators: [Validators.required], }), operator: new FormControl('equals', - { validators: [Validators.required], }), + { validators: [Validators.required] }), }); this.collapsedSearch = this.isCollapsed(); @@ -74,7 +88,7 @@ export class AdvancedSearchComponent implements OnInit { } onSubmit(data) { if (this.advSearchForm.valid) { - let queryParams = { [this.paramName(data.filter)]: data.textsearch + ',' + data.operator }; + const queryParams = { [this.paramName(data.filter)]: data.textsearch + ',' + data.operator }; if (!this.inPlaceSearch) { this.router.navigate([this.searchService.getSearchLink()], { queryParams: queryParams, queryParamsHandling: 'merge' }); } else { diff --git a/src/app/shared/search/search-filters/search-filter/search-facet-filter-wrapper/search-facet-filter-wrapper.component.ts b/src/app/shared/search/search-filters/search-filter/search-facet-filter-wrapper/search-facet-filter-wrapper.component.ts index 6c4dddc464..896319e666 100644 --- a/src/app/shared/search/search-filters/search-filter/search-facet-filter-wrapper/search-facet-filter-wrapper.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-facet-filter-wrapper/search-facet-filter-wrapper.component.ts @@ -1,8 +1,18 @@ -import { Component, Injector, Input, OnInit } from '@angular/core'; +import { + Component, + Injector, + Input, + OnInit, +} from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { GenericConstructor } from '../../../../../core/shared/generic-constructor'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, +} from '../../../../../core/shared/search/search-filter.service'; import { FilterType } from '../../../models/filter-type.model'; import { SearchFilterConfig } from '../../../models/search-filter-config.model'; import { SearchFacetFilterComponent } from '../search-facet-filter/search-facet-filter.component'; diff --git a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.spec.ts b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.spec.ts index 8f080c514c..f130b19f54 100644 --- a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.spec.ts +++ b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.spec.ts @@ -1,16 +1,32 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { + BehaviorSubject, + of as observableOf, +} from 'rxjs'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; import { buildPaginatedList } from '../../../../../core/data/paginated-list.model'; import { PageInfo } from '../../../../../core/shared/page-info.model'; import { SearchService } from '../../../../../core/shared/search/search.service'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE, SearchFilterService } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, + SearchFilterService, +} from '../../../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../remote-data.utils'; import { RouterStub } from '../../../../testing/router.stub'; diff --git a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts index d5f645a0fe..7a1e75dce5 100644 --- a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts @@ -1,8 +1,35 @@ -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; +import { + animate, + state, + style, + transition, + trigger, +} from '@angular/animations'; +import { + Component, + Inject, + OnDestroy, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subject, Subscription } from 'rxjs'; -import { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, take, tap } from 'rxjs/operators'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subject, + Subscription, +} from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + map, + mergeMap, + switchMap, + take, + tap, +} from 'rxjs/operators'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; import { PaginatedList } from '../../../../../core/data/paginated-list.model'; @@ -10,9 +37,19 @@ import { RemoteData } from '../../../../../core/data/remote-data'; import { getFirstSucceededRemoteData } from '../../../../../core/shared/operators'; import { SearchService } from '../../../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../../../core/shared/search/search-configuration.service'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE, SearchFilterService } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, + SearchFilterService, +} from '../../../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; -import { hasNoValue, hasValue, isNotEmpty } from '../../../../empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../../../../empty.util'; import { InputSuggestion } from '../../../../input-suggestions/input-suggestions.model'; import { createPendingRemoteDataObject } from '../../../../remote-data.utils'; import { EmphasizePipe } from '../../../../utils/emphasize.pipe'; @@ -21,7 +58,10 @@ import { FacetValue } from '../../../models/facet-value.model'; import { FacetValues } from '../../../models/facet-values.model'; import { SearchFilterConfig } from '../../../models/search-filter-config.model'; import { SearchOptions } from '../../../models/search-options.model'; -import { getFacetValueForType, stripOperatorFromFilterValue } from '../../../search.utils'; +import { + getFacetValueForType, + stripOperatorFromFilterValue, +} from '../../../search.utils'; @Component({ selector: 'ds-search-facet-filter', diff --git a/src/app/shared/search/search-filters/search-filter/search-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-filter.component.ts index 70289a8da0..b67ab1e31a 100644 --- a/src/app/shared/search/search-filters/search-filter/search-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-filter.component.ts @@ -1,15 +1,33 @@ -import { Component, Inject, Input, OnInit } from '@angular/core'; -import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; -import { filter, map, startWith, switchMap, take } from 'rxjs/operators'; +import { + Component, + Inject, + Input, + OnInit, +} from '@angular/core'; +import { + BehaviorSubject, + Observable, + of as observableOf, +} from 'rxjs'; +import { + filter, + map, + startWith, + switchMap, + take, +} from 'rxjs/operators'; -import { SearchFilterConfig } from '../../models/search-filter-config.model'; -import { SearchFilterService } from '../../../../core/shared/search/search-filter.service'; -import { slide } from '../../../animations/slide'; -import { hasValue, isNotEmpty } from '../../../empty.util'; import { SearchService } from '../../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SearchFilterService } from '../../../../core/shared/search/search-filter.service'; import { SequenceService } from '../../../../core/shared/sequence.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; +import { slide } from '../../../animations/slide'; +import { + hasValue, + isNotEmpty, +} from '../../../empty.util'; +import { SearchFilterConfig } from '../../models/search-filter-config.model'; @Component({ selector: 'ds-search-filter', @@ -184,9 +202,9 @@ export class SearchFilterComponent implements OnInit { } else { return this.searchConfigService.searchOptions.pipe( switchMap((options) => { - if (hasValue(this.scope)) { - options.scope = this.scope; - } + if (hasValue(this.scope)) { + options.scope = this.scope; + } return this.searchService.getFacetValuesFor(this.filter, 1, options).pipe( filter((RD) => !RD.isLoading), map((valuesRD) => { diff --git a/src/app/shared/search/search-filters/search-filter/search-filter.reducer.spec.ts b/src/app/shared/search/search-filters/search-filter/search-filter.reducer.spec.ts index 396b5d8426..114147606e 100644 --- a/src/app/shared/search/search-filters/search-filter/search-filter.reducer.spec.ts +++ b/src/app/shared/search/search-filters/search-filter/search-filter.reducer.spec.ts @@ -1,7 +1,15 @@ // eslint-disable-next-line import/no-namespace import * as deepFreeze from 'deep-freeze'; -import { SearchFilterCollapseAction, SearchFilterDecrementPageAction, SearchFilterExpandAction, SearchFilterIncrementPageAction, SearchFilterInitializeAction, SearchFilterResetPageAction, SearchFilterToggleAction } from './search-filter.actions'; +import { + SearchFilterCollapseAction, + SearchFilterDecrementPageAction, + SearchFilterExpandAction, + SearchFilterIncrementPageAction, + SearchFilterInitializeAction, + SearchFilterResetPageAction, + SearchFilterToggleAction, +} from './search-filter.actions'; import { filterReducer } from './search-filter.reducer'; const filterName1 = 'author'; diff --git a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.spec.ts b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.spec.ts index 3f3d4da468..80ab4bb463 100644 --- a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.spec.ts +++ b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.spec.ts @@ -1,20 +1,42 @@ -import { SearchHierarchyFilterComponent } from './search-hierarchy-filter.component'; -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { DebugElement, EventEmitter, NO_ERRORS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { + DebugElement, + EventEmitter, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Router } from '@angular/router'; -import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { + NgbModal, + NgbModule, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { + BehaviorSubject, + of as observableOf, +} from 'rxjs'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment.test'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; import { buildPaginatedList } from '../../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../../core/data/remote-data'; import { RequestEntryState } from '../../../../../core/data/request-entry-state.model'; import { PageInfo } from '../../../../../core/shared/page-info.model'; import { SearchService } from '../../../../../core/shared/search/search.service'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE, SearchFilterService } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, + SearchFilterService, +} from '../../../../../core/shared/search/search-filter.service'; import { VocabularyEntryDetail } from '../../../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { VocabularyService } from '../../../../../core/submission/vocabularies/vocabulary.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; @@ -22,8 +44,7 @@ import { RouterStub } from '../../../../testing/router.stub'; import { SearchConfigurationServiceStub } from '../../../../testing/search-configuration-service.stub'; import { FacetValue } from '../../../models/facet-value.model'; import { SearchFilterConfig } from '../../../models/search-filter-config.model'; -import { APP_CONFIG } from '../../../../../../config/app-config.interface'; -import { environment } from '../../../../../../environments/environment.test'; +import { SearchHierarchyFilterComponent } from './search-hierarchy-filter.component'; describe('SearchHierarchyFilterComponent', () => { @@ -74,7 +95,7 @@ describe('SearchHierarchyFilterComponent', () => { { provide: SEARCH_CONFIG_SERVICE, useValue: new SearchConfigurationServiceStub() }, { provide: IN_PLACE_SEARCH, useValue: false }, { provide: FILTER_CONFIG, useValue: Object.assign(new SearchFilterConfig(), { name: testSearchFilter }) }, - { provide: REFRESH_FILTER, useValue: new BehaviorSubject(false)}, + { provide: REFRESH_FILTER, useValue: new BehaviorSubject(false) }, { provide: SCOPE, useValue: undefined }, ], schemas: [NO_ERRORS_SCHEMA], diff --git a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts index 9d936fd18b..c107083bdd 100644 --- a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts @@ -1,26 +1,59 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { renderFacetFor } from '../search-filter-type-decorator'; -import { FilterType } from '../../../models/filter-type.model'; -import { facetLoad, SearchFacetFilterComponent } from '../search-facet-filter/search-facet-filter.component'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; +import { + Component, + Inject, + OnDestroy, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { filter, map, take } from 'rxjs/operators'; +import { + NgbModal, + NgbModalRef, +} from '@ng-bootstrap/ng-bootstrap'; +import { + BehaviorSubject, + combineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + filter, + map, + take, +} from 'rxjs/operators'; + +import { + APP_CONFIG, + AppConfig, +} from '../../../../../../config/app-config.interface'; +import { FilterVocabularyConfig } from '../../../../../../config/filter-vocabulary-config'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; import { PageInfo } from '../../../../../core/shared/page-info.model'; import { SearchService } from '../../../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../../../core/shared/search/search-configuration.service'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE, SearchFilterService } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, + SearchFilterService, +} from '../../../../../core/shared/search/search-filter.service'; import { VocabularyEntryDetail } from '../../../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { VocabularyService } from '../../../../../core/submission/vocabularies/vocabulary.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; -import { SearchFilterConfig } from '../../../models/search-filter-config.model'; -import { FacetValue } from '../../../models/facet-value.model'; -import { addOperatorToFilterValue, getFacetValueForType } from '../../../search.utils'; -import { VocabularyTreeviewModalComponent } from '../../../../form/vocabulary-treeview-modal/vocabulary-treeview-modal.component'; import { hasValue } from '../../../../empty.util'; -import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; -import { FilterVocabularyConfig } from '../../../../../../config/filter-vocabulary-config'; +import { VocabularyTreeviewModalComponent } from '../../../../form/vocabulary-treeview-modal/vocabulary-treeview-modal.component'; +import { FacetValue } from '../../../models/facet-value.model'; +import { FilterType } from '../../../models/filter-type.model'; +import { SearchFilterConfig } from '../../../models/search-filter-config.model'; +import { + addOperatorToFilterValue, + getFacetValueForType, +} from '../../../search.utils'; +import { + facetLoad, + SearchFacetFilterComponent, +} from '../search-facet-filter/search-facet-filter.component'; +import { renderFacetFor } from '../search-filter-type-decorator'; @Component({ selector: 'ds-search-hierarchy-filter', @@ -106,7 +139,7 @@ export class SearchHierarchyFilterComponent extends SearchFacetFilterComponent i [this.searchService.getSearchLink()], { queryParams: { - [this.filterConfig.paramName]: [...selectedValues, { value: detail.value }] + [this.filterConfig.paramName]: [...selectedValues, { value: detail.value }] .map((facetValue: FacetValue) => getFacetValueForType(facetValue, this.filterConfig)), }, queryParamsHandling: 'merge', diff --git a/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts b/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts index 3e295ca3e5..960057f662 100644 --- a/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts +++ b/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts @@ -1,17 +1,33 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { + BehaviorSubject, + of as observableOf, +} from 'rxjs'; import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service'; import { buildPaginatedList } from '../../../../../core/data/paginated-list.model'; import { RouteService } from '../../../../../core/services/route.service'; import { PageInfo } from '../../../../../core/shared/page-info.model'; import { SearchService } from '../../../../../core/shared/search/search.service'; -import { FILTER_CONFIG, IN_PLACE_SEARCH, REFRESH_FILTER, SCOPE, SearchFilterService } from '../../../../../core/shared/search/search-filter.service'; +import { + FILTER_CONFIG, + IN_PLACE_SEARCH, + REFRESH_FILTER, + SCOPE, + SearchFilterService, +} from '../../../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../remote-data.utils'; import { RouterStub } from '../../../../testing/router.stub'; diff --git a/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.ts index 8503ee376d..8831268a37 100644 --- a/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-range-filter/search-range-filter.component.ts @@ -25,9 +25,9 @@ import { SearchService } from '../../../../../core/shared/search/search.service' import { SearchConfigurationService } from '../../../../../core/shared/search/search-configuration.service'; import { FILTER_CONFIG, - SCOPE, IN_PLACE_SEARCH, REFRESH_FILTER, + SCOPE, SearchFilterService, } from '../../../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; diff --git a/src/app/shared/search/search-filters/search-filters.component.spec.ts b/src/app/shared/search/search-filters/search-filters.component.spec.ts index 603d74414b..67631d69bb 100644 --- a/src/app/shared/search/search-filters/search-filters.component.spec.ts +++ b/src/app/shared/search/search-filters/search-filters.component.spec.ts @@ -10,13 +10,13 @@ import { import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TranslateModule } from '@ngx-translate/core'; +import { APP_CONFIG } from 'src/config/app-config.interface'; +import { environment } from 'src/environments/environment'; import { SearchService } from '../../../core/shared/search/search.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; -import { APP_CONFIG } from 'src/config/app-config.interface'; -import { environment } from 'src/environments/environment'; import { SearchFiltersComponent } from './search-filters.component'; describe('SearchFiltersComponent', () => { diff --git a/src/app/shared/search/search-filters/search-filters.component.ts b/src/app/shared/search/search-filters/search-filters.component.ts index 726fd9385a..3eead1982f 100644 --- a/src/app/shared/search/search-filters/search-filters.component.ts +++ b/src/app/shared/search/search-filters/search-filters.component.ts @@ -1,11 +1,23 @@ -import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core'; +import { + Component, + Inject, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { + BehaviorSubject, + Observable, +} from 'rxjs'; import { map } from 'rxjs/operators'; -import { APP_CONFIG, AppConfig } from 'src/config/app-config.interface'; -import { SearchService } from '../../../core/shared/search/search.service'; +import { + APP_CONFIG, + AppConfig, +} from 'src/config/app-config.interface'; import { RemoteData } from '../../../core/data/remote-data'; +import { SearchService } from '../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; diff --git a/src/app/shared/search/search-settings/search-settings.component.spec.ts b/src/app/shared/search/search-settings/search-settings.component.spec.ts index 451919fe09..abcd63eee6 100644 --- a/src/app/shared/search/search-settings/search-settings.component.spec.ts +++ b/src/app/shared/search/search-settings/search-settings.component.spec.ts @@ -1,17 +1,25 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { SearchSettingsComponent } from './search-settings.component'; -import { of as observableOf } from 'rxjs'; -import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; -import { TranslateModule } from '@ngx-translate/core'; -import { RouterTestingModule } from '@angular/router/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { VarDirective } from '../../utils/var.directive'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; + +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; +import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { EnumKeysPipe } from '../../utils/enum-keys-pipe'; +import { VarDirective } from '../../utils/var.directive'; +import { SearchSettingsComponent } from './search-settings.component'; describe('SearchSettingsComponent', () => { diff --git a/src/app/shared/search/search-settings/search-settings.component.ts b/src/app/shared/search/search-settings/search-settings.component.ts index 81cafc139a..45679f95b1 100644 --- a/src/app/shared/search/search-settings/search-settings.component.ts +++ b/src/app/shared/search/search-settings/search-settings.component.ts @@ -1,5 +1,13 @@ -import { Component, Inject, Input } from '@angular/core'; -import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { + Component, + Inject, + Input, +} from '@angular/core'; + +import { + SortDirection, + SortOptions, +} from '../../../core/cache/models/sort-options.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts index e3f950a040..dd1b1dd8a8 100644 --- a/src/app/shared/search/search.component.spec.ts +++ b/src/app/shared/search/search.component.spec.ts @@ -1,5 +1,14 @@ -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; @@ -8,11 +17,20 @@ import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { Store } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { cold } from 'jasmine-marbles'; -import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; +import { + BehaviorSubject, + Observable, + of as observableOf, +} from 'rxjs'; +import { APP_CONFIG } from '../../../config/app-config.interface'; +import { environment } from '../../../environments/environment.test'; import { getCollectionPageRoute } from '../../collection-page/collection-page-routing-paths'; import { getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { + SortDirection, + SortOptions, +} from '../../core/cache/models/sort-options.model'; import { CommunityDataService } from '../../core/data/community-data.service'; import { RemoteData } from '../../core/data/remote-data'; import { RouteService } from '../../core/services/route.service'; @@ -21,18 +39,22 @@ import { Item } from '../../core/shared/item.model'; import { SearchService } from '../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { SearchFilterService } from '../../core/shared/search/search-filter.service'; -import { SearchConfig, SortConfig } from '../../core/shared/search/search-filters/search-config.model'; +import { + SearchConfig, + SortConfig, +} from '../../core/shared/search/search-filters/search-config.model'; import { SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; import { HostWindowService } from '../host-window.service'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$, +} from '../remote-data.utils'; import { SidebarService } from '../sidebar/sidebar.service'; import { SidebarServiceStub } from '../testing/sidebar-service.stub'; import { FilterType } from './models/filter-type.model'; import { PaginatedSearchOptions } from './models/paginated-search-options.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; -import { environment } from '../../../environments/environment.test'; -import { APP_CONFIG } from '../../../config/app-config.interface'; import { SearchObjects } from './models/search-objects.model'; import { SearchComponent } from './search.component'; @@ -210,7 +232,7 @@ export function configureSearchComponentTestingModule(compType, additionalDeclar }, { provide: SEARCH_CONFIG_SERVICE, - useValue: searchConfigurationServiceStub + useValue: searchConfigurationServiceStub, }, { provide: APP_CONFIG, useValue: environment }, ], diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts index cc39606a2b..113e788a97 100644 --- a/src/app/shared/search/search.component.ts +++ b/src/app/shared/search/search.component.ts @@ -1,10 +1,36 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { NavigationStart, Router } from '@angular/router'; - -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; -import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Inject, + Input, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; +import { + NavigationStart, + Router, +} from '@angular/router'; import uniqueId from 'lodash/uniqueId'; +import { + BehaviorSubject, + combineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + map, + switchMap, +} from 'rxjs/operators'; +import { + APP_CONFIG, + AppConfig, +} from '../../../config/app-config.interface'; import { COLLECTION_MODULE_PATH } from '../../collection-page/collection-page-routing-paths'; import { COMMUNITY_MODULE_PATH } from '../../community-page/community-page-routing-paths'; import { SortOptions } from '../../core/cache/models/sort-options.model'; @@ -20,24 +46,28 @@ import { SearchConfigurationService } from '../../core/shared/search/search-conf import { SearchConfig } from '../../core/shared/search/search-filters/search-config.model'; import { ViewMode } from '../../core/shared/view-mode.model'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; import { ITEM_MODULE_PATH } from '../../item-page/item-page-routing-paths'; import { SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; import { pushInOut } from '../animations/push'; -import { hasValue, hasValueOperator, isEmpty, isNotEmpty } from '../empty.util'; +import { + hasValue, + hasValueOperator, + isEmpty, + isNotEmpty, +} from '../empty.util'; import { HostWindowService } from '../host-window.service'; import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; import { ListableObject } from '../object-collection/shared/listable-object.model'; import { SidebarService } from '../sidebar/sidebar.service'; -import { PaginatedSearchOptions } from './models/paginated-search-options.model'; -import { SearchResult } from './models/search-result.model'; -import { currentPath } from '../utils/route.utils'; -import { SearchConfigurationOption } from './search-switch-configuration/search-configuration-option.model'; import { followLink } from '../utils/follow-link-config.model'; +import { currentPath } from '../utils/route.utils'; +import { PaginatedSearchOptions } from './models/paginated-search-options.model'; import { SearchFilterConfig } from './models/search-filter-config.model'; import { SearchObjects } from './models/search-objects.model'; +import { SearchResult } from './models/search-result.model'; import { SelectionConfig } from './search-results/search-results.component'; -import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; -import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; +import { SearchConfigurationOption } from './search-switch-configuration/search-configuration-option.model'; @Component({ selector: 'ds-search', @@ -341,7 +371,7 @@ export class SearchComponent implements OnDestroy, OnInit { // filter for search options related to instanced paginated id return searchOptions.pagination.id === this.paginationId; }), - debounceTime(100) + debounceTime(100), ).subscribe(([configuration, searchSortOptions, searchOptions, sortOption, scope]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string]) => { // Build the PaginatedSearchOptions object const combinedOptions = Object.assign({}, searchOptions, diff --git a/src/app/shared/search/search.module.ts b/src/app/shared/search/search.module.ts index 4702957108..18b3f46a0a 100644 --- a/src/app/shared/search/search.module.ts +++ b/src/app/shared/search/search.module.ts @@ -1,12 +1,16 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { MissingTranslationHandler, TranslateModule } from '@ngx-translate/core'; +import { + MissingTranslationHandler, + TranslateModule, +} from '@ngx-translate/core'; import { NouisliderModule } from 'ng2-nouislider'; import { ConfigurationSearchPageComponent } from '../../search-page/configuration-search-page.component'; import { ThemedConfigurationSearchPageComponent } from '../../search-page/themed-configuration-search-page.component'; import { SharedModule } from '../shared.module'; import { MissingTranslationHelper } from '../translate/missing-translation.helper'; +import { AdvancedSearchComponent } from './advanced-search/advanced-search.component'; import { FacetConfigResponse } from './models/facet-config-response.model'; import { FacetValues } from './models/facet-values.model'; import { SearchObjects } from './models/search-objects.model'; @@ -31,7 +35,6 @@ import { SearchResultsComponent } from './search-results/search-results.componen import { ThemedSearchResultsComponent } from './search-results/themed-search-results.component'; import { SearchSettingsComponent } from './search-settings/search-settings.component'; import { ThemedSearchSettingsComponent } from './search-settings/themed-search-settings.component'; -import { AdvancedSearchComponent } from './advanced-search/advanced-search.component'; import { SearchSidebarComponent } from './search-sidebar/search-sidebar.component'; import { ThemedSearchSidebarComponent } from './search-sidebar/themed-search-sidebar.component'; import { SearchSwitchConfigurationComponent } from './search-switch-configuration/search-switch-configuration.component'; diff --git a/src/app/shared/search/themed-search.component.ts b/src/app/shared/search/themed-search.component.ts index cd5e505ddc..15a3006de4 100644 --- a/src/app/shared/search/themed-search.component.ts +++ b/src/app/shared/search/themed-search.component.ts @@ -1,4 +1,9 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { Context } from '../../core/shared/context.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index ec5eb29c91..46c3d6b1d1 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -1,14 +1,28 @@ import { DragDropModule } from '@angular/cdk/drag-drop'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; import { RouterModule } from '@angular/router'; -import { NgbDropdownModule, NgbNavModule, NgbPaginationModule, NgbTooltipModule, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap'; -import { MissingTranslationHandler, TranslateModule } from '@ngx-translate/core'; +import { + NgbDropdownModule, + NgbNavModule, + NgbPaginationModule, + NgbTooltipModule, + NgbTypeaheadModule, +} from '@ng-bootstrap/ng-bootstrap'; +import { + MissingTranslationHandler, + TranslateModule, +} from '@ngx-translate/core'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { NgxPaginationModule } from 'ngx-pagination'; import { GoogleRecaptchaModule } from '../core/google-recaptcha/google-recaptcha.module'; +import { QualityAssuranceEventDataService } from '../core/notifications/qa/events/quality-assurance-event-data.service'; +import { QualityAssuranceSourceDataService } from '../core/notifications/qa/source/quality-assurance-source-data.service'; import { CurationFormComponent } from '../curation-form/curation-form.component'; import { ModifyItemOverviewComponent } from '../item-page/edit-item-page/modify-item-overview/modify-item-overview.component'; import { ItemPageTitleFieldComponent } from '../item-page/simple/field-components/specific-field/title/item-page-title-field.component'; @@ -17,6 +31,7 @@ import { SearchNavbarComponent } from '../search-navbar/search-navbar.component' import { ThemedSearchNavbarComponent } from '../search-navbar/themed-search-navbar.component'; import { ThemedThumbnailComponent } from '../thumbnail/themed-thumbnail.component'; import { ThumbnailComponent } from '../thumbnail/thumbnail.component'; +import { DynamicComponentLoaderDirective } from './abstract-component-loader/dynamic-component-loader.directive'; import { AlertComponent } from './alert/alert.component'; import { AuthNavMenuComponent } from './auth-nav-menu/auth-nav-menu.component'; import { ThemedAuthNavMenuComponent } from './auth-nav-menu/themed-auth-nav-menu.component'; @@ -77,6 +92,7 @@ import { ClaimedTaskActionsDeclineTaskComponent } from './mydspace-actions/claim import { AdvancedClaimedTaskActionRatingComponent } from './mydspace-actions/claimed-task/rating/advanced-claimed-task-action-rating.component'; import { AdvancedClaimedTaskActionSelectReviewerComponent } from './mydspace-actions/claimed-task/select-reviewer/advanced-claimed-task-action-select-reviewer.component'; import { NgForTrackByIdDirective } from './ng-for-track-by-id.directive'; +import { NotificationBoxComponent } from './notification-box/notification-box.component'; import { ObjectCollectionComponent } from './object-collection/object-collection.component'; import { AccessStatusBadgeComponent } from './object-collection/shared/badges/access-status-badge/access-status-badge.component'; import { ThemedAccessStatusBadgeComponent } from './object-collection/shared/badges/access-status-badge/themed-access-status-badge.component'; @@ -91,7 +107,10 @@ import { TypeBadgeComponent } from './object-collection/shared/badges/type-badge import { ImportableListItemControlComponent } from './object-collection/shared/importable-list-item-control/importable-list-item-control.component'; import { ListableObjectComponentLoaderComponent } from './object-collection/shared/listable-object/listable-object-component-loader.component'; import { AbstractListableElementComponent } from './object-collection/shared/object-collection-element/abstract-listable-element.component'; +import { AbstractTabulatableElementComponent } from './object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component'; import { SelectableListItemControlComponent } from './object-collection/shared/selectable-list-item-control/selectable-list-item-control.component'; +import { TabulatableObjectsDirective } from './object-collection/shared/tabulatable-objects/tabulatable-objects.directive'; +import { TabulatableObjectsLoaderComponent } from './object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component'; import { SearchResultDetailElementComponent } from './object-detail/my-dspace-result-detail-element/search-result-detail-element.component'; import { ObjectDetailComponent } from './object-detail/object-detail.component'; import { CollectionGridElementComponent } from './object-grid/collection-grid-element/collection-grid-element.component'; @@ -119,6 +138,7 @@ import { CollectionSearchResultListElementComponent } from './object-list/search import { CommunitySearchResultListElementComponent } from './object-list/search-result-list-element/community-search-result/community-search-result-list-element.component'; import { ItemSearchResultListElementComponent } from './object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { SearchResultListElementComponent } from './object-list/search-result-list-element/search-result-list-element.component'; +import { TabulatableResultListElementsComponent } from './object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; import { CollectionSidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/collection/collection-sidebar-search-list-element.component'; import { CommunitySidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/community/community-sidebar-search-list-element.component'; import { PublicationSidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/item-types/publication/publication-sidebar-search-list-element.component'; @@ -126,6 +146,7 @@ import { SidebarSearchListElementComponent } from './object-list/sidebar-search- import { ThemedObjectListComponent } from './object-list/themed-object-list.component'; import { CollectionSelectComponent } from './object-select/collection-select/collection-select.component'; import { ItemSelectComponent } from './object-select/item-select/item-select.component'; +import { ObjectTableComponent } from './object-table/object-table.component'; import { PageSizeSelectorComponent } from './page-size-selector/page-size-selector.component'; import { PaginationComponent } from './pagination/pagination.component'; import { RoleDirective } from './roles/role.directive'; @@ -137,6 +158,7 @@ import { ThemedSearchFormComponent } from './search-form/themed-search-form.comp import { PageWithSidebarComponent } from './sidebar/page-with-sidebar.component'; import { SidebarDropdownComponent } from './sidebar/sidebar-dropdown.component'; import { StartsWithDateComponent } from './starts-with/date/starts-with-date.component'; +import { StartsWithLoaderComponent } from './starts-with/starts-with-loader.component'; import { StartsWithTextComponent } from './starts-with/text/starts-with-text.component'; import { AbstractTrackableComponent } from './trackable/abstract-trackable.component'; import { MissingTranslationHelper } from './translate/missing-translation.helper'; @@ -155,6 +177,7 @@ import { EnumKeysPipe } from './utils/enum-keys-pipe'; import { FileSizePipe } from './utils/file-size-pipe'; import { FileValueAccessorDirective } from './utils/file-value-accessor.directive'; import { InListValidator } from './utils/in-list-validator.directive'; +import { IpV4Validator } from './utils/ipV4.validator'; import { MarkdownPipe } from './utils/markdown.pipe'; import { MetadataFieldValidator } from './utils/metadatafield-validator.directive'; import { ObjectKeysPipe } from './utils/object-keys-pipe'; @@ -162,23 +185,11 @@ import { ObjNgFor } from './utils/object-ngfor.pipe'; import { ObjectValuesPipe } from './utils/object-values-pipe'; import { FileValidator } from './utils/require-file.validator'; import { SafeUrlPipe } from './utils/safe-url-pipe'; - import { ShortNumberPipe } from './utils/short-number.pipe'; +import { SplitPipe } from './utils/split.pipe'; import { TruncatePipe } from './utils/truncate.pipe'; import { VarDirective } from './utils/var.directive'; import { ViewModeSwitchComponent } from './view-mode-switch/view-mode-switch.component'; -import { SplitPipe } from './utils/split.pipe'; -import { QualityAssuranceEventDataService } from '../core/notifications/qa/events/quality-assurance-event-data.service'; -import { QualityAssuranceSourceDataService } from '../core/notifications/qa/source/quality-assurance-source-data.service'; -import { DynamicComponentLoaderDirective } from './abstract-component-loader/dynamic-component-loader.directive'; -import { StartsWithLoaderComponent } from './starts-with/starts-with-loader.component'; -import { IpV4Validator } from './utils/ipV4.validator'; -import { ObjectTableComponent } from './object-table/object-table.component'; -import { AbstractTabulatableElementComponent } from './object-collection/shared/objects-collection-tabulatable/objects-collection-tabulatable.component'; -import { TabulatableObjectsLoaderComponent } from './object-collection/shared/tabulatable-objects/tabulatable-objects-loader.component'; -import { TabulatableResultListElementsComponent } from './object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; -import { TabulatableObjectsDirective } from './object-collection/shared/tabulatable-objects/tabulatable-objects.directive'; -import { NotificationBoxComponent } from './notification-box/notification-box.component'; const MODULES = [ CommonModule, @@ -219,7 +230,7 @@ const PIPES = [ BrowserOnlyPipe, MarkdownPipe, ShortNumberPipe, - SplitPipe + SplitPipe, ]; const COMPONENTS = [ @@ -376,7 +387,7 @@ const PROVIDERS = [ MockAdminGuard, AbstractTrackableComponent, QualityAssuranceEventDataService, - QualityAssuranceSourceDataService + QualityAssuranceSourceDataService, ]; const DIRECTIVES = [ @@ -395,7 +406,7 @@ const DIRECTIVES = [ ContextHelpDirective, DynamicComponentLoaderDirective, IpV4Validator, - TabulatableObjectsDirective + TabulatableObjectsDirective, ]; @NgModule({ diff --git a/src/app/shared/starts-with/date/starts-with-date.component.spec.ts b/src/app/shared/starts-with/date/starts-with-date.component.spec.ts index 1b74efee56..7b54bf1edb 100644 --- a/src/app/shared/starts-with/date/starts-with-date.component.spec.ts +++ b/src/app/shared/starts-with/date/starts-with-date.component.spec.ts @@ -1,11 +1,17 @@ import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { StartsWithDateComponent } from './starts-with-date.component'; import { TranslateModule } from '@ngx-translate/core'; import { PaginationService } from '../../../core/pagination/pagination.service'; @@ -13,6 +19,7 @@ import { ActivatedRouteStub } from '../../testing/active-router.stub'; import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { RouterStub } from '../../testing/router.stub'; import { EnumKeysPipe } from '../../utils/enum-keys-pipe'; +import { StartsWithDateComponent } from './starts-with-date.component'; describe('StartsWithDateComponent', () => { let comp: StartsWithDateComponent; diff --git a/src/app/shared/starts-with/date/starts-with-date.component.ts b/src/app/shared/starts-with/date/starts-with-date.component.ts index 64b6f0a362..bcb3dfbcdd 100644 --- a/src/app/shared/starts-with/date/starts-with-date.component.ts +++ b/src/app/shared/starts-with/date/starts-with-date.component.ts @@ -1,7 +1,14 @@ -import { Component, OnInit } from '@angular/core'; -import { renderStartsWithFor, StartsWithType } from '../starts-with-decorator'; -import { StartsWithAbstractComponent } from '../starts-with-abstract.component'; +import { + Component, + OnInit, +} from '@angular/core'; + import { hasValue } from '../../empty.util'; +import { StartsWithAbstractComponent } from '../starts-with-abstract.component'; +import { + renderStartsWithFor, + StartsWithType, +} from '../starts-with-decorator'; /** * A switchable component rendering StartsWith options for the type "Date". diff --git a/src/app/shared/starts-with/starts-with-abstract.component.ts b/src/app/shared/starts-with/starts-with-abstract.component.ts index 6fd53a69aa..35efe312aa 100644 --- a/src/app/shared/starts-with/starts-with-abstract.component.ts +++ b/src/app/shared/starts-with/starts-with-abstract.component.ts @@ -1,11 +1,22 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + UntypedFormControl, + UntypedFormGroup, +} from '@angular/forms'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { Subscription } from 'rxjs'; import { PaginationService } from '../../core/pagination/pagination.service'; -import { StartsWithType } from './starts-with-decorator'; import { hasValue } from '../empty.util'; +import { StartsWithType } from './starts-with-decorator'; /** * An abstract component to render StartsWith options diff --git a/src/app/shared/starts-with/starts-with-loader.component.spec.ts b/src/app/shared/starts-with/starts-with-loader.component.spec.ts index 7b8b58d298..e8c6cd2be9 100644 --- a/src/app/shared/starts-with/starts-with-loader.component.spec.ts +++ b/src/app/shared/starts-with/starts-with-loader.component.spec.ts @@ -1,17 +1,28 @@ -import { StartsWithLoaderComponent } from './starts-with-loader.component'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { DynamicComponentLoaderDirective } from '../abstract-component-loader/dynamic-component-loader.directive'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { StartsWithTextComponent } from './text/starts-with-text.component'; -import { ActivatedRoute, Router } from '@angular/router'; + +import { PaginationService } from '../../core/pagination/pagination.service'; +import { DynamicComponentLoaderDirective } from '../abstract-component-loader/dynamic-component-loader.directive'; +import { getMockThemeService } from '../mocks/theme-service.mock'; +import { ActivatedRouteStub } from '../testing/active-router.stub'; +import { PaginationServiceStub } from '../testing/pagination-service.stub'; import { RouterStub } from '../testing/router.stub'; import { ThemeService } from '../theme-support/theme.service'; -import { getMockThemeService } from '../mocks/theme-service.mock'; import { StartsWithType } from './starts-with-decorator'; -import { ActivatedRouteStub } from '../testing/active-router.stub'; -import { PaginationService } from '../../core/pagination/pagination.service'; -import { PaginationServiceStub } from '../testing/pagination-service.stub'; +import { StartsWithLoaderComponent } from './starts-with-loader.component'; +import { StartsWithTextComponent } from './text/starts-with-text.component'; describe('StartsWithLoaderComponent', () => { let comp: StartsWithLoaderComponent; @@ -48,7 +59,7 @@ describe('StartsWithLoaderComponent', () => { set: { changeDetection: ChangeDetectionStrategy.Default, entryComponents: [StartsWithTextComponent], - } + }, }).compileComponents(); })); diff --git a/src/app/shared/starts-with/starts-with-loader.component.ts b/src/app/shared/starts-with/starts-with-loader.component.ts index 9d26c8be7e..663c5e8401 100644 --- a/src/app/shared/starts-with/starts-with-loader.component.ts +++ b/src/app/shared/starts-with/starts-with-loader.component.ts @@ -1,8 +1,15 @@ -import { Component, Input } from '@angular/core'; -import { AbstractComponentLoaderComponent } from '../abstract-component-loader/abstract-component-loader.component'; +import { + Component, + Input, +} from '@angular/core'; + import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { getStartsWithComponent, StartsWithType } from './starts-with-decorator'; +import { AbstractComponentLoaderComponent } from '../abstract-component-loader/abstract-component-loader.component'; import { StartsWithAbstractComponent } from './starts-with-abstract.component'; +import { + getStartsWithComponent, + StartsWithType, +} from './starts-with-decorator'; /** * Component for loading a {@link StartsWithAbstractComponent} depending on the "type" input diff --git a/src/app/shared/starts-with/text/starts-with-text.component.spec.ts b/src/app/shared/starts-with/text/starts-with-text.component.spec.ts index d992076eef..94fccce55f 100644 --- a/src/app/shared/starts-with/text/starts-with-text.component.spec.ts +++ b/src/app/shared/starts-with/text/starts-with-text.component.spec.ts @@ -1,15 +1,22 @@ import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { ActivatedRoute, Router } from '@angular/router'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; import { PaginationService } from '../../../core/pagination/pagination.service'; -import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { ActivatedRouteStub } from '../../testing/active-router.stub'; +import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { RouterStub } from '../../testing/router.stub'; import { EnumKeysPipe } from '../../utils/enum-keys-pipe'; import { StartsWithTextComponent } from './starts-with-text.component'; diff --git a/src/app/shared/starts-with/text/starts-with-text.component.ts b/src/app/shared/starts-with/text/starts-with-text.component.ts index 998758f5d4..0f29f932ad 100644 --- a/src/app/shared/starts-with/text/starts-with-text.component.ts +++ b/src/app/shared/starts-with/text/starts-with-text.component.ts @@ -2,7 +2,10 @@ import { Component } from '@angular/core'; import { hasValue } from '../../empty.util'; import { StartsWithAbstractComponent } from '../starts-with-abstract.component'; -import { renderStartsWithFor, StartsWithType } from '../starts-with-decorator'; +import { + renderStartsWithFor, + StartsWithType, +} from '../starts-with-decorator'; /** * A switchable component rendering StartsWith options for the type "Text". diff --git a/src/app/shared/subscriptions/subscription-view/subscription-view.component.ts b/src/app/shared/subscriptions/subscription-view/subscription-view.component.ts index f6a0a6eafe..187a9740d0 100644 --- a/src/app/shared/subscriptions/subscription-view/subscription-view.component.ts +++ b/src/app/shared/subscriptions/subscription-view/subscription-view.component.ts @@ -1,5 +1,13 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; +import { + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; +import { + NgbModal, + NgbModalRef, +} from '@ng-bootstrap/ng-bootstrap'; import { take } from 'rxjs/operators'; import { getCollectionModuleRoute } from '../../../collection-page/collection-page-routing-paths'; diff --git a/src/app/shared/subscriptions/subscriptions-data.service.spec.ts b/src/app/shared/subscriptions/subscriptions-data.service.spec.ts index a037803ff6..860d3ad5ef 100644 --- a/src/app/shared/subscriptions/subscriptions-data.service.spec.ts +++ b/src/app/shared/subscriptions/subscriptions-data.service.spec.ts @@ -1,20 +1,24 @@ -import { SubscriptionsDataService } from './subscriptions-data.service'; -import { createNoContentRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; -import { Subscription } from './models/subscription.model'; -import { DSOChangeAnalyzer } from '../../core/data/dso-change-analyzer.service'; import { HttpClient } from '@angular/common/http'; -import { NotificationsService } from '../notifications/notifications.service'; -import { RequestService } from '../../core/data/request.service'; -import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service'; import { Store } from '@ngrx/store'; -import { ObjectCacheService } from '../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; + import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { getMockRequestService } from '../mocks/request.service.mock'; +import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../core/cache/object-cache.service'; +import { DSOChangeAnalyzer } from '../../core/data/dso-change-analyzer.service'; +import { RequestService } from '../../core/data/request.service'; +import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import { getMockRemoteDataBuildService } from '../mocks/remote-data-build.service.mock'; -import { NotificationsServiceStub } from '../testing/notifications-service.stub'; +import { getMockRequestService } from '../mocks/request.service.mock'; +import { NotificationsService } from '../notifications/notifications.service'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject$, +} from '../remote-data.utils'; import { HALEndpointServiceStub } from '../testing/hal-endpoint-service.stub'; +import { NotificationsServiceStub } from '../testing/notifications-service.stub'; import { createPaginatedList } from '../testing/utils.test'; +import { Subscription } from './models/subscription.model'; +import { SubscriptionsDataService } from './subscriptions-data.service'; describe('SubscriptionsDataService', () => { diff --git a/src/app/shared/testing/active-router.stub.ts b/src/app/shared/testing/active-router.stub.ts index 4c6dd456d3..4d58d61769 100644 --- a/src/app/shared/testing/active-router.stub.ts +++ b/src/app/shared/testing/active-router.stub.ts @@ -1,6 +1,11 @@ -import { map } from 'rxjs/operators'; -import { ActivatedRoute, convertToParamMap, Data, Params } from '@angular/router'; +import { + ActivatedRoute, + convertToParamMap, + Data, + Params, +} from '@angular/router'; import { BehaviorSubject } from 'rxjs'; +import { map } from 'rxjs/operators'; export class ActivatedRouteStub { diff --git a/src/app/shared/testing/host-window-service.stub.ts b/src/app/shared/testing/host-window-service.stub.ts index 51fba25ac9..af1b159026 100644 --- a/src/app/shared/testing/host-window-service.stub.ts +++ b/src/app/shared/testing/host-window-service.stub.ts @@ -1,4 +1,8 @@ -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; + import { WidthCategory } from '../host-window.service'; // declare a stub service diff --git a/src/app/shared/testing/menu-service.stub.ts b/src/app/shared/testing/menu-service.stub.ts index c1fc40c661..e2e1118021 100644 --- a/src/app/shared/testing/menu-service.stub.ts +++ b/src/app/shared/testing/menu-service.stub.ts @@ -1,4 +1,7 @@ -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; import { MenuID } from '../menu/menu-id.model'; import { MenuSection } from '../menu/menu-section.model'; diff --git a/src/app/shared/testing/object-cache-service.stub.ts b/src/app/shared/testing/object-cache-service.stub.ts index f62f3575c3..d6b21b3922 100644 --- a/src/app/shared/testing/object-cache-service.stub.ts +++ b/src/app/shared/testing/object-cache-service.stub.ts @@ -1,4 +1,8 @@ -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; + import { CacheableObject } from '../../core/cache/cacheable-object.model'; import { ObjectCacheEntry } from '../../core/cache/object-cache.reducer'; diff --git a/src/app/shared/testing/vocabulary-service.stub.ts b/src/app/shared/testing/vocabulary-service.stub.ts index af7f03d1ef..fd4483c5a2 100644 --- a/src/app/shared/testing/vocabulary-service.stub.ts +++ b/src/app/shared/testing/vocabulary-service.stub.ts @@ -1,6 +1,12 @@ -import { Observable, of as observableOf } from 'rxjs'; +import { + Observable, + of as observableOf, +} from 'rxjs'; -import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; +import { + buildPaginatedList, + PaginatedList, +} from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { PageInfo } from '../../core/shared/page-info.model'; import { Vocabulary } from '../../core/submission/vocabularies/models/vocabulary.model'; diff --git a/src/app/shared/theme-support/themed.component.ts b/src/app/shared/theme-support/themed.component.ts index d6869aea90..689b8189da 100644 --- a/src/app/shared/theme-support/themed.component.ts +++ b/src/app/shared/theme-support/themed.component.ts @@ -1,9 +1,37 @@ -import { AfterViewInit, ChangeDetectorRef, Component, ComponentRef, ElementRef, HostBinding, OnChanges, OnDestroy, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core'; -import { BehaviorSubject, combineLatest, from as fromPromise, Observable, of as observableOf, Subscription } from 'rxjs'; -import { catchError, map, switchMap, tap } from 'rxjs/operators'; +import { + AfterViewInit, + ChangeDetectorRef, + Component, + ComponentRef, + ElementRef, + HostBinding, + OnChanges, + OnDestroy, + SimpleChanges, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { + BehaviorSubject, + combineLatest, + from as fromPromise, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; +import { + catchError, + map, + switchMap, + tap, +} from 'rxjs/operators'; import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { hasNoValue, hasValue, isNotEmpty } from '../empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, +} from '../empty.util'; import { BASE_THEME_NAME } from './theme.constants'; import { ThemeService } from './theme.service'; diff --git a/src/app/shared/truncatable/truncatable.reducer.spec.ts b/src/app/shared/truncatable/truncatable.reducer.spec.ts index ee5ea69187..dca19d0225 100644 --- a/src/app/shared/truncatable/truncatable.reducer.spec.ts +++ b/src/app/shared/truncatable/truncatable.reducer.spec.ts @@ -1,7 +1,11 @@ // eslint-disable-next-line import/no-namespace import * as deepFreeze from 'deep-freeze'; -import { TruncatableCollapseAction, TruncatableExpandAction, TruncatableToggleAction } from './truncatable.actions'; +import { + TruncatableCollapseAction, + TruncatableExpandAction, + TruncatableToggleAction, +} from './truncatable.actions'; import { truncatableReducer } from './truncatable.reducer'; const id1 = '123'; diff --git a/src/app/shared/utils/ipV4.validator.spec.ts b/src/app/shared/utils/ipV4.validator.spec.ts index 9408b38103..2410722d61 100644 --- a/src/app/shared/utils/ipV4.validator.spec.ts +++ b/src/app/shared/utils/ipV4.validator.spec.ts @@ -1,6 +1,10 @@ -import { IpV4Validator } from './ipV4.validator'; import { TestBed } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { + UntypedFormControl, + UntypedFormGroup, +} from '@angular/forms'; + +import { IpV4Validator } from './ipV4.validator'; describe('IpV4 validator', () => { @@ -26,10 +30,10 @@ describe('IpV4 validator', () => { it('should return {isValidIp: false} for invalid Ip', () => { formGroup.controls.ip.setValue('100.260.45.1'); - expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({isValidIp: false}); + expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({ isValidIp: false }); formGroup.controls.ip.setValue('100'); - expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({isValidIp: false}); + expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({ isValidIp: false }); formGroup.controls.ip.setValue('testString'); - expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({isValidIp: false}); + expect(ipV4Validator.validate(formGroup.controls.ip as UntypedFormControl)).toEqual({ isValidIp: false }); }); }); diff --git a/src/app/shared/utils/ipV4.validator.ts b/src/app/shared/utils/ipV4.validator.ts index 59de4f4400..04f2a4b022 100644 --- a/src/app/shared/utils/ipV4.validator.ts +++ b/src/app/shared/utils/ipV4.validator.ts @@ -1,12 +1,16 @@ import { Directive } from '@angular/core'; -import { NG_VALIDATORS, UntypedFormControl, Validator } from '@angular/forms'; +import { + NG_VALIDATORS, + UntypedFormControl, + Validator, +} from '@angular/forms'; @Directive({ // eslint-disable-next-line @angular-eslint/directive-selector selector: '[ipV4format]', providers: [ { provide: NG_VALIDATORS, useExisting: IpV4Validator, multi: true }, - ] + ], }) /** * Validator to validate if an Ip is in the right format @@ -21,6 +25,6 @@ export class IpV4Validator implements Validator { return null; } - return {isValidIp: false}; + return { isValidIp: false }; } } diff --git a/src/app/shared/utils/split.pipe.ts b/src/app/shared/utils/split.pipe.ts index 36ddb0f946..2f6290322a 100644 --- a/src/app/shared/utils/split.pipe.ts +++ b/src/app/shared/utils/split.pipe.ts @@ -1,4 +1,7 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { + Pipe, + PipeTransform, +} from '@angular/core'; /** * Custom pipe to split a string into an array of substrings based on a specified separator. @@ -7,7 +10,7 @@ import { Pipe, PipeTransform } from '@angular/core'; * @returns An array of substrings. */ @Pipe({ - name: 'dsSplit' + name: 'dsSplit', }) export class SplitPipe implements PipeTransform { transform(value: string, separator: string): string[] { diff --git a/src/app/statistics/angulartics/dspace-provider.ts b/src/app/statistics/angulartics/dspace-provider.ts index def16d6d5f..c4143bbf97 100644 --- a/src/app/statistics/angulartics/dspace-provider.ts +++ b/src/app/statistics/angulartics/dspace-provider.ts @@ -1,5 +1,9 @@ import { Injectable } from '@angular/core'; -import { Angulartics2, EventTrack } from 'angulartics2'; +import { + Angulartics2, + EventTrack, +} from 'angulartics2'; + import { StatisticsService } from '../statistics.service'; /** diff --git a/src/app/submission/objects/submission-objects.actions.ts b/src/app/submission/objects/submission-objects.actions.ts index dea85b196b..e075ce5e5b 100644 --- a/src/app/submission/objects/submission-objects.actions.ts +++ b/src/app/submission/objects/submission-objects.actions.ts @@ -5,7 +5,10 @@ import { SubmissionDefinitionsModel } from '../../core/config/models/config-subm import { Item } from '../../core/shared/item.model'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; import { WorkspaceitemSectionUploadFileObject } from '../../core/submission/models/workspaceitem-section-upload-file.model'; -import { WorkspaceitemSectionDataType, WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model'; +import { + WorkspaceitemSectionDataType, + WorkspaceitemSectionsObject, +} from '../../core/submission/models/workspaceitem-sections.model'; import { type } from '../../shared/ngrx/type'; import { SectionsType } from '../sections/sections-type'; import { SectionVisibility } from './section-visibility.model'; diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index bab345f333..53dcd9a19e 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -1,39 +1,84 @@ import { Injectable } from '@angular/core'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { + Actions, + createEffect, + ofType, +} from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import findKey from 'lodash/findKey'; import isEqual from 'lodash/isEqual'; import union from 'lodash/union'; +import { + from as observableFrom, + Observable, + of as observableOf, +} from 'rxjs'; +import { + catchError, + filter, + map, + mergeMap, + switchMap, + take, + tap, + withLatestFrom, +} from 'rxjs/operators'; -import { from as observableFrom, Observable, of as observableOf } from 'rxjs'; -import { catchError, filter, map, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; +import { RemoteData } from '../../core/data/remote-data'; +import { Item } from '../../core/shared/item.model'; +import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; import { SubmissionObject } from '../../core/submission/models/submission-object.model'; import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; +import { WorkspaceitemSectionDuplicatesObject } from '../../core/submission/models/workspaceitem-section-duplicates.model'; import { WorkspaceitemSectionUploadObject } from '../../core/submission/models/workspaceitem-section-upload.model'; import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model'; -import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; import { SubmissionJsonPatchOperationsService } from '../../core/submission/submission-json-patch-operations.service'; -import { isEmpty, isNotEmpty, isNotUndefined } from '../../shared/empty.util'; +import { SubmissionObjectDataService } from '../../core/submission/submission-object-data.service'; +import { + isEmpty, + isNotEmpty, + isNotUndefined, +} from '../../shared/empty.util'; +import { FormState } from '../../shared/form/form.reducer'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { SectionsType } from '../sections/sections-type'; +import { followLink } from '../../shared/utils/follow-link-config.model'; import { SectionsService } from '../sections/sections.service'; +import { SectionsType } from '../sections/sections-type'; import { SubmissionState } from '../submission.reducers'; import { SubmissionService } from '../submission.service'; -import parseSectionErrors from '../utils/parseSectionErrors'; -import { CleanDuplicateDetectionAction, CompleteInitSubmissionFormAction, DepositSubmissionAction, DepositSubmissionErrorAction, DepositSubmissionSuccessAction, DiscardSubmissionErrorAction, DiscardSubmissionSuccessAction, InitSectionAction, InitSubmissionFormAction, ResetSubmissionFormAction, SaveAndDepositSubmissionAction, SaveForLaterSubmissionFormAction, SaveForLaterSubmissionFormSuccessAction, SaveSubmissionFormAction, SaveSubmissionFormErrorAction, SaveSubmissionFormSuccessAction, SaveSubmissionSectionFormAction, SaveSubmissionSectionFormErrorAction, SaveSubmissionSectionFormSuccessAction, SubmissionObjectAction, SubmissionObjectActionTypes, UpdateSectionDataAction, UpdateSectionDataSuccessAction } from './submission-objects.actions'; -import { SubmissionObjectEntry } from './submission-objects.reducer'; -import { Item } from '../../core/shared/item.model'; -import { RemoteData } from '../../core/data/remote-data'; -import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; -import { SubmissionObjectDataService } from '../../core/submission/submission-object-data.service'; -import { followLink } from '../../shared/utils/follow-link-config.model'; import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionErrorPaths'; -import { FormState } from '../../shared/form/form.reducer'; -import { SubmissionSectionObject } from './submission-section-object.model'; +import parseSectionErrors from '../utils/parseSectionErrors'; +import { + CleanDuplicateDetectionAction, + CompleteInitSubmissionFormAction, + DepositSubmissionAction, + DepositSubmissionErrorAction, + DepositSubmissionSuccessAction, + DiscardSubmissionErrorAction, + DiscardSubmissionSuccessAction, + InitSectionAction, + InitSubmissionFormAction, + ResetSubmissionFormAction, + SaveAndDepositSubmissionAction, + SaveForLaterSubmissionFormAction, + SaveForLaterSubmissionFormSuccessAction, + SaveSubmissionFormAction, + SaveSubmissionFormErrorAction, + SaveSubmissionFormSuccessAction, + SaveSubmissionSectionFormAction, + SaveSubmissionSectionFormErrorAction, + SaveSubmissionSectionFormSuccessAction, + SubmissionObjectAction, + SubmissionObjectActionTypes, + UpdateSectionDataAction, + UpdateSectionDataSuccessAction, +} from './submission-objects.actions'; +import { SubmissionObjectEntry } from './submission-objects.reducer'; import { SubmissionSectionError } from './submission-section-error.model'; -import { WorkspaceitemSectionDuplicatesObject } from '../../core/submission/models/workspaceitem-section-duplicates.model'; -import { environment } from '../../../environments/environment'; +import { SubmissionSectionObject } from './submission-section-object.model'; @Injectable() export class SubmissionObjectEffects { diff --git a/src/app/submission/objects/submission-objects.reducer.spec.ts b/src/app/submission/objects/submission-objects.reducer.spec.ts index 33132c4559..2389a5600c 100644 --- a/src/app/submission/objects/submission-objects.reducer.spec.ts +++ b/src/app/submission/objects/submission-objects.reducer.spec.ts @@ -1,8 +1,50 @@ import { Item } from '../../core/shared/item.model'; -import { mockSubmissionCollectionId, mockSubmissionDefinitionResponse, mockSubmissionId, mockSubmissionSelfUrl, mockSubmissionState } from '../../shared/mocks/submission.mock'; +import { + mockSubmissionCollectionId, + mockSubmissionDefinitionResponse, + mockSubmissionId, + mockSubmissionSelfUrl, + mockSubmissionState, +} from '../../shared/mocks/submission.mock'; import { SectionsType } from '../sections/sections-type'; -import { CancelSubmissionFormAction, ChangeSubmissionCollectionAction, CleanDuplicateDetectionAction, CompleteInitSubmissionFormAction, DeleteSectionErrorsAction, DeleteUploadedFileAction, DepositSubmissionAction, DepositSubmissionErrorAction, DepositSubmissionSuccessAction, DisableSectionAction, DiscardSubmissionAction, DiscardSubmissionSuccessAction, EditFileDataAction, EnableSectionAction, InertSectionErrorsAction, InitSectionAction, InitSubmissionFormAction, NewUploadedFileAction, RemoveSectionErrorsAction, ResetSubmissionFormAction, SaveAndDepositSubmissionAction, SaveForLaterSubmissionFormAction, SaveForLaterSubmissionFormErrorAction, SaveSubmissionFormAction, SaveSubmissionFormErrorAction, SaveSubmissionFormSuccessAction, SaveSubmissionSectionFormAction, SaveSubmissionSectionFormErrorAction, SaveSubmissionSectionFormSuccessAction, SectionStatusChangeAction, SubmissionObjectAction, UpdateSectionDataAction } from './submission-objects.actions'; -import { submissionObjectReducer, SubmissionObjectState } from './submission-objects.reducer'; +import { + CancelSubmissionFormAction, + ChangeSubmissionCollectionAction, + CleanDuplicateDetectionAction, + CompleteInitSubmissionFormAction, + DeleteSectionErrorsAction, + DeleteUploadedFileAction, + DepositSubmissionAction, + DepositSubmissionErrorAction, + DepositSubmissionSuccessAction, + DisableSectionAction, + DiscardSubmissionAction, + DiscardSubmissionSuccessAction, + EditFileDataAction, + EnableSectionAction, + InertSectionErrorsAction, + InitSectionAction, + InitSubmissionFormAction, + NewUploadedFileAction, + RemoveSectionErrorsAction, + ResetSubmissionFormAction, + SaveAndDepositSubmissionAction, + SaveForLaterSubmissionFormAction, + SaveForLaterSubmissionFormErrorAction, + SaveSubmissionFormAction, + SaveSubmissionFormErrorAction, + SaveSubmissionFormSuccessAction, + SaveSubmissionSectionFormAction, + SaveSubmissionSectionFormErrorAction, + SaveSubmissionSectionFormSuccessAction, + SectionStatusChangeAction, + SubmissionObjectAction, + UpdateSectionDataAction, +} from './submission-objects.actions'; +import { + submissionObjectReducer, + SubmissionObjectState, +} from './submission-objects.reducer'; describe('submissionReducer test suite', () => { diff --git a/src/app/submission/objects/submission-objects.reducer.ts b/src/app/submission/objects/submission-objects.reducer.ts index 1e9568b7aa..82e33062cd 100644 --- a/src/app/submission/objects/submission-objects.reducer.ts +++ b/src/app/submission/objects/submission-objects.reducer.ts @@ -1,13 +1,53 @@ -import { hasValue, isEmpty, isNotEmpty, isNotNull, isNull, isUndefined } from '../../shared/empty.util'; import differenceWith from 'lodash/differenceWith'; import findKey from 'lodash/findKey'; import isEqual from 'lodash/isEqual'; import uniqWith from 'lodash/uniqWith'; -import { - ChangeSubmissionCollectionAction, CleanDuplicateDetectionAction, CompleteInitSubmissionFormAction, DeleteSectionErrorsAction, DeleteUploadedFileAction, DepositSubmissionAction, DepositSubmissionErrorAction, DepositSubmissionSuccessAction, DisableSectionAction, EditFileDataAction, EditFilePrimaryBitstreamAction, EnableSectionAction, InertSectionErrorsAction, InitSectionAction, InitSubmissionFormAction, NewUploadedFileAction, RemoveSectionErrorsAction, ResetSubmissionFormAction, SaveAndDepositSubmissionAction, SaveForLaterSubmissionFormAction, SaveForLaterSubmissionFormErrorAction, SaveForLaterSubmissionFormSuccessAction, SaveSubmissionFormAction, SaveSubmissionFormErrorAction, SaveSubmissionFormSuccessAction, SaveSubmissionSectionFormAction, SaveSubmissionSectionFormErrorAction, SaveSubmissionSectionFormSuccessAction, SectionStatusChangeAction, SetActiveSectionAction, SetSectionFormId, SubmissionObjectAction, SubmissionObjectActionTypes, UpdateSectionDataAction, -} from './submission-objects.actions'; import { WorkspaceitemSectionUploadObject } from '../../core/submission/models/workspaceitem-section-upload.model'; +import { + hasValue, + isEmpty, + isNotEmpty, + isNotNull, + isNull, + isUndefined, +} from '../../shared/empty.util'; +import { + ChangeSubmissionCollectionAction, + CleanDuplicateDetectionAction, + CompleteInitSubmissionFormAction, + DeleteSectionErrorsAction, + DeleteUploadedFileAction, + DepositSubmissionAction, + DepositSubmissionErrorAction, + DepositSubmissionSuccessAction, + DisableSectionAction, + EditFileDataAction, + EditFilePrimaryBitstreamAction, + EnableSectionAction, + InertSectionErrorsAction, + InitSectionAction, + InitSubmissionFormAction, + NewUploadedFileAction, + RemoveSectionErrorsAction, + ResetSubmissionFormAction, + SaveAndDepositSubmissionAction, + SaveForLaterSubmissionFormAction, + SaveForLaterSubmissionFormErrorAction, + SaveForLaterSubmissionFormSuccessAction, + SaveSubmissionFormAction, + SaveSubmissionFormErrorAction, + SaveSubmissionFormSuccessAction, + SaveSubmissionSectionFormAction, + SaveSubmissionSectionFormErrorAction, + SaveSubmissionSectionFormSuccessAction, + SectionStatusChangeAction, + SetActiveSectionAction, + SetSectionFormId, + SubmissionObjectAction, + SubmissionObjectActionTypes, + UpdateSectionDataAction, +} from './submission-objects.actions'; import { SubmissionSectionObject } from './submission-section-object.model'; /** @@ -742,13 +782,13 @@ function editPrimaryBitstream(state: SubmissionObjectState, action: EditFilePrim ...submission.sections[sectionId], data: { ...submission.sections[sectionId].data as WorkspaceitemSectionUploadObject, - primary: fileId - } - } + primary: fileId, + }, + }, }, isLoading: submission.isLoading, savePending: submission.savePending, - } + }, }; } @@ -836,10 +876,10 @@ function cleanDuplicateDetectionSection(state: SubmissionObjectState, action: Cl sections: Object.assign({}, state[ action.payload.submissionId ].sections, { [ 'duplicates' ]: Object.assign({}, state[ action.payload.submissionId ].sections.duplicates, { enabled: false, - data: { potentialDuplicates: [] } - }) - }) - }) + data: { potentialDuplicates: [] }, + }), + }), + }), }); } else { return state; diff --git a/src/app/submission/sections/duplicates/section-duplicates.component.spec.ts b/src/app/submission/sections/duplicates/section-duplicates.component.spec.ts index fb47b243a3..3128a775fd 100644 --- a/src/app/submission/sections/duplicates/section-duplicates.component.spec.ts +++ b/src/app/submission/sections/duplicates/section-duplicates.component.spec.ts @@ -1,96 +1,109 @@ -import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectorRef, + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { BrowserModule } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -import { NgxPaginationModule } from 'ngx-pagination'; -import { cold } from 'jasmine-marbles'; -import { of as observableOf } from 'rxjs'; import { TranslateModule } from '@ngx-translate/core'; +import { cold } from 'jasmine-marbles'; +import { NgxPaginationModule } from 'ngx-pagination'; +import { of as observableOf } from 'rxjs'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; -import { SubmissionService } from '../../submission.service'; -import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub'; -import { SectionsService } from '../sections.service'; -import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; +import { SubmissionFormsConfigDataService } from '../../../core/config/submission-forms-config-data.service'; +import { CollectionDataService } from '../../../core/data/collection-data.service'; +import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; +import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { Collection } from '../../../core/shared/collection.model'; +import { License } from '../../../core/shared/license.model'; +import { MetadataValue } from '../../../core/shared/metadata.models'; +import { SubmissionScopeType } from '../../../core/submission/submission-scope-type'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; +import { FormService } from '../../../shared/form/form.service'; import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock'; import { getMockFormService } from '../../../shared/mocks/form-service.mock'; -import { FormService } from '../../../shared/form/form.service'; -import { SubmissionFormsConfigDataService } from '../../../core/config/submission-forms-config-data.service'; -import { SectionsType } from '../sections-type'; -import { mockSubmissionCollectionId, mockSubmissionId } from '../../../shared/mocks/submission.mock'; -import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; -import { SubmissionSectionDuplicatesComponent } from './section-duplicates.component'; -import { CollectionDataService } from '../../../core/data/collection-data.service'; -import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; -import { SectionFormOperationsService } from '../form/section-form-operations.service'; -import { SubmissionScopeType } from '../../../core/submission/submission-scope-type'; -import { License } from '../../../core/shared/license.model'; -import { Collection } from '../../../core/shared/collection.model'; +import { + mockSubmissionCollectionId, + mockSubmissionId, +} from '../../../shared/mocks/submission.mock'; +import { defaultUUID } from '../../../shared/mocks/uuid.service.mock'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { Duplicate } from '../../../shared/object-list/duplicate-data/duplicate.model'; +import { DUPLICATE } from '../../../shared/object-list/duplicate-data/duplicate.resource-type'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; +import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub'; import { ObjNgFor } from '../../../shared/utils/object-ngfor.pipe'; import { VarDirective } from '../../../shared/utils/var.directive'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -import { Duplicate } from '../../../shared/object-list/duplicate-data/duplicate.model'; -import { MetadataValue } from '../../../core/shared/metadata.models'; -import { defaultUUID } from '../../../shared/mocks/uuid.service.mock'; -import { DUPLICATE } from '../../../shared/object-list/duplicate-data/duplicate.resource-type'; +import { SubmissionService } from '../../submission.service'; +import { SectionFormOperationsService } from '../form/section-form-operations.service'; +import { SectionsService } from '../sections.service'; +import { SectionsType } from '../sections-type'; +import { SubmissionSectionDuplicatesComponent } from './section-duplicates.component'; function getMockSubmissionFormsConfigService(): SubmissionFormsConfigDataService { return jasmine.createSpyObj('FormOperationsService', { getConfigAll: jasmine.createSpy('getConfigAll'), getConfigByHref: jasmine.createSpy('getConfigByHref'), getConfigByName: jasmine.createSpy('getConfigByName'), - getConfigBySearch: jasmine.createSpy('getConfigBySearch') + getConfigBySearch: jasmine.createSpy('getConfigBySearch'), }); } function getMockCollectionDataService(): CollectionDataService { return jasmine.createSpyObj('CollectionDataService', { findById: jasmine.createSpy('findById'), - findByHref: jasmine.createSpy('findByHref') + findByHref: jasmine.createSpy('findByHref'), }); } const duplicates: Duplicate[] = [{ - title: 'Unique title', - uuid: defaultUUID, - workflowItemId: 1, - workspaceItemId: 2, - owningCollection: 'Test Collection', - metadata: { - 'dc.title': [ - Object.assign(new MetadataValue(), { + title: 'Unique title', + uuid: defaultUUID, + workflowItemId: 1, + workspaceItemId: 2, + owningCollection: 'Test Collection', + metadata: { + 'dc.title': [ + Object.assign(new MetadataValue(), { 'value': 'Unique title', 'language': null, 'authority': null, 'confidence': -1, - 'place': 0 - })] + 'place': 0, + })], + }, + type: DUPLICATE, + _links: { + self: { + href: 'http://localhost:8080/server/api/core/submission/duplicates/search?uuid=testid', }, - type: DUPLICATE, - _links: { - self: { - href: 'http://localhost:8080/server/api/core/submission/duplicates/search?uuid=testid' - } - } - }]; + }, +}]; const sectionObject = { header: 'submission.sections.submit.progressbar.duplicates', mandatory: true, opened: true, - data: {potentialDuplicates: duplicates}, + data: { potentialDuplicates: duplicates }, errorsToShow: [], serverValidationErrors: [], id: 'duplicates', sectionType: SectionsType.Duplicates, - sectionVisibility: null + sectionVisibility: null, }; describe('SubmissionSectionDuplicatesComponent test suite', () => { @@ -120,9 +133,9 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => { { key: 'dc.title', language: 'en_US', - value: 'Community 1-Collection 1' + value: 'Community 1-Collection 1', }], - license: createSuccessfulRemoteDataObject$(Object.assign(new License(), { text: licenseText })) + license: createSuccessfulRemoteDataObject$(Object.assign(new License(), { text: licenseText })), }); const paginationService = new PaginationServiceStub(); @@ -157,9 +170,9 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => { { provide: 'submissionIdProvider', useValue: submissionId }, { provide: PaginationService, useValue: paginationService }, ChangeDetectorRef, - FormBuilderService + FormBuilderService, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }).compileComponents().then(); })); @@ -213,7 +226,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => { sectionsServiceStub.isSectionReadOnly.and.returnValue(observableOf(false)); compAsAny.submissionService.getSubmissionScope.and.returnValue(SubmissionScopeType.WorkspaceItem); spyOn(comp, 'getSectionStatus').and.returnValue(observableOf(true)); - spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({potentialDuplicates: duplicates})); + spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({ potentialDuplicates: duplicates })); expect(comp.isLoading).toBeTruthy(); comp.onSectionInit(); fixture.detectChanges(); @@ -225,13 +238,13 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => { it('Should return TRUE if the isLoading is FALSE', () => { compAsAny.isLoading = false; expect(compAsAny.getSectionStatus()).toBeObservable(cold('(a|)', { - a: true + a: true, })); }); it('Should return FALSE', () => { compAsAny.isLoadin = true; expect(compAsAny.getSectionStatus()).toBeObservable(cold('(a|)', { - a: false + a: false, })); }); }); @@ -241,7 +254,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => { // declare a test component @Component({ selector: 'ds-test-cmp', - template: `` + template: ``, }) class TestComponent { diff --git a/src/app/submission/sections/duplicates/section-duplicates.component.ts b/src/app/submission/sections/duplicates/section-duplicates.component.ts index c929ab9ce2..d4065153ae 100644 --- a/src/app/submission/sections/duplicates/section-duplicates.component.ts +++ b/src/app/submission/sections/duplicates/section-duplicates.component.ts @@ -1,20 +1,26 @@ -import {ChangeDetectionStrategy, Component, Inject } from '@angular/core'; - -import { Observable, of as observableOf, Subscription } from 'rxjs'; -import { TranslateService } from '@ngx-translate/core'; -import { SectionsType } from '../sections-type'; -import { SectionModelComponent } from '../models/section.model'; -import { renderSectionFor } from '../sections-decorator'; -import { SectionDataObject } from '../models/section-data.model'; -import { SubmissionService } from '../../submission.service'; -import { AlertType } from '../../../shared/alert/alert-type'; -import { SectionsService } from '../sections.service'; import { - WorkspaceitemSectionDuplicatesObject -} from '../../../core/submission/models/workspaceitem-section-duplicates.model'; + ChangeDetectionStrategy, + Component, + Inject, +} from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; + import { Metadata } from '../../../core/shared/metadata.utils'; +import { WorkspaceitemSectionDuplicatesObject } from '../../../core/submission/models/workspaceitem-section-duplicates.model'; import { URLCombiner } from '../../../core/url-combiner/url-combiner'; import { getItemModuleRoute } from '../../../item-page/item-page-routing-paths'; +import { AlertType } from '../../../shared/alert/alert-type'; +import { SubmissionService } from '../../submission.service'; +import { SectionModelComponent } from '../models/section.model'; +import { SectionDataObject } from '../models/section-data.model'; +import { SectionsService } from '../sections.service'; +import { renderSectionFor } from '../sections-decorator'; +import { SectionsType } from '../sections-type'; /** * Detect duplicates step @@ -24,7 +30,7 @@ import { getItemModuleRoute } from '../../../item-page/item-page-routing-paths'; @Component({ selector: 'ds-submission-section-duplicates', templateUrl: './section-duplicates.component.html', - changeDetection: ChangeDetectionStrategy.Default + changeDetection: ChangeDetectionStrategy.Default, }) @renderSectionFor(SectionsType.Duplicates) @@ -68,7 +74,7 @@ export class SubmissionSectionDuplicatesComponent extends SectionModelComponent } ngOnInit() { - super.ngOnInit(); + super.ngOnInit(); } /** diff --git a/src/app/submission/sections/license/section-license.component.ts b/src/app/submission/sections/license/section-license.component.ts index 282828f5a4..701bf75cb6 100644 --- a/src/app/submission/sections/license/section-license.component.ts +++ b/src/app/submission/sections/license/section-license.component.ts @@ -1,8 +1,29 @@ -import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core'; -import { DynamicCheckboxModel, DynamicFormControlEvent, DynamicFormControlModel, DynamicFormLayout } from '@ng-dynamic-forms/core'; +import { + ChangeDetectorRef, + Component, + Inject, + ViewChild, +} from '@angular/core'; +import { + DynamicCheckboxModel, + DynamicFormControlEvent, + DynamicFormControlModel, + DynamicFormLayout, +} from '@ng-dynamic-forms/core'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, find, map, mergeMap, startWith, take } from 'rxjs/operators'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + filter, + find, + map, + mergeMap, + startWith, + take, +} from 'rxjs/operators'; import { CollectionDataService } from '../../../core/data/collection-data.service'; import { RemoteData } from '../../../core/data/remote-data'; @@ -11,7 +32,12 @@ import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/jso import { Collection } from '../../../core/shared/collection.model'; import { License } from '../../../core/shared/license.model'; import { WorkspaceitemSectionLicenseObject } from '../../../core/submission/models/workspaceitem-section-license.model'; -import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../shared/empty.util'; +import { + hasValue, + isNotEmpty, + isNotNull, + isNotUndefined, +} from '../../../shared/empty.util'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { FormComponent } from '../../../shared/form/form.component'; import { FormService } from '../../../shared/form/form.service'; @@ -23,7 +49,10 @@ import { SectionDataObject } from '../models/section-data.model'; import { SectionsService } from '../sections.service'; import { renderSectionFor } from '../sections-decorator'; import { SectionsType } from '../sections-type'; -import { SECTION_LICENSE_FORM_LAYOUT, SECTION_LICENSE_FORM_MODEL } from './section-license.model'; +import { + SECTION_LICENSE_FORM_LAYOUT, + SECTION_LICENSE_FORM_MODEL, +} from './section-license.model'; /** * This component represents a section that contains the submission license form. diff --git a/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.spec.ts b/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.spec.ts index ecb8a2a61d..cfad518b85 100644 --- a/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.spec.ts +++ b/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.spec.ts @@ -1,25 +1,29 @@ -import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; -import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec'; -import { FindAllData } from '../../../core/data/base/find-all-data'; -import { cold, getTestScheduler } from 'jasmine-marbles'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { TestScheduler } from 'rxjs/testing'; -import { RequestService } from '../../../core/data/request.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { RequestEntry } from '../../../core/data/request-entry.model'; -import { RemoteData } from '../../../core/data/remote-data'; -import { RequestEntryState } from '../../../core/data/request-entry-state.model'; -import { RestResponse } from '../../../core/cache/response.models'; +import { + cold, + getTestScheduler, +} from 'jasmine-marbles'; import { of } from 'rxjs'; -import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; -import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec'; -import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec'; -import { DeleteData } from '../../../core/data/base/delete-data'; -import { PatchData } from '../../../core/data/base/patch-data'; +import { TestScheduler } from 'rxjs/testing'; + +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { RestResponse } from '../../../core/cache/response.models'; import { CreateData } from '../../../core/data/base/create-data'; import { testCreateDataImplementation } from '../../../core/data/base/create-data.spec'; +import { DeleteData } from '../../../core/data/base/delete-data'; +import { testDeleteDataImplementation } from '../../../core/data/base/delete-data.spec'; +import { FindAllData } from '../../../core/data/base/find-all-data'; +import { testFindAllDataImplementation } from '../../../core/data/base/find-all-data.spec'; +import { PatchData } from '../../../core/data/base/patch-data'; +import { testPatchDataImplementation } from '../../../core/data/base/patch-data.spec'; +import { RemoteData } from '../../../core/data/remote-data'; +import { RequestService } from '../../../core/data/request.service'; +import { RequestEntry } from '../../../core/data/request-entry.model'; +import { RequestEntryState } from '../../../core/data/request-entry-state.model'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; describe('CoarNotifyConfigDataService test', () => { let scheduler: TestScheduler; @@ -44,7 +48,7 @@ describe('CoarNotifyConfigDataService test', () => { rdbService, objectCache, halService, - notificationsService + notificationsService, ); } @@ -66,12 +70,12 @@ describe('CoarNotifyConfigDataService test', () => { }); halService = jasmine.createSpyObj('halService', { - getEndpoint: of(endpointURL) + getEndpoint: of(endpointURL), }); rdbService = jasmine.createSpyObj('rdbService', { buildSingle: createSuccessfulRemoteDataObject$({}, 500), - buildList: cold('a', { a: remoteDataMocks.Success }) + buildList: cold('a', { a: remoteDataMocks.Success }), }); diff --git a/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.ts b/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.ts index 0bf5fe5359..cb5155dd32 100644 --- a/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.ts +++ b/src/app/submission/sections/section-coar-notify/coar-notify-config-data.service.ts @@ -1,31 +1,47 @@ import { Injectable } from '@angular/core'; -import { dataService } from '../../../core/data/base/data-service.decorator'; -import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; -import { FindAllData, FindAllDataImpl } from '../../../core/data/base/find-all-data'; -import { DeleteData, DeleteDataImpl } from '../../../core/data/base/delete-data'; -import { RequestService } from '../../../core/data/request.service'; -import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../../../core/cache/object-cache.service'; -import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { Operation } from 'fast-json-patch'; import { Observable } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; +import { + map, + take, +} from 'rxjs/operators'; + +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { + CreateData, + CreateDataImpl, +} from '../../../core/data/base/create-data'; +import { dataService } from '../../../core/data/base/data-service.decorator'; +import { + DeleteData, + DeleteDataImpl, +} from '../../../core/data/base/delete-data'; +import { + FindAllData, + FindAllDataImpl, +} from '../../../core/data/base/find-all-data'; +import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; +import { + PatchData, + PatchDataImpl, +} from '../../../core/data/base/patch-data'; +import { ChangeAnalyzer } from '../../../core/data/change-analyzer'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { NoContent } from '../../../core/shared/NoContent.model'; -import { map, take } from 'rxjs/operators'; -import { URLCombiner } from '../../../core/url-combiner/url-combiner'; +import { RemoteData } from '../../../core/data/remote-data'; import { MultipartPostRequest } from '../../../core/data/request.models'; +import { RequestService } from '../../../core/data/request.service'; import { RestRequest } from '../../../core/data/rest-request.model'; +import { RestRequestMethod } from '../../../core/data/rest-request-method'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NoContent } from '../../../core/shared/NoContent.model'; +import { URLCombiner } from '../../../core/url-combiner/url-combiner'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { SUBMISSION_COAR_NOTIFY_CONFIG } from './section-coar-notify-service.resource-type'; import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config'; -import { CreateData, CreateDataImpl } from '../../../core/data/base/create-data'; -import { PatchData, PatchDataImpl } from '../../../core/data/base/patch-data'; -import { ChangeAnalyzer } from '../../../core/data/change-analyzer'; -import { Operation } from 'fast-json-patch'; -import { RestRequestMethod } from '../../../core/data/rest-request-method'; -import { RequestParam } from '../../../core/cache/models/request-param.model'; /** @@ -97,7 +113,7 @@ export class CoarNotifyConfigDataService extends IdentifiableDataService { const body = this.getInvocationFormData(files); return new MultipartPostRequest(requestId, endpoint, body); - }) + }), ).subscribe((request: RestRequest) => this.requestService.send(request)); return this.rdbService.buildFromRequestUUID(requestId); diff --git a/src/app/submission/sections/section-coar-notify/section-coar-notify.component.spec.ts b/src/app/submission/sections/section-coar-notify/section-coar-notify.component.spec.ts index 0f00aa7a78..f92ceff902 100644 --- a/src/app/submission/sections/section-coar-notify/section-coar-notify.component.spec.ts +++ b/src/app/submission/sections/section-coar-notify/section-coar-notify.component.spec.ts @@ -1,19 +1,25 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SubmissionSectionCoarNotifyComponent } from './section-coar-notify.component'; -import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; -import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; -import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; -import { SectionsService } from '../sections.service'; -import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; import { ChangeDetectorRef } from '@angular/core'; -import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; + +import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { NotifyServicePattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model'; +import { + LdnService, + LdnServiceByPattern, +} from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; +import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { createPaginatedList } from '../../../shared/testing/utils.test'; -import { of } from 'rxjs'; -import { LdnService, LdnServiceByPattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; -import { NotifyServicePattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model'; -import { TranslateModule } from '@ngx-translate/core'; +import { SectionsService } from '../sections.service'; +import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; +import { SubmissionSectionCoarNotifyComponent } from './section-coar-notify.component'; +import { SubmissionCoarNotifyConfig } from './submission-coar-notify.config'; describe('SubmissionSectionCoarNotifyComponent', () => { let component: SubmissionSectionCoarNotifyComponent; @@ -30,8 +36,8 @@ describe('SubmissionSectionCoarNotifyComponent', () => { const patterns: SubmissionCoarNotifyConfig[] = Object.assign( [new SubmissionCoarNotifyConfig()], { - patterns: [{pattern: 'review', multipleRequest: false}, {pattern: 'endorsment', multipleRequest: false}], - } + patterns: [{ pattern: 'review', multipleRequest: false }, { pattern: 'endorsment', multipleRequest: false }], + }, ); const patternsPL = createPaginatedList(patterns); const coarNotifyConfig = createSuccessfulRemoteDataObject$(patternsPL); @@ -42,7 +48,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { ]); coarNotifyConfigDataService = jasmine.createSpyObj( 'CoarNotifyConfigDataService', - ['findAll'] + ['findAll'], ); operationsBuilder = jasmine.createSpyObj('JsonPatchOperationsBuilder', [ 'remove', @@ -64,12 +70,12 @@ describe('SubmissionSectionCoarNotifyComponent', () => { declarations: [SubmissionSectionCoarNotifyComponent], providers: [ { provide: LdnServicesService, useValue: ldnServicesService }, - { provide: CoarNotifyConfigDataService, useValue: coarNotifyConfigDataService}, + { provide: CoarNotifyConfigDataService, useValue: coarNotifyConfigDataService }, { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, { provide: SectionsService, useValue: sectionService }, { provide: ChangeDetectorRef, useValue: cdRefStub }, { provide: 'collectionIdProvider', useValue: 'collectionId' }, - { provide: 'sectionDataProvider', useValue: { id: 'sectionId', data: {} }}, + { provide: 'sectionDataProvider', useValue: { id: 'sectionId', data: {} } }, { provide: 'submissionIdProvider', useValue: 'submissionId' }, NgbDropdown, ], @@ -86,8 +92,8 @@ describe('SubmissionSectionCoarNotifyComponent', () => { Object.assign([], { path: 'sections/sectionId/data/notifyCoar', message: 'error', - }) - ) + }), + ), ); fixture.detectChanges(); }); @@ -109,7 +115,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { }); describe('onChange', () => { - const ldnPattern = {pattern: 'review', multipleRequest: false}; + const ldnPattern = { pattern: 'review', multipleRequest: false }; const index = 0; const selectedService: LdnService = Object.assign(new LdnService(), { id: 1, @@ -125,7 +131,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { beforeEach(() => { component.ldnServiceByPattern[ldnPattern.pattern] = { allowsMultipleRequests: false, - services: [] + services: [], } as LdnServiceByPattern; component.patterns = []; @@ -146,7 +152,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { component.onChange(ldnPattern.pattern, index, null); expect(componentAsAny.operationsBuilder.flushOperation).toHaveBeenCalledWith( - componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']) + componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']), ); expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toBeNull(); expect(component.previousServices[ldnPattern.pattern].services[index]).toBeNull(); @@ -166,7 +172,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { component.ldnServiceByPattern[ldnPattern.pattern].services[index] = previousService; component.previousServices[ldnPattern.pattern] = { allowsMultipleRequests: false, - services: [previousService] + services: [previousService], } as LdnServiceByPattern; component.onChange(ldnPattern.pattern, index, selectedService); @@ -175,13 +181,13 @@ describe('SubmissionSectionCoarNotifyComponent', () => { componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']), [selectedService.id], false, - true + true, ); expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toEqual( - selectedService + selectedService, ); expect(component.previousServices[ldnPattern.pattern].services[index].id).toEqual( - selectedService.id + selectedService.id, ); }); @@ -192,20 +198,20 @@ describe('SubmissionSectionCoarNotifyComponent', () => { componentAsAny.pathCombiner.getPath([ldnPattern.pattern, '-']), [selectedService.id], false, - true + true, ); expect(component.ldnServiceByPattern[ldnPattern.pattern].services[index]).toEqual( - selectedService + selectedService, ); expect(component.previousServices[ldnPattern.pattern].services[index].id).toEqual( - selectedService.id + selectedService.id, ); }); }); describe('initSelectedServicesByPattern', () => { - const pattern1 = {pattern: 'review', multipleRequest: false}; - const pattern2 = {pattern: 'endorsement', multipleRequest: false}; + const pattern1 = { pattern: 'review', multipleRequest: false }; + const pattern2 = { pattern: 'endorsement', multipleRequest: false }; const service1: LdnService = Object.assign(new LdnService(), { id: 1, uuid: 1, @@ -244,16 +250,16 @@ describe('SubmissionSectionCoarNotifyComponent', () => { beforeEach(() => { ldnServicesService.findByInboundPattern.and.returnValue( - createSuccessfulRemoteDataObject$(createPaginatedList(services)) + createSuccessfulRemoteDataObject$(createPaginatedList(services)), ); component.ldnServiceByPattern[pattern1.pattern] = { allowsMultipleRequests: false, - services: [] + services: [], } as LdnServiceByPattern; component.ldnServiceByPattern[pattern2.pattern] = { allowsMultipleRequests: false, - services: [] + services: [], } as LdnServiceByPattern; component.patterns = [pattern1, pattern2]; @@ -287,7 +293,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { }); describe('addService', () => { - const ldnPattern = {pattern: 'review', multipleRequest: false}; + const ldnPattern = { pattern: 'review', multipleRequest: false }; const service: any = { id: 1, name: 'service1', @@ -297,7 +303,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { beforeEach(() => { component.ldnServiceByPattern[ldnPattern.pattern] = { allowsMultipleRequests: false, - services: [] + services: [], } as LdnServiceByPattern; }); @@ -309,7 +315,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { }); describe('removeService', () => { - const ldnPattern = {pattern: 'review', multipleRequest: false}; + const ldnPattern = { pattern: 'review', multipleRequest: false }; const service1: LdnService = Object.assign(new LdnService(), { id: 1, name: 'service1', @@ -341,7 +347,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { beforeEach(() => { component.ldnServiceByPattern[ldnPattern.pattern] = { allowsMultipleRequests: false, - services: [] + services: [], } as LdnServiceByPattern; }); @@ -378,7 +384,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { beforeEach(() => { ldnServicesService.findByInboundPattern.and.returnValue( - createSuccessfulRemoteDataObject$(createPaginatedList(services)) + createSuccessfulRemoteDataObject$(createPaginatedList(services)), ); }); @@ -412,7 +418,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { { path: 'sections/sectionId/data/notifyCoar', message: 'error' }, ]; sectionService.getSectionServerErrors.and.returnValue( - of(validationErrors) + of(validationErrors), ); componentAsAny.getSectionServerErrorsAndSetErrorsToDisplay(); @@ -420,7 +426,7 @@ describe('SubmissionSectionCoarNotifyComponent', () => { expect(sectionService.setSectionError).toHaveBeenCalledWith( component.submissionId, component.sectionData.id, - validationErrors[0] + validationErrors[0], ); }); }); diff --git a/src/app/submission/sections/section-coar-notify/section-coar-notify.component.ts b/src/app/submission/sections/section-coar-notify/section-coar-notify.component.ts index c292c337d7..6415e21f31 100644 --- a/src/app/submission/sections/section-coar-notify/section-coar-notify.component.ts +++ b/src/app/submission/sections/section-coar-notify/section-coar-notify.component.ts @@ -1,22 +1,44 @@ -import { ChangeDetectorRef, Component, Inject } from '@angular/core'; -import { Observable, Subscription } from 'rxjs'; -import { SectionModelComponent } from '../models/section.model'; -import { renderSectionFor } from '../sections-decorator'; -import { SectionsType } from '../sections-type'; +import { + ChangeDetectorRef, + Component, + Inject, +} from '@angular/core'; +import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; +import { + Observable, + Subscription, +} from 'rxjs'; +import { + filter, + map, + take, + tap, +} from 'rxjs/operators'; + +import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { + LdnService, + LdnServiceByPattern, +} from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; -import { SectionsService } from '../sections.service'; -import { SectionDataObject } from '../models/section-data.model'; - -import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util'; - -import { getFirstCompletedRemoteData, getPaginatedListPayload, getRemoteDataPayload } from '../../../core/shared/operators'; -import { LdnServicesService } from '../../../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; -import { LdnService, LdnServiceByPattern } from '../../../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; -import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; -import { filter, map, take, tap } from 'rxjs/operators'; -import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; +import { + getFirstCompletedRemoteData, + getPaginatedListPayload, + getRemoteDataPayload, +} from '../../../core/shared/operators'; +import { + hasValue, + isEmpty, + isNotEmpty, +} from '../../../shared/empty.util'; import { SubmissionSectionError } from '../../objects/submission-section-error.model'; +import { SectionModelComponent } from '../models/section.model'; +import { SectionDataObject } from '../models/section-data.model'; +import { SectionsService } from '../sections.service'; +import { renderSectionFor } from '../sections-decorator'; +import { SectionsType } from '../sections-type'; +import { CoarNotifyConfigDataService } from './coar-notify-config-data.service'; import { LdnPattern } from './submission-coar-notify.config'; /** @@ -26,7 +48,7 @@ import { LdnPattern } from './submission-coar-notify.config'; selector: 'ds-submission-section-coar-notify', templateUrl: './section-coar-notify.component.html', styleUrls: ['./section-coar-notify.component.scss'], - providers: [NgbDropdown] + providers: [NgbDropdown], }) @renderSectionFor(SectionsType.CoarNotify) export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent { @@ -100,7 +122,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent setCoarNotifyConfig() { this.subs.push( this.coarNotifyConfigDataService.findAll().pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData(), ).subscribe((data) => { if (data.hasSucceeded) { this.patterns = data.payload.page[0].patterns; @@ -125,7 +147,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent if (!this.previousServices[pattern]) { this.previousServices[pattern] = { services: [], - allowsMultipleRequests: this.patterns.find(ldnPattern => ldnPattern.pattern === pattern)?.multipleRequest + allowsMultipleRequests: this.patterns.find(ldnPattern => ldnPattern.pattern === pattern)?.multipleRequest, }; } @@ -170,7 +192,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent if (!this.ldnServiceByPattern[ldnPattern.pattern]) { this.ldnServiceByPattern[ldnPattern.pattern] = { services: [], - allowsMultipleRequests: ldnPattern.multipleRequest + allowsMultipleRequests: ldnPattern.multipleRequest, }; } @@ -179,12 +201,12 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent this.addService(ldnPattern, selection); return this.sectionData.data[ldnPattern.pattern].includes(service.uuid); }); - }) + }), ); } else { this.ldnServiceByPattern[ldnPattern.pattern] = { services: [], - allowsMultipleRequests: ldnPattern.multipleRequest + allowsMultipleRequests: ldnPattern.multipleRequest, }; this.addService(ldnPattern, null); } @@ -202,7 +224,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent if (!this.ldnServiceByPattern[ldnPattern.pattern]) { this.ldnServiceByPattern[ldnPattern.pattern] = { services: [], - allowsMultipleRequests: ldnPattern.multipleRequest + allowsMultipleRequests: ldnPattern.multipleRequest, }; } this.ldnServiceByPattern[ldnPattern.pattern].services.push(newService); @@ -250,11 +272,11 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent } }), map((res: LdnService[]) => res.filter((service) => { - if (!this.hasSectionData){ - this.hasSectionData = this.hasInboundPattern(service, pattern); - } - return this.hasInboundPattern(service, pattern); - })) + if (!this.hasSectionData){ + this.hasSectionData = this.hasInboundPattern(service, pattern); + } + return this.hasInboundPattern(service, pattern); + })), ); } @@ -304,7 +326,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent const path = `${pattern}/${index}`; return error.path.includes(path); }); - }) + }), ); } @@ -313,7 +335,7 @@ export class SubmissionSectionCoarNotifyComponent extends SectionModelComponent */ protected getSectionStatus(): Observable { return this.sectionService.getSectionServerErrors(this.submissionId, this.sectionData.id).pipe( - map((validationErrors) => isEmpty(validationErrors) + map((validationErrors) => isEmpty(validationErrors), )); } diff --git a/src/app/submission/sections/section-coar-notify/submission-coar-notify-workspaceitem.model.ts b/src/app/submission/sections/section-coar-notify/submission-coar-notify-workspaceitem.model.ts index 7d17f588be..3ca16a7f24 100644 --- a/src/app/submission/sections/section-coar-notify/submission-coar-notify-workspaceitem.model.ts +++ b/src/app/submission/sections/section-coar-notify/submission-coar-notify-workspaceitem.model.ts @@ -1,8 +1,13 @@ -import { CacheableObject } from '../../../core/cache/cacheable-object.model'; -import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize'; +import { + autoserialize, + deserialize, + deserializeAs, + inheritSerialization, +} from 'cerialize'; -import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { typedObject } from '../../../core/cache/builders/build-decorators'; +import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { COAR_NOTIFY_WORKSPACEITEM } from './section-coar-notify-service.resource-type'; /** An CoarNotify and its properties. */ @@ -13,16 +18,16 @@ export class SubmissionCoarNotifyWorkspaceitemModel extends CacheableObject { @excludeFromEquals @autoserialize - endorsement?: number[]; + endorsement?: number[]; @deserializeAs('id') - review?: number[]; + review?: number[]; @autoserialize - ingest?: number[]; + ingest?: number[]; @deserialize - _links: { + _links: { self: { href: string; }; diff --git a/src/app/submission/sections/section-coar-notify/submission-coar-notify.config.ts b/src/app/submission/sections/section-coar-notify/submission-coar-notify.config.ts index 4a8116cdde..59a9125fed 100644 --- a/src/app/submission/sections/section-coar-notify/submission-coar-notify.config.ts +++ b/src/app/submission/sections/section-coar-notify/submission-coar-notify.config.ts @@ -1,9 +1,14 @@ -import { ResourceType } from '../../../core/shared/resource-type'; -import { CacheableObject } from '../../../core/cache/cacheable-object.model'; -import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize'; +import { + autoserialize, + deserialize, + deserializeAs, + inheritSerialization, +} from 'cerialize'; -import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { typedObject } from '../../../core/cache/builders/build-decorators'; +import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { ResourceType } from '../../../core/shared/resource-type'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { SUBMISSION_COAR_NOTIFY_CONFIG } from './section-coar-notify-service.resource-type'; export interface LdnPattern { @@ -18,19 +23,19 @@ export class SubmissionCoarNotifyConfig extends CacheableObject { @excludeFromEquals @autoserialize - type: ResourceType; + type: ResourceType; @autoserialize - id: string; + id: string; @deserializeAs('id') - uuid: string; + uuid: string; @autoserialize - patterns: LdnPattern[]; + patterns: LdnPattern[]; @deserialize - _links: { + _links: { self: { href: string; }; diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts index 7cf261a97a..4e4f487fbf 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts @@ -1,10 +1,32 @@ import { CommonModule } from '@angular/common'; -import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + ChangeDetectorRef, + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + inject, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; -import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormGroupModel, DynamicSelectModel } from '@ng-dynamic-forms/core'; +import { + NgbActiveModal, + NgbModal, +} from '@ng-bootstrap/ng-bootstrap'; +import { + DynamicFormArrayModel, + DynamicFormControlEvent, + DynamicFormGroupModel, + DynamicSelectModel, +} from '@ng-dynamic-forms/core'; import { TranslateModule } from '@ngx-translate/core'; import { of } from 'rxjs'; @@ -12,20 +34,28 @@ import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/b import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder'; import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service'; import { dateToISOFormat } from '../../../../../shared/date.util'; +import { DynamicCustomSwitchModel } from '../../../../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import { FormBuilderService } from '../../../../../shared/form/builder/form-builder.service'; import { FormFieldMetadataValueObject } from '../../../../../shared/form/builder/models/form-field-metadata-value.model'; import { FormComponent } from '../../../../../shared/form/form.component'; import { FormService } from '../../../../../shared/form/form.service'; import { getMockFormService } from '../../../../../shared/mocks/form-service.mock'; import { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock'; -import { mockFileFormData, mockSubmissionCollectionId, mockSubmissionId, mockSubmissionObject, mockUploadConfigResponse, mockUploadConfigResponseMetadata, mockUploadFiles } from '../../../../../shared/mocks/submission.mock'; +import { + mockFileFormData, + mockSubmissionCollectionId, + mockSubmissionId, + mockSubmissionObject, + mockUploadConfigResponse, + mockUploadConfigResponseMetadata, + mockUploadFiles, +} from '../../../../../shared/mocks/submission.mock'; import { SubmissionJsonPatchOperationsServiceStub } from '../../../../../shared/testing/submission-json-patch-operations-service.stub'; import { SubmissionServiceStub } from '../../../../../shared/testing/submission-service.stub'; import { createTestComponent } from '../../../../../shared/testing/utils.test'; import { SubmissionService } from '../../../../submission.service'; import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component'; import { SectionUploadService } from '../../section-upload.service'; -import { DynamicCustomSwitchModel } from '../../../../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component'; const jsonPatchOpBuilder: any = jasmine.createSpyObj('jsonPatchOpBuilder', { @@ -248,10 +278,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { sections: { upload: { primary: true, - files: mockUploadFiles - } - } - }) + files: mockUploadFiles, + }, + }, + }), ]; operationsService.jsonPatchByResourceID.and.returnValue(of(response)); @@ -294,7 +324,7 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { })); it('should update Bitstream data properly when access options are omitted', fakeAsync(() => { - compAsAny.formRef = {formGroup: null}; + compAsAny.formRef = { formGroup: null }; compAsAny.fileData = fileData; compAsAny.pathCombiner = pathCombiner; formService.validateAllFormFields.and.callFake(() => null); @@ -304,10 +334,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { Object.assign(mockSubmissionObject, { sections: { upload: { - files: mockUploadFiles - } - } - }) + files: mockUploadFiles, + }, + }, + }), ]; operationsService.jsonPatchByResourceID.and.returnValue(of(response)); comp.saveBitstreamData(); diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts index 374cd9992a..8d5779c12c 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts @@ -1,11 +1,32 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, DynamicDatePickerModel, DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormControlModel, DynamicFormGroupModel, DynamicSelectModel, MATCH_ENABLED, OR_OPERATOR } from '@ng-dynamic-forms/core'; +import { + DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, + DynamicDatePickerModel, + DynamicFormArrayModel, + DynamicFormControlEvent, + DynamicFormControlModel, + DynamicFormGroupModel, + DynamicSelectModel, + MATCH_ENABLED, + OR_OPERATOR, +} from '@ng-dynamic-forms/core'; import { DynamicDateControlValue } from '@ng-dynamic-forms/core/lib/model/dynamic-date-control.model'; import { DynamicFormControlCondition } from '@ng-dynamic-forms/core/lib/model/misc/dynamic-form-control-relation.model'; import { Subscription } from 'rxjs'; -import { filter, mergeMap, take } from 'rxjs/operators'; +import { + filter, + mergeMap, + take, +} from 'rxjs/operators'; +import { DynamicCustomSwitchModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; import { AccessConditionOption } from '../../../../../core/config/models/config-access-condition-option.model'; import { SubmissionFormsModel } from '../../../../../core/config/models/config-submission-forms.model'; @@ -16,7 +37,12 @@ import { WorkspaceitemSectionUploadObject } from '../../../../../core/submission import { WorkspaceitemSectionUploadFileObject } from '../../../../../core/submission/models/workspaceitem-section-upload-file.model'; import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service'; import { dateToISOFormat } from '../../../../../shared/date.util'; -import { hasNoValue, hasValue, isNotEmpty, isNotNull } from '../../../../../shared/empty.util'; +import { + hasNoValue, + hasValue, + isNotEmpty, + isNotNull, +} from '../../../../../shared/empty.util'; import { FormBuilderService } from '../../../../../shared/form/builder/form-builder.service'; import { FormFieldModel } from '../../../../../shared/form/builder/models/form-field.model'; import { FormComponent } from '../../../../../shared/form/form.component'; @@ -24,8 +50,22 @@ import { FormService } from '../../../../../shared/form/form.service'; import { SubmissionService } from '../../../../submission.service'; import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component'; import { SectionUploadService } from '../../section-upload.service'; -import { BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG, BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT, BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_CONFIG, BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_CONFIG, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT, BITSTREAM_FORM_PRIMARY, BITSTREAM_FORM_PRIMARY_LAYOUT, BITSTREAM_METADATA_FORM_GROUP_CONFIG, BITSTREAM_METADATA_FORM_GROUP_LAYOUT } from './section-upload-file-edit.model'; -import { DynamicCustomSwitchModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model'; +import { + BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG, + BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT, + BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_CONFIG, + BITSTREAM_ACCESS_CONDITIONS_FORM_ARRAY_LAYOUT, + BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG, + BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT, + BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG, + BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT, + BITSTREAM_FORM_ACCESS_CONDITION_TYPE_CONFIG, + BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT, + BITSTREAM_FORM_PRIMARY, + BITSTREAM_FORM_PRIMARY_LAYOUT, + BITSTREAM_METADATA_FORM_GROUP_CONFIG, + BITSTREAM_METADATA_FORM_GROUP_LAYOUT, +} from './section-upload-file-edit.model'; /** * This component represents the edit form for bitstream @@ -421,51 +461,51 @@ implements OnInit, OnDestroy { const currentAccessCondition = Object.assign({}, accessCondition); currentAccessCondition.name = this.retrieveValueFromField(accessCondition.name); - /* When start and end date fields are deactivated, their values may be still present in formData, + /* When start and end date fields are deactivated, their values may be still present in formData, therefore it is necessary to delete them if they're not allowed by the current access condition option. */ - if (!accessConditionOpt.hasStartDate) { - delete currentAccessCondition.startDate; - } else if (accessCondition.startDate) { - const startDate = this.retrieveValueFromField(accessCondition.startDate); - // Clamp the start date to the maximum, if any, since the - // datepicker sometimes exceeds it. - let startDateDate = new Date(startDate); - if (accessConditionOpt.maxStartDate) { - const maxStartDateDate = new Date(accessConditionOpt.maxStartDate); - if (startDateDate > maxStartDateDate) { - startDateDate = maxStartDateDate; + if (!accessConditionOpt.hasStartDate) { + delete currentAccessCondition.startDate; + } else if (accessCondition.startDate) { + const startDate = this.retrieveValueFromField(accessCondition.startDate); + // Clamp the start date to the maximum, if any, since the + // datepicker sometimes exceeds it. + let startDateDate = new Date(startDate); + if (accessConditionOpt.maxStartDate) { + const maxStartDateDate = new Date(accessConditionOpt.maxStartDate); + if (startDateDate > maxStartDateDate) { + startDateDate = maxStartDateDate; + } } + currentAccessCondition.startDate = dateToISOFormat(startDateDate); } - currentAccessCondition.startDate = dateToISOFormat(startDateDate); - } - if (!accessConditionOpt.hasEndDate) { - delete currentAccessCondition.endDate; - } else if (accessCondition.endDate) { - const endDate = this.retrieveValueFromField(accessCondition.endDate); - // Clamp the end date to the maximum, if any, since the - // datepicker sometimes exceeds it. - let endDateDate = new Date(endDate); - if (accessConditionOpt.maxEndDate) { - const maxEndDateDate = new Date(accessConditionOpt.maxEndDate); - if (endDateDate > maxEndDateDate) { - endDateDate = maxEndDateDate; + if (!accessConditionOpt.hasEndDate) { + delete currentAccessCondition.endDate; + } else if (accessCondition.endDate) { + const endDate = this.retrieveValueFromField(accessCondition.endDate); + // Clamp the end date to the maximum, if any, since the + // datepicker sometimes exceeds it. + let endDateDate = new Date(endDate); + if (accessConditionOpt.maxEndDate) { + const maxEndDateDate = new Date(accessConditionOpt.maxEndDate); + if (endDateDate > maxEndDateDate) { + endDateDate = maxEndDateDate; + } } + currentAccessCondition.endDate = dateToISOFormat(endDateDate); } - currentAccessCondition.endDate = dateToISOFormat(endDateDate); + accessConditionsToSave.push(currentAccessCondition); } - accessConditionsToSave.push(currentAccessCondition); - } - }); + }); } if (isNotEmpty(accessConditionsToSave)) { this.operationsBuilder.add(this.pathCombiner.getPath([...pathFragment, 'accessConditions']), accessConditionsToSave, true); } - // dispatch a PATCH request to save metadata - return this.operationsService.jsonPatchByResourceID( - this.submissionService.getSubmissionObjectLinkName(), - this.submissionId, - this.pathCombiner.rootElement, - this.pathCombiner.subRootElement); + // dispatch a PATCH request to save metadata + return this.operationsService.jsonPatchByResourceID( + this.submissionService.getSubmissionObjectLinkName(), + this.submissionId, + this.pathCombiner.rootElement, + this.pathCombiner.subRootElement); }), ).subscribe((result: SubmissionObject[]) => { const section = result[0].sections[this.sectionId]; @@ -479,7 +519,7 @@ implements OnInit, OnDestroy { Object.keys(uploadSection.files) .filter((key) => uploadSection.files[key].uuid === this.fileId) .forEach((key) => this.uploadService.updateFileData( - this.submissionId, this.sectionId, this.fileId, uploadSection.files[key]), + this.submissionId, this.sectionId, this.fileId, uploadSection.files[key]), ); this.isSaving = false; this.activeModal.close(); diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.model.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.model.ts index de7699300d..4a39dfcfc8 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.model.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.model.ts @@ -1,4 +1,13 @@ -import { DynamicDatePickerModelConfig, DynamicFormArrayModelConfig, DynamicFormControlLayout, DynamicFormGroupModelConfig, DynamicSelectModelConfig, DynamicSwitchModelConfig, MATCH_ENABLED, OR_OPERATOR } from '@ng-dynamic-forms/core'; +import { + DynamicDatePickerModelConfig, + DynamicFormArrayModelConfig, + DynamicFormControlLayout, + DynamicFormGroupModelConfig, + DynamicSelectModelConfig, + DynamicSwitchModelConfig, + MATCH_ENABLED, + OR_OPERATOR, +} from '@ng-dynamic-forms/core'; export const BITSTREAM_METADATA_FORM_GROUP_CONFIG: DynamicFormGroupModelConfig = { id: 'metadata', @@ -51,14 +60,14 @@ export const BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT: DynamicFormControlLayo export const BITSTREAM_FORM_PRIMARY_LAYOUT: DynamicFormControlLayout = { element: { host: 'col-12', - container: 'text-right' + container: 'text-right', }, }; export const BITSTREAM_FORM_PRIMARY: DynamicSwitchModelConfig = { id: 'primary', name: 'primary', - label: 'bitstream.edit.form.primaryBitstream.label' + label: 'bitstream.edit.form.primaryBitstream.label', }; diff --git a/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts b/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts index ce5f941d2a..83b3a33689 100644 --- a/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts +++ b/src/app/submission/sections/upload/file/section-upload-file.component.spec.ts @@ -1,10 +1,28 @@ import { CommonModule } from '@angular/common'; -import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; -import { BrowserModule, By } from '@angular/platform-browser'; -import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { + ChangeDetectorRef, + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + inject, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + BrowserModule, + By, +} from '@angular/platform-browser'; +import { + NgbModal, + NgbModule, +} from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; -import { of as observableOf, of } from 'rxjs'; +import { + of as observableOf, + of, +} from 'rxjs'; import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationsBuilder } from '../../../../core/json-patch/builder/json-patch-operations-builder'; @@ -14,7 +32,12 @@ import { FormBuilderService } from '../../../../shared/form/builder/form-builder import { FormService } from '../../../../shared/form/form.service'; import { getMockFormService } from '../../../../shared/mocks/form-service.mock'; import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock'; -import { mockSubmissionCollectionId, mockSubmissionId, mockUploadConfigResponse, mockUploadFiles } from '../../../../shared/mocks/submission.mock'; +import { + mockSubmissionCollectionId, + mockSubmissionId, + mockUploadConfigResponse, + mockUploadFiles, +} from '../../../../shared/mocks/submission.mock'; import { HALEndpointServiceStub } from '../../../../shared/testing/hal-endpoint-service.stub'; import { SubmissionJsonPatchOperationsServiceStub } from '../../../../shared/testing/submission-json-patch-operations-service.stub'; import { SubmissionServiceStub } from '../../../../shared/testing/submission-service.stub'; diff --git a/src/app/submission/sections/upload/file/section-upload-file.component.ts b/src/app/submission/sections/upload/file/section-upload-file.component.ts index 71c06db2ef..8b86b1ec0f 100644 --- a/src/app/submission/sections/upload/file/section-upload-file.component.ts +++ b/src/app/submission/sections/upload/file/section-upload-file.component.ts @@ -1,21 +1,34 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core'; - -import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { + Component, + Input, + OnChanges, + OnDestroy, + OnInit, + SimpleChanges, + ViewChild, +} from '@angular/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap/modal/modal-config'; import { DynamicFormControlModel } from '@ng-dynamic-forms/core'; +import { + BehaviorSubject, + Observable, + Subscription, +} from 'rxjs'; import { filter } from 'rxjs/operators'; import { SubmissionFormsModel } from '../../../../core/config/models/config-submission-forms.model'; -import { SubmissionService } from '../../../submission.service'; import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationsBuilder } from '../../../../core/json-patch/builder/json-patch-operations-builder'; import { Bitstream } from '../../../../core/shared/bitstream.model'; -import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; import { WorkspaceitemSectionUploadFileObject } from '../../../../core/submission/models/workspaceitem-section-upload-file.model'; import { SubmissionJsonPatchOperationsService } from '../../../../core/submission/submission-json-patch-operations.service'; -import { hasValue, isNotUndefined } from '../../../../shared/empty.util'; +import { + hasValue, + isNotUndefined, +} from '../../../../shared/empty.util'; import { FormService } from '../../../../shared/form/form.service'; +import { SubmissionService } from '../../../submission.service'; import { SectionUploadService } from '../section-upload.service'; import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component'; @@ -139,11 +152,11 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit, */ protected pathCombiner: JsonPatchOperationPathCombiner; - /** + /** * The [JsonPatchOperationPathCombiner] object * @type {JsonPatchOperationPathCombiner} */ - protected primaryBitstreamPathCombiner: JsonPatchOperationPathCombiner; + protected primaryBitstreamPathCombiner: JsonPatchOperationPathCombiner; /** * Array to track all subscriptions and unsubscribe them onDestroy diff --git a/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts b/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts index 8f5fbb8057..2280013147 100644 --- a/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts +++ b/src/app/submission/sections/upload/file/themed-section-upload-file.component.ts @@ -1,4 +1,7 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input, +} from '@angular/core'; import { SubmissionFormsModel } from 'src/app/core/config/models/config-submission-forms.model'; import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; diff --git a/src/app/submission/sections/upload/section-upload.component.spec.ts b/src/app/submission/sections/upload/section-upload.component.spec.ts index c906811f85..59179166a3 100644 --- a/src/app/submission/sections/upload/section-upload.component.spec.ts +++ b/src/app/submission/sections/upload/section-upload.component.spec.ts @@ -329,7 +329,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { comp.onSectionInit(); - expect(comp.required$.getValue()).toBe(true); + expect(comp.required$.getValue()).toBe(true); expect(compAsAny.getSectionStatus()).toBeObservable(cold('-c-d', { c: false, diff --git a/src/app/submission/sections/upload/section-upload.component.ts b/src/app/submission/sections/upload/section-upload.component.ts index 75952faec5..2afd059bfc 100644 --- a/src/app/submission/sections/upload/section-upload.component.ts +++ b/src/app/submission/sections/upload/section-upload.component.ts @@ -1,6 +1,24 @@ -import { ChangeDetectorRef, Component, Inject } from '@angular/core'; -import { BehaviorSubject, combineLatest as observableCombineLatest, combineLatest, Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, map, mergeMap, switchMap, tap } from 'rxjs/operators'; +import { + ChangeDetectorRef, + Component, + Inject, +} from '@angular/core'; +import { + BehaviorSubject, + combineLatest, + combineLatest as observableCombineLatest, + Observable, + Subscription, +} from 'rxjs'; +import { + distinctUntilChanged, + filter, + map, + mergeMap, + switchMap, + tap, +} from 'rxjs/operators'; +import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model'; @@ -15,14 +33,18 @@ import { ResourcePolicyDataService } from '../../../core/resource-policy/resourc import { Collection } from '../../../core/shared/collection.model'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; import { AlertType } from '../../../shared/alert/alert-type'; -import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util'; +import { + hasValue, + isNotEmpty, + isNotUndefined, + isUndefined, +} from '../../../shared/empty.util'; import { followLink } from '../../../shared/utils/follow-link-config.model'; import { SubmissionObjectEntry } from '../../objects/submission-objects.reducer'; import { SubmissionService } from '../../submission.service'; import { SectionModelComponent } from '../models/section.model'; import { SectionDataObject } from '../models/section-data.model'; import { SectionsService } from '../sections.service'; -import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model'; import { renderSectionFor } from '../sections-decorator'; import { SectionsType } from '../sections-type'; import { SectionUploadService } from './section-upload.service'; @@ -198,11 +220,11 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { }), distinctUntilChanged()) .subscribe(([configMetadataForm, { primary, files }]: [SubmissionFormsModel, WorkspaceitemSectionUploadObject]) => { - this.primaryBitstreamUUID = primary; - this.fileList = files; - this.fileNames = Array.from(files, file => this.getFileName(configMetadataForm, file)); - } - ) + this.primaryBitstreamUUID = primary; + this.fileList = files; + this.fileNames = Array.from(files, file => this.getFileName(configMetadataForm, file)); + }, + ), ); } diff --git a/src/app/submission/sections/upload/section-upload.service.spec.ts b/src/app/submission/sections/upload/section-upload.service.spec.ts index e1d2abe048..c57aac0ac9 100644 --- a/src/app/submission/sections/upload/section-upload.service.spec.ts +++ b/src/app/submission/sections/upload/section-upload.service.spec.ts @@ -1,9 +1,16 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + Store, + StoreModule, +} from '@ngrx/store'; import { JsonPatchOperationPathCombiner } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder'; + import { SectionUploadService } from './section-upload.service'; -import { Store, StoreModule } from '@ngrx/store'; const jsonPatchOpBuilder: any = jasmine.createSpyObj('jsonPatchOpBuilder', { add: jasmine.createSpy('add'), @@ -25,7 +32,7 @@ describe('SectionUploadService test suite', () => { SectionUploadService, { provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder }, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }); })); @@ -36,28 +43,28 @@ describe('SectionUploadService test suite', () => { [ { - initialPrimary: null, - primary: true, - operationName: 'add', - expected: [primaryPath, fileId, false, true] + initialPrimary: null, + primary: true, + operationName: 'add', + expected: [primaryPath, fileId, false, true], }, { - initialPrimary: true, - primary: false, - operationName: 'remove', - expected: [primaryPath] + initialPrimary: true, + primary: false, + operationName: 'remove', + expected: [primaryPath], }, { - initialPrimary: false, - primary: true, - operationName: 'replace', - expected: [primaryPath, fileId, true] - } + initialPrimary: false, + primary: true, + operationName: 'replace', + expected: [primaryPath, fileId, true], + }, ].forEach(({ initialPrimary, primary, operationName, expected }) => { it(`updatePrimaryBitstreamOperation should add ${operationName} operation`, () => { - const path = pathCombiner.getPath('primary'); - sectionUploadService.updatePrimaryBitstreamOperation(path, initialPrimary, primary, fileId); - expect(operationsBuilder[operationName]).toHaveBeenCalledWith(...expected); - }); + const path = pathCombiner.getPath('primary'); + sectionUploadService.updatePrimaryBitstreamOperation(path, initialPrimary, primary, fileId); + expect(operationsBuilder[operationName]).toHaveBeenCalledWith(...expected); + }); }); }); diff --git a/src/app/submission/sections/upload/section-upload.service.ts b/src/app/submission/sections/upload/section-upload.service.ts index 30245809b1..152d4e174a 100644 --- a/src/app/submission/sections/upload/section-upload.service.ts +++ b/src/app/submission/sections/upload/section-upload.service.ts @@ -1,21 +1,29 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { distinctUntilChanged, filter, map } from 'rxjs/operators'; +import { + distinctUntilChanged, + filter, + map, +} from 'rxjs/operators'; +import { JsonPatchOperationPathObject } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner'; +import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder'; +import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model'; import { WorkspaceitemSectionUploadFileObject } from '../../../core/submission/models/workspaceitem-section-upload-file.model'; import { isUndefined } from '../../../shared/empty.util'; -import { submissionSectionDataFromIdSelector, submissionUploadedFileFromUuidSelector, submissionUploadedFilesFromIdSelector } from '../../selectors'; -import { WorkspaceitemSectionUploadObject } from 'src/app/core/submission/models/workspaceitem-section-upload.model'; -import { JsonPatchOperationPathObject } from 'src/app/core/json-patch/builder/json-patch-operation-path-combiner'; -import { JsonPatchOperationsBuilder } from 'src/app/core/json-patch/builder/json-patch-operations-builder'; -import { SubmissionState } from '../../submission.reducers'; import { DeleteUploadedFileAction, EditFileDataAction, EditFilePrimaryBitstreamAction, NewUploadedFileAction, } from '../../objects/submission-objects.actions'; +import { + submissionSectionDataFromIdSelector, + submissionUploadedFileFromUuidSelector, + submissionUploadedFilesFromIdSelector, +} from '../../selectors'; +import { SubmissionState } from '../../submission.reducers'; /** * A service that provides methods to handle submission's bitstream state. @@ -31,7 +39,7 @@ export class SectionUploadService { */ constructor(private store: Store, private operationsBuilder: JsonPatchOperationsBuilder) {} - /** + /** * Define and add an operation based on a change * * @param path @@ -152,7 +160,7 @@ export class SectionUploadService { ); } - /** + /** * Update primary bitstream into the state * * @param submissionId @@ -162,9 +170,9 @@ export class SectionUploadService { * @param fileUUID * The bitstream UUID */ - public updateFilePrimaryBitstream(submissionId: string, sectionId: string, fileUUID: string | null) { + public updateFilePrimaryBitstream(submissionId: string, sectionId: string, fileUUID: string | null) { this.store.dispatch( - new EditFilePrimaryBitstreamAction(submissionId, sectionId, fileUUID) + new EditFilePrimaryBitstreamAction(submissionId, sectionId, fileUUID), ); } diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index eba475734a..88c81bdee5 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -1,9 +1,21 @@ -import { CommonModule, NgOptimizedImage } from '@angular/common'; +import { + CommonModule, + NgOptimizedImage, +} from '@angular/common'; import { NgModule } from '@angular/core'; -import { NgbAccordionModule, NgbCollapseModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; +import { + NgbAccordionModule, + NgbCollapseModule, + NgbModalModule, +} from '@ng-bootstrap/ng-bootstrap'; import { EffectsModule } from '@ngrx/effects'; -import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { + Action, + StoreConfig, + StoreModule, +} from '@ngrx/store'; +import { LdnServicesService } from '../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; import { storeModuleConfig } from '../app.reducer'; import { SubmissionAccessesConfigDataService } from '../core/config/submission-accesses-config-data.service'; import { SubmissionUploadsConfigDataService } from '../core/config/submission-uploads-config-data.service'; @@ -19,11 +31,6 @@ import { SubmissionFormCollectionComponent } from './form/collection/submission- import { SubmissionFormFooterComponent } from './form/footer/submission-form-footer.component'; import { SubmissionFormSectionAddComponent } from './form/section-add/submission-form-section-add.component'; import { SubmissionFormComponent } from './form/submission-form.component'; -import { SubmissionSectionContainerComponent } from './sections/container/section-container.component'; -import { submissionReducers, SubmissionState } from './submission.reducers'; -import { submissionEffects } from './submission.effects'; -import { SubmissionSectionUploadComponent } from './sections/upload/section-upload.component'; -import { SectionUploadService } from './sections/upload/section-upload.service'; import { SubmissionUploadFilesComponent } from './form/submission-upload-files/submission-upload-files.component'; import { SubmissionImportExternalCollectionComponent } from './import-external/import-external-collection/submission-import-external-collection.component'; import { SubmissionImportExternalPreviewComponent } from './import-external/import-external-preview/submission-import-external-preview.component'; @@ -33,10 +40,14 @@ import { ThemedSubmissionImportExternalComponent } from './import-external/theme import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; import { SectionAccessesService } from './sections/accesses/section-accesses.service'; import { SubmissionSectionCcLicensesComponent } from './sections/cc-license/submission-section-cc-licenses.component'; +import { SubmissionSectionContainerComponent } from './sections/container/section-container.component'; +import { SubmissionSectionDuplicatesComponent } from './sections/duplicates/section-duplicates.component'; import { SubmissionSectionFormComponent } from './sections/form/section-form.component'; import { SectionFormOperationsService } from './sections/form/section-form-operations.service'; import { SubmissionSectionIdentifiersComponent } from './sections/identifiers/section-identifiers.component'; import { SubmissionSectionLicenseComponent } from './sections/license/section-license.component'; +import { CoarNotifyConfigDataService } from './sections/section-coar-notify/coar-notify-config-data.service'; +import { SubmissionSectionCoarNotifyComponent } from './sections/section-coar-notify/section-coar-notify.component'; import { SectionsDirective } from './sections/sections.directive'; import { SectionsService } from './sections/sections.service'; import { ContentAccordionComponent } from './sections/sherpa-policies/content-accordion/content-accordion.component'; @@ -49,10 +60,13 @@ import { SubmissionSectionUploadFileEditComponent } from './sections/upload/file import { SubmissionSectionUploadFileComponent } from './sections/upload/file/section-upload-file.component'; import { ThemedSubmissionSectionUploadFileComponent } from './sections/upload/file/themed-section-upload-file.component'; import { SubmissionSectionUploadFileViewComponent } from './sections/upload/file/view/section-upload-file-view.component'; -import { SubmissionSectionDuplicatesComponent } from './sections/duplicates/section-duplicates.component'; -import { SubmissionSectionCoarNotifyComponent } from './sections/section-coar-notify/section-coar-notify.component'; -import { CoarNotifyConfigDataService } from './sections/section-coar-notify/coar-notify-config-data.service'; -import { LdnServicesService } from '../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; +import { SubmissionSectionUploadComponent } from './sections/upload/section-upload.component'; +import { SectionUploadService } from './sections/upload/section-upload.service'; +import { submissionEffects } from './submission.effects'; +import { + submissionReducers, + SubmissionState, +} from './submission.reducers'; import { SubmissionSubmitComponent } from './submit/submission-submit.component'; import { ThemedSubmissionSubmitComponent } from './submit/themed-submission-submit.component'; @@ -65,7 +79,7 @@ const ENTRY_COMPONENTS = [ SubmissionSectionAccessesComponent, SubmissionSectionSherpaPoliciesComponent, SubmissionSectionCoarNotifyComponent, - SubmissionSectionDuplicatesComponent + SubmissionSectionDuplicatesComponent, ]; const DECLARATIONS = [ @@ -100,22 +114,22 @@ const DECLARATIONS = [ ]; @NgModule({ - imports: [ - CommonModule, - CoreModule.forRoot(), - SharedModule, - StoreModule.forFeature('submission', submissionReducers, storeModuleConfig as StoreConfig), - EffectsModule.forFeature(), - EffectsModule.forFeature(submissionEffects), - JournalEntitiesModule.withEntryComponents(), - ResearchEntitiesModule.withEntryComponents(), - FormModule, - NgbModalModule, - NgbCollapseModule, - NgbAccordionModule, - UploadModule, - NgOptimizedImage, - ], + imports: [ + CommonModule, + CoreModule.forRoot(), + SharedModule, + StoreModule.forFeature('submission', submissionReducers, storeModuleConfig as StoreConfig), + EffectsModule.forFeature(), + EffectsModule.forFeature(submissionEffects), + JournalEntitiesModule.withEntryComponents(), + ResearchEntitiesModule.withEntryComponents(), + FormModule, + NgbModalModule, + NgbCollapseModule, + NgbAccordionModule, + UploadModule, + NgOptimizedImage, + ], declarations: DECLARATIONS, exports: [ ...DECLARATIONS, @@ -129,8 +143,8 @@ const DECLARATIONS = [ SectionAccessesService, SectionFormOperationsService, CoarNotifyConfigDataService, - LdnServicesService - ] + LdnServicesService, + ], }) /** diff --git a/src/app/suggestion-notifications/selectors.ts b/src/app/suggestion-notifications/selectors.ts index 1dd0df11a7..a8ec8c7def 100644 --- a/src/app/suggestion-notifications/selectors.ts +++ b/src/app/suggestion-notifications/selectors.ts @@ -1,9 +1,16 @@ -import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/store'; -import { suggestionNotificationsSelector, SuggestionNotificationsState } from '../notifications/notifications.reducer'; +import { + createFeatureSelector, + createSelector, + MemoizedSelector, +} from '@ngrx/store'; -import {subStateSelector} from '../submission/selectors'; -import { SuggestionTargetState } from '../notifications/suggestion-targets/suggestion-targets.reducer'; import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; +import { + suggestionNotificationsSelector, + SuggestionNotificationsState, +} from '../notifications/notifications.reducer'; +import { SuggestionTargetState } from '../notifications/suggestion-targets/suggestion-targets.reducer'; +import { subStateSelector } from '../submission/selectors'; /** * Returns the Reciter Suggestion Target state. @@ -40,7 +47,7 @@ export function suggestionTargetObjectSelector(): MemoizedSelector state.suggestionTarget.loaded + (state: SuggestionNotificationsState) => state.suggestionTarget.loaded, ); /** @@ -49,7 +56,7 @@ export const isSuggestionTargetLoadedSelector = createSelector(_getSuggestionTar * @return {boolean} */ export const isReciterSuggestionTargetProcessingSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.processing + (state: SuggestionNotificationsState) => state.suggestionTarget.processing, ); /** @@ -58,7 +65,7 @@ export const isReciterSuggestionTargetProcessingSelector = createSelector(_getSu * @return {number} */ export const getSuggestionTargetTotalPagesSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.totalPages + (state: SuggestionNotificationsState) => state.suggestionTarget.totalPages, ); /** @@ -67,7 +74,7 @@ export const getSuggestionTargetTotalPagesSelector = createSelector(_getSuggesti * @return {number} */ export const getSuggestionTargetCurrentPageSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.currentPage + (state: SuggestionNotificationsState) => state.suggestionTarget.currentPage, ); /** @@ -76,7 +83,7 @@ export const getSuggestionTargetCurrentPageSelector = createSelector(_getSuggest * @return {number} */ export const getSuggestionTargetTotalsSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.totalElements + (state: SuggestionNotificationsState) => state.suggestionTarget.totalElements, ); /** @@ -85,7 +92,7 @@ export const getSuggestionTargetTotalsSelector = createSelector(_getSuggestionTa * @return {SuggestionTarget[]} */ export const getCurrentUserSuggestionTargetsSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.currentUserTargets + (state: SuggestionNotificationsState) => state.suggestionTarget.currentUserTargets, ); /** @@ -94,5 +101,5 @@ export const getCurrentUserSuggestionTargetsSelector = createSelector(_getSugges * @return {boolean} */ export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getSuggestionTargetState, - (state: SuggestionNotificationsState) => state.suggestionTarget.currentUserTargetsVisited + (state: SuggestionNotificationsState) => state.suggestionTarget.currentUserTargetsVisited, ); diff --git a/src/app/suggestions-page/suggestions-page-routing.module.ts b/src/app/suggestions-page/suggestions-page-routing.module.ts index f7d4ecf955..0e5add0a7c 100644 --- a/src/app/suggestions-page/suggestions-page-routing.module.ts +++ b/src/app/suggestions-page/suggestions-page-routing.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { SuggestionsPageResolver } from './suggestions-page.resolver'; -import { SuggestionsPageComponent } from './suggestions-page.component'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { PublicationClaimBreadcrumbResolver } from '../core/breadcrumbs/publication-claim-breadcrumb.resolver'; +import { SuggestionsPageComponent } from './suggestions-page.component'; +import { SuggestionsPageResolver } from './suggestions-page.resolver'; @NgModule({ imports: [ @@ -13,23 +13,23 @@ import { PublicationClaimBreadcrumbResolver } from '../core/breadcrumbs/publicat path: ':targetId', resolve: { suggestionTargets: SuggestionsPageResolver, - breadcrumb: PublicationClaimBreadcrumbResolver//I18nBreadcrumbResolver + breadcrumb: PublicationClaimBreadcrumbResolver,//I18nBreadcrumbResolver }, data: { title: 'admin.notifications.publicationclaim.page.title', breadcrumbKey: 'admin.notifications.publicationclaim', - showBreadcrumbsFluid: false + showBreadcrumbsFluid: false, }, canActivate: [AuthenticatedGuard], runGuardsAndResolvers: 'always', component: SuggestionsPageComponent, }, - ]) + ]), ], providers: [ SuggestionsPageResolver, - PublicationClaimBreadcrumbResolver - ] + PublicationClaimBreadcrumbResolver, + ], }) export class SuggestionsPageRoutingModule { diff --git a/src/app/suggestions-page/suggestions-page.component.spec.ts b/src/app/suggestions-page/suggestions-page.component.spec.ts index 7cdeaddc78..9863f0012d 100644 --- a/src/app/suggestions-page/suggestions-page.component.spec.ts +++ b/src/app/suggestions-page/suggestions-page.component.spec.ts @@ -1,39 +1,53 @@ import { CommonModule } from '@angular/common'; -import { BrowserModule } from '@angular/platform-browser'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; - -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { of as observableOf } from 'rxjs'; - -import { SuggestionsPageComponent } from './suggestions-page.component'; - -import { getMockSuggestionNotificationsStateService, getMockSuggestionsService } from '../shared/mocks/suggestion.mock'; -import { mockSuggestionPublicationOne, mockSuggestionPublicationTwo } from '../shared/mocks/publication-claim.mock'; -import { ObjectKeysPipe } from '../shared/utils/object-keys-pipe'; -import { VarDirective } from '../shared/utils/var.directive'; -import { ActivatedRoute, Router } from '@angular/router'; -import { RouterStub } from '../shared/testing/router.stub'; -import { mockSuggestionTargetsObjectOne } from '../shared/mocks/publication-claim-targets.mock'; -import { AuthService } from '../core/auth/auth.service'; -import { NotificationsService } from '../shared/notifications/notifications.service'; -import { NotificationsServiceStub } from '../shared/testing/notifications-service.stub'; -import { getMockTranslateService } from '../shared/mocks/translate.service.mock'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { createSuccessfulRemoteDataObject } from '../shared/remote-data.utils'; -import { TestScheduler } from 'rxjs/testing'; -import { getTestScheduler } from 'jasmine-marbles'; -import { PaginationServiceStub } from '../shared/testing/pagination-service.stub'; -import { PaginationService } from '../core/pagination/pagination.service'; import { - SuggestionEvidencesComponent -} from '../notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; + async, + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; +import { BrowserModule } from '@angular/platform-browser'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; +import { getTestScheduler } from 'jasmine-marbles'; +import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + +import { AuthService } from '../core/auth/auth.service'; +import { PaginationService } from '../core/pagination/pagination.service'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { SuggestionEvidencesComponent } from '../notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; import { SuggestionApproveAndImport, - SuggestionListElementComponent + SuggestionListElementComponent, } from '../notifications/suggestion-list-element/suggestion-list-element.component'; -import { SuggestionsService } from '../notifications/suggestions.service'; import { SuggestionTargetsStateService } from '../notifications/suggestion-targets/suggestion-targets.state.service'; +import { SuggestionsService } from '../notifications/suggestions.service'; +import { + mockSuggestionPublicationOne, + mockSuggestionPublicationTwo, +} from '../shared/mocks/publication-claim.mock'; +import { mockSuggestionTargetsObjectOne } from '../shared/mocks/publication-claim-targets.mock'; +import { + getMockSuggestionNotificationsStateService, + getMockSuggestionsService, +} from '../shared/mocks/suggestion.mock'; +import { getMockTranslateService } from '../shared/mocks/translate.service.mock'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../shared/remote-data.utils'; +import { NotificationsServiceStub } from '../shared/testing/notifications-service.stub'; +import { PaginationServiceStub } from '../shared/testing/pagination-service.stub'; +import { RouterStub } from '../shared/testing/router.stub'; +import { ObjectKeysPipe } from '../shared/utils/object-keys-pipe'; +import { VarDirective } from '../shared/utils/var.directive'; +import { SuggestionsPageComponent } from './suggestions-page.component'; describe('SuggestionPageComponent', () => { let component: SuggestionsPageComponent; @@ -44,17 +58,17 @@ describe('SuggestionPageComponent', () => { const router = new RouterStub(); const routeStub = { data: observableOf({ - suggestionTargets: createSuccessfulRemoteDataObject(mockSuggestionTargetsObjectOne) + suggestionTargets: createSuccessfulRemoteDataObject(mockSuggestionTargetsObjectOne), }), - queryParams: observableOf({}) + queryParams: observableOf({}), }; const workspaceitemServiceMock = jasmine.createSpyObj('WorkspaceitemDataService', { - importExternalSourceEntry: jasmine.createSpy('importExternalSourceEntry') + importExternalSourceEntry: jasmine.createSpy('importExternalSourceEntry'), }); const authService = jasmine.createSpyObj('authService', { isAuthenticated: observableOf(true), - setRedirectUrl: {} + setRedirectUrl: {}, }); const paginationService = new PaginationServiceStub(); @@ -63,14 +77,14 @@ describe('SuggestionPageComponent', () => { imports: [ BrowserModule, CommonModule, - TranslateModule.forRoot() + TranslateModule.forRoot(), ], declarations: [ SuggestionEvidencesComponent, SuggestionListElementComponent, SuggestionsPageComponent, ObjectKeysPipe, - VarDirective + VarDirective, ], providers: [ { provide: AuthService, useValue: authService }, @@ -82,9 +96,9 @@ describe('SuggestionPageComponent', () => { { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: TranslateService, useValue: getMockTranslateService() }, { provide: PaginationService, useValue: paginationService }, - SuggestionsPageComponent + SuggestionsPageComponent, ], - schemas: [NO_ERRORS_SCHEMA] + schemas: [NO_ERRORS_SCHEMA], }) .compileComponents().then(); })); @@ -160,7 +174,7 @@ describe('SuggestionPageComponent', () => { scheduler.schedule(() => fixture.detectChanges()); scheduler.flush(); - component.approveAndImport({collectionId: '1234'} as unknown as SuggestionApproveAndImport); + component.approveAndImport({ collectionId: '1234' } as unknown as SuggestionApproveAndImport); expect(mockSuggestionsService.approveAndImport).toHaveBeenCalled(); expect(mockSuggestionsTargetStateService.dispatchRefreshUserSuggestionsAction).toHaveBeenCalled(); expect(component.updatePage).toHaveBeenCalled(); @@ -171,7 +185,7 @@ describe('SuggestionPageComponent', () => { scheduler.schedule(() => fixture.detectChanges()); scheduler.flush(); - component.approveAndImportAllSelected({collectionId: '1234'} as unknown as SuggestionApproveAndImport); + component.approveAndImportAllSelected({ collectionId: '1234' } as unknown as SuggestionApproveAndImport); expect(mockSuggestionsService.approveAndImportMultiple).toHaveBeenCalled(); expect(mockSuggestionsTargetStateService.dispatchRefreshUserSuggestionsAction).toHaveBeenCalled(); expect(component.updatePage).toHaveBeenCalled(); @@ -201,17 +215,17 @@ describe('SuggestionPageComponent', () => { }); it('should check if all collection is fixed', () => { - component.isCollectionFixed([mockSuggestionPublicationOne, mockSuggestionPublicationTwo]); - expect(mockSuggestionsService.isCollectionFixed).toHaveBeenCalled(); + component.isCollectionFixed([mockSuggestionPublicationOne, mockSuggestionPublicationTwo]); + expect(mockSuggestionsService.isCollectionFixed).toHaveBeenCalled(); }); it('should translate suggestion source', () => { - component.translateSuggestionSource(); - expect(mockSuggestionsService.translateSuggestionSource).toHaveBeenCalled(); + component.translateSuggestionSource(); + expect(mockSuggestionsService.translateSuggestionSource).toHaveBeenCalled(); }); it('should translate suggestion type', () => { - component.translateSuggestionType(); - expect(mockSuggestionsService.translateSuggestionType).toHaveBeenCalled(); + component.translateSuggestionType(); + expect(mockSuggestionsService.translateSuggestionType).toHaveBeenCalled(); }); }); diff --git a/src/app/suggestions-page/suggestions-page.component.ts b/src/app/suggestions-page/suggestions-page.component.ts index b110c61716..fefc655070 100644 --- a/src/app/suggestions-page/suggestions-page.component.ts +++ b/src/app/suggestions-page/suggestions-page.component.ts @@ -1,28 +1,49 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Data, Router } from '@angular/router'; - -import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; -import { distinctUntilChanged, map, switchMap, take } from 'rxjs/operators'; +import { + Component, + OnInit, +} from '@angular/core'; +import { + ActivatedRoute, + Data, + Router, +} from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; +import { + BehaviorSubject, + combineLatest, + Observable, +} from 'rxjs'; +import { + distinctUntilChanged, + map, + switchMap, + take, +} from 'rxjs/operators'; -import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model'; +import { AuthService } from '../core/auth/auth.service'; +import { + SortDirection, + SortOptions, +} from '../core/cache/models/sort-options.model'; +import { FindListOptions } from '../core/data/find-list-options.model'; import { PaginatedList } from '../core/data/paginated-list.model'; import { RemoteData } from '../core/data/remote-data'; -import { getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; -import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; -import { AuthService } from '../core/auth/auth.service'; -import { NotificationsService } from '../shared/notifications/notifications.service'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { PaginationService } from '../core/pagination/pagination.service'; -import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; -import { FindListOptions } from '../core/data/find-list-options.model'; -import { redirectOn4xx } from '../core/shared/authorized.operators'; -import { getWorkspaceItemEditRoute } from '../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; import { Suggestion } from '../core/notifications/models/suggestion.model'; import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; -import { SuggestionBulkResult, SuggestionsService } from '../notifications/suggestions.service'; -import { SuggestionTargetsStateService } from '../notifications/suggestion-targets/suggestion-targets.state.service'; +import { PaginationService } from '../core/pagination/pagination.service'; +import { redirectOn4xx } from '../core/shared/authorized.operators'; +import { getFirstSucceededRemoteDataPayload } from '../core/shared/operators'; +import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; import { SuggestionApproveAndImport } from '../notifications/suggestion-list-element/suggestion-list-element.component'; +import { SuggestionTargetsStateService } from '../notifications/suggestion-targets/suggestion-targets.state.service'; +import { + SuggestionBulkResult, + SuggestionsService, +} from '../notifications/suggestions.service'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; +import { getWorkspaceItemEditRoute } from '../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; @Component({ selector: 'ds-suggestion-page', @@ -41,7 +62,7 @@ export class SuggestionsPageComponent implements OnInit { */ paginationOptions: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { id: 'sp', - pageSizeOptions: [5, 10, 20, 40, 60] + pageSizeOptions: [5, 10, 20, 40, 60], }); /** @@ -52,7 +73,7 @@ export class SuggestionsPageComponent implements OnInit { /** * The FindListOptions object */ - defaultConfig: FindListOptions = Object.assign(new FindListOptions(), {sort: this.paginationSortConfig}); + defaultConfig: FindListOptions = Object.assign(new FindListOptions(), { sort: this.paginationSortConfig }); /** * A boolean representing if results are loading @@ -85,22 +106,22 @@ export class SuggestionsPageComponent implements OnInit { private suggestionService: SuggestionsService, private suggestionTargetsStateService: SuggestionTargetsStateService, private translateService: TranslateService, - private workspaceItemService: WorkspaceitemDataService + private workspaceItemService: WorkspaceitemDataService, ) { } ngOnInit(): void { this.targetRD$ = this.route.data.pipe( map((data: Data) => data.suggestionTargets as RemoteData), - redirectOn4xx(this.router, this.authService) + redirectOn4xx(this.router, this.authService), ); this.targetId$ = this.targetRD$.pipe( getFirstSucceededRemoteDataPayload(), - map((target: SuggestionTarget) => target.id) + map((target: SuggestionTarget) => target.id), ); this.targetRD$.pipe( - getFirstSucceededRemoteDataPayload() + getFirstSucceededRemoteDataPayload(), ).subscribe((suggestionTarget: SuggestionTarget) => { this.suggestionTarget = suggestionTarget; this.suggestionId = suggestionTarget.id; @@ -129,7 +150,7 @@ export class SuggestionsPageComponent implements OnInit { this.paginationOptions.id, this.defaultConfig, ).pipe( - distinctUntilChanged() + distinctUntilChanged(), ); combineLatest([this.targetId$, pageConfig$]).pipe( switchMap(([targetId, config]: [string, FindListOptions]) => { @@ -137,10 +158,10 @@ export class SuggestionsPageComponent implements OnInit { targetId, config.elementsPerPage, config.currentPage, - config.sort + config.sort, ); }), - take(1) + take(1), ).subscribe((results: PaginatedList) => { this.processing$.next(false); this.suggestionsRD$.next(results); @@ -175,12 +196,12 @@ export class SuggestionsPageComponent implements OnInit { if (results.success > 0) { this.notificationService.success( this.translateService.get('suggestion.ignoreSuggestion.bulk.success', - {count: results.success})); + { count: results.success })); } if (results.fails > 0) { this.notificationService.error( this.translateService.get('suggestion.ignoreSuggestion.bulk.error', - {count: results.fails})); + { count: results.fails })); } }); } @@ -193,7 +214,7 @@ export class SuggestionsPageComponent implements OnInit { this.suggestionService.approveAndImport(this.workspaceItemService, event.suggestion, event.collectionId) .subscribe((workspaceitem: WorkspaceItem) => { const content = this.translateService.instant('suggestion.approveAndImport.success', { url: getWorkspaceItemEditRoute(workspaceitem.id) }); - this.notificationService.success('', content, {timeOut:0}, true); + this.notificationService.success('', content, { timeOut:0 }, true); this.suggestionTargetsStateService.dispatchRefreshUserSuggestionsAction(); this.updatePage(); }); @@ -215,14 +236,14 @@ export class SuggestionsPageComponent implements OnInit { if (results.success > 0) { this.notificationService.success( this.translateService.get('suggestion.approveAndImport.bulk.success', - {count: results.success})); + { count: results.success })); } if (results.fails > 0) { this.notificationService.error( this.translateService.get('suggestion.approveAndImport.bulk.error', - {count: results.fails})); + { count: results.fails })); } - }); + }); } /** diff --git a/src/app/suggestions-page/suggestions-page.module.ts b/src/app/suggestions-page/suggestions-page.module.ts index 90fbdbcf70..8ba4f587f6 100644 --- a/src/app/suggestions-page/suggestions-page.module.ts +++ b/src/app/suggestions-page/suggestions-page.module.ts @@ -1,12 +1,12 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; -import { SuggestionsPageComponent } from './suggestions-page.component'; -import { SharedModule } from '../shared/shared.module'; -import { SuggestionsPageRoutingModule } from './suggestions-page-routing.module'; -import { NotificationsModule } from '../notifications/notifications.module'; import { SuggestionsDataService } from '../core/notifications/suggestions-data.service'; +import { NotificationsModule } from '../notifications/notifications.module'; import { SuggestionsService } from '../notifications/suggestions.service'; +import { SharedModule } from '../shared/shared.module'; +import { SuggestionsPageComponent } from './suggestions-page.component'; +import { SuggestionsPageRoutingModule } from './suggestions-page-routing.module'; @NgModule({ declarations: [SuggestionsPageComponent], @@ -14,11 +14,11 @@ import { SuggestionsService } from '../notifications/suggestions.service'; CommonModule, SharedModule, SuggestionsPageRoutingModule, - NotificationsModule + NotificationsModule, ], providers: [ SuggestionsDataService, - SuggestionsService - ] + SuggestionsService, + ], }) export class SuggestionsPageModule { } diff --git a/src/app/suggestions-page/suggestions-page.resolver.ts b/src/app/suggestions-page/suggestions-page.resolver.ts index ad8ed019b0..e066065c9a 100644 --- a/src/app/suggestions-page/suggestions-page.resolver.ts +++ b/src/app/suggestions-page/suggestions-page.resolver.ts @@ -1,13 +1,16 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; - +import { + ActivatedRouteSnapshot, + Resolve, + RouterStateSnapshot, +} from '@angular/router'; import { Observable } from 'rxjs'; import { find } from 'rxjs/operators'; import { RemoteData } from '../core/data/remote-data'; -import { hasValue } from '../shared/empty.util'; import { SuggestionTarget } from '../core/notifications/models/suggestion-target.model'; import { SuggestionTargetDataService } from '../core/notifications/target/suggestion-target-data.service'; +import { hasValue } from '../shared/empty.util'; /** * This class represents a resolver that requests a specific collection before the route is activated diff --git a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.spec.ts b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.spec.ts index db469d2435..df08d3e8ac 100644 --- a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.spec.ts +++ b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.spec.ts @@ -1,14 +1,20 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + Component, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Router } from '@angular/router'; +import { getMockThemeService } from 'src/app/shared/mocks/theme-service.mock'; +import { ThemeService } from 'src/app/shared/theme-support/theme.service'; import { PAGE_NOT_FOUND_PATH } from '../../../app-routing-paths'; +import { DynamicComponentLoaderDirective } from '../../../shared/abstract-component-loader/dynamic-component-loader.directive'; import { rendersAdvancedWorkflowTaskOption } from '../../../shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-decorator'; import { RouterStub } from '../../../shared/testing/router.stub'; -import { DynamicComponentLoaderDirective } from '../../../shared/abstract-component-loader/dynamic-component-loader.directive'; -import { ThemeService } from 'src/app/shared/theme-support/theme.service'; -import { getMockThemeService } from 'src/app/shared/mocks/theme-service.mock'; import { AdvancedWorkflowActionsLoaderComponent } from './advanced-workflow-actions-loader.component'; const ADVANCED_WORKFLOW_ACTION_TEST = 'testaction'; diff --git a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.ts b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.ts index 07f853e676..e196f1417c 100644 --- a/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.ts +++ b/src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions-loader.component.ts @@ -1,13 +1,15 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { hasValue } from '../../../shared/empty.util'; import { - getAdvancedComponentByWorkflowTaskOption -} from '../../../shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-decorator'; + Component, + Input, + OnInit, +} from '@angular/core'; import { Router } from '@angular/router'; +import { AbstractComponentLoaderComponent } from 'src/app/shared/abstract-component-loader/abstract-component-loader.component'; import { PAGE_NOT_FOUND_PATH } from '../../../app-routing-paths'; import { GenericConstructor } from '../../../core/shared/generic-constructor'; -import { AbstractComponentLoaderComponent } from 'src/app/shared/abstract-component-loader/abstract-component-loader.component'; +import { hasValue } from '../../../shared/empty.util'; +import { getAdvancedComponentByWorkflowTaskOption } from '../../../shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-decorator'; import { ThemeService } from '../../../shared/theme-support/theme.service'; /** diff --git a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts index a71cd7dc5b..1b21174c60 100644 --- a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts +++ b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing-paths.ts @@ -1,4 +1,7 @@ -import { getWorkflowItemModuleRoute, getWorkspaceItemModuleRoute } from '../app-routing-paths'; +import { + getWorkflowItemModuleRoute, + getWorkspaceItemModuleRoute, +} from '../app-routing-paths'; import { URLCombiner } from '../core/url-combiner/url-combiner'; export function getWorkflowItemPageRoute(wfiId: string) { diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index f218bfa2d8..8d565d75ba 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -1,32 +1,33 @@ import { InjectionToken } from '@angular/core'; import { makeStateKey } from '@angular/platform-browser'; -import { Config } from './config.interface'; -import { ServerConfig } from './server-config.interface'; -import { CacheConfig } from './cache-config.interface'; -import { INotificationBoardOptions } from './notifications-config.interfaces'; -import { SubmissionConfig } from './submission-config.interface'; -import { FormConfig } from './form-config.interfaces'; -import { LangConfig } from './lang-config.interface'; -import { ItemConfig } from './item-config.interface'; -import { CommunityPageConfig } from './community-page-config.interface'; -import { CollectionPageConfig } from './collection-page-config.interface'; -import { ThemeConfig } from './theme.config'; + +import { AdminNotifyMetricsRow } from '../app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; +import { ActuatorsConfig } from './actuators.config'; import { AuthConfig } from './auth-config.interfaces'; import { BrowseByConfig } from './browse-by-config.interface'; -import { SuggestionConfig } from './suggestion-config.interfaces'; import { BundleConfig } from './bundle-config.interface'; +import { CacheConfig } from './cache-config.interface'; +import { CollectionPageConfig } from './collection-page-config.interface'; import { CommunityListConfig } from './community-list-config.interface'; +import { CommunityPageConfig } from './community-page-config.interface'; +import { Config } from './config.interface'; import { DiscoverySortConfig } from './discovery-sort.config'; import { FilterVocabularyConfig } from './filter-vocabulary-config'; +import { FormConfig } from './form-config.interfaces'; import { HomeConfig } from './homepage-config.interface'; import { InfoConfig } from './info-config.interface'; +import { ItemConfig } from './item-config.interface'; +import { LangConfig } from './lang-config.interface'; import { MarkdownConfig } from './markdown-config.interface'; +import { MediaViewerConfig } from './media-viewer-config.interface'; +import { INotificationBoardOptions } from './notifications-config.interfaces'; import { QualityAssuranceConfig } from './quality-assurance.config'; import { SearchConfig } from './search-page-config.interface'; -import { AdminNotifyMetricsRow } from '../app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; +import { ServerConfig } from './server-config.interface'; +import { SubmissionConfig } from './submission-config.interface'; +import { SuggestionConfig } from './suggestion-config.interfaces'; +import { ThemeConfig } from './theme.config'; import { UIServerConfig } from './ui-server-config.interface'; -import { MediaViewerConfig } from './media-viewer-config.interface'; -import { ActuatorsConfig } from './actuators.config'; interface AppConfig extends Config { ui: UIServerConfig; diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 4e4f75cde0..d148dee148 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -1,3 +1,4 @@ +import { AdminNotifyMetricsRow } from '../app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; import { RestRequestMethod } from '../app/core/data/rest-request-method'; import { NotificationAnimationsType } from '../app/shared/notifications/models/notification-animations-type'; import { ActuatorsConfig } from './actuators.config'; @@ -8,6 +9,7 @@ import { BundleConfig } from './bundle-config.interface'; import { CacheConfig } from './cache-config.interface'; import { CollectionPageConfig } from './collection-page-config.interface'; import { CommunityListConfig } from './community-list-config.interface'; +import { CommunityPageConfig } from './community-page-config.interface'; import { DiscoverySortConfig } from './discovery-sort.config'; import { FilterVocabularyConfig } from './filter-vocabulary-config'; import { FormConfig } from './form-config.interfaces'; @@ -19,14 +21,12 @@ import { MarkdownConfig } from './markdown-config.interface'; import { MediaViewerConfig } from './media-viewer-config.interface'; import { INotificationBoardOptions } from './notifications-config.interfaces'; import { QualityAssuranceConfig } from './quality-assurance.config'; +import { SearchConfig } from './search-page-config.interface'; import { ServerConfig } from './server-config.interface'; import { SubmissionConfig } from './submission-config.interface'; +import { SuggestionConfig } from './suggestion-config.interfaces'; import { ThemeConfig } from './theme.config'; import { UIServerConfig } from './ui-server-config.interface'; -import { SuggestionConfig } from './suggestion-config.interfaces'; -import { CommunityPageConfig } from './community-page-config.interface'; -import { SearchConfig } from './search-page-config.interface'; -import { AdminNotifyMetricsRow } from '../app/admin/admin-notify-dashboard/admin-notify-metrics/admin-notify-metrics.model'; export class DefaultAppConfig implements AppConfig { production = false; @@ -157,7 +157,7 @@ export class DefaultAppConfig implements AppConfig { timer: 0, }, duplicateDetection: { - alwaysShowSection: false + alwaysShowSection: false, }, typeBind: { field: 'dc.type', @@ -200,49 +200,49 @@ export class DefaultAppConfig implements AppConfig { { value: 600, style: 'text-success', - icon: 'fa-circle-check' + icon: 'fa-circle-check', }, { value: 500, style: 'text-info', - icon: 'fa-gear' + icon: 'fa-gear', }, { value: 400, style: 'text-warning', - icon: 'fa-circle-question' + icon: 'fa-circle-question', }, { value: 300, style: 'text-muted', - icon: 'fa-circle-question' + icon: 'fa-circle-question', }, { value: 200, style: 'text-muted', - icon: 'fa-circle-exclamation' + icon: 'fa-circle-exclamation', }, { value: 100, style: 'text-muted', - icon: 'fa-circle-stop' + icon: 'fa-circle-stop', }, { value: 0, style: 'text-muted', - icon: 'fa-ban' + icon: 'fa-ban', }, { value: -1, style: 'text-muted', - icon: 'fa-circle-xmark' + icon: 'fa-circle-xmark', }, // default configuration { value: 'default', style: 'text-muted', - icon: 'fa-circle-xmark' - } + icon: 'fa-circle-xmark', + }, ], }, @@ -310,9 +310,9 @@ export class DefaultAppConfig implements AppConfig { sortField: 'dc.date.accessioned', }, topLevelCommunityList: { - pageSize: 5 + pageSize: 5, }, - showDiscoverFilters: false + showDiscoverFilters: false, }; // Item Config @@ -508,8 +508,8 @@ export class DefaultAppConfig implements AppConfig { search: SearchConfig = { advancedFilters: { enabled: false, - filter: ['title', 'author', 'subject', 'entityType'] - } + filter: ['title', 'author', 'subject', 'entityType'], + }, }; notifyMetrics: AdminNotifyMetricsRow[] = [ @@ -520,34 +520,34 @@ export class DefaultAppConfig implements AppConfig { color: '#B8DAFF', title: 'admin-notify-dashboard.NOTIFY.incoming.accepted', config: 'NOTIFY.incoming.accepted', - description: 'admin-notify-dashboard.NOTIFY.incoming.accepted.description' + description: 'admin-notify-dashboard.NOTIFY.incoming.accepted.description', }, { color: '#D4EDDA', title: 'admin-notify-dashboard.NOTIFY.incoming.processed', config: 'NOTIFY.incoming.processed', - description: 'admin-notify-dashboard.NOTIFY.incoming.processed.description' + description: 'admin-notify-dashboard.NOTIFY.incoming.processed.description', }, { color: '#FDBBC7', title: 'admin-notify-dashboard.NOTIFY.incoming.failure', config: 'NOTIFY.incoming.failure', - description: 'admin-notify-dashboard.NOTIFY.incoming.failure.description' + description: 'admin-notify-dashboard.NOTIFY.incoming.failure.description', }, { color: '#FDBBC7', title: 'admin-notify-dashboard.NOTIFY.incoming.untrusted', config: 'NOTIFY.incoming.untrusted', - description: 'admin-notify-dashboard.NOTIFY.incoming.untrusted.description' + description: 'admin-notify-dashboard.NOTIFY.incoming.untrusted.description', }, { color: '#43515F', title: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems', textColor: '#fff', config: 'NOTIFY.incoming.involvedItems', - description: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems.description' + description: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems.description', }, - ] + ], }, { title: 'admin-notify-dashboard.generated-ldn', @@ -556,34 +556,34 @@ export class DefaultAppConfig implements AppConfig { color: '#D4EDDA', title: 'admin-notify-dashboard.NOTIFY.outgoing.delivered', config: 'NOTIFY.outgoing.delivered', - description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description' + description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description', }, { color: '#B8DAFF', title: 'admin-notify-dashboard.NOTIFY.outgoing.queued', config: 'NOTIFY.outgoing.queued', - description: 'admin-notify-dashboard.NOTIFY.outgoing.queued.description' + description: 'admin-notify-dashboard.NOTIFY.outgoing.queued.description', }, { color: '#FDEEBB', title: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry', config: 'NOTIFY.outgoing.queued_for_retry', - description: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry.description' + description: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry.description', }, { color: '#FDBBC7', title: 'admin-notify-dashboard.NOTIFY.outgoing.failure', config: 'NOTIFY.outgoing.failure', - description: 'admin-notify-dashboard.NOTIFY.outgoing.failure.description' + description: 'admin-notify-dashboard.NOTIFY.outgoing.failure.description', }, { color: '#43515F', title: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems', textColor: '#fff', config: 'NOTIFY.outgoing.involvedItems', - description: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems.description' + description: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems.description', }, - ] - } + ], + }, ]; } diff --git a/src/config/search-page-config.interface.ts b/src/config/search-page-config.interface.ts index 44ac719bc7..699e3fd61f 100644 --- a/src/config/search-page-config.interface.ts +++ b/src/config/search-page-config.interface.ts @@ -1,5 +1,5 @@ -import { Config } from './config.interface'; import { AdvancedSearchConfig } from './advance-search-config.interface'; +import { Config } from './config.interface'; export interface SearchConfig extends Config { diff --git a/src/themes/custom/app/browse-by/browse-by-date/browse-by-date.component.ts b/src/themes/custom/app/browse-by/browse-by-date/browse-by-date.component.ts index f37727769e..b07a946b87 100644 --- a/src/themes/custom/app/browse-by/browse-by-date/browse-by-date.component.ts +++ b/src/themes/custom/app/browse-by/browse-by-date/browse-by-date.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; + import { BrowseByDateComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-date/browse-by-date.component'; import { BrowseByDataType } from '../../../../../app/browse-by/browse-by-switcher/browse-by-data-type'; import { rendersBrowseBy } from '../../../../../app/browse-by/browse-by-switcher/browse-by-decorator'; diff --git a/src/themes/custom/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts b/src/themes/custom/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts index 765167b591..70d7d00dad 100644 --- a/src/themes/custom/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts +++ b/src/themes/custom/app/browse-by/browse-by-metadata/browse-by-metadata.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; + import { BrowseByMetadataComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-metadata/browse-by-metadata.component'; import { BrowseByDataType } from '../../../../../app/browse-by/browse-by-switcher/browse-by-data-type'; import { rendersBrowseBy } from '../../../../../app/browse-by/browse-by-switcher/browse-by-decorator'; diff --git a/src/themes/custom/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts b/src/themes/custom/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts index 800b23a816..a33899f89e 100644 --- a/src/themes/custom/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts +++ b/src/themes/custom/app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component.ts @@ -1,7 +1,8 @@ import { Component } from '@angular/core'; -import { BrowseByTaxonomyComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component'; + import { BrowseByDataType } from '../../../../../app/browse-by/browse-by-switcher/browse-by-data-type'; import { rendersBrowseBy } from '../../../../../app/browse-by/browse-by-switcher/browse-by-decorator'; +import { BrowseByTaxonomyComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component'; import { Context } from '../../../../../app/core/shared/context.model'; @Component({ diff --git a/src/themes/custom/app/browse-by/browse-by-title/browse-by-title.component.ts b/src/themes/custom/app/browse-by/browse-by-title/browse-by-title.component.ts index 9bb328670d..e6a14b0041 100644 --- a/src/themes/custom/app/browse-by/browse-by-title/browse-by-title.component.ts +++ b/src/themes/custom/app/browse-by/browse-by-title/browse-by-title.component.ts @@ -1,7 +1,8 @@ import { Component } from '@angular/core'; -import { BrowseByTitleComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-title/browse-by-title.component'; + import { BrowseByDataType } from '../../../../../app/browse-by/browse-by-switcher/browse-by-data-type'; import { rendersBrowseBy } from '../../../../../app/browse-by/browse-by-switcher/browse-by-decorator'; +import { BrowseByTitleComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-title/browse-by-title.component'; import { Context } from '../../../../../app/core/shared/context.model'; @Component({ diff --git a/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts b/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts index a3f51bf916..0dee3d5a4d 100644 --- a/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts +++ b/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; + import { CommunityPageSubCollectionListComponent as BaseComponent } from '../../../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; @Component({ diff --git a/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts b/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts index 68af7dddd0..ca4fc71e16 100644 --- a/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts +++ b/src/themes/custom/app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; + import { CommunityPageSubCommunityListComponent as BaseComponent } from '../../../../../../../app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component'; @Component({ diff --git a/src/themes/custom/eager-theme.module.ts b/src/themes/custom/eager-theme.module.ts index 00aec8ef2e..3ac3f48dfc 100644 --- a/src/themes/custom/eager-theme.module.ts +++ b/src/themes/custom/eager-theme.module.ts @@ -82,24 +82,24 @@ const DECLARATIONS = [ ]; @NgModule({ - imports: [ - CommonModule, - SharedModule, - RootModule, - NavbarModule, - SharedBrowseByModule, - ResultsBackButtonModule, - ItemPageModule, - ItemSharedModule, - DsoPageModule, - ], - declarations: DECLARATIONS, - providers: [ - ...ENTRY_COMPONENTS.map((component) => ({ provide: component })), - ], - exports: [ - ItemSearchResultListElementComponent - ] + imports: [ + CommonModule, + SharedModule, + RootModule, + NavbarModule, + SharedBrowseByModule, + ResultsBackButtonModule, + ItemPageModule, + ItemSharedModule, + DsoPageModule, + ], + declarations: DECLARATIONS, + providers: [ + ...ENTRY_COMPONENTS.map((component) => ({ provide: component })), + ], + exports: [ + ItemSearchResultListElementComponent, + ], }) /** * This module is included in the main bundle that gets downloaded at first page load. So it should diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index ec0947d531..814313f46e 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -37,6 +37,7 @@ import { ItemVersionsModule } from '../../app/item-page/versions/item-versions.m import { MyDSpacePageModule } from '../../app/my-dspace-page/my-dspace-page.module'; import { MyDspaceSearchModule } from '../../app/my-dspace-page/my-dspace-search.module'; import { NavbarModule } from '../../app/navbar/navbar.module'; +import { NotificationsModule } from '../../app/notifications/notifications.module'; import { ProfilePageModule } from '../../app/profile-page/profile-page.module'; import { RegisterEmailFormModule } from '../../app/register-email-form/register-email-form.module'; import { RootModule } from '../../app/root.module'; @@ -53,22 +54,26 @@ import { SharedModule } from '../../app/shared/shared.module'; import { StatisticsModule } from '../../app/statistics/statistics.module'; import { StatisticsPageModule } from '../../app/statistics-page/statistics-page.module'; import { SubmissionModule } from '../../app/submission/submission.module'; -import { FileSectionComponent } from './app/item-page/simple/field-components/file-section/file-section.component'; -import { HomePageComponent } from './app/home-page/home-page.component'; -import { RootComponent } from './app/root/root.component'; import { SystemWideAlertModule } from '../../app/system-wide-alert/system-wide-alert.module'; import { AdminSidebarComponent } from './app/admin/admin-sidebar/admin-sidebar.component'; import { EditBitstreamPageComponent } from './app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component'; import { BreadcrumbsComponent } from './app/breadcrumbs/breadcrumbs.component'; +import { BrowseByDateComponent } from './app/browse-by/browse-by-date/browse-by-date.component'; +import { BrowseByMetadataComponent } from './app/browse-by/browse-by-metadata/browse-by-metadata.component'; +import { BrowseByTaxonomyComponent } from './app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component'; +import { BrowseByTitleComponent } from './app/browse-by/browse-by-title/browse-by-title.component'; import { CollectionPageComponent } from './app/collection-page/collection-page.component'; import { EditItemTemplatePageComponent } from './app/collection-page/edit-item-template-page/edit-item-template-page.component'; import { CommunityListComponent } from './app/community-list-page/community-list/community-list.component'; import { CommunityListPageComponent } from './app/community-list-page/community-list-page.component'; import { CommunityPageComponent } from './app/community-page/community-page.component'; +import { CommunityPageSubCollectionListComponent } from './app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; +import { CommunityPageSubCommunityListComponent } from './app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component'; import { DsoEditMetadataComponent } from './app/dso-shared/dso-edit-metadata/dso-edit-metadata.component'; import { ForbiddenComponent } from './app/forbidden/forbidden.component'; import { ForgotEmailComponent } from './app/forgot-password/forgot-password-email/forgot-email.component'; import { ForgotPasswordFormComponent } from './app/forgot-password/forgot-password-form/forgot-password-form.component'; +import { HomePageComponent } from './app/home-page/home-page.component'; import { EndUserAgreementComponent } from './app/info/end-user-agreement/end-user-agreement.component'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; import { FeedbackFormComponent } from './app/info/feedback/feedback-form/feedback-form.component'; @@ -80,6 +85,7 @@ import { FullItemPageComponent } from './app/item-page/full/full-item-page.compo import { MediaViewerComponent } from './app/item-page/media-viewer/media-viewer.component'; import { MediaViewerImageComponent } from './app/item-page/media-viewer/media-viewer-image/media-viewer-image.component'; import { MediaViewerVideoComponent } from './app/item-page/media-viewer/media-viewer-video/media-viewer-video.component'; +import { FileSectionComponent } from './app/item-page/simple/field-components/file-section/file-section.component'; import { ItemPageTitleFieldComponent } from './app/item-page/simple/field-components/specific-field/title/item-page-title-field.component'; import { ItemPageComponent } from './app/item-page/simple/item-page.component'; import { MetadataRepresentationListComponent } from './app/item-page/simple/metadata-representation-list/metadata-representation-list.component'; @@ -96,26 +102,16 @@ import { RegisterEmailComponent } from './app/register-page/register-email/regis import { DenyRequestCopyComponent } from './app/request-copy/deny-request-copy/deny-request-copy.component'; import { EmailRequestCopyComponent } from './app/request-copy/email-request-copy/email-request-copy.component'; import { GrantRequestCopyComponent } from './app/request-copy/grant-request-copy/grant-request-copy.component'; +import { RootComponent } from './app/root/root.component'; import { ConfigurationSearchPageComponent } from './app/search-page/configuration-search-page.component'; import { SearchPageComponent } from './app/search-page/search-page.component'; import { AuthNavMenuComponent } from './app/shared/auth-nav-menu/auth-nav-menu.component'; import { UserMenuComponent } from './app/shared/auth-nav-menu/user-menu/user-menu.component'; import { BrowseByComponent } from './app/shared/browse-by/browse-by.component'; import { ComcolPageBrowseByComponent } from './app/shared/comcol-page-browse-by/comcol-page-browse-by.component'; -import { SearchSettingsComponent } from './app/shared/search/search-settings/search-settings.component'; -import { CommunityPageSubCommunityListComponent } from './app/community-page/sections/sub-com-col-section/sub-community-list/community-page-sub-community-list.component'; -import { CommunityPageSubCollectionListComponent } from './app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; -import { ObjectListComponent } from './app/shared/object-list/object-list.component'; - -import { BrowseByMetadataComponent } from './app/browse-by/browse-by-metadata/browse-by-metadata.component'; -import { BrowseByDateComponent } from './app/browse-by/browse-by-date/browse-by-date.component'; -import { BrowseByTitleComponent } from './app/browse-by/browse-by-title/browse-by-title.component'; -import { BrowseByTaxonomyComponent } from './app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component'; -import { ExternalSourceEntryImportModalComponent } from './app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/external-source-entry-import-modal/external-source-entry-import-modal.component'; -import { SearchFiltersComponent } from './app/shared/search/search-filters/search-filters.component'; -import { SearchSidebarComponent } from './app/shared/search/search-sidebar/search-sidebar.component'; import { ComcolPageHandleComponent } from './app/shared/comcol-page-handle/comcol-page-handle.component'; import { DsDynamicLookupRelationExternalSourceTabComponent } from './app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/dynamic-lookup-relation-external-source-tab.component'; +import { ExternalSourceEntryImportModalComponent } from './app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/external-source-tab/external-source-entry-import-modal/external-source-entry-import-modal.component'; import { DsDynamicLookupRelationSearchTabComponent } from './app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component'; import { LoadingComponent } from './app/shared/loading/loading.component'; import { AccessStatusBadgeComponent } from './app/shared/object-collection/shared/badges/access-status-badge/access-status-badge.component'; @@ -123,8 +119,12 @@ import { BadgesComponent } from './app/shared/object-collection/shared/badges/ba import { MyDSpaceStatusBadgeComponent } from './app/shared/object-collection/shared/badges/my-dspace-status-badge/my-dspace-status-badge.component'; import { StatusBadgeComponent } from './app/shared/object-collection/shared/badges/status-badge/status-badge.component'; import { TypeBadgeComponent } from './app/shared/object-collection/shared/badges/type-badge/type-badge.component'; +import { ObjectListComponent } from './app/shared/object-list/object-list.component'; import { ResultsBackButtonComponent } from './app/shared/results-back-button/results-back-button.component'; +import { SearchFiltersComponent } from './app/shared/search/search-filters/search-filters.component'; import { SearchResultsComponent } from './app/shared/search/search-results/search-results.component'; +import { SearchSettingsComponent } from './app/shared/search/search-settings/search-settings.component'; +import { SearchSidebarComponent } from './app/shared/search/search-sidebar/search-sidebar.component'; import { SearchFormComponent } from './app/shared/search-form/search-form.component'; import { CollectionStatisticsPageComponent } from './app/statistics-page/collection-statistics-page/collection-statistics-page.component'; import { CommunityStatisticsPageComponent } from './app/statistics-page/community-statistics-page/community-statistics-page.component'; @@ -133,7 +133,6 @@ import { SiteStatisticsPageComponent } from './app/statistics-page/site-statisti import { SubmissionEditComponent } from './app/submission/edit/submission-edit.component'; import { SubmissionImportExternalComponent } from './app/submission/import-external/submission-import-external.component'; import { SubmissionSectionUploadFileComponent } from './app/submission/sections/upload/file/section-upload-file.component'; -import { NotificationsModule } from '../../app/notifications/notifications.module'; import { SubmissionSubmitComponent } from './app/submission/submit/submission-submit.component'; import { ThumbnailComponent } from './app/thumbnail/thumbnail.component'; import { WorkflowItemDeleteComponent } from './app/workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component'; diff --git a/src/themes/dspace/app/header/header.component.ts b/src/themes/dspace/app/header/header.component.ts index eaf2a1f7eb..1e71ba6b20 100644 --- a/src/themes/dspace/app/header/header.component.ts +++ b/src/themes/dspace/app/header/header.component.ts @@ -1,7 +1,10 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit, +} from '@angular/core'; +import { Observable } from 'rxjs'; import { HeaderComponent as BaseComponent } from '../../../../app/header/header.component'; -import { Observable } from 'rxjs'; /** * Represents the header with the logo and simple navigation