Fixed subscriptions

This commit is contained in:
Giuseppe Digilio
2019-02-18 16:54:52 +01:00
parent 8422549d26
commit 9c2b51fb19
4 changed files with 54 additions and 48 deletions

View File

@@ -13,7 +13,7 @@
[disabled]="(disabled$ | async)"
ngbDropdownToggle>
<span *ngIf="(disabled$ | async)"><i class='fas fa-circle-notch fa-spin'></i></span>
<span *ngIf="!(disabled$ | async)">{{ (selectedCollectionName) ? selectedCollectionName : '' }}</span>
<span *ngIf="!(disabled$ | async)">{{ selectedCollectionName$ | async }}</span>
</button>
<div ngbDropdownMenu

View File

@@ -11,7 +11,7 @@ import {
} from '@angular/core';
import { FormControl } from '@angular/forms';
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
import { BehaviorSubject, combineLatest, Observable, of as observableOf, Subscription } from 'rxjs';
import {
debounceTime,
distinctUntilChanged,
@@ -21,11 +21,9 @@ import {
map,
mergeMap,
reduce,
startWith,
tap
startWith
} from 'rxjs/operators';
import { isNullOrUndefined } from 'util';
import { Collection } from '../../../core/shared/collection.model';
import { CommunityDataService } from '../../../core/data/community-data.service';
import { Community } from '../../../core/shared/community.model';
@@ -33,7 +31,6 @@ import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util';
import { RemoteData } from '../../../core/data/remote-data';
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
import { Workspaceitem } from '../../../core/submission/models/workspaceitem.model';
import { PaginatedList } from '../../../core/data/paginated-list';
import { SubmissionService } from '../../submission.service';
import { SubmissionObject } from '../../../core/submission/models/submission-object.model';
@@ -61,9 +58,9 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
/**
* An event fired when a different collection is selected.
* Event's payload equals to new collection uuid.
* Event's payload equals to new SubmissionObject.
*/
@Output() collectionChange: EventEmitter<Workspaceitem> = new EventEmitter<Workspaceitem>();
@Output() collectionChange: EventEmitter<SubmissionObject> = new EventEmitter<SubmissionObject>();
public disabled$ = new BehaviorSubject<boolean>(true);
public model: any;
@@ -71,14 +68,13 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
public searchListCollection$: Observable<CollectionListEntry[]>;
public selectedCollectionId: string;
public selectedCollectionName: string;
public selectedCollectionName$: Observable<string>;
protected pathCombiner: JsonPatchOperationPathCombiner;
private scrollableBottom = false;
private scrollableTop = false;
private subs: Subscription[] = [];
formatter = (x: { collection: string }) => x.collection;
constructor(protected cdr: ChangeDetectorRef,
private communityDataService: CommunityDataService,
private operationsBuilder: JsonPatchOperationsBuilder,
@@ -104,21 +100,19 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
if (hasValue(changes.currentCollectionId)
&& hasValue(changes.currentCollectionId.currentValue)) {
this.selectedCollectionId = this.currentCollectionId;
// @TODO replace with search/top browse endpoint
// @TODO implement community/subcommunity hierarchy
const listCollection$ = this.communityDataService.findAll().pipe(
const communities$ = this.communityDataService.findAll().pipe(
find((communities: RemoteData<PaginatedList<Community>>) => isNotEmpty(communities.payload)),
mergeMap((communities: RemoteData<PaginatedList<Community>>) => communities.payload.page),
mergeMap((communities: RemoteData<PaginatedList<Community>>) => communities.payload.page));
const listCollection$ = communities$.pipe(
flatMap((communityData: Community) => {
return communityData.collections.pipe(
find((collections: RemoteData<PaginatedList<Collection>>) => !collections.isResponsePending && collections.hasSucceeded),
mergeMap((collections: RemoteData<PaginatedList<Collection>>) => collections.payload.page),
filter((collectionData: Collection) => isNotEmpty(collectionData)),
tap((collectionData: Collection) => {
if (collectionData.id === this.selectedCollectionId) {
this.selectedCollectionName = collectionData.name;
}
}),
map((collectionData: Collection) => ({
communities: [{id: communityData.id, name: communityData.name}],
collection: {id: collectionData.id, name: collectionData.name}
@@ -129,6 +123,19 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
startWith([])
);
this.selectedCollectionName$ = communities$.pipe(
flatMap((communityData: Community) => {
return communityData.collections.pipe(
find((collections: RemoteData<PaginatedList<Collection>>) => !collections.isResponsePending && collections.hasSucceeded),
mergeMap((collections: RemoteData<PaginatedList<Collection>>) => collections.payload.page),
filter((collectionData: Collection) => isNotEmpty(collectionData)),
filter((collectionData: Collection) => collectionData.id === this.selectedCollectionId),
map((collectionData: Collection) => collectionData.name)
);
}),
startWith('')
);
const searchTerm$ = this.searchField.valueChanges.pipe(
debounceTime(200),
distinctUntilChanged(),
@@ -138,7 +145,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
this.searchListCollection$ = combineLatest(searchTerm$, listCollection$).pipe(
map(([searchTerm, listCollection]) => {
this.disabled$.next(isEmpty(listCollection));
if (searchTerm === '' || isNullOrUndefined(searchTerm)) {
if (isEmpty(searchTerm)) {
return listCollection;
} else {
return listCollection.filter((v) => v.collection.name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1).slice(0, 5)
@@ -167,6 +174,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
.subscribe((submissionObject: SubmissionObject[]) => {
this.selectedCollectionId = event.collection.id;
this.selectedCollectionName = event.collection.name;
this.selectedCollectionName$ = observableOf(event.collection.name);
this.collectionChange.emit(submissionObject[0]);
this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id);
this.disabled$.next(false);

View File

@@ -1,4 +1,4 @@
<span class="mb-5">{{ licenseText }}</span>
<span class="mb-5">{{ licenseText$ | async }}</span>
<br> <br>
<ds-form *ngIf="formModel" #formRef="formComponent"
[formId]="formId"

View File

@@ -1,7 +1,7 @@
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
import { Observable, Subscription } from 'rxjs';
import { distinctUntilChanged, filter, find, flatMap, map, take } from 'rxjs/operators';
import { distinctUntilChanged, filter, find, flatMap, map, startWith, take } from 'rxjs/operators';
import {
DynamicCheckboxModel,
DynamicFormControlEvent,
@@ -41,7 +41,7 @@ export class LicenseSectionComponent extends SectionModelComponent {
public formModel: DynamicFormControlModel[];
public formLayout: DynamicFormLayout = SECTION_LICENSE_FORM_LAYOUT;
public displaySubmit = false;
public licenseText: string;
public licenseText$: Observable<string>;
protected pathCombiner: JsonPatchOperationPathCombiner;
protected subs: Subscription[] = [];
@@ -68,33 +68,31 @@ export class LicenseSectionComponent extends SectionModelComponent {
this.formModel = this.formBuilderService.fromJSON(SECTION_LICENSE_FORM_MODEL);
const model = this.formBuilderService.findById('granted', this.formModel);
// Retrieve license accepted status
if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) {
(model as DynamicCheckboxModel).valueUpdates.next(true);
} else {
(model as DynamicCheckboxModel).valueUpdates.next(false);
}
this.licenseText$ = this.collectionDataService.findById(this.collectionId).pipe(
filter((collectionData: RemoteData<Collection>) => isNotUndefined((collectionData.payload))),
flatMap((collectionData: RemoteData<Collection>) => collectionData.payload.license),
find((licenseData: RemoteData<License>) => isNotUndefined((licenseData.payload))),
map((licenseData: RemoteData<License>) => licenseData.payload.text),
startWith(''));
this.subs.push(
this.collectionDataService.findById(this.collectionId).pipe(
filter((collectionData: RemoteData<Collection>) => isNotUndefined((collectionData.payload))),
flatMap((collectionData: RemoteData<Collection>) => collectionData.payload.license),
find((licenseData: RemoteData<License>) => isNotUndefined((licenseData.payload))))
.subscribe((licenseData: RemoteData<License>) => {
this.licenseText = licenseData.payload.text;
// Retrieve license accepted status
if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) {
(model as DynamicCheckboxModel).valueUpdates.next(true);
} else {
(model as DynamicCheckboxModel).valueUpdates.next(false);
}
// Disable checkbox whether it's in workflow or item scope
this.sectionService.isSectionReadOnly(
this.submissionId,
this.sectionData.id,
this.submissionService.getSubmissionScope()
).pipe(
take(1),
filter((isReadOnly) => isReadOnly))
.subscribe(() => {
model.disabledUpdates.next(true);
});
this.changeDetectorRef.detectChanges();
// Disable checkbox whether it's in workflow or item scope
this.sectionService.isSectionReadOnly(
this.submissionId,
this.sectionData.id,
this.submissionService.getSubmissionScope()
).pipe(
take(1),
filter((isReadOnly) => isReadOnly))
.subscribe(() => {
model.disabledUpdates.next(true);
}),
this.sectionService.getSectionErrors(this.submissionId, this.sectionData.id).pipe(
@@ -108,7 +106,7 @@ export class LicenseSectionComponent extends SectionModelComponent {
if (error.path === '/sections/license') {
// check whether license is not accepted
if (!(model as DynamicCheckboxModel).checked) {
return Object.assign({}, error, {path: '/sections/license/granted'});
return Object.assign({}, error, { path: '/sections/license/granted' });
} else {
return null;
}