From 5f88caf409e46006f19284654a18047850888ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Sat, 3 Aug 2024 16:43:53 +0200 Subject: [PATCH] Refacto default value (#6507) A quick followup of #6506 to add clarity and differentiate emptyValue from defaultValue --- .../utils/generateDefaultFieldValue.ts | 27 +++++++++++++++ .../utils/generateEmptyFieldValue.ts | 2 +- .../object-record/utils/prefillRecord.ts | 4 +-- .../constants/SettingsFieldTypeConfigs.ts | 34 +++++++++---------- .../preview/utils/getComputedDefaultValue.ts | 17 ---------- .../preview/utils/getFieldPreviewValue.ts | 10 +++--- 6 files changed, 52 insertions(+), 42 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-record/utils/generateDefaultFieldValue.ts delete mode 100644 packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getComputedDefaultValue.ts diff --git a/packages/twenty-front/src/modules/object-record/utils/generateDefaultFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateDefaultFieldValue.ts new file mode 100644 index 000000000..2ed467659 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/utils/generateDefaultFieldValue.ts @@ -0,0 +1,27 @@ +import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty'; +import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue'; +import { v4 } from 'uuid'; + +export const generateDefaultFieldValue = ( + fieldMetadataItem: Pick< + FieldMetadataItem, + 'defaultValue' | 'type' | 'fromRelationMetadata' + >, +) => { + const defaultValue = isFieldValueEmpty({ + fieldValue: fieldMetadataItem.defaultValue, + fieldDefinition: fieldMetadataItem, + }) + ? generateEmptyFieldValue(fieldMetadataItem) + : fieldMetadataItem.defaultValue; + + switch (defaultValue) { + case 'uuid': + return v4(); + case 'now': + return new Date().toISOString(); + default: + return defaultValue; + } +}; diff --git a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts index b83d2bdf0..d7dc1f935 100644 --- a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts +++ b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts @@ -4,7 +4,7 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataType } from '~/generated-metadata/graphql'; export const generateEmptyFieldValue = ( - fieldMetadataItem: FieldMetadataItem, + fieldMetadataItem: Pick, ) => { switch (fieldMetadataItem.type) { case FieldMetadataType.Email: diff --git a/packages/twenty-front/src/modules/object-record/utils/prefillRecord.ts b/packages/twenty-front/src/modules/object-record/utils/prefillRecord.ts index 53e686c5a..2ec83214d 100644 --- a/packages/twenty-front/src/modules/object-record/utils/prefillRecord.ts +++ b/packages/twenty-front/src/modules/object-record/utils/prefillRecord.ts @@ -2,7 +2,7 @@ import { isUndefined } from '@sniptt/guards'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue'; +import { generateDefaultFieldValue } from '@/object-record/utils/generateDefaultFieldValue'; import { isDefined } from '~/utils/isDefined'; export const prefillRecord = ({ @@ -20,7 +20,7 @@ export const prefillRecord = ({ return [ fieldMetadataItem.name, isUndefined(inputValue) - ? generateEmptyFieldValue(fieldMetadataItem) + ? generateDefaultFieldValue(fieldMetadataItem) : inputValue, ]; }) diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts index 71791488a..8a190997a 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts @@ -31,55 +31,55 @@ DEFAULT_DATE_VALUE.setFullYear(DEFAULT_DATE_VALUE.getFullYear() + 2); export type SettingsFieldTypeConfig = { label: string; Icon: IconComponent; - defaultValue?: unknown; + exampleValue?: unknown; }; export const SETTINGS_FIELD_TYPE_CONFIGS = { [FieldMetadataType.Uuid]: { label: 'Unique ID', Icon: IconKey, - defaultValue: '00000000-0000-0000-0000-000000000000', + exampleValue: '00000000-0000-0000-0000-000000000000', }, [FieldMetadataType.Text]: { label: 'Text', Icon: IconTextSize, - defaultValue: + exampleValue: '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.', }, [FieldMetadataType.Numeric]: { label: 'Numeric', Icon: IconNumbers, - defaultValue: 2000, + exampleValue: 2000, }, [FieldMetadataType.Number]: { label: 'Number', Icon: IconNumbers, - defaultValue: 2000, + exampleValue: 2000, }, [FieldMetadataType.Link]: { label: 'Link', Icon: IconLink, - defaultValue: { url: 'www.twenty.com', label: '' }, + exampleValue: { url: 'www.twenty.com', label: '' }, }, [FieldMetadataType.Links]: { label: 'Links', Icon: IconLink, - defaultValue: { primaryLinkUrl: 'twenty.com', primaryLinkLabel: '' }, + exampleValue: { primaryLinkUrl: 'twenty.com', primaryLinkLabel: '' }, }, [FieldMetadataType.Boolean]: { label: 'True/False', Icon: IconCheck, - defaultValue: true, + exampleValue: true, }, [FieldMetadataType.DateTime]: { label: 'Date and Time', Icon: IconCalendarTime, - defaultValue: DEFAULT_DATE_VALUE.toISOString(), + exampleValue: DEFAULT_DATE_VALUE.toISOString(), }, [FieldMetadataType.Date]: { label: 'Date', Icon: IconCalendarEvent, - defaultValue: DEFAULT_DATE_VALUE.toISOString(), + exampleValue: DEFAULT_DATE_VALUE.toISOString(), }, [FieldMetadataType.Select]: { label: 'Select', @@ -92,7 +92,7 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = { [FieldMetadataType.Currency]: { label: 'Currency', Icon: IconCoins, - defaultValue: { amountMicros: 2000000000, currencyCode: CurrencyCode.USD }, + exampleValue: { amountMicros: 2000000000, currencyCode: CurrencyCode.USD }, }, [FieldMetadataType.Relation]: { label: 'Relation', @@ -102,22 +102,22 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = { [FieldMetadataType.Phone]: { label: 'Phone', Icon: IconPhone, - defaultValue: '+1234-567-890', + exampleValue: '+1234-567-890', }, [FieldMetadataType.Rating]: { label: 'Rating', Icon: IconTwentyStar, - defaultValue: '3', + exampleValue: '3', }, [FieldMetadataType.FullName]: { label: 'Full Name', Icon: IconUser, - defaultValue: { firstName: 'John', lastName: 'Doe' }, + exampleValue: { firstName: 'John', lastName: 'Doe' }, }, [FieldMetadataType.Address]: { label: 'Address', Icon: IconMap, - defaultValue: { + exampleValue: { addressStreet1: '456 Oak Street', addressStreet2: 'Unit 3B', addressCity: 'Springfield', @@ -131,12 +131,12 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = { [FieldMetadataType.RawJson]: { label: 'JSON', Icon: IconJson, - defaultValue: { key: 'value' }, + exampleValue: { key: 'value' }, }, [FieldMetadataType.RichText]: { label: 'Rich Text', Icon: IconFilePencil, - defaultValue: { key: 'value' }, + exampleValue: { key: 'value' }, }, [FieldMetadataType.Actor]: { label: 'Actor', diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getComputedDefaultValue.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getComputedDefaultValue.ts deleted file mode 100644 index afbca98c0..000000000 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getComputedDefaultValue.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Some default value are special keywords such as 'uuid' or 'now' -// that are mapped to a function that generates a value on the backend. -// (see serializeFunctionDefaultValue.ts on the server) -// We need to do a similar mapping on the frontend - -import { v4 } from 'uuid'; - -export const getComputedDefaultValue = (defaultValue?: any) => { - switch (defaultValue) { - case 'uuid': - return v4(); - case 'now': - return new Date().toISOString(); - default: - return null; - } -}; diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getFieldPreviewValue.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getFieldPreviewValue.ts index ce3fe7275..a71d6ed07 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getFieldPreviewValue.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getFieldPreviewValue.ts @@ -1,6 +1,6 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty'; -import { getComputedDefaultValue } from '@/settings/data-model/fields/preview/utils/getComputedDefaultValue'; +import { generateDefaultFieldValue } from '@/object-record/utils/generateDefaultFieldValue'; import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig'; import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings'; import { isDefined } from '~/utils/isDefined'; @@ -18,17 +18,17 @@ export const getFieldPreviewValue = ({ fieldValue: fieldMetadataItem.defaultValue, }) ) { - return getComputedDefaultValue(fieldMetadataItem.defaultValue); + return generateDefaultFieldValue(fieldMetadataItem); } const fieldTypeConfig = getSettingsFieldTypeConfig(fieldMetadataItem.type); if ( isDefined(fieldTypeConfig) && - 'defaultValue' in fieldTypeConfig && - isDefined(fieldTypeConfig.defaultValue) + 'exampleValue' in fieldTypeConfig && + isDefined(fieldTypeConfig.exampleValue) ) { - return getComputedDefaultValue(fieldTypeConfig.defaultValue); + return fieldTypeConfig.exampleValue; } return null;