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:
@ -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.',
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -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;
|
||||
};
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user