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';
export const generateEmptyFieldValue = (
fieldMetadataItem: FieldMetadataItem,
fieldMetadataItem: Pick<FieldMetadataItem, 'type' | 'fromRelationMetadata'>,
) => {
switch (fieldMetadataItem.type) {
case FieldMetadataType.Email:

View File

@ -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 = <T extends ObjectRecord>({
@ -20,7 +20,7 @@ export const prefillRecord = <T extends ObjectRecord>({
return [
fieldMetadataItem.name,
isUndefined(inputValue)
? generateEmptyFieldValue(fieldMetadataItem)
? generateDefaultFieldValue(fieldMetadataItem)
: inputValue,
];
})

View File

@ -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',

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 { 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;