Skip to content

Commit 97ce799

Browse files
author
Andrea Barbasso
committed
Merged dspace-cris-2023_02_x into DSC-1590
2 parents 761c84a + f835e19 commit 97ce799

100 files changed

Lines changed: 953 additions & 393 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/json-patch/builder/json-patch-operations-builder.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { VocabularyEntry } from '../../submission/vocabularies/models/vocabulary
1313
import { FormFieldMetadataValueObject } from '../../../shared/form/builder/models/form-field-metadata-value.model';
1414
import { FormFieldLanguageValueObject } from '../../../shared/form/builder/models/form-field-language-value.model';
1515
import { CoreState } from '../../core-state.model';
16+
import { Metadata } from '../../shared/metadata.utils';
17+
import { ConfidenceType } from '../../shared/confidence-type';
1618

1719
/**
1820
* Provides methods to dispatch JsonPatch Operations Actions
@@ -148,6 +150,11 @@ export class JsonPatchOperationsBuilder {
148150
} else {
149151
operationValue = value;
150152
}
153+
//Update confidence if was added once the field was already created, value is set only in constructor of FormFieldMetadataValueObject
154+
if (Metadata.hasValidAuthority(operationValue.authority) && (isEmpty(operationValue.confidence) || operationValue.confidence === -1)) {
155+
operationValue.confidence = ConfidenceType.CF_ACCEPTED;
156+
}
157+
151158
} else if (value instanceof Date) {
152159
if (securityLevel != null) {
153160
operationValue = new FormFieldMetadataValueObject(dateToISOFormat(value), null, securityLevel);

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/metadata/rendering-types/advanced-attachment/advanced-attachment.component.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ describe('AdvancedAttachmentComponent', () => {
152152
{ provide: 'fieldProvider', useValue: mockField },
153153
{ provide: 'itemProvider', useValue: testItem },
154154
{ provide: 'renderingSubTypeProvider', useValue: '' },
155+
{ provide: 'tabNameProvider', useValue: '' },
155156
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
156157
{ provide: AuthorizationDataService, useValue: mockAuthorizedService },
157158
],

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metadata/rendering-types/advanced-attachment/advanced-attachment.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ export class AdvancedAttachmentComponent extends AttachmentComponent implements
4141
@Inject('fieldProvider') public fieldProvider: LayoutField,
4242
@Inject('itemProvider') public itemProvider: Item,
4343
@Inject('renderingSubTypeProvider') public renderingSubTypeProvider: string,
44+
@Inject('tabNameProvider') public tabNameProvider: string,
4445
protected bitstreamDataService: BitstreamDataService,
4546
protected translateService: TranslateService
4647
) {
47-
super(fieldProvider, itemProvider, renderingSubTypeProvider, bitstreamDataService, translateService);
48+
super(fieldProvider, itemProvider, renderingSubTypeProvider, tabNameProvider, bitstreamDataService, translateService);
4849
}
4950

5051
getBitstreamsByItem(options?: FindListOptions): Observable<PaginatedList<Bitstream>> {

0 commit comments

Comments
 (0)