feat: simplify field preview logic in Settings (#5541)

Closes #5382

TODO:

- [x] Test all field previews in app
- [x] Fix tests
- [x] Fix JSON preview
This commit is contained in:
Thaïs
2024-05-24 18:06:57 +02:00
committed by GitHub
parent 1ae7fbe90d
commit c7d61e183a
33 changed files with 1184 additions and 510 deletions

View File

@ -1,176 +0,0 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import {
mockedCompanyObjectMetadataItem,
mockedOpportunityObjectMetadataItem,
mockedPersonObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { getFieldDefaultPreviewValue } from '../getFieldDefaultPreviewValue';
describe('getFieldDefaultPreviewValue', () => {
describe('SELECT field', () => {
it('returns the default select option value', () => {
// Given
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
({ name }) => name === 'stage',
)!;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem: { ...fieldMetadataItem, defaultValue: "'MEETING'" },
});
// Then
expect(result).toEqual('MEETING');
});
it('returns the first select option if no default option was found', () => {
// Given
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
({ name }) => name === 'stage',
)!;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem: { ...fieldMetadataItem, defaultValue: null },
});
// Then
expect(result).toEqual(fieldMetadataItem.options![0].value);
});
});
describe('RELATION field', () => {
it('returns a record with a default label identifier (if relation label identifier type !== TEXT)', () => {
// Given
const objectMetadataItem = mockedCompanyObjectMetadataItem;
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
({ name }) => name === 'people',
)!;
const relationObjectMetadataItem = mockedPersonObjectMetadataItem;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
relationObjectMetadataItem,
});
// Then
expect(result).toEqual({
name: {
firstName: 'John',
lastName: 'Doe',
},
});
});
it('returns a record with the relation object label singular as label identifier (if relation label identifier type === TEXT)', () => {
// Given
const objectMetadataItem = mockedPersonObjectMetadataItem;
const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
({ name }) => name === 'company',
)!;
const relationObjectMetadataItem = mockedCompanyObjectMetadataItem;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
relationObjectMetadataItem,
});
// Then
expect(result).toEqual({
name: 'Company',
});
});
it('returns null if the relation object does not have a label identifier field', () => {
// Given
const objectMetadataItem = mockedPersonObjectMetadataItem;
const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
({ name }) => name === 'company',
)!;
const relationObjectMetadataItem: ObjectMetadataItem = {
...mockedCompanyObjectMetadataItem,
labelIdentifierFieldMetadataId: null,
fields: mockedCompanyObjectMetadataItem.fields.filter(
({ name }) => name !== 'name',
),
};
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
relationObjectMetadataItem,
});
// Then
expect(result).toBeNull();
});
});
describe('Other fields', () => {
it('returns the object singular name as default value for the label identifier field (type TEXT)', () => {
// Given
const objectMetadataItem = mockedCompanyObjectMetadataItem;
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
({ name }) => name === 'name',
)!;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
});
// Then
expect(result).toBe('Company');
});
it('returns a default value for the label identifier field (type FULL_NAME)', () => {
// Given
const objectMetadataItem = mockedPersonObjectMetadataItem;
const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
({ name }) => name === 'name',
)!;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
});
// Then
expect(result).toEqual({
firstName: 'John',
lastName: 'Doe',
});
});
it('returns a default value for other field types', () => {
// Given
const objectMetadataItem = mockedCompanyObjectMetadataItem;
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
({ name }) => name === 'domainName',
)!;
// When
const result = getFieldDefaultPreviewValue({
objectMetadataItem,
fieldMetadataItem,
});
// Then
expect(result).toBe(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum magna enim, dapibus non enim in, lacinia faucibus nunc. Sed interdum ante sed felis facilisis, eget ultricies neque molestie. Mauris auctor, justo eu volutpat cursus, libero erat tempus nulla, non sodales lorem lacus a est.',
);
});
});
});

View File

@ -1,89 +0,0 @@
import { isString } from '@sniptt/guards';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { isDefined } from '~/utils/isDefined';
import { stripSimpleQuotesFromString } from '~/utils/string/stripSimpleQuotesFromString';
export const getFieldDefaultPreviewValue = ({
fieldMetadataItem,
objectMetadataItem,
relationObjectMetadataItem,
}: {
fieldMetadataItem: Pick<
FieldMetadataItem,
'type' | 'defaultValue' | 'options'
> & {
id?: string;
name?: string;
};
objectMetadataItem: ObjectMetadataItem;
relationObjectMetadataItem?: ObjectMetadataItem;
}) => {
if (fieldMetadataItem.type === FieldMetadataType.Select) {
const defaultValue = isString(fieldMetadataItem.defaultValue)
? stripSimpleQuotesFromString(fieldMetadataItem.defaultValue)
: null;
return defaultValue ?? fieldMetadataItem.options?.[0]?.value ?? null;
}
if (fieldMetadataItem.type === FieldMetadataType.MultiSelect) {
const defaultValues = Array.isArray(fieldMetadataItem.defaultValue)
? fieldMetadataItem.defaultValue?.map((defaultValue: `'${string}'`) =>
stripSimpleQuotesFromString(defaultValue),
)
: null;
return defaultValues?.length
? defaultValues
: fieldMetadataItem.options?.map(({ value }) => value) ?? null;
}
if (
fieldMetadataItem.type === FieldMetadataType.Relation &&
isDefined(relationObjectMetadataItem)
) {
const relationLabelIdentifierFieldMetadataItem =
getLabelIdentifierFieldMetadataItem(relationObjectMetadataItem);
if (!relationLabelIdentifierFieldMetadataItem) return null;
const { type: relationLabelIdentifierFieldType } =
relationLabelIdentifierFieldMetadataItem;
const relationFieldTypeConfig = getSettingsFieldTypeConfig(
relationLabelIdentifierFieldType,
);
const defaultRelationLabelIdentifierFieldValue =
relationLabelIdentifierFieldType === FieldMetadataType.Text
? relationObjectMetadataItem.labelSingular
: relationFieldTypeConfig?.defaultValue;
const defaultRelationRecord = {
[relationLabelIdentifierFieldMetadataItem.name]:
defaultRelationLabelIdentifierFieldValue,
};
return defaultRelationRecord;
}
const isLabelIdentifier =
!!fieldMetadataItem.id &&
!!fieldMetadataItem.name &&
isLabelIdentifierField({
fieldMetadataItem: {
id: fieldMetadataItem.id,
name: fieldMetadataItem.name,
},
objectMetadataItem,
});
const fieldTypeConfig = getSettingsFieldTypeConfig(fieldMetadataItem.type);
return isLabelIdentifier && fieldMetadataItem.type === FieldMetadataType.Text
? objectMetadataItem.labelSingular
: fieldTypeConfig?.defaultValue;
};

View File

@ -1,8 +1,13 @@
import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs';
import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType';
import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings';
import { FieldMetadataType } from '~/generated-metadata/graphql';
export const getSettingsFieldTypeConfig = (fieldType: FieldMetadataType) =>
isFieldTypeSupportedInSettings(fieldType)
export const getSettingsFieldTypeConfig = <T extends FieldMetadataType>(
fieldType: T,
) =>
(isFieldTypeSupportedInSettings(fieldType)
? SETTINGS_FIELD_TYPE_CONFIGS[fieldType]
: undefined) as T extends SettingsSupportedFieldType
? (typeof SETTINGS_FIELD_TYPE_CONFIGS)[T]
: undefined;