Skip to content

Commit 7cf69ea

Browse files
author
Davide Negretti
committed
Merged in DSC-1669-main (pull request DSpace#1865)
DSC-1669 main
2 parents 78a059b + 0270bf0 commit 7cf69ea

File tree

33 files changed

+95415
-28646
lines changed

33 files changed

+95415
-28646
lines changed

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ export abstract class MetadataGroupComponent extends RenderingTypeStructuredMode
3232
/**
3333
* The prefix used for box field label's i18n key
3434
*/
35-
fieldI18nPrefix = 'layout.field.label.';
35+
readonly fieldI18nPrefix = 'layout.field.label';
36+
37+
/**
38+
* The prefix used for box field label's
39+
*/
40+
readonly nestedMetadataPrefix = 'NESTED';
3641

3742
/**
3843
* A boolean representing if component is initialized
@@ -80,17 +85,23 @@ export abstract class MetadataGroupComponent extends RenderingTypeStructuredMode
8085
}
8186

8287
/**
83-
* Returns a string representing the label of field if exists
88+
* Returns the translated label, if exists, otherwiuse returns a fallback value
8489
*/
8590
getLabel(field: LayoutField): string {
86-
const fieldLabelI18nKey = this.fieldI18nPrefix + field.label;
87-
const header: string = this.translateService.instant(fieldLabelI18nKey);
88-
if (header === fieldLabelI18nKey) {
89-
// if translation does not exist return the value present in the header property
90-
return this.translateService.instant(field.label);
91-
} else {
92-
return header;
93-
}
91+
return this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.${this.nestedMetadataPrefix}[${field.metadata}]}`) ??
92+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.[${field.metadata}]`) ??
93+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.${field.metadata}`) ?? // old syntax - do not use
94+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.[${field.metadata}]`) ??
95+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${field.label}`) ?? // old syntax - do not use
96+
field.label; // the untranslated value from the CRIS layout
97+
}
98+
99+
/**
100+
* Return the translated label, if exists, otherwise returns null
101+
*/
102+
getTranslationIfExists(key: string): string {
103+
const translation: string = this.translateService.instant(key);
104+
return translation !== key ? translation : null;
94105
}
95106

96107
ngOnDestroy(): void {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div *ngIf="metadataFieldRenderOptions" class="{{containerStyle}}">
22
<div class="d-flex" [class.flex-column]="field.labelAsHeading">
33
<span *ngIf="hasLabel"
4-
class="{{labelStyle}}" [innerHTML]="label">
4+
class="{{labelStyle}}" [innerHTML]="getLabel()">
55
</span>
66

77
<div *ngIf="!isStructured" class="d-flex col flex-wrap" [class.flex-column]="!field.valuesInline">

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

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { CrisLayoutBox, LayoutField, LayoutFieldType } from '../../../../../../.
44
import {
55
FieldRenderingType,
66
getMetadataBoxFieldRendering,
7-
MetadataBoxFieldRenderOptions
7+
MetadataBoxFieldRenderOptions,
88
} from '../../rendering-types/metadata-box.decorator';
99
import { hasValue, isEmpty, isNotEmpty } from '../../../../../../../shared/empty.util';
1010
import { TranslateService } from '@ngx-translate/core';
@@ -13,11 +13,11 @@ import { MetadataValue } from '../../../../../../../core/shared/metadata.models'
1313
import { Bitstream } from '../../../../../../../core/shared/bitstream.model';
1414
import { getFirstCompletedRemoteData } from '../../../../../../../core/shared/operators';
1515
import { map, take } from 'rxjs/operators';
16-
import { BitstreamDataService } from '../../../../../../../core/data/bitstream-data.service';
17-
import { MetadataFilter } from '../../../../../../../core/data/bitstream-data.service';
16+
import { BitstreamDataService, MetadataFilter } from '../../../../../../../core/data/bitstream-data.service';
1817
import { RemoteData } from '../../../../../../../core/data/remote-data';
1918
import { PaginatedList } from '../../../../../../../core/data/paginated-list.model';
2019
import { Observable } from 'rxjs';
20+
import { inject } from '@angular/core';
2121

2222
@Component({
2323
selector: 'ds-metadata-container',
@@ -46,7 +46,7 @@ export class MetadataContainerComponent implements OnInit {
4646
/**
4747
* The prefix used for box field label's i18n key
4848
*/
49-
fieldI18nPrefix = 'layout.field.label.';
49+
readonly fieldI18nPrefix = 'layout.field.label';
5050

5151
/**
5252
* A boolean representing if metadata rendering type is structured or not
@@ -58,12 +58,9 @@ export class MetadataContainerComponent implements OnInit {
5858
*/
5959
metadataFieldRenderOptions: MetadataBoxFieldRenderOptions;
6060

61-
constructor(
62-
protected bitstreamDataService: BitstreamDataService,
63-
protected translateService: TranslateService,
64-
protected cd: ChangeDetectorRef
65-
) {
66-
}
61+
protected readonly bitstreamDataService = inject(BitstreamDataService);
62+
protected readonly translateService = inject(TranslateService);
63+
protected readonly cd = inject(ChangeDetectorRef);
6764

6865
/**
6966
* Returns all metadata values in the item
@@ -82,17 +79,29 @@ export class MetadataContainerComponent implements OnInit {
8279
/**
8380
* Returns a string representing the label of field if exists
8481
*/
85-
get label(): string {
86-
const fieldLabelI18nKey = this.fieldI18nPrefix + this.item.entityType + '.' + this.field.metadata;
87-
const header: string = this.translateService.instant(fieldLabelI18nKey);
88-
if (header === fieldLabelI18nKey) {
89-
// if translation does not exist return the value present in the header property
90-
return this.translateService.instant(this.field.label);
82+
getLabel(): string {
83+
if (this.field.fieldType === LayoutFieldType.BITSTREAM) {
84+
return (hasValue(this.field.bitstream.metadataValue) ?
85+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.BITSTREAM[${this.field.bitstream.metadataValue}]`) :
86+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.BITSTREAM`)
87+
) ?? this.field.label;
9188
} else {
92-
return header;
89+
return this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.[${this.field.metadata}]`) ??
90+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.item.entityType}.${this.field.metadata}`) ?? // old syntax - do not use
91+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.[${this.field.metadata}]`) ??
92+
this.getTranslationIfExists(`${this.fieldI18nPrefix}.${this.field.label}`) ?? // old syntax - do not use
93+
this.field.label; // the untranslated value from the CRIS layout
9394
}
9495
}
9596

97+
/**
98+
* Return the translated label, if exists, otherwise returns null
99+
*/
100+
getTranslationIfExists(key: string): string {
101+
const translation: string = this.translateService.instant(key);
102+
return translation !== key ? translation : null;
103+
}
104+
96105
/**
97106
* Returns a string representing the style of field container if exists
98107
*/

src/app/shared/metric/metric-altmetric/metric-altmetric.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
[attr.data-link-target]="remark | dsListMetricProps : 'data-link-target' : isListElement"
1818
></div>
1919
</div>
20-
<div class="font-weight-bold" *ngIf="!hideLabel">
20+
<div class="font-weight-bold" *ngIf="!hideLabel && (showAltmetricLabel$ | async)">
2121
{{ "item.page.metric.label." + metric.metricType | translate }}
2222
</div>
2323
</div>

src/app/shared/metric/metric-altmetric/metric-altmetric.component.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AfterViewChecked, Component, OnInit } from '@angular/core';
1+
import { AfterViewChecked, AfterViewInit, Component, OnInit, Renderer2 } from '@angular/core';
22
import { BaseEmbeddedMetricComponent } from '../metric-loader/base-embedded-metric.component';
33
import { DomSanitizer } from '@angular/platform-browser';
44
import { hasValue } from '../../empty.util';
5+
import { BehaviorSubject } from 'rxjs';
56

67
declare let _altmetric_embed_init: any;
78

@@ -10,10 +11,14 @@ declare let _altmetric_embed_init: any;
1011
templateUrl: './metric-altmetric.component.html',
1112
styleUrls: ['./metric-altmetric.component.scss', '../metric-loader/base-metric.component.scss']
1213
})
13-
export class MetricAltmetricComponent extends BaseEmbeddedMetricComponent implements OnInit, AfterViewChecked {
14+
export class MetricAltmetricComponent extends BaseEmbeddedMetricComponent implements OnInit, AfterViewChecked, AfterViewInit {
1415
remark: JSON;
16+
/**
17+
* Flag to show the altmetric label
18+
*/
19+
showAltmetricLabel$: BehaviorSubject<boolean> = new BehaviorSubject(false);
1520

16-
constructor(protected sr: DomSanitizer) {
21+
constructor(protected sr: DomSanitizer, private renderer: Renderer2) {
1722
super(sr);
1823
}
1924

@@ -33,4 +38,11 @@ export class MetricAltmetricComponent extends BaseEmbeddedMetricComponent implem
3338
this.hide.emit(true);
3439
}
3540
}
41+
42+
ngAfterViewInit(): void {
43+
// Show the altmetric label only when the altmetric component is ready
44+
this.renderer.listen(this.metricChild.nativeElement, 'altmetric:show', () => {
45+
this.showAltmetricLabel$.next(true);
46+
});
47+
}
3648
}

0 commit comments

Comments
 (0)