mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-14 13:33:03 +00:00
65272: filter relationship metadata when displaying on item-metadata, keep them stored in the object-updates store
This commit is contained in:
@@ -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()
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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;
|
||||
}))
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user