diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html
index e366fbc909..2975fdde9c 100644
--- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html
+++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html
@@ -8,7 +8,7 @@
{{'admin-notify-dashboard.metrics' | translate}}
-
+
diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts
index abaf9f05b5..b4e03d5ec7 100644
--- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts
+++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts
@@ -3,10 +3,21 @@ import { SearchService } from "../../core/shared/search/search.service";
import { environment } from "../../../environments/environment";
import { PaginatedSearchOptions } from "../../shared/search/models/paginated-search-options.model";
import { PaginationComponentOptions } from "../../shared/pagination/pagination-component-options.model";
-import { concatAll, concatWith, flatMap, forkJoin, from, mergeAll, switchMap } from "rxjs";
-import { concat, delay } from "rxjs/operators";
-import { getFirstSucceededRemoteData } from "../../core/shared/operators";
+import {
+ listableObjectComponent
+} 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({
selector: 'ds-admin-notify-dashboard',
templateUrl: './admin-notify-dashboard.component.html',
@@ -14,7 +25,9 @@ import { getFirstSucceededRemoteData } from "../../core/shared/operators";
})
export class AdminNotifyDashboardComponent implements OnInit{
- metricsConfig = environment.notifyMetrics;
+ public notifyMetricsRows$: Observable
+
+ private metricsConfig = environment.notifyMetrics;
private singleResultOptions = Object.assign(new PaginationComponentOptions(), {
id: 'single-result-options',
pageSize: 1
@@ -22,14 +35,56 @@ export class AdminNotifyDashboardComponent implements OnInit{
constructor(private searchService: SearchService) {}
ngOnInit() {
- const discoveryConfigurations = this.metricsConfig
+ const mertricsRowsConfigurations = this.metricsConfig
.map(row => row.boxes)
.map(boxes => boxes.map(box => box.config).filter(config => !!config));
- const mergedConfigurations = discoveryConfigurations[0].concat(discoveryConfigurations[1]);
- const searchConfigurations = mergedConfigurations
+ const flatConfigurations = [].concat(...mertricsRowsConfigurations.map((config) => config));
+ const searchConfigurations = flatConfigurations
.map(config => Object.assign(new PaginatedSearchOptions({}),
{ 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) : 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)
+ }
+ })
}
}
diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts
new file mode 100644
index 0000000000..254151ce76
--- /dev/null
+++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts
@@ -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 {
+}
diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts
new file mode 100644
index 0000000000..440c084d0f
--- /dev/null
+++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts
@@ -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;
+ }
+}
diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts
new file mode 100644
index 0000000000..f8d7c4d1f6
--- /dev/null
+++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts
@@ -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');
diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts
index eef4f1f68e..728419c574 100644
--- a/src/app/core/core.module.ts
+++ b/src/app/core/core.module.ts
@@ -197,6 +197,7 @@ import {
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 { 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,
SubmissionCoarNotifyConfig,
NotifyRequestsStatus,
+ AdminNotifyMessage
];
@NgModule({