diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts index 54ad0d58a..c011cad6d 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts @@ -56,7 +56,10 @@ export class MetadataSourceBase implements Wizard { }; parser(changes: Partial, schema?: any): any { - if (!changes.organization) { + if (!schema || !schema.properties) { + return changes; + } + if (schema.properties.hasOwnProperty('organization') && !changes.organization) { changes.organization = {}; } return changes; diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts index 1a8d0d648..b00263ea8 100644 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts @@ -98,9 +98,23 @@ export class ResolverEditStepComponent implements OnDestroy { this.valueChangeEmitted$.pipe( takeUntil(this.ngUnsubscribe), map(changes => changes.value), - withLatestFrom(this.definition$, this.store.select(fromResolver.getSelectedResolver), this.changes$), + withLatestFrom( + this.definition$, + this.store.select(fromResolver.getSelectedResolver), + this.changes$, + this.schema$ + ), filter(([valueChange, definition, resolver]) => definition && resolver), - map(([valueChange, definition, resolver, changes]) => definition.parser({ ...resolver, ...changes, ...valueChange })) + map(([ + valueChange, + definition, + resolver, + changes, + schema + ]) => { + const parsed = definition.parser({ ...valueChange }, schema); + return { ...resolver, ...changes, ...parsed }; + }) ) .subscribe(changes => { this.store.dispatch(new UpdateChangesRequest(changes)); diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts index 68840c70e..f33f0f958 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts @@ -77,9 +77,16 @@ export class ResolverWizardStepComponent implements OnDestroy { ); this.valueChangeEmitted$.pipe( - withLatestFrom(this.definition$), + withLatestFrom( + this.definition$, + this.schema$, + this.store.select(fromResolver.getSelectedDraft) + ), filter(([ changes, definition ]) => (!!definition && !!changes)), - map(([ changes, definition ]) => definition.parser(changes.value)) + map(([ changes, definition, schema, original ]) => { + const parsed = definition.parser(changes.value, schema); + return { ...original, ...parsed }; + }) ) .subscribe(changes => { this.store.dispatch(new UpdateChangesRequest(changes)); diff --git a/ui/src/app/metadata/resolver/effect/entity.effect.ts b/ui/src/app/metadata/resolver/effect/entity.effect.ts index d28f8a3db..4ad8bb586 100644 --- a/ui/src/app/metadata/resolver/effect/entity.effect.ts +++ b/ui/src/app/metadata/resolver/effect/entity.effect.ts @@ -32,16 +32,10 @@ export class EntityEffects { ofType(ResolverEntityActionTypes.UPDATE_CHANGES_REQUEST), map(action => action.payload), withLatestFrom( - this.store.select(fromResolver.getEntityChanges), - this.store.select(fromWizard.getSchema) + this.store.select(fromResolver.getEntityChanges) ), - map(([changes, stored, schema]) => { - const props = Object.keys(schema.properties); - const diffed = props.reduce((changeObj, prop) => { - changeObj[prop] = !changes.hasOwnProperty(prop) && stored.hasOwnProperty(prop) ? null : changes[prop]; - return changeObj; - }, {}); - const update = { ...stored, ...diffed }; + map(([changes, storedChanges]) => { + const update = { ...storedChanges, ...changes }; return new UpdateChangesSuccess(update); }) ); diff --git a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts index 37fd58bb9..82addcdbd 100644 --- a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts +++ b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts @@ -38,7 +38,9 @@ export function reducer(state = initialState, action: ResolverCollectionActionsU } case ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS: { - return adapter.updateOne(action.payload, state); + const removed = adapter.removeOne(action.payload.id as string, state); + const addBack = adapter.upsertOne(action.payload.changes as MetadataResolver, removed); + return addBack; } case ResolverCollectionActionTypes.SELECT_SUCCESS: {