From da8f1b0a669360c57c10cb4a2178e82e41b5ec65 Mon Sep 17 00:00:00 2001 From: brendanlaschke Date: Sat, 30 Mar 2024 11:38:08 +0100 Subject: [PATCH] Fix display empty value if boolean instead of false on show page (#4468) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * default value boolean fixed * fixed creation, fixed updating a value to false * fixed default value for default value if boolean * fixed tests --------- Co-authored-by: Félix Malfait --- .../hooks/useFieldMetadataItem.ts | 24 ++++++-- .../utils/formatFieldMetadataItemInput.ts | 2 +- .../SettingsDataModelDefaultValue.tsx | 60 +++++++++++++++++++ ...SettingsDataModelFieldSettingsFormCard.tsx | 9 +++ .../SettingsDataModelFieldTypeSelect.tsx | 16 ++++- ...DataModelFieldSettingsFormCard.stories.tsx | 2 + .../__tests__/useFieldMetadataForm.test.ts | 1 + .../forms/hooks/useFieldMetadataForm.ts | 15 ++++- .../data-model/SettingsObjectFieldEdit.tsx | 11 +++- .../SettingsObjectNewFieldStep2.tsx | 3 +- .../field-metadata/field-metadata.service.ts | 8 ++- 11 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 packages/twenty-front/src/modules/settings/data-model/components/SettingsDataModelDefaultValue.tsx diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts index 2c0a196fb..c33c1b288 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts @@ -17,7 +17,7 @@ export const useFieldMetadataItem = () => { const { deleteOneFieldMetadataItem } = useDeleteOneFieldMetadataItem(); const createMetadataField = ( - input: Pick & { + input: Pick & { defaultValue?: unknown; objectMetadataId: string; options?: Omit[]; @@ -26,7 +26,9 @@ export const useFieldMetadataItem = () => { ) => { const formatedInput = formatFieldMetadataItemInput(input); const defaultValue = input.defaultValue - ? `'${input.defaultValue}'` + ? typeof input.defaultValue == 'string' + ? `'${input.defaultValue}'` + : input.defaultValue : formatedInput.defaultValue ?? undefined; return createOneFieldMetadataItem({ @@ -38,14 +40,25 @@ export const useFieldMetadataItem = () => { }; const editMetadataField = ( - input: Pick & { + input: Pick< + Field, + 'id' | 'label' | 'icon' | 'description' | 'defaultValue' + > & { options?: FieldMetadataOption[]; }, - ) => - updateOneFieldMetadataItem({ + ) => { + const formatedInput = formatFieldMetadataItemInput(input); + const defaultValue = input.defaultValue + ? typeof input.defaultValue == 'string' + ? `'${input.defaultValue}'` + : input.defaultValue + : formatedInput.defaultValue ?? undefined; + + return updateOneFieldMetadataItem({ fieldMetadataIdToUpdate: input.id, updatePayload: formatFieldMetadataItemInput({ ...input, + defaultValue, // In Edit mode, all options need an id, // so we generate an id for newly created options. options: input.options?.map((option) => @@ -53,6 +66,7 @@ export const useFieldMetadataItem = () => { ), }), }); + }; const activateMetadataField = (metadataField: FieldMetadataItem) => updateOneFieldMetadataItem({ diff --git a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemInput.ts b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemInput.ts index 7b72e8b23..3107b96e4 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemInput.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemInput.ts @@ -45,7 +45,7 @@ export const formatFieldMetadataItemInput = ( return { defaultValue: defaultOption ? `'${getOptionValueFromLabel(defaultOption.label)}'` - : undefined, + : input.defaultValue, description: input.description?.trim() ?? null, icon: input.icon, label: input.label.trim(), diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsDataModelDefaultValue.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsDataModelDefaultValue.tsx new file mode 100644 index 000000000..7a1456543 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/components/SettingsDataModelDefaultValue.tsx @@ -0,0 +1,60 @@ +import styled from '@emotion/styled'; + +import { IconCheck, IconX } from '@/ui/display/icon'; +import { Select } from '@/ui/input/components/Select'; +import { CardContent } from '@/ui/layout/card/components/CardContent'; + +type SettingsDataModelDefaultValueFormProps = { + className?: string; + disabled?: boolean; + onChange?: (defaultValue: SettingsDataModelDefaultValue) => void; + value?: SettingsDataModelDefaultValue; +}; + +export type SettingsDataModelDefaultValue = any; + +const StyledContainer = styled(CardContent)` + padding-bottom: ${({ theme }) => theme.spacing(3.5)}; +`; + +const StyledLabel = styled.span` + color: ${({ theme }) => theme.font.color.light}; + display: block; + font-size: ${({ theme }) => theme.font.size.xs}; + font-weight: ${({ theme }) => theme.font.weight.semiBold}; + margin-bottom: 6px; + margin-top: ${({ theme }) => theme.spacing(1)}; +`; + +export const SettingsDataModelDefaultValueForm = ({ + className, + disabled, + onChange, + value, +}: SettingsDataModelDefaultValueFormProps) => { + return ( + + Default Value +