[DURACOM-271] Fix error which led to have empty dashboard when new notification is delivered

This commit is contained in:
Giuseppe Digilio
2024-06-11 18:06:40 +02:00
parent cee07c2e4a
commit 74e1e67126
4 changed files with 119 additions and 21 deletions

View File

@@ -7,6 +7,8 @@ import { ActivatedRoute } from '@angular/router';
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { APP_CONFIG } from '../../../config/app-config.interface';
import { environment } from '../../../environments/environment.test';
import { buildPaginatedList } from '../../core/data/paginated-list.model'; import { buildPaginatedList } from '../../core/data/paginated-list.model';
import { SearchService } from '../../core/shared/search/search.service'; import { SearchService } from '../../core/shared/search/search.service';
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
@@ -28,9 +30,89 @@ describe('AdminNotifyDashboardComponent', () => {
let searchResult3; let searchResult3;
let results; let results;
const mockBoxes = [ 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.received-ldn',
boxes: [
{
color: '#B8DAFF',
title: 'admin-notify-dashboard.NOTIFY.incoming.accepted',
config: 'NOTIFY.incoming.accepted',
description: 'admin-notify-dashboard.NOTIFY.incoming.accepted.description',
count: undefined,
},
{
color: '#D4EDDA',
title: 'admin-notify-dashboard.NOTIFY.incoming.processed',
config: 'NOTIFY.incoming.processed',
description: 'admin-notify-dashboard.NOTIFY.incoming.processed.description',
count: undefined,
},
{
color: '#FDBBC7',
title: 'admin-notify-dashboard.NOTIFY.incoming.failure',
config: 'NOTIFY.incoming.failure',
description: 'admin-notify-dashboard.NOTIFY.incoming.failure.description',
count: undefined,
},
{
color: '#FDBBC7',
title: 'admin-notify-dashboard.NOTIFY.incoming.untrusted',
config: 'NOTIFY.incoming.untrusted',
description: 'admin-notify-dashboard.NOTIFY.incoming.untrusted.description',
count: undefined,
},
{
color: '#43515F',
title: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems',
textColor: '#fff',
config: 'NOTIFY.incoming.involvedItems',
description: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems.description',
count: undefined,
},
],
},
{
title: 'admin-notify-dashboard.generated-ldn',
boxes: [
{
color: '#D4EDDA',
title: 'admin-notify-dashboard.NOTIFY.outgoing.delivered',
config: 'NOTIFY.outgoing.delivered',
description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description',
count: undefined,
},
{
color: '#B8DAFF',
title: 'admin-notify-dashboard.NOTIFY.outgoing.queued',
config: 'NOTIFY.outgoing.queued',
description: 'admin-notify-dashboard.NOTIFY.outgoing.queued.description',
count: undefined,
},
{
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',
count: undefined,
},
{
color: '#FDBBC7',
title: 'admin-notify-dashboard.NOTIFY.outgoing.failure',
config: 'NOTIFY.outgoing.failure',
description: 'admin-notify-dashboard.NOTIFY.outgoing.failure.description',
count: undefined,
},
{
color: '#43515F',
title: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems',
textColor: '#fff',
config: 'NOTIFY.outgoing.involvedItems',
description: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems.description',
count: undefined,
},
],
},
]; ];
beforeEach(async () => { beforeEach(async () => {
@@ -45,6 +127,7 @@ describe('AdminNotifyDashboardComponent', () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [TranslateModule.forRoot(), NgbNavModule, AdminNotifyDashboardComponent], imports: [TranslateModule.forRoot(), NgbNavModule, AdminNotifyDashboardComponent],
providers: [ providers: [
{ provide: APP_CONFIG, useValue: environment },
{ provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results) } }, { provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results) } },
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() }, { provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
], ],

View File

@@ -4,17 +4,21 @@ import {
} from '@angular/common'; } from '@angular/common';
import { import {
Component, Component,
Inject,
OnInit, OnInit,
} from '@angular/core'; } from '@angular/core';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { import {
BehaviorSubject,
forkJoin, forkJoin,
Observable,
} from 'rxjs'; } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { environment } from '../../../environments/environment'; import {
APP_CONFIG,
AppConfig,
} from '../../../config/app-config.interface';
import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model';
import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { getFirstCompletedRemoteData } from '../../core/shared/operators';
import { SearchService } from '../../core/shared/search/search.service'; import { SearchService } from '../../core/shared/search/search.service';
@@ -51,20 +55,25 @@ import {
/** /**
* Component used for visual representation and search of LDN messages for Admins * Component used for visual representation and search of LDN messages for Admins
*/ */
export class AdminNotifyDashboardComponent implements OnInit{ export class AdminNotifyDashboardComponent implements OnInit {
public notifyMetricsRows$: Observable<AdminNotifyMetricsRow[]>; public notifyMetricsRows$: BehaviorSubject<AdminNotifyMetricsRow[]> = new BehaviorSubject<AdminNotifyMetricsRow[]>([]);
private metricsConfig: AdminNotifyMetricsRow[];
private metricsConfig = environment.notifyMetrics;
private singleResultOptions = Object.assign(new PaginationComponentOptions(), { private singleResultOptions = Object.assign(new PaginationComponentOptions(), {
id: 'single-result-options', id: 'single-result-options',
pageSize: 1, pageSize: 1,
}); });
constructor(private searchService: SearchService) { constructor(
@Inject(APP_CONFIG) protected appConfig: AppConfig,
private searchService: SearchService,
) {
} }
ngOnInit() { ngOnInit() {
this.metricsConfig = this.appConfig.notifyMetrics;
const mertricsRowsConfigurations = this.metricsConfig const mertricsRowsConfigurations = this.metricsConfig
.map(row => row.boxes) .map(row => row.boxes)
.map(boxes => boxes.map(box => box.config).filter(config => !!config)); .map(boxes => boxes.map(box => box.config).filter(config => !!config));
@@ -74,15 +83,18 @@ export class AdminNotifyDashboardComponent implements OnInit{
{ configuration: config, pagination: this.singleResultOptions }, { configuration: config, pagination: this.singleResultOptions },
)); ));
this.notifyMetricsRows$ = forkJoin(searchConfigurations.map(config => this.searchService.search(config) forkJoin(
.pipe( searchConfigurations.map(config => this.searchService.search(config)
getFirstCompletedRemoteData(), .pipe(
map(response => this.mapSearchObjectsToMetricsBox(response.payload)), getFirstCompletedRemoteData(),
map(response => this.mapSearchObjectsToMetricsBox(config.configuration, response.payload)),
),
), ),
),
).pipe( ).pipe(
map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)), map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)),
); ).subscribe((metricBoxes: AdminNotifyMetricsRow[]) => {
this.notifyMetricsRows$.next(metricBoxes);
});
} }
/** /**
@@ -91,13 +103,12 @@ export class AdminNotifyDashboardComponent implements OnInit{
* @param searchObject The object to map * @param searchObject The object to map
* @private * @private
*/ */
private mapSearchObjectsToMetricsBox(searchObject: SearchObjects<DSpaceObject>): AdminNotifyMetricsBox { private mapSearchObjectsToMetricsBox(configuration: string, searchObject: SearchObjects<DSpaceObject>): AdminNotifyMetricsBox {
const count = searchObject.pageInfo.totalElements; const count = searchObject.pageInfo.totalElements;
const objectConfig = searchObject.configuration; const metricsBoxes = [].concat(...this.metricsConfig.map((config: AdminNotifyMetricsRow) => config.boxes));
const metricsBoxes = [].concat(...this.metricsConfig.map((config) => config.boxes));
return { return {
...metricsBoxes.find(box => box.config === objectConfig), ...metricsBoxes.find(box => box.config === configuration),
count, count,
}; };
} }

View File

@@ -1,4 +1,4 @@
<div role="button" <div role="button" *ngIf="boxConfig"
class="w-100 h-100 pt-4 pb-3 px-2 box-container" class="w-100 h-100 pt-4 pb-3 px-2 box-container"
[ngStyle]="{'background-color': boxConfig.color}" [ngStyle]="{'background-color': boxConfig.color}"
[dsHoverClass]="'shadow-lg'" [dsHoverClass]="'shadow-lg'"

View File

@@ -1,4 +1,7 @@
import { NgStyle } from '@angular/common'; import {
NgIf,
NgStyle,
} from '@angular/common';
import { import {
Component, Component,
EventEmitter, EventEmitter,
@@ -23,6 +26,7 @@ import { listableObjectComponent } from '../object-collection/shared/listable-ob
NgStyle, NgStyle,
HoverClassDirective, HoverClassDirective,
TranslateModule, TranslateModule,
NgIf,
], ],
}) })
/** /**