Refacto default value (#6507)
A quick followup of #6506 to add clarity and differentiate emptyValue from defaultValue
This commit is contained in:
@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -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:
|
||||||
|
|||||||
@ -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,
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user