Skip to content

Commit 830c35e

Browse files
committed
fix: reset default value on field type switch in Settings/Data Model field form
Closes #5412
1 parent 88f5eb6 commit 830c35e

9 files changed

+68
-38
lines changed

packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldSettingsFormCard.tsx

+11-11
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@ import omit from 'lodash.omit';
33
import { z } from 'zod';
44

55
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
6+
import { SettingsDataModelPreviewFormCard } from '@/settings/data-model/components/SettingsDataModelPreviewFormCard';
7+
import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs';
68
import {
79
SettingsDataModelFieldBooleanForm,
810
settingsDataModelFieldBooleanFormSchema,
9-
} from '@/settings/data-model/components/SettingsDataModelDefaultValue';
10-
import { SettingsDataModelPreviewFormCard } from '@/settings/data-model/components/SettingsDataModelPreviewFormCard';
11-
import { settingsDataModelFieldRelationFormSchema } from '@/settings/data-model/components/SettingsObjectFieldRelationForm';
12-
import {
13-
settingsDataModelFieldMultiSelectFormSchema,
14-
settingsDataModelFieldSelectFormSchema,
15-
} from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
16-
import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs';
11+
} from '@/settings/data-model/fields/forms/components/boolean/SettingsDataModelFieldBooleanForm';
1712
import {
1813
SettingsDataModelFieldCurrencyForm,
1914
settingsDataModelFieldCurrencyFormSchema,
20-
} from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldCurrencyForm';
21-
import { SettingsDataModelFieldRelationSettingsFormCard } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldRelationSettingsFormCard';
22-
import { SettingsDataModelFieldSelectSettingsFormCard } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldSelectSettingsFormCard';
15+
} from '@/settings/data-model/fields/forms/components/currency/SettingsDataModelFieldCurrencyForm';
16+
import { settingsDataModelFieldRelationFormSchema } from '@/settings/data-model/fields/forms/components/relation/SettingsDataModelFieldRelationForm';
17+
import { SettingsDataModelFieldRelationSettingsFormCard } from '@/settings/data-model/fields/forms/components/relation/SettingsDataModelFieldRelationSettingsFormCard';
18+
import {
19+
settingsDataModelFieldMultiSelectFormSchema,
20+
settingsDataModelFieldSelectFormSchema,
21+
} from '@/settings/data-model/fields/forms/components/select/SettingsDataModelFieldSelectForm';
22+
import { SettingsDataModelFieldSelectSettingsFormCard } from '@/settings/data-model/fields/forms/components/select/SettingsDataModelFieldSelectSettingsFormCard';
2323
import {
2424
SettingsDataModelFieldPreviewCard,
2525
SettingsDataModelFieldPreviewCardProps,

packages/twenty-front/src/modules/settings/data-model/components/SettingsDataModelDefaultValue.tsx renamed to packages/twenty-front/src/modules/settings/data-model/fields/forms/components/boolean/SettingsDataModelFieldBooleanForm.tsx

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useEffect } from 'react';
12
import { Controller, useFormContext } from 'react-hook-form';
23
import styled from '@emotion/styled';
34
import { IconCheck, IconX } from 'twenty-ui';
@@ -8,8 +9,6 @@ import { Select } from '@/ui/input/components/Select';
89
import { CardContent } from '@/ui/layout/card/components/CardContent';
910
import { isDefined } from '~/utils/isDefined';
1011

11-
// TODO: rename to SettingsDataModelFieldBooleanForm and move to settings/data-model/fields/forms/components
12-
1312
export const settingsDataModelFieldBooleanFormSchema = z.object({
1413
defaultValue: z.boolean(),
1514
});
@@ -33,18 +32,23 @@ const StyledLabel = styled.span`
3332
font-size: ${({ theme }) => theme.font.size.xs};
3433
font-weight: ${({ theme }) => theme.font.weight.semiBold};
3534
margin-bottom: 6px;
36-
margin-top: ${({ theme }) => theme.spacing(1)};
3735
`;
3836

3937
export const SettingsDataModelFieldBooleanForm = ({
4038
className,
4139
fieldMetadataItem,
4240
}: SettingsDataModelFieldBooleanFormProps) => {
43-
const { control } = useFormContext<SettingsDataModelFieldBooleanFormValues>();
41+
const { control, resetField } =
42+
useFormContext<SettingsDataModelFieldBooleanFormValues>();
4443

4544
const isEditMode = isDefined(fieldMetadataItem?.defaultValue);
4645
const initialValue = fieldMetadataItem?.defaultValue ?? true;
4746

47+
// Reset defaultValue on mount, so it doesn't conflict with other field types.
48+
useEffect(() => {
49+
resetField('defaultValue', { defaultValue: initialValue });
50+
}, [initialValue, resetField]);
51+
4852
return (
4953
<StyledContainer>
5054
<StyledLabel>Default Value</StyledLabel>
+24-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useEffect } from 'react';
12
import { Controller, useFormContext } from 'react-hook-form';
23
import { z } from 'zod';
34

@@ -13,6 +14,7 @@ import { simpleQuotesStringSchema } from '~/utils/validation-schemas/simpleQuote
1314

1415
export const settingsDataModelFieldCurrencyFormSchema = z.object({
1516
defaultValue: z.object({
17+
amountMicros: z.null(),
1618
currencyCode: simpleQuotesStringSchema.refine(
1719
(value) =>
1820
currencyCodeSchema.safeParse(stripSimpleQuotesFromString(value))
@@ -43,19 +45,38 @@ export const SettingsDataModelFieldCurrencyForm = ({
4345
disabled,
4446
fieldMetadataItem,
4547
}: SettingsDataModelFieldCurrencyFormProps) => {
46-
const { control } =
48+
const { control, resetField } =
4749
useFormContext<SettingsDataModelFieldCurrencyFormValues>();
4850

49-
const initialValue =
51+
const initialAmountMicrosValue = null;
52+
const initialCurrencyCode =
5053
(fieldMetadataItem?.defaultValue?.currencyCode as CurrencyCode) ??
5154
CurrencyCode.USD;
55+
const initialCurrencyCodeValue =
56+
applySimpleQuotesToString(initialCurrencyCode);
57+
58+
// Reset defaultValue on mount, so it doesn't conflict with other field types.
59+
useEffect(() => {
60+
resetField('defaultValue', {
61+
defaultValue: {
62+
amountMicros: initialAmountMicrosValue,
63+
currencyCode: initialCurrencyCodeValue,
64+
},
65+
});
66+
}, [initialCurrencyCodeValue, resetField]);
5267

5368
return (
5469
<CardContent>
70+
<Controller
71+
name="defaultValue.amountMicros"
72+
control={control}
73+
defaultValue={initialAmountMicrosValue}
74+
render={() => <></>}
75+
/>
5576
<Controller
5677
name="defaultValue.currencyCode"
5778
control={control}
58-
defaultValue={applySimpleQuotesToString(initialValue)}
79+
defaultValue={initialCurrencyCodeValue}
5980
render={({ field: { onChange, value } }) => (
6081
<Select
6182
fullWidth

packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldRelationForm.tsx renamed to packages/twenty-front/src/modules/settings/data-model/fields/forms/components/relation/SettingsDataModelFieldRelationForm.tsx

+2-5
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@ import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilte
77
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
88
import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation';
99
import { fieldMetadataItemSchema } from '@/object-metadata/validation-schemas/fieldMetadataItemSchema';
10+
import { RELATION_TYPES } from '@/settings/data-model/constants/RelationTypes';
1011
import { useRelationSettingsFormInitialValues } from '@/settings/data-model/fields/forms/hooks/useRelationSettingsFormInitialValues';
12+
import { RelationType } from '@/settings/data-model/types/RelationType';
1113
import { IconPicker } from '@/ui/input/components/IconPicker';
1214
import { Select } from '@/ui/input/components/Select';
1315
import { TextInput } from '@/ui/input/components/TextInput';
1416

15-
import { RELATION_TYPES } from '../constants/RelationTypes';
16-
import { RelationType } from '../types/RelationType';
17-
18-
// TODO: rename to SettingsDataModelFieldRelationForm and move to settings/data-model/fields/forms/components
19-
2017
export const settingsDataModelFieldRelationFormSchema = z.object({
2118
relation: z.object({
2219
field: fieldMetadataItemSchema.pick({
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import styled from '@emotion/styled';
44
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
55
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
66
import { SettingsDataModelPreviewFormCard } from '@/settings/data-model/components/SettingsDataModelPreviewFormCard';
7+
import { RELATION_TYPES } from '@/settings/data-model/constants/RelationTypes';
78
import {
89
SettingsDataModelFieldRelationForm,
910
SettingsDataModelFieldRelationFormValues,
10-
} from '@/settings/data-model/components/SettingsObjectFieldRelationForm';
11-
import { RELATION_TYPES } from '@/settings/data-model/constants/RelationTypes';
11+
} from '@/settings/data-model/fields/forms/components/relation/SettingsDataModelFieldRelationForm';
1212
import { useRelationSettingsFormInitialValues } from '@/settings/data-model/fields/forms/hooks/useRelationSettingsFormInitialValues';
1313
import {
1414
SettingsDataModelFieldPreviewCard,

packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectForm.tsx renamed to packages/twenty-front/src/modules/settings/data-model/fields/forms/components/select/SettingsDataModelFieldSelectForm.tsx

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useEffect } from 'react';
12
import { Controller, useFormContext } from 'react-hook-form';
23
import styled from '@emotion/styled';
34
import { DropResult } from '@hello-pangea/dnd';
@@ -23,9 +24,7 @@ import { toSpliced } from '~/utils/array/toSpliced';
2324
import { applySimpleQuotesToString } from '~/utils/string/applySimpleQuotesToString';
2425
import { simpleQuotesStringSchema } from '~/utils/validation-schemas/simpleQuotesStringSchema';
2526

26-
import { SettingsObjectFieldSelectFormOptionRow } from './SettingsObjectFieldSelectFormOptionRow';
27-
28-
// TODO: rename to SettingsDataModelFieldSelectForm and move to settings/data-model/fields/forms/components
27+
import { SettingsDataModelFieldSelectFormOptionRow } from './SettingsDataModelFieldSelectFormOptionRow';
2928

3029
export const settingsDataModelFieldSelectFormSchema = z.object({
3130
defaultValue: simpleQuotesStringSchema.nullable(),
@@ -87,6 +86,7 @@ export const SettingsDataModelFieldSelectForm = ({
8786
setValue: setFormValue,
8887
watch: watchFormValue,
8988
getValues,
89+
resetField,
9090
} = useFormContext<SettingsDataModelFieldSelectFormValues>();
9191

9292
const handleDragEnd = (
@@ -168,6 +168,11 @@ export const SettingsDataModelFieldSelectForm = ({
168168
}
169169
};
170170

171+
// Reset defaultValue on mount or on field type change, so it doesn't conflict with other field types.
172+
useEffect(() => {
173+
resetField('defaultValue', { defaultValue: initialDefaultValue });
174+
}, [initialDefaultValue, initialOptions, resetField, fieldMetadataItem.type]);
175+
171176
return (
172177
<>
173178
<Controller
@@ -195,7 +200,7 @@ export const SettingsDataModelFieldSelectForm = ({
195200
index={index}
196201
isDragDisabled={options.length === 1}
197202
itemComponent={
198-
<SettingsObjectFieldSelectFormOptionRow
203+
<SettingsDataModelFieldSelectFormOptionRow
199204
key={option.id}
200205
option={option}
201206
onChange={(nextOption) => {

packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectFormOptionRow.tsx renamed to packages/twenty-front/src/modules/settings/data-model/fields/forms/components/select/SettingsDataModelFieldSelectFormOptionRow.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
2323
import { MenuItemSelectColor } from '@/ui/navigation/menu-item/components/MenuItemSelectColor';
2424
import { MAIN_COLOR_NAMES } from '@/ui/theme/constants/MainColorNames';
2525

26-
type SettingsObjectFieldSelectFormOptionRowProps = {
26+
type SettingsDataModelFieldSelectFormOptionRowProps = {
2727
className?: string;
2828
isDefault?: boolean;
2929
onChange: (value: FieldMetadataItemOption) => void;
@@ -55,15 +55,15 @@ const StyledOptionInput = styled(TextInput)`
5555
}
5656
`;
5757

58-
export const SettingsObjectFieldSelectFormOptionRow = ({
58+
export const SettingsDataModelFieldSelectFormOptionRow = ({
5959
className,
6060
isDefault,
6161
onChange,
6262
onRemove,
6363
onSetAsDefault,
6464
onRemoveAsDefault,
6565
option,
66-
}: SettingsObjectFieldSelectFormOptionRowProps) => {
66+
}: SettingsDataModelFieldSelectFormOptionRowProps) => {
6767
const theme = useTheme();
6868

6969
const dropdownIds = useMemo(() => {
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
settingsDataModelFieldMultiSelectFormSchema,
99
SettingsDataModelFieldSelectForm,
1010
settingsDataModelFieldSelectFormSchema,
11-
} from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
11+
} from '@/settings/data-model/fields/forms/components/select/SettingsDataModelFieldSelectForm';
1212
import { useSelectSettingsFormInitialValues } from '@/settings/data-model/fields/forms/hooks/useSelectSettingsFormInitialValues';
1313
import {
1414
SettingsDataModelFieldPreviewCard,

packages/twenty-front/src/modules/settings/data-model/utils/getFieldDefaultPreviewValue.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { isString } from '@sniptt/guards';
2+
13
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
24
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
35
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
@@ -23,17 +25,18 @@ export const getFieldDefaultPreviewValue = ({
2325
relationObjectMetadataItem?: ObjectMetadataItem;
2426
}) => {
2527
if (fieldMetadataItem.type === FieldMetadataType.Select) {
26-
const defaultValue = fieldMetadataItem.defaultValue
28+
const defaultValue = isString(fieldMetadataItem.defaultValue)
2729
? stripSimpleQuotesFromString(fieldMetadataItem.defaultValue)
2830
: null;
2931
return defaultValue ?? fieldMetadataItem.options?.[0]?.value ?? null;
3032
}
3133

3234
if (fieldMetadataItem.type === FieldMetadataType.MultiSelect) {
33-
const defaultValues = fieldMetadataItem.defaultValue?.map(
34-
(defaultValue: `'${string}'`) =>
35-
stripSimpleQuotesFromString(defaultValue),
36-
);
35+
const defaultValues = Array.isArray(fieldMetadataItem.defaultValue)
36+
? fieldMetadataItem.defaultValue?.map((defaultValue: `'${string}'`) =>
37+
stripSimpleQuotesFromString(defaultValue),
38+
)
39+
: null;
3740
return defaultValues?.length
3841
? defaultValues
3942
: fieldMetadataItem.options?.map(({ value }) => value) ?? null;

0 commit comments

Comments
 (0)