Skip to content

Commit 27d05ae

Browse files
committed
Merge branch 'w2p-111638_Process-admin-UI-redesign_Overview-page-tables_PR-feedback' into process-admin-ui-redesign-8.0.0-next
2 parents 87bb3ca + 4651d3a commit 27d05ae

12 files changed

Lines changed: 157 additions & 173 deletions

src/app/process-page/form/process-form.component.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { ControlContainer, NgForm } from '@angular/forms';
77
import { ScriptParameter } from '../scripts/script-parameter.model';
88
import { NotificationsService } from '../../shared/notifications/notifications.service';
99
import { TranslateService } from '@ngx-translate/core';
10-
import { RequestService } from '../../core/data/request.service';
11-
import { Router } from '@angular/router';
10+
import { Router, NavigationExtras } from '@angular/router';
1211
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
1312
import { RemoteData } from '../../core/data/remote-data';
1413
import { getProcessListRoute } from '../process-page-routing.paths';
@@ -57,7 +56,6 @@ export class ProcessFormComponent implements OnInit {
5756
private scriptService: ScriptDataService,
5857
private notificationsService: NotificationsService,
5958
private translationService: TranslateService,
60-
private requestService: RequestService,
6159
private router: Router) {
6260
}
6361

@@ -91,7 +89,7 @@ export class ProcessFormComponent implements OnInit {
9189
const title = this.translationService.get('process.new.notification.success.title');
9290
const content = this.translationService.get('process.new.notification.success.content');
9391
this.notificationsService.success(title, content);
94-
this.sendBack();
92+
this.sendBack(rd.payload);
9593
} else {
9694
const title = this.translationService.get('process.new.notification.error.title');
9795
const content = this.translationService.get('process.new.notification.error.content');
@@ -143,11 +141,17 @@ export class ProcessFormComponent implements OnInit {
143141
return this.missingParameters.length > 0;
144142
}
145143

146-
private sendBack() {
147-
this.requestService.removeByHrefSubstring('/processes');
148-
/* should subscribe on the previous method to know the action is finished and then navigate,
149-
will fix this when the removeByHrefSubstring changes are merged */
150-
this.router.navigateByUrl(getProcessListRoute());
144+
/**
145+
* Redirect the user to the processes overview page with the new process' ID,
146+
* so it can be highlighted in the overview table.
147+
* @param newProcess The newly created process
148+
* @private
149+
*/
150+
private sendBack(newProcess: Process) {
151+
const extras: NavigationExtras = {
152+
queryParams: { new_process_id: newProcess.processId },
153+
};
154+
void this.router.navigate([getProcessListRoute()], extras);
151155
}
152156
}
153157

src/app/process-page/overview/process-overview.component.html

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,7 @@
22
<div class="d-flex">
33
<h1 class="flex-grow-1">{{'process.overview.title' | translate}}</h1>
44
</div>
5-
<div class="d-flex justify-content-end mb-2">
6-
<button *ngIf="processBulkDeleteService.hasSelected()" class="btn btn-primary mr-2"
7-
(click)="processBulkDeleteService.clearAllProcesses()"><i
8-
class="fas fa-undo pr-2"></i>{{'process.overview.delete.clear' | translate }}
9-
</button>
10-
<button *ngIf="processBulkDeleteService.hasSelected()" class="btn btn-danger mr-2"
11-
(click)="openDeleteModal(deleteModal)"><i
12-
class="fas fa-trash pr-2"></i>{{'process.overview.delete' | translate: {count: processBulkDeleteService.getAmountOfSelectedProcesses()} }}
13-
</button>
14-
<button class="btn btn-success" routerLink="/processes/new"><i
15-
class="fas fa-plus pr-2"></i>{{'process.overview.new' | translate}}</button>
16-
</div>
5+
<ng-container *ngTemplateOutlet="buttons"></ng-container>
176

187
<div class="sections">
198
<ds-process-overview-table
@@ -23,18 +12,37 @@ <h1 class="flex-grow-1">{{'process.overview.title' | translate}}</h1>
2312
<ds-process-overview-table
2413
[processStatus]="ProcessStatus.SCHEDULED"
2514
[useAutoRefreshingSearchBy]="true"
26-
[getInfoValueMethod]="processOverviewService.timeStarted"/>
15+
[getInfoValueMethod]="processOverviewService.timeCreated"/>
2716
<ds-process-overview-table
2817
[processStatus]="ProcessStatus.COMPLETED"
18+
[sortField]="ProcessSortField.endTime"
2919
[useAutoRefreshingSearchBy]="true"
3020
[getInfoValueMethod]="processOverviewService.timeCompleted"/>
3121
<ds-process-overview-table
3222
[processStatus]="ProcessStatus.FAILED"
23+
[sortField]="ProcessSortField.endTime"
3324
[useAutoRefreshingSearchBy]="true"
3425
[getInfoValueMethod]="processOverviewService.timeCompleted"/>
3526
</div>
27+
28+
<ng-container *ngTemplateOutlet="buttons"></ng-container>
3629
</div>
3730

31+
<ng-template #buttons>
32+
<div class="d-flex justify-content-end mb-2">
33+
<button *ngIf="processBulkDeleteService.hasSelected()" class="btn btn-primary mr-2"
34+
(click)="processBulkDeleteService.clearAllProcesses()"><i
35+
class="fas fa-undo pr-2"></i>{{'process.overview.delete.clear' | translate }}
36+
</button>
37+
<button *ngIf="processBulkDeleteService.hasSelected()" class="btn btn-danger mr-2"
38+
(click)="openDeleteModal(deleteModal)"><i
39+
class="fas fa-trash pr-2"></i>{{'process.overview.delete' | translate: {count: processBulkDeleteService.getAmountOfSelectedProcesses()} }}
40+
</button>
41+
<button class="btn btn-success" routerLink="/processes/new"><i
42+
class="fas fa-plus pr-2"></i>{{'process.overview.new' | translate}}</button>
43+
</div>
44+
</ng-template>
45+
3846
<ng-template #deleteModal>
3947

4048
<div>

src/app/process-page/overview/process-overview.component.spec.ts

Lines changed: 7 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,86 +3,27 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
33
import { VarDirective } from '../../shared/utils/var.directive';
44
import { TranslateModule } from '@ngx-translate/core';
55
import { RouterTestingModule } from '@angular/router/testing';
6-
import { NO_ERRORS_SCHEMA } from '@angular/core';
6+
import { NO_ERRORS_SCHEMA, TemplateRef } from '@angular/core';
77
import { ProcessDataService } from '../../core/data/processes/process-data.service';
8-
import { Process } from '../processes/process.model';
9-
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
10-
import { EPerson } from '../../core/eperson/models/eperson.model';
118
import { By } from '@angular/platform-browser';
12-
import { ProcessStatus } from '../processes/process-status.model';
13-
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
14-
import { createPaginatedList } from '../../shared/testing/utils.test';
15-
import { PaginationService } from '../../core/pagination/pagination.service';
16-
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
17-
import { DatePipe } from '@angular/common';
189
import { BehaviorSubject } from 'rxjs';
1910
import { ProcessBulkDeleteService } from './process-bulk-delete.service';
2011
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
12+
import { ProcessOverviewService } from './process-overview.service';
2113

2214
describe('ProcessOverviewComponent', () => {
2315
let component: ProcessOverviewComponent;
2416
let fixture: ComponentFixture<ProcessOverviewComponent>;
2517

2618
let processService: ProcessDataService;
27-
let ePersonService: EPersonDataService;
28-
let paginationService;
29-
30-
let processes: Process[];
31-
let ePerson: EPerson;
3219

3320
let processBulkDeleteService;
3421
let modalService;
3522

36-
const pipe = new DatePipe('en-US');
37-
3823
function init() {
39-
processes = [
40-
Object.assign(new Process(), {
41-
processId: 1,
42-
scriptName: 'script-name',
43-
startTime: '2020-03-19 00:30:00',
44-
endTime: '2020-03-19 23:30:00',
45-
processStatus: ProcessStatus.COMPLETED
46-
}),
47-
Object.assign(new Process(), {
48-
processId: 2,
49-
scriptName: 'script-name',
50-
startTime: '2020-03-20 00:30:00',
51-
endTime: '2020-03-20 23:30:00',
52-
processStatus: ProcessStatus.FAILED
53-
}),
54-
Object.assign(new Process(), {
55-
processId: 3,
56-
scriptName: 'another-script-name',
57-
startTime: '2020-03-21 00:30:00',
58-
endTime: '2020-03-21 23:30:00',
59-
processStatus: ProcessStatus.RUNNING
60-
})
61-
];
62-
ePerson = Object.assign(new EPerson(), {
63-
metadata: {
64-
'eperson.firstname': [
65-
{
66-
value: 'John',
67-
language: null
68-
}
69-
],
70-
'eperson.lastname': [
71-
{
72-
value: 'Doe',
73-
language: null
74-
}
75-
]
76-
}
77-
});
78-
processService = jasmine.createSpyObj('processService', {
79-
findAll: createSuccessfulRemoteDataObject$(createPaginatedList(processes))
24+
processService = jasmine.createSpyObj('processOverviewService', {
25+
timeStarted: '2024-02-05 16:43:32',
8026
});
81-
ePersonService = jasmine.createSpyObj('ePersonService', {
82-
findById: createSuccessfulRemoteDataObject$(ePerson)
83-
});
84-
85-
paginationService = new PaginationServiceStub();
8627

8728
processBulkDeleteService = jasmine.createSpyObj('processBulkDeleteService', {
8829
clearAllProcesses: {},
@@ -96,11 +37,7 @@ describe('ProcessOverviewComponent', () => {
9637
});
9738

9839
(processBulkDeleteService.isToBeDeleted as jasmine.Spy).and.callFake((id) => {
99-
if (id === 2) {
100-
return true;
101-
} else {
102-
return false;
103-
}
40+
return id === 2;
10441
});
10542

10643
modalService = jasmine.createSpyObj('modalService', {
@@ -114,9 +51,7 @@ describe('ProcessOverviewComponent', () => {
11451
declarations: [ProcessOverviewComponent, VarDirective],
11552
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])],
11653
providers: [
117-
{ provide: ProcessDataService, useValue: processService },
118-
{ provide: EPersonDataService, useValue: ePersonService },
119-
{ provide: PaginationService, useValue: paginationService },
54+
{ provide: ProcessOverviewService, useValue: processService },
12055
{ provide: ProcessBulkDeleteService, useValue: processBulkDeleteService },
12156
{ provide: NgbModal, useValue: modalService },
12257
],
@@ -165,21 +100,19 @@ describe('ProcessOverviewComponent', () => {
165100

166101
describe('openDeleteModal', () => {
167102
it('should open the modal', () => {
168-
component.openDeleteModal({});
103+
component.openDeleteModal({} as TemplateRef<any>);
169104
expect(modalService.open).toHaveBeenCalledWith({});
170105
});
171106
});
172107

173108
describe('deleteSelected', () => {
174109
it('should call the deleteSelectedProcesses method on the processBulkDeleteService and close the modal when processing is done', () => {
175110
spyOn(component, 'closeModal');
176-
spyOn(component, 'setProcesses');
177111

178112
component.deleteSelected();
179113

180114
expect(processBulkDeleteService.deleteSelectedProcesses).toHaveBeenCalled();
181115
expect(component.closeModal).toHaveBeenCalled();
182-
expect(component.setProcesses).toHaveBeenCalled();
183116
});
184117
});
185118
});

src/app/process-page/overview/process-overview.component.ts

Lines changed: 7 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,9 @@
1-
import { Component, OnDestroy, OnInit } from '@angular/core';
2-
import { Observable, Subscription } from 'rxjs';
3-
import { RemoteData } from '../../core/data/remote-data';
4-
import { PaginatedList } from '../../core/data/paginated-list.model';
5-
import { Process } from '../processes/process.model';
6-
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
7-
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
8-
import { switchMap } from 'rxjs/operators';
9-
import { ProcessDataService } from '../../core/data/processes/process-data.service';
10-
import { PaginationService } from '../../core/pagination/pagination.service';
11-
import { FindListOptions } from '../../core/data/find-list-options.model';
1+
import { Component, OnDestroy, OnInit, TemplateRef } from '@angular/core';
2+
import { Subscription } from 'rxjs';
123
import { ProcessBulkDeleteService } from './process-bulk-delete.service';
134
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
145
import { hasValue } from '../../shared/empty.util';
15-
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
16-
import { ProcessOverviewService } from './process-overview.service';
6+
import { ProcessOverviewService, ProcessSortField } from './process-overview.service';
177
import { ProcessStatus } from '../processes/process-status.model';
188

199
@Component({
@@ -25,64 +15,25 @@ import { ProcessStatus } from '../processes/process-status.model';
2515
*/
2616
export class ProcessOverviewComponent implements OnInit, OnDestroy {
2717

18+
// Enums are redeclared here so they can be used in the template
2819
protected readonly ProcessStatus = ProcessStatus;
20+
protected readonly ProcessSortField = ProcessSortField;
2921

30-
/**
31-
* List of all processes
32-
*/
33-
processesRD$: Observable<RemoteData<PaginatedList<Process>>>;
34-
35-
/**
36-
* The current pagination configuration for the page used by the FindAll method
37-
*/
38-
config: FindListOptions = Object.assign(new FindListOptions(), {
39-
elementsPerPage: 20
40-
});
41-
42-
/**
43-
* The current pagination configuration for the page
44-
*/
45-
pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), {
46-
id: 'po',
47-
pageSize: 20
48-
});
49-
50-
/**
51-
* Date format to use for start and end time of processes
52-
*/
53-
dateFormat = 'yyyy-MM-dd HH:mm:ss';
54-
55-
processesToDelete: string[] = [];
5622
private modalRef: any;
5723

5824
isProcessingSub: Subscription;
5925

60-
constructor(protected processService: ProcessDataService,
61-
protected processOverviewService: ProcessOverviewService,
62-
protected paginationService: PaginationService,
63-
protected ePersonService: EPersonDataService,
26+
constructor(protected processOverviewService: ProcessOverviewService,
6427
protected modalService: NgbModal,
6528
public processBulkDeleteService: ProcessBulkDeleteService,
66-
protected dsoNameService: DSONameService,
6729
) {
6830
}
6931

7032
ngOnInit(): void {
71-
this.setProcesses();
7233
this.processBulkDeleteService.clearAllProcesses();
7334
}
7435

75-
/**
76-
* Send a request to fetch all processes for the current page
77-
*/
78-
setProcesses() {
79-
this.processesRD$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.config).pipe(
80-
switchMap((config) => this.processService.findAll(config, true, false))
81-
);
82-
}
83-
8436
ngOnDestroy(): void {
85-
this.paginationService.clearPagination(this.pageConfig.id);
8637
if (hasValue(this.isProcessingSub)) {
8738
this.isProcessingSub.unsubscribe();
8839
}
@@ -92,7 +43,7 @@ export class ProcessOverviewComponent implements OnInit, OnDestroy {
9243
* Open a given modal.
9344
* @param content - the modal content.
9445
*/
95-
openDeleteModal(content) {
46+
openDeleteModal(content: TemplateRef<any>) {
9647
this.modalRef = this.modalService.open(content);
9748
}
9849

@@ -118,7 +69,6 @@ export class ProcessOverviewComponent implements OnInit, OnDestroy {
11869
.subscribe((isProcessing) => {
11970
if (!isProcessing) {
12071
this.closeModal();
121-
this.setProcesses();
12272
}
12373
});
12474
}

0 commit comments

Comments
 (0)