Skip to content

Commit 50026ed

Browse files
author
Andrea Barbasso
committed
Merged dspace-cris-2023_02_x into task/dspace-cris-2023_02_x/DSC-1575
2 parents 18c2834 + f3f7983 commit 50026ed

45 files changed

Lines changed: 595 additions & 281 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/app/core/core.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ import { EditItemMode } from './submission/models/edititem-mode.model';
162162
import { AuditDataService } from './audit/audit-data.service';
163163
import { Audit } from './audit/model/audit.model';
164164
import { ItemExportFormat } from './itemexportformat/model/item-export-format.model';
165-
import { MetricsComponentsDataService } from './layout/metrics-components-data.service';
165+
import { MetricsComponentsService } from './layout/metrics-components.service';
166166
import { MetricsComponent } from './layout/models/metrics-component.model';
167167
import { Metric } from './shared/metric.model';
168168
import { MetricsDataService } from './data/metrics-data.service';
@@ -354,7 +354,7 @@ const PROVIDERS = [
354354
FilteredDiscoveryPageResponseParsingService,
355355
{ provide: NativeWindowService, useFactory: NativeWindowFactory },
356356
TabDataService,
357-
MetricsComponentsDataService,
357+
MetricsComponentsService,
358358
MetricsDataService,
359359
VocabularyService,
360360
VocabularyDataService,

src/app/core/layout/metrics-components-data.service.spec.ts renamed to src/app/core/layout/metrics-components.service.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Metric } from '../shared/metric.model';
2-
import { MetricsComponentsDataService } from './metrics-components-data.service';
2+
import { MetricsComponentsService } from './metrics-components.service';
33

4-
describe('MetricsComponentsDataService', () => {
4+
describe('MetricsComponentsService', () => {
55

6-
let service: MetricsComponentsDataService;
6+
let service: MetricsComponentsService;
77

88
beforeEach(() => {
9-
service = new MetricsComponentsDataService();
9+
service = new MetricsComponentsService();
1010

1111
});
1212

@@ -44,8 +44,8 @@ describe('MetricsComponentsDataService', () => {
4444

4545
expect(result.length).toBe(1);
4646
expect(result[0].metrics.length).toBe(2);
47-
expect(result[0].metrics[0].metricType).toBe('views');
48-
expect(result[0].metrics[1].metricType).toBe('downloads');
47+
expect(result[0].metrics[0].metricType).toBe('downloads');
48+
expect(result[0].metrics[1].metricType).toBe('views');
4949

5050
});
5151

src/app/core/layout/metrics-components-data.service.ts renamed to src/app/core/layout/metrics-components.service.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { CrisLayoutMetricRow } from './models/tab.model';
44
/**
55
* A service responsible for managing metrics objects
66
*/
7-
export class MetricsComponentsDataService {
7+
export class MetricsComponentsService {
88

99
/**
1010
* Get matching metrics for item.
@@ -20,17 +20,13 @@ export class MetricsComponentsDataService {
2020

2121
computeMetricsRows(itemMetrics: Metric[], maxColumn, metricTypes: string[]): CrisLayoutMetricRow[] {
2222

23-
// support
24-
const typeMap = {};
25-
metricTypes.forEach((type) => typeMap[type] = type);
26-
2723
// filter, enrich, order
28-
const metrics = itemMetrics
29-
.filter((metric) => typeMap[metric.metricType])
30-
.map((metric) => {
31-
return { ...metric, position: typeMap[metric.metricType].position };
24+
const metrics: Metric[] = itemMetrics
25+
.filter((metric: Metric) => metricTypes.includes(metric.metricType))
26+
.map((metric: Metric) => {
27+
return { ...metric, position: metricTypes.indexOf(metric.metricType) };
3228
})
33-
.sort((metric) => metric.position);
29+
.sort((metricA, metricB ) => metricA.position - metricB.position);
3430

3531
// chunker
3632
const totalRow = Math.ceil(metrics.length / maxColumn);
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { DOCUMENT } from '@angular/common';
2+
import {
3+
Inject,
4+
Injectable,
5+
} from '@angular/core';
6+
import { Observable, ReplaySubject, Subject } from 'rxjs';
7+
import { environment } from 'src/environments/environment';
8+
import {
9+
NativeWindowRef,
10+
NativeWindowService,
11+
} from '../services/window.service';import { MathJaxConfig, MathService } from './math.service';
12+
13+
@Injectable({
14+
providedIn: 'root'
15+
})
16+
/**
17+
* Provide the MathService for CSR
18+
*/
19+
export class ClientMathService extends MathService {
20+
21+
protected isReady$: Subject<boolean>;
22+
23+
protected mathJaxOptions = {
24+
tex: {
25+
inlineMath: [['$', '$'], ['\\(', '\\)']]
26+
},
27+
svg: {
28+
fontCache: 'global'
29+
},
30+
startup: {
31+
typeset: false
32+
}
33+
};
34+
35+
protected mathJax: MathJaxConfig = {
36+
source: 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js',
37+
id: 'MathJaxScript'
38+
};
39+
protected mathJaxFallback: MathJaxConfig = {
40+
source: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-chtml.min.js',
41+
id: 'MathJaxBackupScript'
42+
};
43+
44+
constructor(
45+
@Inject(DOCUMENT) private _document: Document,
46+
@Inject(NativeWindowService) protected _window: NativeWindowRef,
47+
) {
48+
super();
49+
50+
this.isReady$ = new ReplaySubject<boolean>();
51+
52+
void this.registerMathJaxAsync(this.mathJax)
53+
.then(() => this.isReady$.next(true))
54+
.catch(_ => {
55+
void this.registerMathJaxAsync(this.mathJaxFallback)
56+
.then(() => this.isReady$.next(true));
57+
});
58+
}
59+
60+
/**
61+
* Register the specified MathJax script in the document
62+
*
63+
* @param config The configuration object for the script
64+
*/
65+
protected async registerMathJaxAsync(config: MathJaxConfig): Promise<any> {
66+
if (environment.markdown.mathjax) {
67+
return new Promise<void>((resolve, reject) => {
68+
69+
const optionsScript: HTMLScriptElement = this._document.createElement('script');
70+
optionsScript.type = 'text/javascript';
71+
optionsScript.text = `MathJax = ${JSON.stringify(this.mathJaxOptions)};`;
72+
this._document.head.appendChild(optionsScript);
73+
74+
const script: HTMLScriptElement = this._document.createElement('script');
75+
script.id = config.id;
76+
script.type = 'text/javascript';
77+
script.src = config.source;
78+
script.crossOrigin = 'anonymous';
79+
script.async = true;
80+
script.onload = () => resolve();
81+
script.onerror = error => reject(error);
82+
this._document.head.appendChild(script);
83+
});
84+
}
85+
return Promise.resolve();
86+
}
87+
88+
/**
89+
* Return the status of the script registration
90+
*/
91+
ready(): Observable<boolean> {
92+
return this.isReady$;
93+
}
94+
95+
/**
96+
* Render the specified element using the MathJax JavaScript
97+
*
98+
* @param element The element to render with MathJax
99+
*/
100+
render(element: HTMLElement) {
101+
if (environment.markdown.mathjax) {
102+
this._window.nativeWindow.MathJax.typesetPromise([element]);
103+
}
104+
}
105+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { TestBed } from '@angular/core/testing';
2+
import { Observable, of } from 'rxjs';
3+
import { MathService, MathJaxConfig } from './math.service';
4+
5+
export class MockMathService extends MathService {
6+
protected mathJaxOptions: any = {};
7+
protected mathJax: MathJaxConfig = { source: '', id: '' };
8+
protected mathJaxFallback: MathJaxConfig = { source: '', id: '' };
9+
10+
protected registerMathJaxAsync(config: MathJaxConfig): Promise<any> {
11+
return Promise.resolve();
12+
}
13+
14+
ready(): Observable<boolean> {
15+
return of(true);
16+
}
17+
18+
render(element: HTMLElement): void {
19+
return;
20+
}
21+
}
22+
23+
describe('MathService', () => {
24+
let service: MockMathService;
25+
26+
beforeEach(() => {
27+
TestBed.configureTestingModule({});
28+
service = new MockMathService();
29+
spyOn(service, 'render');
30+
});
31+
32+
it('should be created', () => {
33+
expect(service).toBeTruthy();
34+
});
35+
36+
it('should be ready', (done) => {
37+
service.ready().subscribe(isReady => {
38+
expect(isReady).toBe(true);
39+
done();
40+
});
41+
});
42+
43+
it('should render', () => {
44+
service.render(document.createElement('div'));
45+
expect(service.render).toHaveBeenCalled();
46+
});
47+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Observable } from 'rxjs';
2+
3+
export interface MathJaxConfig {
4+
source: string;
5+
id: string;
6+
}
7+
8+
/**
9+
* This service is used to provide the MathJax library with the ability to render markdown code
10+
*/
11+
export abstract class MathService {
12+
protected abstract mathJaxOptions: any;
13+
protected abstract mathJax: MathJaxConfig;
14+
protected abstract mathJaxFallback: MathJaxConfig;
15+
16+
protected abstract registerMathJaxAsync(config: MathJaxConfig): Promise<any>;
17+
abstract ready(): Observable<boolean>;
18+
abstract render(element: HTMLElement): void;
19+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Injectable } from '@angular/core';
2+
import { Observable, ReplaySubject, Subject } from 'rxjs';
3+
import { MathJaxConfig, MathService } from './math.service';
4+
5+
@Injectable({
6+
providedIn: 'root'
7+
})
8+
/**
9+
* Provide the MathService for SSR
10+
*/
11+
export class ServerMathService extends MathService {
12+
13+
protected signal: Subject<boolean>;
14+
15+
protected mathJaxOptions = {};
16+
17+
protected mathJax: MathJaxConfig = {
18+
source: '',
19+
id: ''
20+
};
21+
protected mathJaxFallback: MathJaxConfig = {
22+
source: '',
23+
id: ''
24+
};
25+
26+
constructor() {
27+
super();
28+
29+
this.signal = new ReplaySubject<boolean>();
30+
this.signal.next(true);
31+
}
32+
33+
protected async registerMathJaxAsync(config: MathJaxConfig): Promise<any> {
34+
return Promise.resolve();
35+
}
36+
37+
ready(): Observable<boolean> {
38+
return this.signal;
39+
}
40+
41+
render(element: HTMLElement) {
42+
return;
43+
}
44+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable max-classes-per-file */
2-
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
33

44
import { Observable, of } from 'rxjs';
55
import { RemoteData } from '../../../../../core/data/remote-data';
@@ -16,7 +16,7 @@ import { SharedModule } from '../../../../../shared/shared.module';
1616
import { CrisLayoutMetricsBoxComponent } from './cris-layout-metrics-box.component';
1717
import { metricsComponent } from '../../../../../shared/testing/metrics-components.mock';
1818
import { MetricsComponent } from '../../../../../core/layout/models/metrics-component.model';
19-
import { MetricsComponentsDataService } from '../../../../../core/layout/metrics-components-data.service';
19+
import { MetricsComponentsService } from '../../../../../core/layout/metrics-components.service';
2020
import { Metric } from '../../../../../core/shared/metric.model';
2121
import { ItemDataService } from '../../../../../core/data/item-data.service';
2222
import { CrisLayoutMetricRow } from '../../../../../core/layout/models/tab.model';
@@ -78,7 +78,7 @@ describe('CrisLayoutMetricsBoxComponent', () => {
7878
let component: CrisLayoutMetricsBoxComponent;
7979
let fixture: ComponentFixture<CrisLayoutMetricsBoxComponent>;
8080

81-
beforeEach(async(() => {
81+
beforeEach(waitForAsync(() => {
8282

8383
itemDataService = jasmine.createSpyObj('ItemDataService', {
8484
getMetrics: jasmine.createSpy('getMetrics')
@@ -94,7 +94,7 @@ describe('CrisLayoutMetricsBoxComponent', () => {
9494
BrowserAnimationsModule,
9595
SharedModule],
9696
providers: [
97-
{ provide: MetricsComponentsDataService, useClass: MetricsComponentsDataServiceMock },
97+
{ provide: MetricsComponentsService, useClass: MetricsComponentsDataServiceMock },
9898
{ provide: ItemDataService, useValue: itemDataService },
9999
{ provide: 'boxProvider', useClass: boxMetrics },
100100
{ provide: 'itemProvider', useClass: { metrics: [metric1Mock, metric2Mock] } },

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { RenderCrisLayoutBoxFor } from '../../../../decorators/cris-layout-box.d
88
import { LayoutBox } from '../../../../enums/layout-box.enum';
99
import { getFirstSucceededRemoteDataPayload } from '../../../../../core/shared/operators';
1010
import { hasValue } from '../../../../../shared/empty.util';
11-
import { MetricsComponentsDataService } from '../../../../../core/layout/metrics-components-data.service';
11+
import { MetricsComponentsService } from '../../../../../core/layout/metrics-components.service';
1212
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';
@@ -51,7 +51,7 @@ export class CrisLayoutMetricsBoxComponent extends CrisLayoutBoxModelComponent i
5151
subs: Subscription[] = [];
5252

5353
constructor(
54-
protected metricsComponentService: MetricsComponentsDataService,
54+
protected metricsComponentService: MetricsComponentsService,
5555
protected itemService: ItemDataService,
5656
protected translateService: TranslateService,
5757
@Inject('boxProvider') public boxProvider: CrisLayoutBox,

src/app/item-page/field-components/metadata-values/metadata-values.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<!-- Render value as markdown -->
1414
<ng-template #markdown let-value="value">
15-
<span class="dont-break-out" [innerHTML]="value | dsMarkdown | async">
15+
<span class="dont-break-out" [dsMarkdown]="value">
1616
</span>
1717
</ng-template>
1818

0 commit comments

Comments
 (0)