mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-08 10:34:15 +00:00
finalize config and mapping
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
<a ngbNavLink>{{'admin-notify-dashboard.metrics' | translate}}</a>
|
<a ngbNavLink>{{'admin-notify-dashboard.metrics' | translate}}</a>
|
||||||
<ng-template ngbNavContent>
|
<ng-template ngbNavContent>
|
||||||
<div id="metrics">
|
<div id="metrics">
|
||||||
<ds-admin-notify-metrics [boxesConfig]="metricsConfig"></ds-admin-notify-metrics>
|
<ds-admin-notify-metrics [boxesConfig]="notifyMetricsRows$ | async"></ds-admin-notify-metrics>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</li>
|
</li>
|
||||||
|
@@ -3,10 +3,21 @@ import { SearchService } from "../../core/shared/search/search.service";
|
|||||||
import { environment } from "../../../environments/environment";
|
import { environment } from "../../../environments/environment";
|
||||||
import { PaginatedSearchOptions } from "../../shared/search/models/paginated-search-options.model";
|
import { PaginatedSearchOptions } from "../../shared/search/models/paginated-search-options.model";
|
||||||
import { PaginationComponentOptions } from "../../shared/pagination/pagination-component-options.model";
|
import { PaginationComponentOptions } from "../../shared/pagination/pagination-component-options.model";
|
||||||
import { concatAll, concatWith, flatMap, forkJoin, from, mergeAll, switchMap } from "rxjs";
|
import {
|
||||||
import { concat, delay } from "rxjs/operators";
|
listableObjectComponent
|
||||||
import { getFirstSucceededRemoteData } from "../../core/shared/operators";
|
} from "../../shared/object-collection/shared/listable-object/listable-object.decorator";
|
||||||
|
import { ViewMode } from "../../core/shared/view-mode.model";
|
||||||
|
import { Context } from "../../core/shared/context.model";
|
||||||
|
import { AdminNotifySearchResult } from "./models/admin-notify-message-search-result.model";
|
||||||
|
import { forkJoin, Observable } from "rxjs";
|
||||||
|
import { getFirstCompletedRemoteData } from "../../core/shared/operators";
|
||||||
|
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 { DSpaceObject } from "../../core/shared/dspace-object.model";
|
||||||
|
|
||||||
|
|
||||||
|
@listableObjectComponent(AdminNotifySearchResult, ViewMode.GridElement, Context.AdminSearch)
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-admin-notify-dashboard',
|
selector: 'ds-admin-notify-dashboard',
|
||||||
templateUrl: './admin-notify-dashboard.component.html',
|
templateUrl: './admin-notify-dashboard.component.html',
|
||||||
@@ -14,7 +25,9 @@ import { getFirstSucceededRemoteData } from "../../core/shared/operators";
|
|||||||
})
|
})
|
||||||
export class AdminNotifyDashboardComponent implements OnInit{
|
export class AdminNotifyDashboardComponent implements OnInit{
|
||||||
|
|
||||||
metricsConfig = environment.notifyMetrics;
|
public notifyMetricsRows$: Observable<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
|
||||||
@@ -22,14 +35,56 @@ export class AdminNotifyDashboardComponent implements OnInit{
|
|||||||
constructor(private searchService: SearchService) {}
|
constructor(private searchService: SearchService) {}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
const discoveryConfigurations = 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));
|
||||||
const mergedConfigurations = discoveryConfigurations[0].concat(discoveryConfigurations[1]);
|
const flatConfigurations = [].concat(...mertricsRowsConfigurations.map((config) => config));
|
||||||
const searchConfigurations = mergedConfigurations
|
const searchConfigurations = flatConfigurations
|
||||||
.map(config => Object.assign(new PaginatedSearchOptions({}),
|
.map(config => Object.assign(new PaginatedSearchOptions({}),
|
||||||
{ configuration: config, pagination: this.singleResultOptions }
|
{ configuration: config, pagination: this.singleResultOptions }
|
||||||
));
|
));
|
||||||
// TODO: check for search completion before executing next one
|
|
||||||
|
this.notifyMetricsRows$ = forkJoin(searchConfigurations.map(config => this.searchService.search(config)
|
||||||
|
.pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map(response => this.mapSearchObjectsToMetricsBox(response.payload)),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).pipe(
|
||||||
|
map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to map received SearchObjects to notify boxes config
|
||||||
|
*
|
||||||
|
* @param searchObject The object to map
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private mapSearchObjectsToMetricsBox(searchObject: SearchObjects<DSpaceObject>) : AdminNotifyMetricsBox {
|
||||||
|
const objectConfig = searchObject.configuration;
|
||||||
|
const count = searchObject.pageInfo.totalElements;
|
||||||
|
const metricsBoxes = [].concat(...this.metricsConfig.map((config) => config.boxes));
|
||||||
|
|
||||||
|
return {
|
||||||
|
...metricsBoxes.find(box => box.config === objectConfig),
|
||||||
|
count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to map updated boxes with count to each row of the configuration
|
||||||
|
*
|
||||||
|
* @param boxes The object to map
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private mapUpdatedBoxesToMetricsRows(boxes: AdminNotifyMetricsBox[]) : AdminNotifyMetricsRow[] {
|
||||||
|
return this.metricsConfig.map(row => {
|
||||||
|
return {
|
||||||
|
...row,
|
||||||
|
boxes: row.boxes.map(box => boxes.find(boxWithCount => boxWithCount.config === box.config))
|
||||||
|
.filter(box => !!box)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
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";
|
||||||
|
|
||||||
|
|
||||||
|
@searchResultFor(AdminNotifyMessage)
|
||||||
|
export class AdminNotifySearchResult extends SearchResult<AdminNotifyMessage> {
|
||||||
|
}
|
@@ -0,0 +1,31 @@
|
|||||||
|
import { deserialize, inheritSerialization } from 'cerialize';
|
||||||
|
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";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A message that includes admin notify info
|
||||||
|
*/
|
||||||
|
@typedObject
|
||||||
|
@inheritSerialization(DSpaceObject)
|
||||||
|
export class AdminNotifyMessage extends DSpaceObject {
|
||||||
|
static type = ADMIN_NOTIFY_MESSAGE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of the message
|
||||||
|
*/
|
||||||
|
@excludeFromEquals
|
||||||
|
type = ADMIN_NOTIFY_MESSAGE;
|
||||||
|
|
||||||
|
@deserialize
|
||||||
|
_links: {
|
||||||
|
self: {
|
||||||
|
href: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
get self(): string {
|
||||||
|
return this._links.self.href;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,9 @@
|
|||||||
|
import { ResourceType } from "../../../core/shared/resource-type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The resource type for AdminNotifyMessage
|
||||||
|
*
|
||||||
|
* Needs to be in a separate file to prevent circular
|
||||||
|
* dependencies in webpack.
|
||||||
|
*/
|
||||||
|
export const ADMIN_NOTIFY_MESSAGE = new ResourceType('message');
|
@@ -197,6 +197,7 @@ import {
|
|||||||
import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config';
|
import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config';
|
||||||
import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model';
|
import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model';
|
||||||
import { NotifyRequestsStatusDataService } from './data/notify-services-status-data.service';
|
import { NotifyRequestsStatusDataService } from './data/notify-services-status-data.service';
|
||||||
|
import { AdminNotifyMessage } from "../admin/admin-notify-dashboard/models/admin-notify-message.model";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -410,6 +411,7 @@ export const models =
|
|||||||
Itemfilter,
|
Itemfilter,
|
||||||
SubmissionCoarNotifyConfig,
|
SubmissionCoarNotifyConfig,
|
||||||
NotifyRequestsStatus,
|
NotifyRequestsStatus,
|
||||||
|
AdminNotifyMessage
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
Reference in New Issue
Block a user