Skip to content

Commit da21a22

Browse files
committed
Merged in dspacecris-7-DSC-1053 (pull request DSpace#595)
Improve performance Approved-by: Andrea Barbasso Approved-by: Davide Negretti
2 parents f0c3921 + 7cb7a4b commit da21a22

8 files changed

Lines changed: 123 additions & 81 deletions

File tree

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metadata/cris-layout-metadata-box.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class CrisLayoutMetadataBoxComponent extends CrisLayoutBoxModelComponent
3636
subs: Subscription[] = [];
3737

3838
constructor(
39-
public cd: ChangeDetectorRef,
39+
public cdr: ChangeDetectorRef,
4040
protected translateService: TranslateService,
4141
@Inject('boxProvider') public boxProvider: CrisLayoutBox,
4242
@Inject('itemProvider') public itemProvider: Item
@@ -55,6 +55,7 @@ export class CrisLayoutMetadataBoxComponent extends CrisLayoutBoxModelComponent
5555
*/
5656
setMetadataComponents(metadatacomponents: MetadataBoxConfiguration) {
5757
this.metadataBoxConfiguration = metadatacomponents;
58+
this.cdr.detectChanges();
5859
}
5960

6061
/**

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metrics/cris-layout-metrics-box.component.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, Inject, OnDestroy, OnInit } from '@angular/core';
1+
import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core';
22

33
import { BehaviorSubject, Subscription } from 'rxjs';
44
import { TranslateService } from '@ngx-translate/core';
@@ -13,6 +13,7 @@ import { ItemDataService } from '../../../../../core/data/item-data.service';
1313
import { CrisLayoutBox, MetricsBoxConfiguration, } from '../../../../../core/layout/models/box.model';
1414
import { Item } from '../../../../../core/shared/item.model';
1515
import { CrisLayoutMetricRow } from '../../../../../core/layout/models/tab.model';
16+
import { isPlatformBrowser } from '@angular/common';
1617

1718
/**
1819
* This component renders the metadata boxes of items
@@ -54,25 +55,28 @@ export class CrisLayoutMetricsBoxComponent extends CrisLayoutBoxModelComponent i
5455
protected itemService: ItemDataService,
5556
protected translateService: TranslateService,
5657
@Inject('boxProvider') public boxProvider: CrisLayoutBox,
57-
@Inject('itemProvider') public itemProvider: Item
58+
@Inject('itemProvider') public itemProvider: Item,
59+
@Inject(PLATFORM_ID) protected platformId: Object
5860
) {
5961
super(translateService, boxProvider, itemProvider);
6062
}
6163

6264
ngOnInit() {
6365
super.ngOnInit();
6466

65-
this.metricsBoxConfiguration = this.box.configuration as MetricsBoxConfiguration;
66-
this.subs.push(
67-
this.itemService.getMetrics(this.item.uuid).pipe(getFirstSucceededRemoteDataPayload())
68-
.subscribe((result) => {
69-
const matchingMetrics = this.metricsComponentService.getMatchingMetrics(
70-
result.page,
71-
this.metricsBoxConfiguration.maxColumns,
72-
this.metricsBoxConfiguration.metrics
73-
);
74-
this.metricRows.next(matchingMetrics);
75-
}));
67+
if (isPlatformBrowser(this.platformId)) {
68+
this.metricsBoxConfiguration = this.box.configuration as MetricsBoxConfiguration;
69+
this.subs.push(
70+
this.itemService.getMetrics(this.item.uuid).pipe(getFirstSucceededRemoteDataPayload())
71+
.subscribe((result) => {
72+
const matchingMetrics = this.metricsComponentService.getMatchingMetrics(
73+
result.page,
74+
this.metricsBoxConfiguration.maxColumns,
75+
this.metricsBoxConfiguration.metrics
76+
);
77+
this.metricRows.next(matchingMetrics);
78+
}));
79+
}
7680
}
7781

7882
/**

src/app/shared/object-list/metric-donuts/metric-donuts.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="flex-row d-flex ml-4">
2-
<ng-container *ngFor="let metric of donuts() | async; trackBy: identify">
2+
<ng-container *ngFor="let metric of (metrics$ | async); trackBy: identify">
33
<ds-metric-loader
44
class="d-inline-block d-flex flex-col mr-1"
55
[metric]="metric"

src/app/shared/object-list/metric-donuts/metric-donuts.component.ts

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
1-
import { ChangeDetectionStrategy, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
2-
import { Observable, of } from 'rxjs';
1+
import { isPlatformBrowser } from '@angular/common';
2+
import {
3+
ChangeDetectionStrategy,
4+
Component,
5+
Inject,
6+
Input,
7+
OnInit,
8+
PLATFORM_ID,
9+
ViewEncapsulation
10+
} from '@angular/core';
11+
12+
import { BehaviorSubject, Observable, of } from 'rxjs';
13+
314
import { Metric } from '../../../core/shared/metric.model';
4-
import { hasValue } from '../../empty.util';
5-
import { getFirstSucceededRemoteListPayload } from '../../../core/shared/operators';
15+
import { isEmpty } from '../../empty.util';
16+
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
617
import { map } from 'rxjs/operators';
718
import { Item } from '../../../core/shared/item.model';
819
import { LinkService } from '../../../core/cache/builders/link.service';
920
import { followLink } from '../../utils/follow-link-config.model';
21+
import { RemoteData } from '../../../core/data/remote-data';
22+
import { PaginatedList } from '../../../core/data/paginated-list.model';
1023

1124
export const allowedDonuts = ['altmetric', 'dimensions', 'plumX'];
1225

@@ -21,27 +34,45 @@ export const allowedDonuts = ['altmetric', 'dimensions', 'plumX'];
2134
*/
2235
export class MetricDonutsComponent implements OnInit {
2336

37+
/**
38+
* The item object for which to show the metrics donuts
39+
*/
2440
@Input() item: Item;
2541

26-
constructor(private linkService: LinkService) {
42+
/**
43+
* The list of metric donuts to load
44+
*/
45+
metrics$: BehaviorSubject<Metric[]> = new BehaviorSubject<Metric[]>([]);
46+
47+
constructor(private linkService: LinkService, @Inject(PLATFORM_ID) protected platformId: Object) {
2748
}
2849

2950
ngOnInit() {
3051
this.linkService.resolveLink(this.item, followLink('metrics'));
52+
if (isPlatformBrowser(this.platformId)) {
53+
this.retrieveMetrics().subscribe((metrics: Metric[]) => {
54+
this.metrics$.next(metrics);
55+
})
56+
}
3157
}
3258

3359
/**
34-
* Filter metrics with a positive metricCount value.
60+
* Retrieve metrics from item object.
3561
*/
36-
donuts(): Observable<Metric[]> {
37-
if (!hasValue(this.item.metrics)) {
62+
private retrieveMetrics(): Observable<Metric[]> {
63+
if (isEmpty(this.item.metrics)) {
3864
return of([]);
65+
} else {
66+
return this.item.metrics.pipe(
67+
getFirstCompletedRemoteData(),
68+
map((metricsRD: RemoteData<PaginatedList<Metric>>) => {
69+
if (metricsRD.hasSucceeded) {
70+
return metricsRD.payload.page.filter(metric => allowedDonuts.includes(metric.metricType));
71+
} else {
72+
return [];
73+
}
74+
}));
3975
}
40-
return this.item.metrics.pipe(
41-
getFirstSucceededRemoteListPayload(),
42-
map((metrics: Metric[]) => {
43-
return metrics.filter(metric => allowedDonuts.includes(metric.metricType));
44-
}));
4576
}
4677

4778
identify(index, item) {

src/app/shared/search/search-charts/search-charts.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div *ngIf="(filters | async)?.hasSucceeded && (filters | async)?.payload?.length > 0" class="container">
1+
<div *ngIf="isPlatformBrowser && (filters | async)?.hasSucceeded && (filters | async)?.payload?.length > 0" class="container">
22
<div class="row">
33
<div class="col-md-12 mb-40">
44
<div class="d-flex align-items-center mb-2">

src/app/shared/search/search-charts/search-charts.component.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import { getRemoteDataPayload } from './../../../core/shared/operators';
2-
import { SEARCH_CONFIG_SERVICE } from './../../../my-dspace-page/my-dspace-page.component';
3-
import { SearchConfigurationService } from './../../../core/shared/search/search-configuration.service';
4-
import { SearchService } from './../../../core/shared/search/search.service';
5-
import { Component, Inject, Input, OnInit } from '@angular/core';
1+
import { isPlatformBrowser } from '@angular/common';
2+
import { ChangeDetectorRef, Component, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';
63

74
import { BehaviorSubject, Observable, of } from 'rxjs';
8-
import { filter, map, switchMap, take, tap, mergeMap } from 'rxjs/operators';
5+
import { filter, map, mergeMap, switchMap, take, tap } from 'rxjs/operators';
6+
97
import { RemoteData } from '../../../core/data/remote-data';
108
import { SearchFilterConfig } from '../models/search-filter-config.model';
119
import { shrinkInOut } from '../../animations/shrink';
1210
import { hasValue, isNotEmpty } from '../../empty.util';
11+
import { getRemoteDataPayload } from '../../../core/shared/operators';
12+
import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component';
13+
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
14+
import { SearchService } from '../../../core/shared/search/search.service';
1315

1416
@Component({
1517
selector: 'ds-search-charts',
@@ -57,25 +59,37 @@ export class SearchChartsComponent implements OnInit {
5759
*/
5860
selectedFilter: SearchFilterConfig;
5961

62+
/**
63+
* Whether a platform id represents a browser platform.
64+
*/
65+
isPlatformBrowser: boolean;
6066

61-
constructor(private searchService: SearchService,
67+
constructor(
68+
private cdr: ChangeDetectorRef,
69+
private searchService: SearchService,
70+
@Inject(PLATFORM_ID) protected platformId: Object,
6271
@Inject(SEARCH_CONFIG_SERVICE) private searchConfigService: SearchConfigurationService) {
6372
}
6473

6574
ngOnInit(): void {
66-
this.filters.pipe(
67-
filter((rd: RemoteData<SearchFilterConfig[]>) => isNotEmpty(rd)),
68-
take(1),
69-
mergeMap((rd: RemoteData<SearchFilterConfig[]>) => {
70-
return this.hasFacetValues(rd.payload[0]).pipe(
71-
tap((hasValues) => {
72-
this.selectedFilter = this.selectedFilter
73-
? this.selectedFilter
74-
: rd.hasSucceeded && hasValues ? rd.payload[0] : null;
75-
})
76-
);
77-
}),
78-
).subscribe();
75+
this.isPlatformBrowser = isPlatformBrowser(this.platformId);
76+
77+
if (isPlatformBrowser(this.platformId)) {
78+
this.filters.pipe(
79+
filter((rd: RemoteData<SearchFilterConfig[]>) => isNotEmpty(rd)),
80+
take(1),
81+
mergeMap((rd: RemoteData<SearchFilterConfig[]>) => {
82+
return this.hasFacetValues(rd.payload[0]).pipe(
83+
tap((hasValues) => {
84+
this.selectedFilter = this.selectedFilter
85+
? this.selectedFilter
86+
: rd.hasSucceeded && hasValues ? rd.payload[0] : null;
87+
this.cdr.detectChanges();
88+
})
89+
);
90+
}),
91+
).subscribe();
92+
}
7993
}
8094

8195
/**

src/app/social/social.component.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import {
2-
Component,
3-
Inject, OnDestroy,
4-
OnInit,
5-
} from '@angular/core';
6-
import { DOCUMENT } from '@angular/common';
1+
import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID, } from '@angular/core';
2+
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
73
import { ActivatedRoute } from '@angular/router';
84
import { SocialService } from './social.service';
95

@@ -13,7 +9,7 @@ import { SocialService } from './social.service';
139
styleUrls: ['./social.component.scss']
1410
})
1511
/**
16-
* Component to render dinamically the social2 buttons using addThis plugin
12+
* Component to render dynamically the social2 buttons using addThis plugin
1713
*/
1814
export class SocialComponent implements OnInit, OnDestroy {
1915

@@ -25,19 +21,22 @@ export class SocialComponent implements OnInit, OnDestroy {
2521
subscription;
2622

2723
constructor(@Inject(DOCUMENT) private _document: Document,
24+
@Inject(PLATFORM_ID) protected platformId: Object,
2825
private socialService: SocialService,
2926
private activatedRoute: ActivatedRoute,
3027
) {
3128
}
3229

3330
ngOnInit() {
34-
this.subscription = this.socialService.showSocialButtons(this.activatedRoute).subscribe((show) => {
35-
if (show) {
36-
this.showSocialButtons();
37-
} else {
38-
this.hideSocialButtons();
39-
}
40-
});
31+
if (isPlatformBrowser(this.platformId)) {
32+
this.subscription = this.socialService.showSocialButtons(this.activatedRoute).subscribe((show) => {
33+
if (show) {
34+
this.showSocialButtons();
35+
} else {
36+
this.hideSocialButtons();
37+
}
38+
});
39+
}
4140
}
4241

4342
showSocialButtons() {

src/app/social/social.service.ts

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { Injectable } from '@angular/core';
2+
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
3+
4+
import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs';
5+
import { distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';
6+
27
import { environment } from '../../environments/environment';
38
import { CookieService } from '../core/services/cookie.service';
4-
import { distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';
5-
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
69
import { AuthService } from '../core/auth/auth.service';
7-
import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs';
810

911
export const APP_THIS_ID_SELECTOR = '#at4-share';
1012

@@ -29,30 +31,29 @@ export class SocialService {
2931
}
3032

3133
initializeAddThisScript(_document: Document): any {
32-
// console.log('Initializing the addThisCookie script');
34+
// Initializing the addThisCookie script
3335
const script = _document.createElement('script');
3436
script.type = 'text/javascript';
3537
script.src = environment.addThisPlugin.scriptUrl + environment.addThisPlugin.siteId;
3638
_document.body.appendChild(script);
3739
}
3840

3941
hide(_document: Document) {
40-
// console.log('Hiding social buttons');
42+
// Hiding social buttons
4143
const socialButtons: HTMLElement = _document.querySelector(APP_THIS_ID_SELECTOR);
4244
if (socialButtons) {
43-
// console.log('HTML Element found, setting display to none');
45+
// HTML Element found, setting display to none
4446
socialButtons.style.display = 'none';
4547
}
4648
}
4749

4850
show(_document: Document) {
49-
// console.log('Showing social buttons');
51+
// Showing social buttons
5052
const socialButtons: HTMLElement = _document.querySelector(APP_THIS_ID_SELECTOR);
5153
if (socialButtons) {
52-
// console.log('HTML Element found, setting display to block');
54+
// HTML Element found, setting display to block
5355
socialButtons.style.display = 'block';
5456
}
55-
// console.error('No HTML Elements to show');
5657
}
5758

5859
protected initialize(activatedRoute: ActivatedRoute) {
@@ -89,7 +90,6 @@ export class SocialService {
8990

9091
// Listen to every cookies / user state changes and evaluate sharing state
9192
combineLatest([cookies$, userUUId$]).subscribe(([cookieMap, userUUID]) => {
92-
// console.log('COOKIE/USER change detected. Evaluating.', cookieMap, userUUID);
9393
this.evaluateShowHide(cookieMap, userUUID);
9494
});
9595

@@ -119,17 +119,10 @@ export class SocialService {
119119
}
120120

121121
protected isAddThisCookieEnabled(cookieMap, userUUID) {
122-
// console.log(cookieMap, userUUID);
123-
// if (userUUID) {
124-
// console.log('The user is authenticated, checking klaro-' + userUUID);
125-
// } else {
126-
// console.log('The user is not authenticated, checking klaro-anonymous');
127-
// }
128122
const cookie = userUUID ? this.cookie.get('klaro-' + userUUID) : this.cookie.get('klaro-anonymous');
129123
const addThisCookie = cookie ? cookie['add-this'] : false;
130-
// console.log('AddThisCookie is ' + addThisCookie);
124+
131125
return addThisCookie;
132126
}
133127

134-
135128
}

0 commit comments

Comments
 (0)