fix infinite loop

This commit is contained in:
Art Lowel
2019-12-03 14:46:33 +01:00
parent ef1ed04fd2
commit 71a3a22a7c
2 changed files with 78 additions and 45 deletions

View File

@@ -1,34 +1,61 @@
import { Injectable } from '@angular/core';
import { RequestService } from './request.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { hasValue, hasValueOperator, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util';
import { distinctUntilChanged, filter, map, mergeMap, skipWhile, startWith, switchMap, take, tap } from 'rxjs/operators';
import { configureRequest, getRemoteDataPayload, getResponseFromEntry, getSucceededRemoteData } from '../shared/operators';
import { DeleteRequest, FindAllOptions, PostRequest, RestRequest } from './request.models';
import { Observable } from 'rxjs/internal/Observable';
import { RestResponse } from '../cache/response.models';
import { Item } from '../shared/item.model';
import { Relationship } from '../shared/item-relationships/relationship.model';
import { RelationshipType } from '../shared/item-relationships/relationship-type.model';
import { RemoteData } from './remote-data';
import { combineLatest, combineLatest as observableCombineLatest } from 'rxjs';
import { PaginatedList } from './paginated-list';
import { ItemDataService } from './item-data.service';
import { compareArraysUsingIds, paginatedRelationsToItems, relationsToItems } from '../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ObjectCacheService } from '../cache/object-cache.service';
import { DataService } from './data.service';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { MemoizedSelector, select, Store } from '@ngrx/store';
import { CoreState } from '../core.reducers';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpHeaders } from '@angular/common/http';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { Injectable } from '@angular/core';
import { SearchParam } from '../cache/models/search-param.model'; import { MemoizedSelector, select, Store } from '@ngrx/store';
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; import { combineLatest, combineLatest as observableCombineLatest } from 'rxjs';
import { Observable } from 'rxjs/internal/Observable';
import {
distinctUntilChanged,
filter,
map,
mergeMap,
startWith,
switchMap,
take,
tap
} from 'rxjs/operators';
import {
compareArraysUsingIds,
paginatedRelationsToItems,
relationsToItems
} from '../../+item-page/simple/item-types/shared/item-relationships-utils';
import { AppState, keySelector } from '../../app.reducer'; import { AppState, keySelector } from '../../app.reducer';
import {
hasValue,
hasValueOperator,
isNotEmpty,
isNotEmptyOperator
} from '../../shared/empty.util';
import { ReorderableRelationship } from '../../shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component';
import {
RemoveNameVariantAction,
SetNameVariantAction
} from '../../shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/name-variant.actions';
import { NameVariantListState } from '../../shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/name-variant.reducer'; import { NameVariantListState } from '../../shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/name-variant.reducer';
import { RemoveNameVariantAction, SetNameVariantAction } from '../../shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/name-variant.actions'; import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { SearchParam } from '../cache/models/search-param.model';
import { ObjectCacheService } from '../cache/object-cache.service';
import { RestResponse } from '../cache/response.models';
import { CoreState } from '../core.reducers';
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { RelationshipType } from '../shared/item-relationships/relationship-type.model';
import { Relationship } from '../shared/item-relationships/relationship.model';
import { Item } from '../shared/item.model';
import {
configureRequest,
getRemoteDataPayload,
getResponseFromEntry,
getSucceededRemoteData
} from '../shared/operators';
import { DataService } from './data.service';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
import { ItemDataService } from './item-data.service';
import { PaginatedList } from './paginated-list';
import { RemoteData, RemoteDataState } from './remote-data';
import { DeleteRequest, FindAllOptions, PostRequest, RestRequest } from './request.models';
import { RequestService } from './request.service';
const relationshipListsStateSelector = (state: AppState) => state.relationshipLists; const relationshipListsStateSelector = (state: AppState) => state.relationshipLists;
@@ -116,9 +143,9 @@ export class RelationshipService extends DataService<Relationship> {
this.findById(relationshipId).pipe( this.findById(relationshipId).pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
switchMap((relationship: Relationship) => combineLatest( switchMap((rel: Relationship) => combineLatest(
relationship.leftItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()), rel.leftItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()),
relationship.rightItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()) rel.rightItem.pipe(getSucceededRemoteData(), getRemoteDataPayload())
) )
), ),
take(1) take(1)
@@ -336,20 +363,26 @@ export class RelationshipService extends DataService<Relationship> {
) )
} }
public updatePlace(relationship: Relationship, newIndex: number, left: boolean): Observable<RemoteData<Relationship>> { public updatePlace(reoRel: ReorderableRelationship): Observable<RemoteData<Relationship>> {
let updatedRelationship; let updatedRelationship;
if (left) { if (reoRel.useLeftItem) {
updatedRelationship = Object.assign(new Relationship(), relationship, { leftPlace: newIndex }); updatedRelationship = Object.assign(new Relationship(), reoRel.relationship, { rightPlace: reoRel.newIndex });
} else { } else {
updatedRelationship = Object.assign(new Relationship(), relationship, { rightPlace: newIndex }); updatedRelationship = Object.assign(new Relationship(), reoRel.relationship, { leftPlace: reoRel.newIndex });
} }
return this.update(updatedRelationship).pipe(
tap((relationshipRD: RemoteData<Relationship>) => { const update$ = this.update(updatedRelationship);
if (relationshipRD.hasSucceeded) {
this.removeRelationshipItemsFromCacheByRelationship(relationship.id); update$.pipe(
} filter((relationshipRD: RemoteData<Relationship>) => relationshipRD.state === RemoteDataState.ResponsePending),
}) take(1),
); ).subscribe((relationshipRD: RemoteData<Relationship>) => {
if (relationshipRD.state === RemoteDataState.ResponsePending) {
this.removeRelationshipItemsFromCacheByRelationship(reoRel.relationship.id);
}
});
return update$;
} }
} }

View File

@@ -340,16 +340,16 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
moveSelection(event: CdkDragDrop<Relationship>) { moveSelection(event: CdkDragDrop<Relationship>) {
this.zone.runOutsideAngular(() => { this.zone.runOutsideAngular(() => {
moveItemInArray(this.reorderables, event.previousIndex, event.currentIndex); moveItemInArray(this.reorderables, event.previousIndex, event.currentIndex);
const relationships = this.reorderables.map((reo: Reorderable, index: number) => { const reorderables = this.reorderables.map((reo: Reorderable, index: number) => {
reo.oldIndex = reo.getPlace(); reo.oldIndex = reo.getPlace();
reo.newIndex = index; reo.newIndex = index;
return reo; return reo;
} }
); );
return observableCombineLatest(relationships.map((rel: ReorderableRelationship) => { return observableCombineLatest(reorderables.map((rel: ReorderableRelationship) => {
console.log(rel); console.log(rel);
if (rel.oldIndex !== rel.newIndex) { if (rel.oldIndex !== rel.newIndex) {
return this.relationshipService.updatePlace(rel.relationship, rel.newIndex, !rel.useLeftItem); return this.relationshipService.updatePlace(rel);
} else { } else {
return observableOf(undefined); return observableOf(undefined);
} }