forked from hazza/dspace-angular
Fixed subscriptions
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
[disabled]="(disabled$ | async)"
|
[disabled]="(disabled$ | async)"
|
||||||
ngbDropdownToggle>
|
ngbDropdownToggle>
|
||||||
<span *ngIf="(disabled$ | async)"><i class='fas fa-circle-notch fa-spin'></i></span>
|
<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>
|
</button>
|
||||||
|
|
||||||
<div ngbDropdownMenu
|
<div ngbDropdownMenu
|
||||||
|
@@ -11,7 +11,7 @@ import {
|
|||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { FormControl } from '@angular/forms';
|
import { FormControl } from '@angular/forms';
|
||||||
|
|
||||||
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
|
import { BehaviorSubject, combineLatest, Observable, of as observableOf, Subscription } from 'rxjs';
|
||||||
import {
|
import {
|
||||||
debounceTime,
|
debounceTime,
|
||||||
distinctUntilChanged,
|
distinctUntilChanged,
|
||||||
@@ -21,11 +21,9 @@ import {
|
|||||||
map,
|
map,
|
||||||
mergeMap,
|
mergeMap,
|
||||||
reduce,
|
reduce,
|
||||||
startWith,
|
startWith
|
||||||
tap
|
|
||||||
} from 'rxjs/operators';
|
} from 'rxjs/operators';
|
||||||
|
|
||||||
import { isNullOrUndefined } from 'util';
|
|
||||||
import { Collection } from '../../../core/shared/collection.model';
|
import { Collection } from '../../../core/shared/collection.model';
|
||||||
import { CommunityDataService } from '../../../core/data/community-data.service';
|
import { CommunityDataService } from '../../../core/data/community-data.service';
|
||||||
import { Community } from '../../../core/shared/community.model';
|
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 { RemoteData } from '../../../core/data/remote-data';
|
||||||
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
|
||||||
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
|
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 { PaginatedList } from '../../../core/data/paginated-list';
|
||||||
import { SubmissionService } from '../../submission.service';
|
import { SubmissionService } from '../../submission.service';
|
||||||
import { SubmissionObject } from '../../../core/submission/models/submission-object.model';
|
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.
|
* 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 disabled$ = new BehaviorSubject<boolean>(true);
|
||||||
public model: any;
|
public model: any;
|
||||||
@@ -71,14 +68,13 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
|
|||||||
public searchListCollection$: Observable<CollectionListEntry[]>;
|
public searchListCollection$: Observable<CollectionListEntry[]>;
|
||||||
public selectedCollectionId: string;
|
public selectedCollectionId: string;
|
||||||
public selectedCollectionName: string;
|
public selectedCollectionName: string;
|
||||||
|
public selectedCollectionName$: Observable<string>;
|
||||||
|
|
||||||
protected pathCombiner: JsonPatchOperationPathCombiner;
|
protected pathCombiner: JsonPatchOperationPathCombiner;
|
||||||
private scrollableBottom = false;
|
private scrollableBottom = false;
|
||||||
private scrollableTop = false;
|
private scrollableTop = false;
|
||||||
private subs: Subscription[] = [];
|
private subs: Subscription[] = [];
|
||||||
|
|
||||||
formatter = (x: { collection: string }) => x.collection;
|
|
||||||
|
|
||||||
constructor(protected cdr: ChangeDetectorRef,
|
constructor(protected cdr: ChangeDetectorRef,
|
||||||
private communityDataService: CommunityDataService,
|
private communityDataService: CommunityDataService,
|
||||||
private operationsBuilder: JsonPatchOperationsBuilder,
|
private operationsBuilder: JsonPatchOperationsBuilder,
|
||||||
@@ -104,21 +100,19 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
|
|||||||
if (hasValue(changes.currentCollectionId)
|
if (hasValue(changes.currentCollectionId)
|
||||||
&& hasValue(changes.currentCollectionId.currentValue)) {
|
&& hasValue(changes.currentCollectionId.currentValue)) {
|
||||||
this.selectedCollectionId = this.currentCollectionId;
|
this.selectedCollectionId = this.currentCollectionId;
|
||||||
|
|
||||||
// @TODO replace with search/top browse endpoint
|
// @TODO replace with search/top browse endpoint
|
||||||
// @TODO implement community/subcommunity hierarchy
|
// @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)),
|
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) => {
|
flatMap((communityData: Community) => {
|
||||||
return communityData.collections.pipe(
|
return communityData.collections.pipe(
|
||||||
find((collections: RemoteData<PaginatedList<Collection>>) => !collections.isResponsePending && collections.hasSucceeded),
|
find((collections: RemoteData<PaginatedList<Collection>>) => !collections.isResponsePending && collections.hasSucceeded),
|
||||||
mergeMap((collections: RemoteData<PaginatedList<Collection>>) => collections.payload.page),
|
mergeMap((collections: RemoteData<PaginatedList<Collection>>) => collections.payload.page),
|
||||||
filter((collectionData: Collection) => isNotEmpty(collectionData)),
|
filter((collectionData: Collection) => isNotEmpty(collectionData)),
|
||||||
tap((collectionData: Collection) => {
|
|
||||||
if (collectionData.id === this.selectedCollectionId) {
|
|
||||||
this.selectedCollectionName = collectionData.name;
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
map((collectionData: Collection) => ({
|
map((collectionData: Collection) => ({
|
||||||
communities: [{id: communityData.id, name: communityData.name}],
|
communities: [{id: communityData.id, name: communityData.name}],
|
||||||
collection: {id: collectionData.id, name: collectionData.name}
|
collection: {id: collectionData.id, name: collectionData.name}
|
||||||
@@ -129,6 +123,19 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
|
|||||||
startWith([])
|
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(
|
const searchTerm$ = this.searchField.valueChanges.pipe(
|
||||||
debounceTime(200),
|
debounceTime(200),
|
||||||
distinctUntilChanged(),
|
distinctUntilChanged(),
|
||||||
@@ -138,7 +145,7 @@ export class SubmissionFormCollectionComponent implements OnChanges, OnInit {
|
|||||||
this.searchListCollection$ = combineLatest(searchTerm$, listCollection$).pipe(
|
this.searchListCollection$ = combineLatest(searchTerm$, listCollection$).pipe(
|
||||||
map(([searchTerm, listCollection]) => {
|
map(([searchTerm, listCollection]) => {
|
||||||
this.disabled$.next(isEmpty(listCollection));
|
this.disabled$.next(isEmpty(listCollection));
|
||||||
if (searchTerm === '' || isNullOrUndefined(searchTerm)) {
|
if (isEmpty(searchTerm)) {
|
||||||
return listCollection;
|
return listCollection;
|
||||||
} else {
|
} else {
|
||||||
return listCollection.filter((v) => v.collection.name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1).slice(0, 5)
|
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[]) => {
|
.subscribe((submissionObject: SubmissionObject[]) => {
|
||||||
this.selectedCollectionId = event.collection.id;
|
this.selectedCollectionId = event.collection.id;
|
||||||
this.selectedCollectionName = event.collection.name;
|
this.selectedCollectionName = event.collection.name;
|
||||||
|
this.selectedCollectionName$ = observableOf(event.collection.name);
|
||||||
this.collectionChange.emit(submissionObject[0]);
|
this.collectionChange.emit(submissionObject[0]);
|
||||||
this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id);
|
this.submissionService.changeSubmissionCollection(this.submissionId, event.collection.id);
|
||||||
this.disabled$.next(false);
|
this.disabled$.next(false);
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<span class="mb-5">{{ licenseText }}</span>
|
<span class="mb-5">{{ licenseText$ | async }}</span>
|
||||||
<br> <br>
|
<br> <br>
|
||||||
<ds-form *ngIf="formModel" #formRef="formComponent"
|
<ds-form *ngIf="formModel" #formRef="formComponent"
|
||||||
[formId]="formId"
|
[formId]="formId"
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
|
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
|
||||||
|
|
||||||
import { Observable, Subscription } from 'rxjs';
|
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 {
|
import {
|
||||||
DynamicCheckboxModel,
|
DynamicCheckboxModel,
|
||||||
DynamicFormControlEvent,
|
DynamicFormControlEvent,
|
||||||
@@ -41,7 +41,7 @@ export class LicenseSectionComponent extends SectionModelComponent {
|
|||||||
public formModel: DynamicFormControlModel[];
|
public formModel: DynamicFormControlModel[];
|
||||||
public formLayout: DynamicFormLayout = SECTION_LICENSE_FORM_LAYOUT;
|
public formLayout: DynamicFormLayout = SECTION_LICENSE_FORM_LAYOUT;
|
||||||
public displaySubmit = false;
|
public displaySubmit = false;
|
||||||
public licenseText: string;
|
public licenseText$: Observable<string>;
|
||||||
|
|
||||||
protected pathCombiner: JsonPatchOperationPathCombiner;
|
protected pathCombiner: JsonPatchOperationPathCombiner;
|
||||||
protected subs: Subscription[] = [];
|
protected subs: Subscription[] = [];
|
||||||
@@ -68,33 +68,31 @@ export class LicenseSectionComponent extends SectionModelComponent {
|
|||||||
this.formModel = this.formBuilderService.fromJSON(SECTION_LICENSE_FORM_MODEL);
|
this.formModel = this.formBuilderService.fromJSON(SECTION_LICENSE_FORM_MODEL);
|
||||||
const model = this.formBuilderService.findById('granted', this.formModel);
|
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.subs.push(
|
||||||
this.collectionDataService.findById(this.collectionId).pipe(
|
// Disable checkbox whether it's in workflow or item scope
|
||||||
filter((collectionData: RemoteData<Collection>) => isNotUndefined((collectionData.payload))),
|
this.sectionService.isSectionReadOnly(
|
||||||
flatMap((collectionData: RemoteData<Collection>) => collectionData.payload.license),
|
this.submissionId,
|
||||||
find((licenseData: RemoteData<License>) => isNotUndefined((licenseData.payload))))
|
this.sectionData.id,
|
||||||
.subscribe((licenseData: RemoteData<License>) => {
|
this.submissionService.getSubmissionScope()
|
||||||
this.licenseText = licenseData.payload.text;
|
).pipe(
|
||||||
|
take(1),
|
||||||
// Retrieve license accepted status
|
filter((isReadOnly) => isReadOnly))
|
||||||
if ((this.sectionData.data as WorkspaceitemSectionLicenseObject).granted) {
|
.subscribe(() => {
|
||||||
(model as DynamicCheckboxModel).valueUpdates.next(true);
|
model.disabledUpdates.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();
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
this.sectionService.getSectionErrors(this.submissionId, this.sectionData.id).pipe(
|
this.sectionService.getSectionErrors(this.submissionId, this.sectionData.id).pipe(
|
||||||
@@ -108,7 +106,7 @@ export class LicenseSectionComponent extends SectionModelComponent {
|
|||||||
if (error.path === '/sections/license') {
|
if (error.path === '/sections/license') {
|
||||||
// check whether license is not accepted
|
// check whether license is not accepted
|
||||||
if (!(model as DynamicCheckboxModel).checked) {
|
if (!(model as DynamicCheckboxModel).checked) {
|
||||||
return Object.assign({}, error, {path: '/sections/license/granted'});
|
return Object.assign({}, error, { path: '/sections/license/granted' });
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user