Skip to content

Commit cf2407b

Browse files
authored
Merge pull request DSpace#4488 from alexandrevryghem/w2p-117573_remove-observable-function-calls-from-template-7_x
[Port dspace-7_x] Removed observable function calls from template (part 2)
2 parents a864260 + 7afe49d commit cf2407b

33 files changed

Lines changed: 299 additions & 442 deletions

src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div *ngIf="registryService.getActiveMetadataField() | async; then editheader; else createHeader"></div>
1+
<div *ngIf="activeMetadataField$ | async; then editheader; else createHeader"></div>
22

33
<ng-template #createHeader>
44
<h2>{{messagePrefix + '.create' | translate}}</h2>

src/app/admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts

Lines changed: 61 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { RegistryService } from '../../../../core/registry/registry.service';
1111
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
1212
import { take } from 'rxjs/operators';
1313
import { TranslateService } from '@ngx-translate/core';
14-
import { combineLatest } from 'rxjs';
14+
import { Observable } from 'rxjs';
1515
import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
1616
import { MetadataField } from '../../../../core/metadata/metadata-field.model';
1717

@@ -90,6 +90,8 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
9090
*/
9191
@Output() submitForm: EventEmitter<any> = new EventEmitter();
9292

93+
activeMetadataField$: Observable<MetadataField>;
94+
9395
constructor(public registryService: RegistryService,
9496
private formBuilderService: FormBuilderService,
9597
private translateService: TranslateService) {
@@ -99,70 +101,64 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
99101
* Initialize the component, setting up the necessary Models for the dynamic form
100102
*/
101103
ngOnInit() {
102-
combineLatest([
103-
this.translateService.get(`${this.messagePrefix}.element`),
104-
this.translateService.get(`${this.messagePrefix}.qualifier`),
105-
this.translateService.get(`${this.messagePrefix}.scopenote`)
106-
]).subscribe(([element, qualifier, scopenote]) => {
107-
this.element = new DynamicInputModel({
108-
id: 'element',
109-
label: element,
110-
name: 'element',
111-
validators: {
112-
required: null,
113-
pattern: '^[^. ,]*$',
114-
maxLength: 64,
115-
},
116-
required: true,
117-
errorMessages: {
118-
pattern: 'error.validation.metadata.element.invalid-pattern',
119-
maxLength: 'error.validation.metadata.element.max-length',
120-
},
121-
});
122-
this.qualifier = new DynamicInputModel({
123-
id: 'qualifier',
124-
label: qualifier,
125-
name: 'qualifier',
126-
validators: {
127-
pattern: '^[^. ,]*$',
128-
maxLength: 64,
129-
},
130-
required: false,
131-
errorMessages: {
132-
pattern: 'error.validation.metadata.qualifier.invalid-pattern',
133-
maxLength: 'error.validation.metadata.qualifier.max-length',
134-
},
135-
});
136-
this.scopeNote = new DynamicTextAreaModel({
137-
id: 'scopeNote',
138-
label: scopenote,
139-
name: 'scopeNote',
140-
required: false,
141-
rows: 5,
142-
});
143-
this.formModel = [
144-
new DynamicFormGroupModel(
145-
{
146-
id: 'metadatadatafieldgroup',
147-
group:[this.element, this.qualifier, this.scopeNote]
148-
})
149-
];
150-
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
151-
this.registryService.getActiveMetadataField().subscribe((field: MetadataField): void => {
152-
if (field == null) {
153-
this.clearFields();
154-
} else {
155-
this.formGroup.patchValue({
156-
metadatadatafieldgroup: {
157-
element: field.element,
158-
qualifier: field.qualifier,
159-
scopeNote: field.scopeNote,
160-
},
161-
});
162-
this.element.disabled = true;
163-
this.qualifier.disabled = true;
164-
}
165-
});
104+
this.element = new DynamicInputModel({
105+
id: 'element',
106+
label: this.translateService.instant(`${this.messagePrefix}.element`),
107+
name: 'element',
108+
validators: {
109+
required: null,
110+
pattern: '^[^. ,]*$',
111+
maxLength: 64,
112+
},
113+
required: true,
114+
errorMessages: {
115+
pattern: 'error.validation.metadata.element.invalid-pattern',
116+
maxLength: 'error.validation.metadata.element.max-length',
117+
},
118+
});
119+
this.qualifier = new DynamicInputModel({
120+
id: 'qualifier',
121+
label: this.translateService.instant(`${this.messagePrefix}.qualifier`),
122+
name: 'qualifier',
123+
validators: {
124+
pattern: '^[^. ,]*$',
125+
maxLength: 64,
126+
},
127+
required: false,
128+
errorMessages: {
129+
pattern: 'error.validation.metadata.qualifier.invalid-pattern',
130+
maxLength: 'error.validation.metadata.qualifier.max-length',
131+
},
132+
});
133+
this.scopeNote = new DynamicTextAreaModel({
134+
id: 'scopeNote',
135+
label: this.translateService.instant(`${this.messagePrefix}.scopenote`),
136+
name: 'scopeNote',
137+
required: false,
138+
rows: 5,
139+
});
140+
this.formModel = [
141+
new DynamicFormGroupModel(
142+
{
143+
id: 'metadatadatafieldgroup',
144+
group:[this.element, this.qualifier, this.scopeNote]
145+
})
146+
];
147+
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
148+
this.registryService.getActiveMetadataField().subscribe((field: MetadataField): void => {
149+
if (field == null) {
150+
this.clearFields();
151+
} else {
152+
this.formGroup.patchValue({
153+
metadatadatafieldgroup: {
154+
element: field.element,
155+
qualifier: field.qualifier,
156+
scopeNote: field.scopeNote,
157+
},
158+
});
159+
this.element.disabled = true;
160+
this.qualifier.disabled = true;
161+
}
166162
});
167163
}
168164

src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<div class="container">
2-
<ds-alert [type]="'alert-info'" [content]="'item.edit.authorizations.heading'"></ds-alert>
3-
<ds-resource-policies [resourceType]="'item'" [resourceName]="(getItemName() | async)"
4-
[resourceUUID]="(getItemUUID() | async)">
2+
<ds-alert [type]="AlertType.Info" [content]="'item.edit.authorizations.heading'"></ds-alert>
3+
<ds-resource-policies [resourceType]="'item'" [resourceName]="itemName$ | async"
4+
[resourceUUID]="(item$ | async)?.id">
55
</ds-resource-policies>
6-
<ng-container *ngFor="let bundle of (bundles$ | async); trackById">
6+
<ng-container *ngFor="let bundle of (bundles$ | async)">
77
<ds-resource-policies [resourceType]="'bundle'" [resourceUUID]="bundle.id" [resourceName]="bundle.name">
88
</ds-resource-policies>
99
<ng-container *ngIf="(bundleBitstreamsMap.get(bundle.id)?.bitstreams | async)?.length > 0">
@@ -16,7 +16,7 @@
1616
</div>
1717
<div class="card-body" [id]="bundle.id" [ngbCollapse]="bundleBitstreamsMap.get(bundle.id).isCollapsed">
1818
<ng-container
19-
*ngFor="let bitstream of (bundleBitstreamsMap.get(bundle.id).bitstreams | async); trackById">
19+
*ngFor="let bitstream of (bundleBitstreamsMap.get(bundle.id).bitstreams | async)">
2020
<ds-resource-policies [resourceType]="'bitstream'" [resourceUUID]="bitstream.id"
2121
[resourceName]="bitstream.name"></ds-resource-policies>
2222
</ng-container>

src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.spec.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,17 +147,9 @@ describe('ItemAuthorizationsComponent test suite', () => {
147147
}));
148148
});
149149

150-
it('should get the item UUID', () => {
151-
152-
expect(comp.getItemUUID()).toBeObservable(cold('(a|)', {
153-
a: item.id
154-
}));
155-
156-
});
157-
158150
it('should get the item\'s bundle', () => {
159151

160-
expect(comp.getItemBundles()).toBeObservable(cold('a', {
152+
expect(comp.bundles$).toBeObservable(cold('a', {
161153
a: bundles
162154
}));
163155

src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
44
import { ActivatedRoute } from '@angular/router';
55

66
import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'rxjs';
7-
import { catchError, filter, first, map, mergeMap, take } from 'rxjs/operators';
7+
import { catchError, filter, map, mergeMap, take } from 'rxjs/operators';
88

99
import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model';
1010
import {
@@ -17,6 +17,7 @@ import { LinkService } from '../../../core/cache/builders/link.service';
1717
import { Bundle } from '../../../core/shared/bundle.model';
1818
import { hasValue, isNotEmpty } from '../../../shared/empty.util';
1919
import { Bitstream } from '../../../core/shared/bitstream.model';
20+
import { AlertType } from '../../../shared/alert/alert-type';
2021

2122
/**
2223
* Interface for a bundle's bitstream map entry
@@ -52,7 +53,7 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy {
5253
* The target editing item
5354
* @type {Observable<Item>}
5455
*/
55-
private item$: Observable<Item>;
56+
item$: Observable<Item>;
5657

5758
/**
5859
* Array to track all subscriptions and unsubscribe them onDestroy
@@ -91,16 +92,13 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy {
9192
*/
9293
private bitstreamPageSize = 4;
9394

94-
/**
95-
* Initialize instance variables
96-
*
97-
* @param {LinkService} linkService
98-
* @param {ActivatedRoute} route
99-
* @param nameService
100-
*/
95+
itemName$: Observable<string>;
96+
97+
readonly AlertType = AlertType;
98+
10199
constructor(
102-
private linkService: LinkService,
103-
private route: ActivatedRoute,
100+
protected linkService: LinkService,
101+
protected route: ActivatedRoute,
104102
public nameService: DSONameService
105103
) {
106104
}
@@ -109,37 +107,19 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy {
109107
* Initialize the component, setting up the bundle and bitstream within the item
110108
*/
111109
ngOnInit(): void {
112-
this.getBundlesPerItem();
110+
this.getBundlesPerItem();
111+
this.itemName$ = this.getItemName();
113112
}
114113

115114
/**
116-
* Return the item's UUID
115+
* Return the item's name
117116
*/
118-
getItemUUID(): Observable<string> {
119-
return this.item$.pipe(
120-
map((item: Item) => item.id),
121-
first((UUID: string) => isNotEmpty(UUID))
122-
);
123-
}
124-
125-
/**
126-
* Return the item's name
127-
*/
128-
getItemName(): Observable<string> {
117+
private getItemName(): Observable<string> {
129118
return this.item$.pipe(
130119
map((item: Item) => this.nameService.getName(item))
131120
);
132121
}
133122

134-
/**
135-
* Return all item's bundles
136-
*
137-
* @return an observable that emits all item's bundles
138-
*/
139-
getItemBundles(): Observable<Bundle[]> {
140-
return this.bundles$.asObservable();
141-
}
142-
143123
/**
144124
* Get all bundles per item
145125
* and all the bitstreams per bundle

src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.html

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
<div class="container mb-5">
22
<h1>{{'person.orcid.registry.auth' | translate}}</h1>
3-
<ng-container *ngIf="(isLinkedToOrcid() | async); then orcidLinked; else orcidNotLinked"></ng-container>
3+
<ng-container *ngIf="(isOrcidLinked$ | async); then orcidLinked; else orcidNotLinked"></ng-container>
44
</div>
55

66
<ng-template #orcidLinked>
77
<div data-test="orcidLinked">
88
<div class="row">
9-
<div *ngIf="(hasOrcidAuthorizations() | async)" class="col-sm-6 mb-3" data-test="hasOrcidAuthorizations">
9+
<div *ngIf="(hasOrcidAuthorizations$ | async)" class="col-sm-6 mb-3" data-test="hasOrcidAuthorizations">
1010
<div class="card h-100">
1111
<div class="card-header">{{ 'person.page.orcid.granted-authorizations'| translate }}</div>
1212
<div class="card-body">
1313
<div class="container p-0">
1414
<ul>
15-
<li *ngFor="let auth of (getOrcidAuthorizations() | async)" data-test="orcidAuthorization">
15+
<li *ngFor="let auth of profileAuthorizationScopes$ | async" data-test="orcidAuthorization">
1616
{{getAuthorizationDescription(auth) | translate}}
1717
</li>
1818
</ul>
@@ -25,13 +25,13 @@ <h1>{{'person.orcid.registry.auth' | translate}}</h1>
2525
<div class="card-header">{{ 'person.page.orcid.missing-authorizations'| translate }}</div>
2626
<div class="card-body">
2727
<div class="container">
28-
<ds-alert *ngIf="!(hasMissingOrcidAuthorizations() | async)" [type]="'alert-success'" data-test="noMissingOrcidAuthorizations">
28+
<ds-alert *ngIf="!(hasMissingOrcidAuthorizations$ | async)" [type]="AlertType.Success" data-test="noMissingOrcidAuthorizations">
2929
{{'person.page.orcid.no-missing-authorizations-message' | translate}}
3030
</ds-alert>
31-
<ds-alert *ngIf="(hasMissingOrcidAuthorizations() | async)" [type]="'alert-warning'" data-test="missingOrcidAuthorizations">
31+
<ds-alert *ngIf="(hasMissingOrcidAuthorizations$ | async)" [type]="AlertType.Warning" data-test="missingOrcidAuthorizations">
3232
{{'person.page.orcid.missing-authorizations-message' | translate}}
3333
<ul>
34-
<li *ngFor="let auth of (getMissingOrcidAuthorizations() | async)" data-test="missingOrcidAuthorization">
34+
<li *ngFor="let auth of profileAuthorizationScopes$ | async" data-test="missingOrcidAuthorization">
3535
{{getAuthorizationDescription(auth) | translate }}
3636
</li>
3737
</ul>
@@ -41,11 +41,11 @@ <h1>{{'person.orcid.registry.auth' | translate}}</h1>
4141
</div>
4242
</div>
4343
</div>
44-
<ds-alert *ngIf="(onlyAdminCanDisconnectProfileFromOrcid() | async) && !(ownerCanDisconnectProfileFromOrcid() | async)"
45-
[type]="'alert-warning'" data-test="unlinkOnlyAdmin">
44+
<ds-alert *ngIf="(onlyAdminCanDisconnectProfileFromOrcid$ | async) && !(ownerCanDisconnectProfileFromOrcid$ | async)"
45+
[type]="AlertType.Warning" data-test="unlinkOnlyAdmin">
4646
{{ 'person.page.orcid.remove-orcid-message' | translate}}
4747
</ds-alert>
48-
<div class="row" *ngIf="(ownerCanDisconnectProfileFromOrcid() | async)" data-test="unlinkOwner">
48+
<div class="row" *ngIf="(ownerCanDisconnectProfileFromOrcid$ | async)" data-test="unlinkOwner">
4949
<div class="col">
5050
<button type="submit" class="btn btn-danger float-right" (click)="unlinkOrcid()"
5151
[dsBtnDisabled]="(unlinkProcessing | async)">
@@ -54,7 +54,7 @@ <h1>{{'person.orcid.registry.auth' | translate}}</h1>
5454
<span *ngIf="(unlinkProcessing | async)"><i
5555
class='fas fa-circle-notch fa-spin'></i> {{'person.page.orcid.unlink.processing' | translate}}</span>
5656
</button>
57-
<button *ngIf="(hasMissingOrcidAuthorizations() | async)" type="submit"
57+
<button *ngIf="(hasMissingOrcidAuthorizations$ | async)" type="submit"
5858
class="btn btn-primary float-right" (click)="linkOrcid()">
5959
<span><i class="fas fa-check"></i> {{ 'person.page.orcid.grant-authorizations' | translate }}</span>
6060
</button>
@@ -68,7 +68,7 @@ <h1>{{'person.orcid.registry.auth' | translate}}</h1>
6868
<div class="row">
6969
<div class="col-2"><img alt="orcid-logo" src="../../../../assets/images/orcid.logo.icon.svg"/></div>
7070
<div class="col">
71-
<ds-alert [type]="'alert-info'">{{ getOrcidNotLinkedMessage() | async }}</ds-alert>
71+
<ds-alert [type]="AlertType.Info">{{ getOrcidNotLinkedMessage() }}</ds-alert>
7272
</div>
7373
</div>
7474
<div class="row">

0 commit comments

Comments
 (0)