From f3aa2d47a6dc5b1397a3f683452b90d6fe1f4784 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 11 May 2023 11:10:00 +0200 Subject: [PATCH] [CST-9636] finalize implementation --- .../browse/bulk-access-browse.component.ts | 5 +- .../bulk-access/bulk-access.component.spec.ts | 97 +++++++++++++------ .../bulk-access/bulk-access.component.ts | 65 +++++++------ 3 files changed, 109 insertions(+), 58 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index 53a7302b46..eff5942d4e 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, tap } from 'rxjs/operators'; +import { distinctUntilChanged, 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'; @@ -67,8 +67,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)), - tap(console.log) + map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts index 3372f98dab..8a64d01df4 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.spec.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -10,6 +10,9 @@ import { SelectableListService } from '../../shared/object-list/selectable-list/ import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { Process } from '../../process-page/processes/process.model'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; fdescribe('BulkAccessComponent', () => { let component: BulkAccessComponent; @@ -47,6 +50,13 @@ fdescribe('BulkAccessComponent', () => { } }; + const mockFile = { + "uuids": [ + '1234', '5678' + ], + "file": { } + } + const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { getValue: jasmine.createSpy('getValue'), reset: jasmine.createSpy('reset') @@ -55,12 +65,18 @@ fdescribe('BulkAccessComponent', () => { const selectableListState: SelectableListState = { id: 'test', selection }; const expectedIdList = ['1234', '5678']; + const selectableListStateEmpty: SelectableListState = { id: 'test', selection: [] }; + beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ TranslateModule.forRoot() ], + imports: [ + RouterTestingModule, + TranslateModule.forRoot() + ], declarations: [ BulkAccessComponent ], providers: [ { provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock }, + { provide: NotificationsService, useValue: NotificationsServiceStub }, { provide: SelectableListService, useValue: selectableListServiceMock } ], schemas: [NO_ERRORS_SCHEMA] @@ -73,43 +89,70 @@ fdescribe('BulkAccessComponent', () => { component = fixture.componentInstance; bulkAccessControlService = TestBed.inject(BulkAccessControlService); selectableListService = TestBed.inject(SelectableListService); - (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); - fixture.detectChanges(); - component.settings = mockSettings; + }); afterEach(() => { fixture.destroy(); }); - it('should create', () => { - expect(component).toBeTruthy(); + describe('when there are no elements selected', () => { + + beforeEach(() => { + + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty)); + fixture.detectChanges(); + component.settings = mockSettings; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual([]); + }); + + it('should disable the execute button when there are no objects selected', () => { + expect(component.canExport()).toBe(false); + }); + }); - it('should generate the id list by selected elements', () => { - expect(component.objectsSelected$.value).toEqual(expectedIdList); - }); + describe('when there are elements selected', () => { - it('should disable the execute button when there are no objects selected', () => { - expect(component.canExport()).toBe(false); - }); + beforeEach(() => { - it('should enable the execute button when there are objects selected', () => { - component.objectsSelected$.next(['1234']); - expect(component.canExport()).toBe(true); - }); + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); + fixture.detectChanges(); + component.settings = mockSettings; + }); - it('should call the settings reset method when reset is called', () => { - spyOn(component.settings, 'reset'); - component.reset(); - expect(component.settings.reset).toHaveBeenCalled(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call the bulkAccessControlService executeScript method when submit is called', () => { - (component.settings as any).getValue.and.returnValue(mockFormState) - bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); - component.objectsSelected$.next(['1234']); - component.submit(); - expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual(expectedIdList); + }); + + it('should enable the execute button when there are objects selected', () => { + component.objectsSelected$.next(['1234']); + expect(component.canExport()).toBe(true); + }); + + it('should call the settings reset method when reset is called', () => { + component.reset(); + expect(component.settings.reset).toHaveBeenCalled(); + }); + + it('should call the bulkAccessControlService executeScript method when submit is called', () => { + (component.settings as any).getValue.and.returnValue(mockFormState); + bulkAccessControlService.createPayloadFile.and.returnValue(mockFile); + bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); + component.objectsSelected$.next(['1234']); + component.submit(); + expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + }); }); }); diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index 8a82edb273..b928f3da4a 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -1,36 +1,28 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; + +import { BehaviorSubject, Subscription } from 'rxjs'; +import { distinctUntilChanged, map } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.component'; -import { distinctUntilChanged, map, take, tap } from 'rxjs/operators'; import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; -import { BehaviorSubject, Subscription } from 'rxjs'; import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { Process } from '../../process-page/processes/process.model'; +import { isNotEmpty } from '../../shared/empty.util'; +import { getProcessDetailRoute } from '../../process-page/process-page-routing.paths'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; @Component({ selector: 'ds-bulk-access', - // templateUrl: './bulk-access.component.html', - template: `
- -
- - -
- -
- - -
-
`, + templateUrl: './bulk-access.component.html', styleUrls: ['./bulk-access.component.scss'] }) export class BulkAccessComponent implements OnInit { - /** * The selection list id */ @@ -53,16 +45,18 @@ export class BulkAccessComponent implements OnInit { constructor( private bulkAccessControlService: BulkAccessControlService, - private selectableListService: SelectableListService - ) { } + private notificationsService: NotificationsService, + private router: Router, + private selectableListService: SelectableListService, + private translationService: TranslateService + ) { + } ngOnInit(): void { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - tap(console.log), - map((list: SelectableListState) => this.generateIdListBySelectedElements(list)), - tap(console.log) + map((list: SelectableListState) => this.generateIdListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } @@ -97,9 +91,24 @@ export class BulkAccessComponent implements OnInit { this.bulkAccessControlService.executeScript( this.objectsSelected$.value || [], file - ).pipe(take(1)).subscribe((res) => { - console.log('success', res); - }); + ).pipe( + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + if (rd.hasSucceeded) { + const title = this.translationService.get('process.new.notification.success.title'); + const content = this.translationService.get('process.new.notification.success.content'); + this.notificationsService.success(title, content); + if (isNotEmpty(rd.payload)) { + this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); + } + return true; + } else { + const title = this.translationService.get('process.new.notification.error.title'); + const content = this.translationService.get('process.new.notification.error.content'); + this.notificationsService.error(title, content); + return false; + } + })).subscribe(); } /**