Ignore defaultValue update for select fields (#4193)
* Ignore defaultValue update for select fields * Fix tests
This commit is contained in:
@ -21,7 +21,7 @@ describe('transformMetadataForComparison', () => {
|
|||||||
{ name: 'Test2', value: { c: 3 }, extra: 'keepMe' },
|
{ name: 'Test2', value: { c: 3 }, extra: 'keepMe' },
|
||||||
];
|
];
|
||||||
const result = transformMetadataForComparison(input, {
|
const result = transformMetadataForComparison(input, {
|
||||||
propertiesToIgnore: ['ignored'],
|
shouldIgnoreProperty: (property) => ['ignored'].includes(property),
|
||||||
propertiesToStringify: ['value'],
|
propertiesToStringify: ['value'],
|
||||||
keyFactory: (datum) => datum.name,
|
keyFactory: (datum) => datum.name,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -8,7 +8,7 @@ type TransformToString<T, Keys extends keyof T> = {
|
|||||||
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
||||||
fieldMetadataCollection: T[],
|
fieldMetadataCollection: T[],
|
||||||
options: {
|
options: {
|
||||||
propertiesToIgnore?: readonly Keys[];
|
shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
|
||||||
propertiesToStringify?: readonly Keys[];
|
propertiesToStringify?: readonly Keys[];
|
||||||
keyFactory: (datum: T) => string;
|
keyFactory: (datum: T) => string;
|
||||||
},
|
},
|
||||||
@ -18,7 +18,7 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
|
|||||||
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
||||||
fieldMetadataCollection: T,
|
fieldMetadataCollection: T,
|
||||||
options: {
|
options: {
|
||||||
propertiesToIgnore?: readonly Keys[];
|
shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
|
||||||
propertiesToStringify?: readonly Keys[];
|
propertiesToStringify?: readonly Keys[];
|
||||||
},
|
},
|
||||||
): TransformToString<T, Keys>;
|
): TransformToString<T, Keys>;
|
||||||
@ -26,13 +26,11 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
|
|||||||
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
export function transformMetadataForComparison<T, Keys extends keyof T>(
|
||||||
metadata: T[] | T,
|
metadata: T[] | T,
|
||||||
options: {
|
options: {
|
||||||
propertiesToIgnore?: readonly Keys[];
|
shouldIgnoreProperty?: (property: string, originalMetadata?: T) => boolean;
|
||||||
propertiesToStringify?: readonly Keys[];
|
propertiesToStringify?: readonly Keys[];
|
||||||
keyFactory?: (datum: T) => string;
|
keyFactory?: (datum: T) => string;
|
||||||
},
|
},
|
||||||
): Record<string, TransformToString<T, Keys>> | TransformToString<T, Keys> {
|
): Record<string, TransformToString<T, Keys>> | TransformToString<T, Keys> {
|
||||||
const propertiesToIgnore = (options.propertiesToIgnore ??
|
|
||||||
[]) as readonly string[];
|
|
||||||
const propertiesToStringify = (options.propertiesToStringify ??
|
const propertiesToStringify = (options.propertiesToStringify ??
|
||||||
[]) as readonly string[];
|
[]) as readonly string[];
|
||||||
|
|
||||||
@ -40,7 +38,10 @@ export function transformMetadataForComparison<T, Keys extends keyof T>(
|
|||||||
const transformedField = {} as TransformToString<T, Keys>;
|
const transformedField = {} as TransformToString<T, Keys>;
|
||||||
|
|
||||||
for (const property in datum) {
|
for (const property in datum) {
|
||||||
if (propertiesToIgnore.includes(property)) {
|
if (
|
||||||
|
options.shouldIgnoreProperty &&
|
||||||
|
options.shouldIgnoreProperty(property, datum)
|
||||||
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|||||||
@ -11,15 +11,16 @@ import { PartialObjectMetadata } from 'src/workspace/workspace-sync-metadata/int
|
|||||||
|
|
||||||
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
|
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
|
||||||
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
||||||
|
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
|
||||||
|
|
||||||
const fieldPropertiesToIgnore = [
|
const commonFieldPropertiesToIgnore = [
|
||||||
'id',
|
'id',
|
||||||
'createdAt',
|
'createdAt',
|
||||||
'updatedAt',
|
'updatedAt',
|
||||||
'objectMetadataId',
|
'objectMetadataId',
|
||||||
'isActive',
|
'isActive',
|
||||||
'options',
|
'options',
|
||||||
] as const;
|
];
|
||||||
|
|
||||||
const fieldPropertiesToStringify = ['targetColumnMap', 'defaultValue'] as const;
|
const fieldPropertiesToStringify = ['targetColumnMap', 'defaultValue'] as const;
|
||||||
|
|
||||||
@ -36,13 +37,28 @@ export class WorkspaceFieldComparator {
|
|||||||
string,
|
string,
|
||||||
Partial<PartialFieldMetadata>
|
Partial<PartialFieldMetadata>
|
||||||
> = {};
|
> = {};
|
||||||
|
|
||||||
// Double security to only compare non-custom fields
|
// Double security to only compare non-custom fields
|
||||||
const filteredOriginalFieldCollection =
|
const filteredOriginalFieldCollection =
|
||||||
originalObjectMetadata.fields.filter((field) => !field.isCustom);
|
originalObjectMetadata.fields.filter((field) => !field.isCustom);
|
||||||
const originalFieldMetadataMap = transformMetadataForComparison(
|
const originalFieldMetadataMap = transformMetadataForComparison(
|
||||||
filteredOriginalFieldCollection,
|
filteredOriginalFieldCollection,
|
||||||
{
|
{
|
||||||
propertiesToIgnore: fieldPropertiesToIgnore,
|
shouldIgnoreProperty: (property, originalMetadata) => {
|
||||||
|
if (commonFieldPropertiesToIgnore.includes(property)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
originalMetadata &&
|
||||||
|
property === 'defaultValue' &&
|
||||||
|
originalMetadata.type === FieldMetadataType.SELECT
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
propertiesToStringify: fieldPropertiesToStringify,
|
propertiesToStringify: fieldPropertiesToStringify,
|
||||||
keyFactory(datum) {
|
keyFactory(datum) {
|
||||||
return datum.name;
|
return datum.name;
|
||||||
@ -52,7 +68,21 @@ export class WorkspaceFieldComparator {
|
|||||||
const standardFieldMetadataMap = transformMetadataForComparison(
|
const standardFieldMetadataMap = transformMetadataForComparison(
|
||||||
standardObjectMetadata.fields,
|
standardObjectMetadata.fields,
|
||||||
{
|
{
|
||||||
propertiesToIgnore: ['options'],
|
shouldIgnoreProperty: (property, originalMetadata) => {
|
||||||
|
if (['options'].includes(property)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
originalMetadata &&
|
||||||
|
property === 'defaultValue' &&
|
||||||
|
originalMetadata.type === FieldMetadataType.SELECT
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
propertiesToStringify: fieldPropertiesToStringify,
|
propertiesToStringify: fieldPropertiesToStringify,
|
||||||
keyFactory(datum) {
|
keyFactory(datum) {
|
||||||
return datum.name;
|
return datum.name;
|
||||||
|
|||||||
@ -20,7 +20,7 @@ const objectPropertiesToIgnore = [
|
|||||||
'imageIdentifierFieldMetadataId',
|
'imageIdentifierFieldMetadataId',
|
||||||
'isActive',
|
'isActive',
|
||||||
'fields',
|
'fields',
|
||||||
] as const;
|
];
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WorkspaceObjectComparator {
|
export class WorkspaceObjectComparator {
|
||||||
@ -44,7 +44,8 @@ export class WorkspaceObjectComparator {
|
|||||||
const partialOriginalObjectMetadata = transformMetadataForComparison(
|
const partialOriginalObjectMetadata = transformMetadataForComparison(
|
||||||
originalObjectMetadata,
|
originalObjectMetadata,
|
||||||
{
|
{
|
||||||
propertiesToIgnore: objectPropertiesToIgnore,
|
shouldIgnoreProperty: (property) =>
|
||||||
|
objectPropertiesToIgnore.includes(property),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import {
|
|||||||
import { RelationMetadataEntity } from 'src/metadata/relation-metadata/relation-metadata.entity';
|
import { RelationMetadataEntity } from 'src/metadata/relation-metadata/relation-metadata.entity';
|
||||||
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
import { transformMetadataForComparison } from 'src/workspace/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
||||||
|
|
||||||
const relationPropertiesToIgnore = ['createdAt', 'updatedAt'] as const;
|
const relationPropertiesToIgnore = ['createdAt', 'updatedAt'];
|
||||||
const relationPropertiesToUpdate = ['onDeleteAction'];
|
const relationPropertiesToUpdate = ['onDeleteAction'];
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -38,7 +38,8 @@ export class WorkspaceRelationComparator {
|
|||||||
const originalRelationMetadataMap = transformMetadataForComparison(
|
const originalRelationMetadataMap = transformMetadataForComparison(
|
||||||
originalRelationMetadataCollection,
|
originalRelationMetadataCollection,
|
||||||
{
|
{
|
||||||
propertiesToIgnore: relationPropertiesToIgnore,
|
shouldIgnoreProperty: (property) =>
|
||||||
|
relationPropertiesToIgnore.includes(property),
|
||||||
keyFactory(relationMetadata) {
|
keyFactory(relationMetadata) {
|
||||||
return `${relationMetadata.fromObjectMetadataId}->${relationMetadata.fromFieldMetadataId}`;
|
return `${relationMetadata.fromObjectMetadataId}->${relationMetadata.fromFieldMetadataId}`;
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user