Skip to content

Commit 72dd332

Browse files
committed
feat: simplify field preview logic in Settings
Closes #5382
1 parent 5448512 commit 72dd332

12 files changed

+249
-224
lines changed

packages/twenty-front/src/modules/settings/data-model/fields/preview/components/SettingsDataModelFieldPreview.tsx

+28-15
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { useIcons } from 'twenty-ui';
44

55
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
66
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
7+
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
78
import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay';
89
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
910
import { BooleanFieldInput } from '@/object-record/record-field/meta-types/input/components/BooleanFieldInput';
1011
import { RatingFieldInput } from '@/object-record/record-field/meta-types/input/components/RatingFieldInput';
1112
import { SettingsDataModelSetFieldValueEffect } from '@/settings/data-model/fields/preview/components/SettingsDataModelSetFieldValueEffect';
12-
import { SettingsDataModelSetRecordEffect } from '@/settings/data-model/fields/preview/components/SettingsDataModelSetRecordEffect';
13-
import { useFieldPreview } from '@/settings/data-model/fields/preview/hooks/useFieldPreview';
13+
import { useFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useFieldPreviewValue';
1414
import { FieldMetadataType } from '~/generated-metadata/graphql';
1515

1616
export type SettingsDataModelFieldPreviewProps = {
@@ -61,24 +61,37 @@ export const SettingsDataModelFieldPreview = ({
6161
const { getIcon } = useIcons();
6262
const FieldIcon = getIcon(fieldMetadataItem.icon);
6363

64-
const { entityId, fieldName, fieldPreviewValue, isLabelIdentifier, record } =
65-
useFieldPreview({
66-
fieldMetadataItem,
64+
// id and name are undefined in create mode (field does not exist yet)
65+
// and are defined in edit mode.
66+
const isLabelIdentifier =
67+
!!fieldMetadataItem.id &&
68+
!!fieldMetadataItem.name &&
69+
isLabelIdentifierField({
70+
fieldMetadataItem: {
71+
id: fieldMetadataItem.id,
72+
name: fieldMetadataItem.name,
73+
},
6774
objectMetadataItem,
68-
relationObjectMetadataItem,
6975
});
7076

77+
const fieldPreviewValue = useFieldPreviewValue({
78+
isLabelIdentifier,
79+
fieldMetadataItem,
80+
objectMetadataItem,
81+
relationObjectMetadataItem,
82+
});
83+
84+
const fieldName =
85+
fieldMetadataItem.name || `${fieldMetadataItem.type}-new-field`;
86+
const entityId = `${objectMetadataItem.nameSingular}-${fieldName}-preview`;
87+
7188
return (
7289
<>
73-
{record ? (
74-
<SettingsDataModelSetRecordEffect record={record} />
75-
) : (
76-
<SettingsDataModelSetFieldValueEffect
77-
entityId={entityId}
78-
fieldName={fieldName}
79-
value={fieldPreviewValue}
80-
/>
81-
)}
90+
<SettingsDataModelSetFieldValueEffect
91+
entityId={entityId}
92+
fieldName={fieldName}
93+
value={fieldPreviewValue}
94+
/>
8295
<StyledFieldPreview shrink={shrink}>
8396
{!!withFieldLabel && (
8497
<StyledFieldLabel>
+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { RecoilRoot } from 'recoil';
66
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
77
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
88

9-
import { useFieldPreview } from '../useFieldPreview';
9+
import { useFieldPreviewValue } from '../useFieldPreviewValue';
1010

1111
const Wrapper = ({ children }: { children: ReactNode }) => (
1212
<RecoilRoot>
@@ -28,7 +28,7 @@ describe('useFieldPreview', () => {
2828

2929
// When
3030
const { result } = renderHook(
31-
() => useFieldPreview({ fieldMetadataItem, objectMetadataItem }),
31+
() => useFieldPreviewValue({ fieldMetadataItem, objectMetadataItem }),
3232
{ wrapper: Wrapper },
3333
);
3434

@@ -51,7 +51,7 @@ describe('useFieldPreview', () => {
5151

5252
// When
5353
const { result } = renderHook(
54-
() => useFieldPreview({ fieldMetadataItem, objectMetadataItem }),
54+
() => useFieldPreviewValue({ fieldMetadataItem, objectMetadataItem }),
5555
{ wrapper: Wrapper },
5656
);
5757

packages/twenty-front/src/modules/settings/data-model/fields/preview/hooks/useFieldPreview.ts

-106
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
2+
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
3+
import { useLabelIdentifierFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useLabelIdentifierFieldPreviewValue';
4+
import { useRelationFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useRelationFieldPreviewValue';
5+
import { getFieldPreviewValue } from '@/settings/data-model/fields/preview/utils/getFieldPreviewValue';
6+
import { getMultiSelectFieldPreviewValue } from '@/settings/data-model/fields/preview/utils/getMultiSelectFieldPreviewValue';
7+
import { getSelectFieldPreviewValue } from '@/settings/data-model/fields/preview/utils/getSelectFieldPreviewValue';
8+
import { FieldMetadataType } from '~/generated-metadata/graphql';
9+
10+
type UseFieldPreviewParams = {
11+
fieldMetadataItem: Pick<
12+
FieldMetadataItem,
13+
'type' | 'options' | 'defaultValue'
14+
>;
15+
isLabelIdentifier?: boolean;
16+
objectMetadataItem: ObjectMetadataItem;
17+
relationObjectMetadataItem?: ObjectMetadataItem;
18+
};
19+
20+
export const useFieldPreviewValue = ({
21+
fieldMetadataItem,
22+
isLabelIdentifier = false,
23+
objectMetadataItem,
24+
relationObjectMetadataItem,
25+
}: UseFieldPreviewParams) => {
26+
const labelIdentifierFieldPreviewValue = useLabelIdentifierFieldPreviewValue({
27+
objectMetadataItem,
28+
skip: !isLabelIdentifier,
29+
});
30+
31+
const relationFieldPreviewValue = useRelationFieldPreviewValue({
32+
relationObjectMetadataItem: relationObjectMetadataItem ?? {
33+
fields: [],
34+
labelSingular: '',
35+
nameSingular: '',
36+
},
37+
skip:
38+
fieldMetadataItem.type !== FieldMetadataType.Relation ||
39+
!relationObjectMetadataItem,
40+
});
41+
42+
if (isLabelIdentifier) return labelIdentifierFieldPreviewValue;
43+
44+
switch (fieldMetadataItem.type) {
45+
case FieldMetadataType.Relation:
46+
return relationFieldPreviewValue;
47+
case FieldMetadataType.Select:
48+
return getSelectFieldPreviewValue({ fieldMetadataItem });
49+
case FieldMetadataType.MultiSelect:
50+
return getMultiSelectFieldPreviewValue({ fieldMetadataItem });
51+
default:
52+
return getFieldPreviewValue({ fieldMetadataItem });
53+
}
54+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
2+
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
3+
import { getPlaceholderRecord } from '@/settings/data-model/fields/preview/utils/getPlaceholderRecord';
4+
5+
type UseLabelIdentifierFieldPreviewParams = {
6+
objectMetadataItem: Pick<
7+
ObjectMetadataItem,
8+
| 'fields'
9+
| 'labelIdentifierFieldMetadataId'
10+
| 'labelSingular'
11+
| 'nameSingular'
12+
>;
13+
skip?: boolean;
14+
};
15+
16+
export const useLabelIdentifierFieldPreviewValue = ({
17+
objectMetadataItem,
18+
skip,
19+
}: UseLabelIdentifierFieldPreviewParams) => {
20+
const { records } = useFindManyRecords({
21+
objectNameSingular: objectMetadataItem.nameSingular,
22+
limit: 1,
23+
skip,
24+
});
25+
26+
if (!skip) return null;
27+
28+
const [firstRecord] = records;
29+
30+
const fieldPreviewValue =
31+
firstRecord ??
32+
// If no record was found, display a placeholder record
33+
getPlaceholderRecord({ objectMetadataItem });
34+
35+
return fieldPreviewValue;
36+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
2+
import { useLabelIdentifierFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useLabelIdentifierFieldPreviewValue';
3+
4+
type UseRelationFieldPreviewParams = {
5+
relationObjectMetadataItem: Pick<
6+
ObjectMetadataItem,
7+
| 'fields'
8+
| 'labelIdentifierFieldMetadataId'
9+
| 'labelSingular'
10+
| 'nameSingular'
11+
>;
12+
skip?: boolean;
13+
};
14+
15+
export const useRelationFieldPreviewValue = ({
16+
relationObjectMetadataItem,
17+
skip,
18+
}: UseRelationFieldPreviewParams) =>
19+
useLabelIdentifierFieldPreviewValue({
20+
objectMetadataItem: relationObjectMetadataItem,
21+
skip,
22+
});

0 commit comments

Comments
 (0)