mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
Fixed subscriptions
This commit is contained in:
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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"
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user