fix a number of issues with name variants

This commit is contained in:
Art Lowel
2020-04-03 17:28:13 +02:00
parent 62002f94ef
commit f64eff42f4
13 changed files with 116 additions and 62 deletions

View File

@@ -83,7 +83,12 @@ import { SelectableListService } from '../../../object-list/selectable-list/sele
import { DsDynamicDisabledComponent } from './models/disabled/dynamic-disabled.component';
import { DYNAMIC_FORM_CONTROL_TYPE_DISABLED } from './models/disabled/dynamic-disabled.model';
import { DsDynamicLookupRelationModalComponent } from './relation-lookup-modal/dynamic-lookup-relation-modal.component';
import { getAllSucceededRemoteData, getRemoteDataPayload, getSucceededRemoteData } from '../../../../core/shared/operators';
import {
getAllSucceededRemoteData,
getRemoteDataPayload,
getSucceededRemoteData,
getAllSucceededRemoteDataPayload, getPaginatedListPayload, getFirstSucceededRemoteDataPayload
} from '../../../../core/shared/operators';
import { RemoteData } from '../../../../core/data/remote-data';
import { Item } from '../../../../core/shared/item.model';
import { ItemDataService } from '../../../../core/data/item-data.service';
@@ -95,11 +100,13 @@ import { PaginatedList } from '../../../../core/data/paginated-list';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import { Collection } from '../../../../core/shared/collection.model';
import { MetadataValue } from '../../../../core/shared/metadata.models';
import { MetadataValue, VIRTUAL_METADATA_PREFIX } from '../../../../core/shared/metadata.models';
import { FormService } from '../../form.service';
import { SelectableListState } from '../../../object-list/selectable-list/selectable-list.reducer';
import { SubmissionService } from '../../../../submission/submission.service';
import { followLink } from '../../../utils/follow-link-config.model';
import { paginatedRelationsToItems } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { RelationshipOptions } from '../models/relationship-options.model';
export function dsDynamicFormControlMapFn(model: DynamicFormControlModel): Type<DynamicFormControl> | null {
switch (model.type) {
@@ -261,13 +268,37 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
}
}
if (this.model.relationshipConfig) {
const relationshipOptions = Object.assign(new RelationshipOptions(), this.model.relationshipConfig);
this.listId = 'list-' + this.model.relationshipConfig.relationshipType;
this.setItem();
const subscription = this.selectableListService.getSelectableList(this.listId).pipe(
find((list: SelectableListState) => hasNoValue(list)),
switchMap(() => this.item$.pipe(take(1))),
switchMap((item) => {
return this.relationshipService.getRelatedItemsByLabel(item, this.model.relationshipConfig.relationshipType).pipe(
const relationshipsRD$ = this.relationshipService.getItemRelationshipsByLabel(item,
this.model.relationshipConfig.relationshipType,
undefined,
followLink('leftItem'),
followLink('rightItem'),
followLink('relationshipType')
);
relationshipsRD$.pipe(
getFirstSucceededRemoteDataPayload(),
getPaginatedListPayload()
).subscribe((relationships: Relationship[]) => {
// set initial namevariants for pre-existing relationships
relationships.forEach((relationship: Relationship) => {
const relationshipMD: MetadataValue = item.firstMetadata(relationshipOptions.metadataField, { authority: `${VIRTUAL_METADATA_PREFIX}${relationship.id}` });
const nameVariantMD: MetadataValue = item.firstMetadata(this.model.metadataFields, { authority: `${VIRTUAL_METADATA_PREFIX}${relationship.id}` });
if (hasValue(relationshipMD) && isNotEmpty(relationshipMD.value) && hasValue(nameVariantMD) && isNotEmpty(nameVariantMD.value)) {
this.relationshipService.setNameVariant(this.listId, relationshipMD.value, nameVariantMD.value);
}
});
});
return relationshipsRD$.pipe(
paginatedRelationsToItems(item.uuid),
getSucceededRemoteData(),
map((items: RemoteData<PaginatedList<Item>>) => items.payload.page.map((i) => Object.assign(new ItemSearchResult(), { indexableObject: i }))),
)

View File

@@ -208,6 +208,7 @@ export class ExistingMetadataListElementComponent implements OnInit, OnChanges,
const relationMD: MetadataValue = this.submissionItem.firstMetadata(this.relationshipOptions.metadataField, { value: this.relatedItem.uuid });
if (hasValue(relationMD)) {
const metadataRepresentationMD: MetadataValue = this.submissionItem.firstMetadata(this.metadataFields, { authority: relationMD.authority });
const nextValue = Object.assign(
new ItemMetadataRepresentation(metadataRepresentationMD),
this.relatedItem

View File

@@ -7,6 +7,7 @@ export interface DynamicRowArrayModelConfig extends DynamicFormArrayModelConfig
submissionId: string;
relationshipConfig: RelationshipOptions;
metadataKey: string;
metadataFields: string[];
}
export class DynamicRowArrayModel extends DynamicFormArrayModel {
@@ -15,6 +16,7 @@ export class DynamicRowArrayModel extends DynamicFormArrayModel {
@serializable() submissionId: string;
@serializable() relationshipConfig: RelationshipOptions;
@serializable() metadataKey: string;
@serializable() metadataFields: string[];
isRowArray = true;
constructor(config: DynamicRowArrayModelConfig, layout?: DynamicFormControlLayout) {
@@ -24,5 +26,6 @@ export class DynamicRowArrayModel extends DynamicFormArrayModel {
this.submissionId = config.submissionId;
this.relationshipConfig = config.relationshipConfig;
this.metadataKey = config.metadataKey;
this.metadataFields = config.metadataFields;
}
}

View File

@@ -20,6 +20,7 @@ import { RequestService } from '../../../../../core/data/request.service';
import { ServerSyncBufferActionTypes } from '../../../../../core/cache/server-sync-buffer.actions';
import { CommitPatchOperationsAction, JsonPatchOperationsActionTypes, PatchOperationsActions } from '../../../../../core/json-patch/json-patch-operations.actions';
import { followLink } from '../../../../utils/follow-link-config.model';
import { RemoteData } from '../../../../../core/data/remote-data';
const DEBOUNCE_TIME = 500;
@@ -101,10 +102,14 @@ export class RelationshipEffects {
if (inProgress) {
this.nameVariantUpdates[identifier] = nameVariant;
} else {
this.relationshipService.updateNameVariant(item1, item2, relationshipType, nameVariant).pipe(take(1))
.subscribe(() => {
this.updateAfterPatchSubmissionId = submissionId;
});
this.relationshipService.updateNameVariant(item1, item2, relationshipType, nameVariant).pipe(
filter((relationshipRD: RemoteData<Relationship>) => hasValue(relationshipRD.payload)),
take(1)
).subscribe(() => {
this.updateAfterPatchSubmissionId = submissionId;
this.relationshipService.refreshRelationshipItemsInCache(item1);
this.relationshipService.refreshRelationshipItemsInCache(item2);
});
}
}
)
@@ -161,8 +166,6 @@ export class RelationshipEffects {
private removeRelationship(item1: Item, item2: Item, relationshipType: string, submissionId: string) {
this.relationshipService.getRelationshipByItemsAndLabel(item1, item2, relationshipType).pipe(
take(1),
hasValueOperator(),
mergeMap((relationship: Relationship) => this.relationshipService.deleteRelationship(relationship.id, 'none')),
take(1),
switchMap(() => this.refreshWorkspaceItemInCache(submissionId)),