sending name variant update requests to the server

This commit is contained in:
lotte
2019-11-06 16:43:25 +01:00
parent 5a6a0eac6f
commit 836492d2af
4 changed files with 67 additions and 39 deletions

View File

@@ -184,17 +184,19 @@ export abstract class DataService<T extends CacheableObject> {
* @return {Observable<RemoteData<PaginatedList<T>>}
* Return an observable that emits response from the server
*/
protected searchBy(searchMethod: string, options: FindAllOptions = {}): Observable<RemoteData<PaginatedList<T>>> {
protected searchBy(searchMethod: string, options: FindAllOptions = {}, refresh: boolean = false): Observable<RemoteData<PaginatedList<T>>> {
const hrefObs = this.getSearchByHref(searchMethod, options);
hrefObs.pipe(
first((href: string) => hasValue(href)))
find((href: string) => hasValue(href)))
.subscribe((href: string) => {
if (refresh) {
this.requestService.removeByHrefSubstring(href);
}
const request = new FindAllRequest(this.requestService.generateRequestId(), href, options);
this.requestService.configure(request, true);
});
return this.rdbService.buildList<T>(hrefObs) as Observable<RemoteData<PaginatedList<T>>>;
}
@@ -219,7 +221,7 @@ export abstract class DataService<T extends CacheableObject> {
if (isNotEmpty(operations)) {
this.objectCache.addPatch(object.self, operations);
}
return this.findById(object.uuid);
return this.findByHref(object.self);
}
));

View File

@@ -26,9 +26,9 @@ import { HttpClient, HttpHeaders } from '@angular/common/http';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
import { SearchParam } from '../cache/models/search-param.model';
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
import { RemoveNameVariantAction, SetNameVariantAction } from '../../shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/relationship.actions';
import { AppState, keySelector } from '../../app.reducer';
import { NameVariantListState, RelationshipState } 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';
const relationshipListsStateSelector = (state: AppState) => state.relationshipLists;
@@ -37,8 +37,8 @@ const relationshipListStateSelector = (listID: string): MemoizedSelector<AppStat
return keySelector<NameVariantListState>(listID, relationshipListsStateSelector);
};
const relationshipStateSelector = (listID: string, itemID: string): MemoizedSelector<AppState, RelationshipState> => {
return keySelector<RelationshipState>(itemID, relationshipListStateSelector(listID));
const relationshipStateSelector = (listID: string, itemID: string): MemoizedSelector<AppState, string> => {
return keySelector<string>(itemID, relationshipListStateSelector(listID));
};
/**
@@ -225,7 +225,7 @@ export class RelationshipService extends DataService<Relationship> {
} else {
findAllOptions.searchParams = searchParams;
}
return this.searchBy('byLabel', findAllOptions);
return this.searchBy('byLabel', findAllOptions, true);
}
/**
@@ -263,6 +263,7 @@ export class RelationshipService extends DataService<Relationship> {
return this.getItemRelationshipsByLabel(item1, label)
.pipe(
getSucceededRemoteData(),
tap((t) => console.log(t)),
map((relationshipListRD: RemoteData<PaginatedList<Relationship>>) => relationshipListRD.payload.page),
mergeMap((relationships: Relationship[]) => {
return observableCombineLatest(...relationships.map((relationship: Relationship) => {
@@ -293,7 +294,7 @@ export class RelationshipService extends DataService<Relationship> {
public getNameVariant(listID: string, itemID: string): Observable<string> {
return this.appStore.pipe(
select(relationshipStateSelector(listID, itemID)), tap((t) => console.log(t)), map((state: RelationshipState) => hasValue(state) ? state.nameVariant : undefined)
select(relationshipStateSelector(listID, itemID))
);
}
@@ -304,4 +305,29 @@ export class RelationshipService extends DataService<Relationship> {
public getNameVariantsByListID(listID: string) {
return this.appStore.pipe(select(relationshipListStateSelector(listID)));
}
public updateNameVariant(item1: Item, item2: Item, relationshipLabel: string, nameVariant: string): Observable<RemoteData<Relationship>> {
return this.getRelationshipByItemsAndLabel(item1, item2, relationshipLabel)
.pipe(
switchMap((relation: Relationship) =>
relation.relationshipType.pipe(
getSucceededRemoteData(),
getRemoteDataPayload(),
map(type => {
return { relation, type }
})
)
),
switchMap((relationshipAndType: {relation: Relationship, type: RelationshipType}) => {
const { relation, type } = relationshipAndType;
let updatedRelationship;
if (relationshipLabel === type.leftwardType) {
updatedRelationship = Object.assign(new Relationship(), relation, { rightWardValue: nameVariant });
} else {
updatedRelationship = Object.assign(new Relationship(), relation, { leftWardValue: nameVariant });
}
return this.update(updatedRelationship);
})
)
}
}

View File

@@ -47,6 +47,7 @@ export const getResponseFromEntry = () =>
export const getResourceLinksFromResponse = () =>
(source: Observable<RequestEntry>): Observable<string[]> =>
source.pipe(
tap((t) => console.log(t)),
filterSuccessfulResponses(),
map((response: DSOSuccessResponse) => response.resourceSelfLinks),
);

View File

@@ -47,7 +47,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit {
metadataFields: string;
subMap: {
[uuid: string]: Subscription
};
} = {};
constructor(
public modal: NgbActiveModal,
@@ -78,7 +78,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit {
this.subMap[sri.indexableObject.uuid] = nameVariant$
.pipe(skip(1))
.subscribe((nameVariant: string) =>
this.relationshipService.updateNameVariant(this.item, sri.indexableObject, this.relationshipOptions.relationshipType, nameVariant)
this.relationshipService.updateNameVariant(this.item, sri.indexableObject, this.relationshipOptions.relationshipType, nameVariant).subscribe()
);
return nameVariant$
.pipe(
@@ -97,7 +97,6 @@ export class DsDynamicLookupRelationModalComponent implements OnInit {
.subscribe((obs: any[]) => {
return obs.forEach((object: any) => {
this.store.dispatch(new AddRelationshipAction(this.item, object.item, this.relationshipOptions.relationshipType, object.nameVariant));
this.addSelectSubscription(object);
}
);
})
@@ -107,39 +106,39 @@ export class DsDynamicLookupRelationModalComponent implements OnInit {
deselect(...selectableObjects: SearchResult<Item>[]) {
this.zone.runOutsideAngular(
() => selectableObjects.forEach((object) => {
this.subMap[object.indexableObject.uuid].unsubscribe();
this.store.dispatch(new RemoveRelationshipAction(this.item, object.indexableObject, this.relationshipOptions.relationshipType));
this.addSelectSubscription(object);
})
)
;
}
subscriptions = new Map<string, Subscription>();
// subscriptions = new Map<string, Subscription>();
//
// addSelectSubscription(itemSR: SearchResult<Item>) {
// const nameVariant$ = this.relationshipService.getNameVariant(this.listId, itemSR.indexableObject.uuid).pipe(hasValueOperator());
// const subscription = nameVariant$
// .pipe(
// switchMap((nameVariant: string) => {
// return this.relationshipService.getRelationshipByItemsAndLabel(this.item, itemSR.indexableObject, this.relationshipOptions.relationshipType)
// .pipe(map((relationship: Relationship) => Object.assign(new Relationship(), relationship, { leftwardValue: nameVariant })))
// }),
// switchMap((updatedRelation: Relationship) => this.relationshipService.update(updatedRelation))
// )
// .subscribe();
// this.subscriptions.set(itemSR.indexableObject.uuid, subscription);
// }
addSelectSubscription(itemSR: SearchResult<Item>) {
const nameVariant$ = this.relationshipService.getNameVariant(this.listId, itemSR.indexableObject.uuid).pipe(hasValueOperator());
const subscription = nameVariant$
.pipe(
switchMap((nameVariant: string) => {
return this.relationshipService.getRelationshipByItemsAndLabel(this.item, itemSR.indexableObject, this.relationshipOptions.relationshipType)
.pipe(map((relationship: Relationship) => Object.assign(new Relationship(), relationship, { leftwardValue: nameVariant })))
}),
switchMap((updatedRelation: Relationship) => this.relationshipService.update(updatedRelation))
)
.subscribe();
this.subscriptions.set(itemSR.indexableObject.uuid, subscription);
}
removeSelectSubscription(itemSR: SearchResult<Item>) {
this.subscriptions.get(itemSR.indexableObject.uuid).unsubscribe();
}
ngOnDestroy() {
let sub;
while (sub = this.subscriptions.values().next(), !sub.done) {
sub.unsubscribe();
}
}
// removeSelectSubscription(itemSR: SearchResult<Item>) {
// this.subscriptions.get(itemSR.indexableObject.uuid).unsubscribe();
// }
//
// ngOnDestroy() {
// let sub;
// while (sub = this.subscriptions.values().next(), !sub.done) {
// sub.unsubscribe();
// }
// }
setExistingNameVariants() {
const virtualMDs$: Observable<MetadataValue[]> = this.item.allMetadata(this.metadataFields).filter((mdValue) => mdValue.isVirtual);