Skip to content

Commit fb9ed87

Browse files
committed
Merge remote-tracking branch 'atmire/w2p-93963-Add_support_for_line_breaks_markdown_and_mathjax_in_metadata' into w2p-94060_Issue-1720_MyDSpace-support-entities
2 parents 7a52b69 + 3b65388 commit fb9ed87

25 files changed

Lines changed: 661 additions & 45 deletions

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@
104104
"jwt-decode": "^3.1.2",
105105
"klaro": "^0.7.10",
106106
"lodash": "^4.17.21",
107+
"markdown-it": "^13.0.1",
108+
"markdown-it-mathjax3": "^4.3.1",
107109
"mirador": "^3.3.0",
108110
"mirador-dl-plugin": "^0.13.0",
109111
"mirador-share-plugin": "^0.11.0",
@@ -116,20 +118,21 @@
116118
"ngx-moment": "^5.0.0",
117119
"ngx-pagination": "5.0.0",
118120
"ngx-sortablejs": "^11.1.0",
121+
"ngx-ui-switch": "^11.0.1",
119122
"nouislider": "^14.6.3",
120123
"pem": "1.14.4",
121124
"postcss-cli": "^9.1.0",
122125
"prop-types": "^15.7.2",
123126
"react-copy-to-clipboard": "^5.0.1",
124127
"reflect-metadata": "^0.1.13",
125128
"rxjs": "^7.5.5",
129+
"sanitize-html": "^2.7.2",
126130
"sortablejs": "1.13.0",
127131
"tslib": "^2.0.0",
128132
"url-parse": "^1.5.6",
129133
"uuid": "^8.3.2",
130134
"webfontloader": "1.6.28",
131-
"zone.js": "~0.11.5",
132-
"ngx-ui-switch": "^11.0.1"
135+
"zone.js": "~0.11.5"
133136
},
134137
"devDependencies": {
135138
"@angular-builders/custom-webpack": "~13.1.0",
@@ -155,6 +158,7 @@
155158
"@types/js-cookie": "2.2.6",
156159
"@types/lodash": "^4.14.165",
157160
"@types/node": "^14.14.9",
161+
"@types/sanitize-html": "^2.6.2",
158162
"@typescript-eslint/eslint-plugin": "5.11.0",
159163
"@typescript-eslint/parser": "5.11.0",
160164
"axe-core": "^4.3.3",

src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<td class="w-100">
2727
<div class="value-field">
2828
<div *ngIf="!(editable | async)">
29-
<span class="dont-break-out">{{metadata?.value}}</span>
29+
<span class="dont-break-out preserve-line-breaks">{{metadata?.value}}</span>
3030
</div>
3131
<div *ngIf="(editable | async)" class="field-container">
3232
<textarea class="form-control" type="textarea" attr.aria-labelledby="fieldValue" [(ngModel)]="metadata.value" [dsDebounce]

src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { By } from '@angular/platform-browser';
66
import { MetadataUriValuesComponent } from './metadata-uri-values.component';
77
import { isNotEmpty } from '../../../shared/empty.util';
88
import { MetadataValue } from '../../../core/shared/metadata.models';
9+
import { APP_CONFIG } from '../../../../config/app-config.interface';
10+
import { environment } from '../../../../environments/environment';
911

1012
let comp: MetadataUriValuesComponent;
1113
let fixture: ComponentFixture<MetadataUriValuesComponent>;
@@ -33,6 +35,9 @@ describe('MetadataUriValuesComponent', () => {
3335
useClass: TranslateLoaderMock
3436
}
3537
})],
38+
providers: [
39+
{ provide: APP_CONFIG, useValue: environment },
40+
],
3641
declarations: [MetadataUriValuesComponent],
3742
schemas: [NO_ERRORS_SCHEMA]
3843
}).overrideComponent(MetadataUriValuesComponent, {
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
<ds-metadata-field-wrapper [label]="label | translate">
2-
<span class="dont-break-out" *ngFor="let mdValue of mdValues; let last=last;">
3-
{{mdValue.value}}<span *ngIf="!last" [innerHTML]="separator"></span>
4-
</span>
2+
<ng-container *ngFor="let mdValue of mdValues; let last=last;">
3+
<ng-container *ngTemplateOutlet="(renderMarkdown ? markdown : simple); context: {value: mdValue.value, classes: 'dont-break-out preserve-line-breaks'}">
4+
</ng-container>
5+
<span class="separator" *ngIf="!last" [innerHTML]="separator"></span>
6+
</ng-container>
57
</ds-metadata-field-wrapper>
8+
9+
<ng-template #markdown let-value="value" let-classes="classes">
10+
<span class="{{classes}}" [innerHTML]="value | dsMarkdown | async">
11+
</span>
12+
</ng-template>
13+
14+
<ng-template #simple let-value="value" let-classes="classes">
15+
<span class="{{classes}}">
16+
{{value}}
17+
</span>
18+
</ng-template>

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { TranslateLoaderMock } from '../../../shared/mocks/translate-loader.mock
55
import { MetadataValuesComponent } from './metadata-values.component';
66
import { By } from '@angular/platform-browser';
77
import { MetadataValue } from '../../../core/shared/metadata.models';
8+
import { APP_CONFIG } from '../../../../config/app-config.interface';
9+
import { environment } from '../../../../environments/environment';
810

911
let comp: MetadataValuesComponent;
1012
let fixture: ComponentFixture<MetadataValuesComponent>;
@@ -32,8 +34,11 @@ describe('MetadataValuesComponent', () => {
3234
loader: {
3335
provide: TranslateLoader,
3436
useClass: TranslateLoaderMock
35-
}
37+
},
3638
})],
39+
providers: [
40+
{ provide: APP_CONFIG, useValue: environment },
41+
],
3742
declarations: [MetadataValuesComponent],
3843
schemas: [NO_ERRORS_SCHEMA]
3944
}).overrideComponent(MetadataValuesComponent, {
@@ -58,7 +63,7 @@ describe('MetadataValuesComponent', () => {
5863
});
5964

6065
it('should contain separators equal to the amount of metadata values minus one', () => {
61-
const separators = fixture.debugElement.queryAll(By.css('span>span'));
66+
const separators = fixture.debugElement.queryAll(By.css('span.separator'));
6267
expect(separators.length).toBe(mockMetadata.length - 1);
6368
});
6469

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Component, Input } from '@angular/core';
1+
import { Component, Inject, Input, OnChanges, SimpleChanges } from '@angular/core';
22
import { MetadataValue } from '../../../core/shared/metadata.models';
3+
import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface';
34

45
/**
56
* This component renders the configured 'values' into the ds-metadata-field-wrapper component.
@@ -10,7 +11,12 @@ import { MetadataValue } from '../../../core/shared/metadata.models';
1011
styleUrls: ['./metadata-values.component.scss'],
1112
templateUrl: './metadata-values.component.html'
1213
})
13-
export class MetadataValuesComponent {
14+
export class MetadataValuesComponent implements OnChanges {
15+
16+
constructor(
17+
@Inject(APP_CONFIG) private appConfig: AppConfig,
18+
) {
19+
}
1420

1521
/**
1622
* The metadata values to display
@@ -27,4 +33,19 @@ export class MetadataValuesComponent {
2733
*/
2834
@Input() label: string;
2935

36+
/**
37+
* Whether the {@link MarkdownPipe} should be used to render these metadata values.
38+
* This will only have effect if {@link MarkdownConfig#enabled} is true.
39+
* Mathjax will only be rendered if {@link MarkdownConfig#mathjax} is true.
40+
*/
41+
@Input() enableMarkdown = false;
42+
43+
/**
44+
* This variable will be true if both {@link environment.markdown.enabled} and {@link enableMarkdown} are true.
45+
*/
46+
renderMarkdown;
47+
48+
ngOnChanges(changes: SimpleChanges): void {
49+
this.renderMarkdown = !!this.appConfig.markdown.enabled && this.enableMarkdown;
50+
}
3051
}

src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,44 @@ import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
33
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
44
import { ItemPageAbstractFieldComponent } from './item-page-abstract-field.component';
55
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
6-
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
7-
import { mockItemWithMetadataFieldAndValue } from '../item-page-field.component.spec';
6+
import { SharedModule } from '../../../../../shared/shared.module';
7+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
8+
import { environment } from '../../../../../../environments/environment';
9+
import { By } from '@angular/platform-browser';
810

911
let comp: ItemPageAbstractFieldComponent;
1012
let fixture: ComponentFixture<ItemPageAbstractFieldComponent>;
1113

12-
const mockField = 'dc.description.abstract';
13-
const mockValue = 'test value';
14-
1514
describe('ItemPageAbstractFieldComponent', () => {
1615
beforeEach(waitForAsync(() => {
1716
TestBed.configureTestingModule({
18-
imports: [TranslateModule.forRoot({
19-
loader: {
20-
provide: TranslateLoader,
21-
useClass: TranslateLoaderMock
22-
}
23-
})],
24-
declarations: [ItemPageAbstractFieldComponent, MetadataValuesComponent],
17+
imports: [
18+
TranslateModule.forRoot({
19+
loader: {
20+
provide: TranslateLoader,
21+
useClass: TranslateLoaderMock
22+
}
23+
}),
24+
SharedModule,
25+
],
26+
providers: [
27+
{ provide: APP_CONFIG, useValue: environment },
28+
],
29+
declarations: [ItemPageAbstractFieldComponent],
2530
schemas: [NO_ERRORS_SCHEMA]
2631
}).overrideComponent(ItemPageAbstractFieldComponent, {
2732
set: { changeDetection: ChangeDetectionStrategy.Default }
2833
}).compileComponents();
2934
}));
3035

3136
beforeEach(waitForAsync(() => {
37+
3238
fixture = TestBed.createComponent(ItemPageAbstractFieldComponent);
3339
comp = fixture.componentInstance;
34-
comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
3540
fixture.detectChanges();
3641
}));
3742

38-
it('should display display the correct metadata value', () => {
39-
expect(fixture.nativeElement.innerHTML).toContain(mockValue);
43+
it('should render a ds-metadata-values', () => {
44+
expect(fixture.debugElement.query(By.css('ds-metadata-values'))).toBeDefined();
4045
});
4146
});

src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,8 @@ export class ItemPageAbstractFieldComponent extends ItemPageFieldComponent {
3636
*/
3737
label = 'item.page.abstract';
3838

39+
/**
40+
* Use the {@link MarkdownPipe} to render dc.description.abstract values
41+
*/
42+
enableMarkdown = true;
3943
}

src/app/item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loa
55
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
66
import { mockItemWithMetadataFieldAndValue } from '../item-page-field.component.spec';
77
import { ItemPageAuthorFieldComponent } from './item-page-author-field.component';
8+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
9+
import { environment } from '../../../../../../environments/environment';
810

911
let comp: ItemPageAuthorFieldComponent;
1012
let fixture: ComponentFixture<ItemPageAuthorFieldComponent>;
@@ -21,6 +23,9 @@ describe('ItemPageAuthorFieldComponent', () => {
2123
useClass: TranslateLoaderMock
2224
}
2325
})],
26+
providers: [
27+
{ provide: APP_CONFIG, useValue: environment },
28+
],
2429
declarations: [ItemPageAuthorFieldComponent, MetadataValuesComponent],
2530
schemas: [NO_ERRORS_SCHEMA]
2631
}).overrideComponent(ItemPageAuthorFieldComponent, {

src/app/item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loa
55
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
66
import { mockItemWithMetadataFieldAndValue } from '../item-page-field.component.spec';
77
import { ItemPageDateFieldComponent } from './item-page-date-field.component';
8+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
9+
import { environment } from '../../../../../../environments/environment';
810

911
let comp: ItemPageDateFieldComponent;
1012
let fixture: ComponentFixture<ItemPageDateFieldComponent>;
@@ -21,6 +23,9 @@ describe('ItemPageDateFieldComponent', () => {
2123
useClass: TranslateLoaderMock
2224
}
2325
})],
26+
providers: [
27+
{ provide: APP_CONFIG, useValue: environment },
28+
],
2429
declarations: [ItemPageDateFieldComponent, MetadataValuesComponent],
2530
schemas: [NO_ERRORS_SCHEMA]
2631
}).overrideComponent(ItemPageDateFieldComponent, {

0 commit comments

Comments
 (0)