Refacto default value (#6507)

A quick followup of #6506 to add clarity and differentiate emptyValue
from defaultValue
This commit is contained in:
Félix Malfait
2024-08-03 16:43:53 +02:00
committed by GitHub
parent 6432ad39b9
commit 5f88caf409
6 changed files with 52 additions and 42 deletions

View File

@ -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;
}
};

View File

@ -4,7 +4,7 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const generateEmptyFieldValue = ( export const generateEmptyFieldValue = (
fieldMetadataItem: FieldMetadataItem, fieldMetadataItem: Pick<FieldMetadataItem, 'type' | 'fromRelationMetadata'>,
) => { ) => {
switch (fieldMetadataItem.type) { switch (fieldMetadataItem.type) {
case FieldMetadataType.Email: case FieldMetadataType.Email:

View File

@ -2,7 +2,7 @@ import { isUndefined } from '@sniptt/guards';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; 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'; import { isDefined } from '~/utils/isDefined';
export const prefillRecord = <T extends ObjectRecord>({ export const prefillRecord = <T extends ObjectRecord>({
@ -20,7 +20,7 @@ export const prefillRecord = <T extends ObjectRecord>({
return [ return [
fieldMetadataItem.name, fieldMetadataItem.name,
isUndefined(inputValue) isUndefined(inputValue)
? generateEmptyFieldValue(fieldMetadataItem) ? generateDefaultFieldValue(fieldMetadataItem)
: inputValue, : inputValue,
]; ];
}) })

View File

@ -31,55 +31,55 @@ DEFAULT_DATE_VALUE.setFullYear(DEFAULT_DATE_VALUE.getFullYear() + 2);
export type SettingsFieldTypeConfig = { export type SettingsFieldTypeConfig = {
label: string; label: string;
Icon: IconComponent; Icon: IconComponent;
defaultValue?: unknown; exampleValue?: unknown;
}; };
export const SETTINGS_FIELD_TYPE_CONFIGS = { export const SETTINGS_FIELD_TYPE_CONFIGS = {
[FieldMetadataType.Uuid]: { [FieldMetadataType.Uuid]: {
label: 'Unique ID', label: 'Unique ID',
Icon: IconKey, Icon: IconKey,
defaultValue: '00000000-0000-0000-0000-000000000000', exampleValue: '00000000-0000-0000-0000-000000000000',
}, },
[FieldMetadataType.Text]: { [FieldMetadataType.Text]: {
label: 'Text', label: 'Text',
Icon: IconTextSize, 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.', '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]: { [FieldMetadataType.Numeric]: {
label: 'Numeric', label: 'Numeric',
Icon: IconNumbers, Icon: IconNumbers,
defaultValue: 2000, exampleValue: 2000,
}, },
[FieldMetadataType.Number]: { [FieldMetadataType.Number]: {
label: 'Number', label: 'Number',
Icon: IconNumbers, Icon: IconNumbers,
defaultValue: 2000, exampleValue: 2000,
}, },
[FieldMetadataType.Link]: { [FieldMetadataType.Link]: {
label: 'Link', label: 'Link',
Icon: IconLink, Icon: IconLink,
defaultValue: { url: 'www.twenty.com', label: '' }, exampleValue: { url: 'www.twenty.com', label: '' },
}, },
[FieldMetadataType.Links]: { [FieldMetadataType.Links]: {
label: 'Links', label: 'Links',
Icon: IconLink, Icon: IconLink,
defaultValue: { primaryLinkUrl: 'twenty.com', primaryLinkLabel: '' }, exampleValue: { primaryLinkUrl: 'twenty.com', primaryLinkLabel: '' },
}, },
[FieldMetadataType.Boolean]: { [FieldMetadataType.Boolean]: {
label: 'True/False', label: 'True/False',
Icon: IconCheck, Icon: IconCheck,
defaultValue: true, exampleValue: true,
}, },
[FieldMetadataType.DateTime]: { [FieldMetadataType.DateTime]: {
label: 'Date and Time', label: 'Date and Time',
Icon: IconCalendarTime, Icon: IconCalendarTime,
defaultValue: DEFAULT_DATE_VALUE.toISOString(), exampleValue: DEFAULT_DATE_VALUE.toISOString(),
}, },
[FieldMetadataType.Date]: { [FieldMetadataType.Date]: {
label: 'Date', label: 'Date',
Icon: IconCalendarEvent, Icon: IconCalendarEvent,
defaultValue: DEFAULT_DATE_VALUE.toISOString(), exampleValue: DEFAULT_DATE_VALUE.toISOString(),
}, },
[FieldMetadataType.Select]: { [FieldMetadataType.Select]: {
label: 'Select', label: 'Select',
@ -92,7 +92,7 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = {
[FieldMetadataType.Currency]: { [FieldMetadataType.Currency]: {
label: 'Currency', label: 'Currency',
Icon: IconCoins, Icon: IconCoins,
defaultValue: { amountMicros: 2000000000, currencyCode: CurrencyCode.USD }, exampleValue: { amountMicros: 2000000000, currencyCode: CurrencyCode.USD },
}, },
[FieldMetadataType.Relation]: { [FieldMetadataType.Relation]: {
label: 'Relation', label: 'Relation',
@ -102,22 +102,22 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = {
[FieldMetadataType.Phone]: { [FieldMetadataType.Phone]: {
label: 'Phone', label: 'Phone',
Icon: IconPhone, Icon: IconPhone,
defaultValue: '+1234-567-890', exampleValue: '+1234-567-890',
}, },
[FieldMetadataType.Rating]: { [FieldMetadataType.Rating]: {
label: 'Rating', label: 'Rating',
Icon: IconTwentyStar, Icon: IconTwentyStar,
defaultValue: '3', exampleValue: '3',
}, },
[FieldMetadataType.FullName]: { [FieldMetadataType.FullName]: {
label: 'Full Name', label: 'Full Name',
Icon: IconUser, Icon: IconUser,
defaultValue: { firstName: 'John', lastName: 'Doe' }, exampleValue: { firstName: 'John', lastName: 'Doe' },
}, },
[FieldMetadataType.Address]: { [FieldMetadataType.Address]: {
label: 'Address', label: 'Address',
Icon: IconMap, Icon: IconMap,
defaultValue: { exampleValue: {
addressStreet1: '456 Oak Street', addressStreet1: '456 Oak Street',
addressStreet2: 'Unit 3B', addressStreet2: 'Unit 3B',
addressCity: 'Springfield', addressCity: 'Springfield',
@ -131,12 +131,12 @@ export const SETTINGS_FIELD_TYPE_CONFIGS = {
[FieldMetadataType.RawJson]: { [FieldMetadataType.RawJson]: {
label: 'JSON', label: 'JSON',
Icon: IconJson, Icon: IconJson,
defaultValue: { key: 'value' }, exampleValue: { key: 'value' },
}, },
[FieldMetadataType.RichText]: { [FieldMetadataType.RichText]: {
label: 'Rich Text', label: 'Rich Text',
Icon: IconFilePencil, Icon: IconFilePencil,
defaultValue: { key: 'value' }, exampleValue: { key: 'value' },
}, },
[FieldMetadataType.Actor]: { [FieldMetadataType.Actor]: {
label: 'Actor', label: 'Actor',

View File

@ -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;
}
};

View File

@ -1,6 +1,6 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty'; 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 { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig';
import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings'; import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
@ -18,17 +18,17 @@ export const getFieldPreviewValue = ({
fieldValue: fieldMetadataItem.defaultValue, fieldValue: fieldMetadataItem.defaultValue,
}) })
) { ) {
return getComputedDefaultValue(fieldMetadataItem.defaultValue); return generateDefaultFieldValue(fieldMetadataItem);
} }
const fieldTypeConfig = getSettingsFieldTypeConfig(fieldMetadataItem.type); const fieldTypeConfig = getSettingsFieldTypeConfig(fieldMetadataItem.type);
if ( if (
isDefined(fieldTypeConfig) && isDefined(fieldTypeConfig) &&
'defaultValue' in fieldTypeConfig && 'exampleValue' in fieldTypeConfig &&
isDefined(fieldTypeConfig.defaultValue) isDefined(fieldTypeConfig.exampleValue)
) { ) {
return getComputedDefaultValue(fieldTypeConfig.defaultValue); return fieldTypeConfig.exampleValue;
} }
return null; return null;