Skip to content

Commit 74e1e67

Browse files
committed
[DURACOM-271] Fix error which led to have empty dashboard when new notification is delivered
1 parent cee07c2 commit 74e1e67

4 files changed

Lines changed: 119 additions & 21 deletions

File tree

src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { ActivatedRoute } from '@angular/router';
77
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
88
import { TranslateModule } from '@ngx-translate/core';
99

10+
import { APP_CONFIG } from '../../../config/app-config.interface';
11+
import { environment } from '../../../environments/environment.test';
1012
import { buildPaginatedList } from '../../core/data/paginated-list.model';
1113
import { SearchService } from '../../core/shared/search/search.service';
1214
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
@@ -28,9 +30,89 @@ describe('AdminNotifyDashboardComponent', () => {
2830
let searchResult3;
2931
let results;
3032

31-
const mockBoxes = [
32-
{ title: 'admin-notify-dashboard.received-ldn', boxes: [ undefined, undefined, undefined, undefined, undefined ] },
33-
{ title: 'admin-notify-dashboard.generated-ldn', boxes: [ undefined, undefined, undefined, undefined, undefined ] },
33+
const mockBoxes = [
34+
{
35+
title: 'admin-notify-dashboard.received-ldn',
36+
boxes: [
37+
{
38+
color: '#B8DAFF',
39+
title: 'admin-notify-dashboard.NOTIFY.incoming.accepted',
40+
config: 'NOTIFY.incoming.accepted',
41+
description: 'admin-notify-dashboard.NOTIFY.incoming.accepted.description',
42+
count: undefined,
43+
},
44+
{
45+
color: '#D4EDDA',
46+
title: 'admin-notify-dashboard.NOTIFY.incoming.processed',
47+
config: 'NOTIFY.incoming.processed',
48+
description: 'admin-notify-dashboard.NOTIFY.incoming.processed.description',
49+
count: undefined,
50+
},
51+
{
52+
color: '#FDBBC7',
53+
title: 'admin-notify-dashboard.NOTIFY.incoming.failure',
54+
config: 'NOTIFY.incoming.failure',
55+
description: 'admin-notify-dashboard.NOTIFY.incoming.failure.description',
56+
count: undefined,
57+
},
58+
{
59+
color: '#FDBBC7',
60+
title: 'admin-notify-dashboard.NOTIFY.incoming.untrusted',
61+
config: 'NOTIFY.incoming.untrusted',
62+
description: 'admin-notify-dashboard.NOTIFY.incoming.untrusted.description',
63+
count: undefined,
64+
},
65+
{
66+
color: '#43515F',
67+
title: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems',
68+
textColor: '#fff',
69+
config: 'NOTIFY.incoming.involvedItems',
70+
description: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems.description',
71+
count: undefined,
72+
},
73+
],
74+
},
75+
{
76+
title: 'admin-notify-dashboard.generated-ldn',
77+
boxes: [
78+
{
79+
color: '#D4EDDA',
80+
title: 'admin-notify-dashboard.NOTIFY.outgoing.delivered',
81+
config: 'NOTIFY.outgoing.delivered',
82+
description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description',
83+
count: undefined,
84+
},
85+
{
86+
color: '#B8DAFF',
87+
title: 'admin-notify-dashboard.NOTIFY.outgoing.queued',
88+
config: 'NOTIFY.outgoing.queued',
89+
description: 'admin-notify-dashboard.NOTIFY.outgoing.queued.description',
90+
count: undefined,
91+
},
92+
{
93+
color: '#FDEEBB',
94+
title: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry',
95+
config: 'NOTIFY.outgoing.queued_for_retry',
96+
description: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry.description',
97+
count: undefined,
98+
},
99+
{
100+
color: '#FDBBC7',
101+
title: 'admin-notify-dashboard.NOTIFY.outgoing.failure',
102+
config: 'NOTIFY.outgoing.failure',
103+
description: 'admin-notify-dashboard.NOTIFY.outgoing.failure.description',
104+
count: undefined,
105+
},
106+
{
107+
color: '#43515F',
108+
title: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems',
109+
textColor: '#fff',
110+
config: 'NOTIFY.outgoing.involvedItems',
111+
description: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems.description',
112+
count: undefined,
113+
},
114+
],
115+
},
34116
];
35117

36118
beforeEach(async () => {
@@ -45,6 +127,7 @@ describe('AdminNotifyDashboardComponent', () => {
45127
await TestBed.configureTestingModule({
46128
imports: [TranslateModule.forRoot(), NgbNavModule, AdminNotifyDashboardComponent],
47129
providers: [
130+
{ provide: APP_CONFIG, useValue: environment },
48131
{ provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results) } },
49132
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
50133
],

src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@ import {
44
} from '@angular/common';
55
import {
66
Component,
7+
Inject,
78
OnInit,
89
} from '@angular/core';
910
import { RouterLink } from '@angular/router';
1011
import { TranslateModule } from '@ngx-translate/core';
1112
import {
13+
BehaviorSubject,
1214
forkJoin,
13-
Observable,
1415
} from 'rxjs';
1516
import { map } from 'rxjs/operators';
1617

17-
import { environment } from '../../../environments/environment';
18+
import {
19+
APP_CONFIG,
20+
AppConfig,
21+
} from '../../../config/app-config.interface';
1822
import { DSpaceObject } from '../../core/shared/dspace-object.model';
1923
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
2024
import { SearchService } from '../../core/shared/search/search.service';
@@ -51,20 +55,25 @@ import {
5155
/**
5256
* Component used for visual representation and search of LDN messages for Admins
5357
*/
54-
export class AdminNotifyDashboardComponent implements OnInit{
58+
export class AdminNotifyDashboardComponent implements OnInit {
59+
60+
public notifyMetricsRows$: BehaviorSubject<AdminNotifyMetricsRow[]> = new BehaviorSubject<AdminNotifyMetricsRow[]>([]);
5561

56-
public notifyMetricsRows$: Observable<AdminNotifyMetricsRow[]>;
62+
private metricsConfig: AdminNotifyMetricsRow[];
5763

58-
private metricsConfig = environment.notifyMetrics;
5964
private singleResultOptions = Object.assign(new PaginationComponentOptions(), {
6065
id: 'single-result-options',
6166
pageSize: 1,
6267
});
6368

64-
constructor(private searchService: SearchService) {
69+
constructor(
70+
@Inject(APP_CONFIG) protected appConfig: AppConfig,
71+
private searchService: SearchService,
72+
) {
6573
}
6674

6775
ngOnInit() {
76+
this.metricsConfig = this.appConfig.notifyMetrics;
6877
const mertricsRowsConfigurations = this.metricsConfig
6978
.map(row => row.boxes)
7079
.map(boxes => boxes.map(box => box.config).filter(config => !!config));
@@ -74,15 +83,18 @@ export class AdminNotifyDashboardComponent implements OnInit{
7483
{ configuration: config, pagination: this.singleResultOptions },
7584
));
7685

77-
this.notifyMetricsRows$ = forkJoin(searchConfigurations.map(config => this.searchService.search(config)
78-
.pipe(
79-
getFirstCompletedRemoteData(),
80-
map(response => this.mapSearchObjectsToMetricsBox(response.payload)),
86+
forkJoin(
87+
searchConfigurations.map(config => this.searchService.search(config)
88+
.pipe(
89+
getFirstCompletedRemoteData(),
90+
map(response => this.mapSearchObjectsToMetricsBox(config.configuration, response.payload)),
91+
),
8192
),
82-
),
8393
).pipe(
8494
map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)),
85-
);
95+
).subscribe((metricBoxes: AdminNotifyMetricsRow[]) => {
96+
this.notifyMetricsRows$.next(metricBoxes);
97+
});
8698
}
8799

88100
/**
@@ -91,13 +103,12 @@ export class AdminNotifyDashboardComponent implements OnInit{
91103
* @param searchObject The object to map
92104
* @private
93105
*/
94-
private mapSearchObjectsToMetricsBox(searchObject: SearchObjects<DSpaceObject>): AdminNotifyMetricsBox {
106+
private mapSearchObjectsToMetricsBox(configuration: string, searchObject: SearchObjects<DSpaceObject>): AdminNotifyMetricsBox {
95107
const count = searchObject.pageInfo.totalElements;
96-
const objectConfig = searchObject.configuration;
97-
const metricsBoxes = [].concat(...this.metricsConfig.map((config) => config.boxes));
108+
const metricsBoxes = [].concat(...this.metricsConfig.map((config: AdminNotifyMetricsRow) => config.boxes));
98109

99110
return {
100-
...metricsBoxes.find(box => box.config === objectConfig),
111+
...metricsBoxes.find(box => box.config === configuration),
101112
count,
102113
};
103114
}

src/app/shared/notification-box/notification-box.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div role="button"
1+
<div role="button" *ngIf="boxConfig"
22
class="w-100 h-100 pt-4 pb-3 px-2 box-container"
33
[ngStyle]="{'background-color': boxConfig.color}"
44
[dsHoverClass]="'shadow-lg'"

src/app/shared/notification-box/notification-box.component.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { NgStyle } from '@angular/common';
1+
import {
2+
NgIf,
3+
NgStyle,
4+
} from '@angular/common';
25
import {
36
Component,
47
EventEmitter,
@@ -23,6 +26,7 @@ import { listableObjectComponent } from '../object-collection/shared/listable-ob
2326
NgStyle,
2427
HoverClassDirective,
2528
TranslateModule,
29+
NgIf,
2630
],
2731
})
2832
/**

0 commit comments

Comments
 (0)