Removed nested subscriptions

This commit is contained in:
Giuseppe Digilio
2019-01-14 18:57:41 +01:00
parent d41aa9fbc6
commit d441c1673f

View File

@@ -1,7 +1,7 @@
import { ChangeDetectorRef, Component, Inject } from '@angular/core'; import { ChangeDetectorRef, Component, Inject } from '@angular/core';
import { combineLatest, forkJoin as observableForkJoin, Observable } from 'rxjs'; import { combineLatest, Observable } from 'rxjs';
import { distinctUntilChanged, filter, flatMap, map, take } from 'rxjs/operators'; import { distinctUntilChanged, filter, flatMap, map, reduce, take, tap } from 'rxjs/operators';
import { SectionModelComponent } from '../models/section.model'; import { SectionModelComponent } from '../models/section.model';
import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util'; import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shared/empty.util';
@@ -21,7 +21,6 @@ import { Group } from '../../../core/eperson/models/group.model';
import { SectionsService } from '../sections.service'; import { SectionsService } from '../sections.service';
import { SubmissionService } from '../../submission.service'; import { SubmissionService } from '../../submission.service';
import { Collection } from '../../../core/shared/collection.model'; import { Collection } from '../../../core/shared/collection.model';
import { PaginatedList } from '../../../core/data/paginated-list';
import { ResourcePolicy } from '../../../core/shared/resource-policy.model'; import { ResourcePolicy } from '../../../core/shared/resource-policy.model';
import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model'; import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model';
@@ -90,32 +89,30 @@ export class UploadSectionComponent extends SectionModelComponent {
this.subs.push( this.subs.push(
this.submissionService.getSubmissionObject(this.submissionId).pipe( this.submissionService.getSubmissionObject(this.submissionId).pipe(
filter((submissionObject: SubmissionObjectEntry) => isNotUndefined(submissionObject) && !submissionObject.isLoading), filter((submissionObject: SubmissionObjectEntry) => isNotUndefined(submissionObject) && !submissionObject.isLoading),
filter((submissionObject: SubmissionObjectEntry) => isUndefined(this.collectionId) || this.collectionId !== submissionObject.collection)) filter((submissionObject: SubmissionObjectEntry) => isUndefined(this.collectionId) || this.collectionId !== submissionObject.collection),
.subscribe((submissionObject: SubmissionObjectEntry) => { tap((submissionObject: SubmissionObjectEntry) => this.collectionId = submissionObject.collection),
this.collectionId = submissionObject.collection; flatMap((submissionObject: SubmissionObjectEntry) => this.collectionDataService.findById(submissionObject.collection)),
this.collectionDataService.findById(this.collectionId).pipe(
filter((rd: RemoteData<Collection>) => isNotUndefined((rd.payload))), filter((rd: RemoteData<Collection>) => isNotUndefined((rd.payload))),
take(1)) take(1),
.subscribe((collectionRemoteData: RemoteData<Collection>) => { tap((collectionRemoteData: RemoteData<Collection>) => this.collectionName = collectionRemoteData.payload.name),
this.collectionName = collectionRemoteData.payload.name; flatMap((collectionRemoteData: RemoteData<Collection>) => {
return this.collectionDataService.findByHref(
// Default Access Conditions (collectionRemoteData.payload as any)._links.defaultAccessConditions
this.subs.push(collectionRemoteData.payload.defaultAccessConditions.pipe( );
filter((defaultAccessConditionsRemoteData: RemoteData<PaginatedList<ResourcePolicy>>) => }),
filter((defaultAccessConditionsRemoteData: RemoteData<ResourcePolicy>) =>
defaultAccessConditionsRemoteData.hasSucceeded), defaultAccessConditionsRemoteData.hasSucceeded),
take(1)) take(1),
.subscribe((defaultAccessConditionsRemoteData: RemoteData<PaginatedList<ResourcePolicy>>) => { tap((defaultAccessConditionsRemoteData: RemoteData<ResourcePolicy>) => {
console.log(JSON.stringify(defaultAccessConditionsRemoteData.payload));
if (isNotEmpty(defaultAccessConditionsRemoteData.payload)) { if (isNotEmpty(defaultAccessConditionsRemoteData.payload)) {
this.collectionDefaultAccessConditions = Array.isArray(defaultAccessConditionsRemoteData.payload.page) this.collectionDefaultAccessConditions = Array.isArray(defaultAccessConditionsRemoteData.payload)
? defaultAccessConditionsRemoteData.payload.page : [defaultAccessConditionsRemoteData.payload.page]; ? defaultAccessConditionsRemoteData.payload : [defaultAccessConditionsRemoteData.payload];
} }
}),
// Edit Form Configuration, access policy list flatMap(() => config$),
this.subs.push(config$.pipe( take(1),
take(1)) flatMap((config: SubmissionUploadsModel) => {
.subscribe((config: SubmissionUploadsModel) => {
this.availableAccessConditionOptions = isNotEmpty(config.accessConditionOptions) ? config.accessConditionOptions : []; this.availableAccessConditionOptions = isNotEmpty(config.accessConditionOptions) ? config.accessConditionOptions : [];
this.collectionPolicyType = this.availableAccessConditionOptions.length > 0 this.collectionPolicyType = this.availableAccessConditionOptions.length > 0
@@ -123,23 +120,27 @@ export class UploadSectionComponent extends SectionModelComponent {
: POLICY_DEFAULT_NO_LIST; : POLICY_DEFAULT_NO_LIST;
this.availableGroups = new Map(); this.availableGroups = new Map();
const groupsObs = []; const groups$ = [];
// Retrieve Groups for accessConditionPolicies // Retrieve Groups for accessConditionPolicies
this.availableAccessConditionOptions.forEach((accessCondition: AccessConditionOption) => { this.availableAccessConditionOptions.forEach((accessCondition: AccessConditionOption) => {
if (accessCondition.hasEndDate === true || accessCondition.hasStartDate === true) { if (accessCondition.hasEndDate === true || accessCondition.hasStartDate === true) {
groupsObs.push( groups$.push(
this.groupService.findById(accessCondition.groupUUID).pipe( this.groupService.findById(accessCondition.groupUUID).pipe(
filter((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded), filter((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded),
take(1)) take(1))
); );
} }
}); });
let obsCounter = 1; return groups$;
observableForkJoin(groupsObs).pipe( }),
flatMap((group) => group), flatMap((group) => group),
take(groupsObs.length)) reduce((acc: Group[], group: RemoteData<Group>) => {
.subscribe((rd: RemoteData<Group>) => { console.log(JSON.stringify(group.payload));
const group: Group = rd.payload; acc.push(group.payload);
return acc;
}, []),
).subscribe((groups: Group[]) => {
groups.forEach((group: Group) => {
if (isUndefined(this.availableGroups.get(group.uuid))) { if (isUndefined(this.availableGroups.get(group.uuid))) {
if (Array.isArray(group.groups)) { if (Array.isArray(group.groups)) {
const groupArrayData = []; const groupArrayData = [];
@@ -151,15 +152,9 @@ export class UploadSectionComponent extends SectionModelComponent {
this.availableGroups.set(group.uuid, { name: group.name, uuid: group.uuid }); this.availableGroups.set(group.uuid, { name: group.name, uuid: group.uuid });
} }
} }
if (obsCounter++ === groupsObs.length) { });
this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detectChanges();
}
})
})
);
})
);
})
}) })
, ,
combineLatest(this.configMetadataForm$, combineLatest(this.configMetadataForm$,