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