65272: filter relationship metadata when displaying on item-metadata, keep them stored in the object-updates store

This commit is contained in:
Kristof De Langhe
2020-02-11 14:55:08 +01:00
parent 1885845fef
commit e3facbd8c8
5 changed files with 14 additions and 22 deletions

View File

@@ -100,7 +100,7 @@ export class ItemMetadataComponent extends AbstractItemUpdateComponent {
* Sends all initial values of this item to the object updates service
*/
public initializeOriginalFields() {
this.objectUpdatesService.initialize(this.url, this.getMetadataAsListExcludingRelationships(), this.item.lastModified);
this.objectUpdatesService.initialize(this.url, this.item.metadataAsList, this.item.lastModified);
}
/**
@@ -110,12 +110,12 @@ export class ItemMetadataComponent extends AbstractItemUpdateComponent {
public submit() {
this.isValid().pipe(first()).subscribe((isValid) => {
if (isValid) {
const metadata$: Observable<Identifiable[]> = this.objectUpdatesService.getUpdatedFields(this.url, this.getMetadataAsListExcludingRelationships()) as Observable<MetadatumViewModel[]>;
const metadata$: Observable<Identifiable[]> = this.objectUpdatesService.getUpdatedFields(this.url, this.item.metadataAsList) as Observable<MetadatumViewModel[]>;
metadata$.pipe(
first(),
switchMap((metadata: MetadatumViewModel[]) => {
const updatedItem: Item = Object.assign(cloneDeep(this.item), { metadata: Metadata.toMetadataMap(metadata) });
return this.updateService.update(updatedItem, ['relation.*', 'relationship.*']);
return this.updateService.update(updatedItem);
}),
tap(() => this.updateService.commitUpdates()),
getSucceededRemoteData()

View File

@@ -261,26 +261,14 @@ export abstract class DataService<T extends CacheableObject> implements UpdateDa
* Add a new patch to the object cache
* The patch is derived from the differences between the given object and its version in the object cache
* @param {DSpaceObject} object The given object
* @param ignoreMetadataFields An optional list of metadata fields to ignore updates for (* is allowed as a wildcard, for example: dc.description.*)
*/
update(object: T, ignoreMetadataFields: string[] = []): Observable<RemoteData<T>> {
const ignoreMetadataFieldsPrefix = ignoreMetadataFields.map((field) => field.indexOf('*') > -1 ? field.slice(0, field.indexOf('*')) : field);
update(object: T): Observable<RemoteData<T>> {
const oldVersion$ = this.findByHref(object.self);
return oldVersion$.pipe(
getSucceededRemoteData(),
getRemoteDataPayload(),
mergeMap((oldVersion: T) => {
// Fetch operations from difference between old version and new version
// Filter out any metadata operations for a field specified under ignoreMetadataFields
const operations = this.comparator.diff(oldVersion, object).filter((operation) => {
let ignoredFieldFound = false;
ignoreMetadataFieldsPrefix.forEach((fieldPrefix) => {
if (operation.path.indexOf('/metadata/' + fieldPrefix) > -1) {
ignoredFieldFound = true;
}
});
return !ignoredFieldFound;
});
const operations = this.comparator.diff(oldVersion, object);
if (isNotEmpty(operations)) {
this.objectCache.addPatch(object.self, operations);
}

View File

@@ -158,8 +158,8 @@ export class ItemTemplateDataService implements UpdateDataService<Item> {
/**
* Add a new patch to the object cache
*/
update(object: Item, ignoreMetadataFields: string[] = []): Observable<RemoteData<Item>> {
return this.dataService.update(object, ignoreMetadataFields);
update(object: Item): Observable<RemoteData<Item>> {
return this.dataService.update(object);
}
/**

View File

@@ -97,9 +97,13 @@ export class ObjectUpdatesService {
let fieldUpdate = objectEntry.fieldUpdates[uuid];
if (isEmpty(fieldUpdate)) {
const identifiable = initialFields.find((object: Identifiable) => object.uuid === uuid);
fieldUpdate = { field: identifiable, changeType: undefined };
if (hasValue(identifiable)) {
fieldUpdate = {field: identifiable, changeType: undefined};
}
}
if (hasValue(fieldUpdate)) {
fieldUpdates[uuid] = fieldUpdate;
}
fieldUpdates[uuid] = fieldUpdate;
});
return fieldUpdates;
}))

View File

@@ -6,6 +6,6 @@ import { RestRequestMethod } from './rest-request-method';
* Represents a data service to update a given object
*/
export interface UpdateDataService<T> {
update(object: T, ignoreMetadataFields?: string[]): Observable<RemoteData<T>>;
update(object: T): Observable<RemoteData<T>>;
commitUpdates(method?: RestRequestMethod);
}