Skip to content

Commit b5a8459

Browse files
author
sid0-0
committed
Prefill Relation Fields with Initiating Object Icon and Name
1 parent 2f41e14 commit b5a8459

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

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

+34-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import { fieldMetadataItemSchema } from '@/object-metadata/validation-schemas/fi
1010
import { FIELD_NAME_MAXIMUM_LENGTH } from '@/settings/data-model/constants/FieldNameMaximumLength';
1111
import { RELATION_TYPES } from '@/settings/data-model/constants/RelationTypes';
1212
import { useRelationSettingsFormInitialValues } from '@/settings/data-model/fields/forms/relation/hooks/useRelationSettingsFormInitialValues';
13+
import { SettingsDataModelFieldPreviewCardProps } from '@/settings/data-model/fields/preview/components/SettingsDataModelFieldPreviewCard';
1314
import { RelationType } from '@/settings/data-model/types/RelationType';
1415
import { IconPicker } from '@/ui/input/components/IconPicker';
1516
import { Select } from '@/ui/input/components/Select';
1617
import { TextInput } from '@/ui/input/components/TextInput';
18+
import { useEffect, useState } from 'react';
1719
import { RelationDefinitionType } from '~/generated-metadata/graphql';
1820

1921
export const settingsDataModelFieldRelationFormSchema = z.object({
@@ -38,6 +40,7 @@ export type SettingsDataModelFieldRelationFormValues = z.infer<
3840

3941
type SettingsDataModelFieldRelationFormProps = {
4042
fieldMetadataItem: Pick<FieldMetadataItem, 'type'>;
43+
objectMetadataItem: SettingsDataModelFieldPreviewCardProps['objectMetadataItem'];
4144
};
4245

4346
const StyledContainer = styled.div`
@@ -75,25 +78,49 @@ const RELATION_TYPE_OPTIONS = Object.entries(RELATION_TYPES)
7578

7679
export const SettingsDataModelFieldRelationForm = ({
7780
fieldMetadataItem,
81+
objectMetadataItem,
7882
}: SettingsDataModelFieldRelationFormProps) => {
79-
const { control, watch: watchFormValue } =
80-
useFormContext<SettingsDataModelFieldRelationFormValues>();
83+
const {
84+
control,
85+
watch: watchFormValue,
86+
setValue,
87+
} = useFormContext<SettingsDataModelFieldRelationFormValues>();
8188
const { getIcon } = useIcons();
8289
const { objectMetadataItems, findObjectMetadataItemById } =
8390
useFilteredObjectMetadataItems();
8491

92+
const [labelEditedManually, setLabelEditedManually] = useState(false);
93+
8594
const {
8695
disableFieldEdition,
8796
disableRelationEdition,
8897
initialRelationFieldMetadataItem,
8998
initialRelationObjectMetadataItem,
9099
initialRelationType,
91-
} = useRelationSettingsFormInitialValues({ fieldMetadataItem });
100+
} = useRelationSettingsFormInitialValues({
101+
fieldMetadataItem,
102+
objectMetadataItem,
103+
});
92104

93105
const selectedObjectMetadataItem = findObjectMetadataItemById(
94106
watchFormValue('relation.objectMetadataId'),
95107
);
96108

109+
const relationType = watchFormValue('relation.type');
110+
111+
useEffect(() => {
112+
if (labelEditedManually) return;
113+
setValue(
114+
'relation.field.label',
115+
[
116+
RelationDefinitionType.ManyToMany,
117+
RelationDefinitionType.ManyToOne,
118+
].includes(relationType)
119+
? objectMetadataItem.labelPlural
120+
: objectMetadataItem.labelSingular,
121+
);
122+
}, [labelEditedManually, objectMetadataItem, relationType, setValue]);
123+
97124
return (
98125
<StyledContainer>
99126
<StyledSelectsContainer>
@@ -163,7 +190,10 @@ export const SettingsDataModelFieldRelationForm = ({
163190
disabled={disableFieldEdition}
164191
placeholder="Field name"
165192
value={value}
166-
onChange={onChange}
193+
onChange={(newValue) => {
194+
setLabelEditedManually(true);
195+
onChange(newValue);
196+
}}
167197
fullWidth
168198
maxLength={FIELD_NAME_MAXIMUM_LENGTH}
169199
/>

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

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export const SettingsDataModelFieldRelationSettingsFormCard = ({
104104
form={
105105
<SettingsDataModelFieldRelationForm
106106
fieldMetadataItem={fieldMetadataItem}
107+
objectMetadataItem={objectMetadataItem}
107108
/>
108109
}
109110
/>

packages/twenty-front/src/modules/settings/data-model/fields/forms/relation/hooks/useRelationSettingsFormInitialValues.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ import { useMemo } from 'react';
22

33
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
44
import { useGetRelationMetadata } from '@/object-metadata/hooks/useGetRelationMetadata';
5-
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
65
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
76
import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation';
7+
import { SettingsDataModelFieldPreviewCardProps } from '@/settings/data-model/fields/preview/components/SettingsDataModelFieldPreviewCard';
88
import { RelationDefinitionType } from '~/generated-metadata/graphql';
99

1010
export const useRelationSettingsFormInitialValues = ({
1111
fieldMetadataItem,
12+
objectMetadataItem,
1213
}: {
1314
fieldMetadataItem?: Pick<FieldMetadataItem, 'type' | 'relationDefinition'>;
15+
objectMetadataItem?: SettingsDataModelFieldPreviewCardProps['objectMetadataItem'];
1416
}) => {
1517
const { objectMetadataItems } = useFilteredObjectMetadataItems();
1618

@@ -28,11 +30,13 @@ export const useRelationSettingsFormInitialValues = ({
2830
const initialRelationObjectMetadataItem = useMemo(
2931
() =>
3032
relationObjectMetadataItemFromFieldMetadata ??
31-
objectMetadataItems.find(
32-
({ nameSingular }) => nameSingular === CoreObjectNameSingular.Person,
33-
) ??
33+
objectMetadataItem ??
3434
objectMetadataItems.filter(isObjectMetadataAvailableForRelation)[0],
35-
[objectMetadataItems, relationObjectMetadataItemFromFieldMetadata],
35+
[
36+
objectMetadataItem,
37+
objectMetadataItems,
38+
relationObjectMetadataItemFromFieldMetadata,
39+
],
3640
);
3741

3842
const initialRelationType =
@@ -44,7 +48,12 @@ export const useRelationSettingsFormInitialValues = ({
4448
disableRelationEdition: !!relationFieldMetadataItem,
4549
initialRelationFieldMetadataItem: relationFieldMetadataItem ?? {
4650
icon: initialRelationObjectMetadataItem.icon ?? 'IconUsers',
47-
label: '',
51+
label: [
52+
RelationDefinitionType.ManyToMany,
53+
RelationDefinitionType.ManyToOne,
54+
].includes(initialRelationType)
55+
? initialRelationObjectMetadataItem.labelPlural
56+
: initialRelationObjectMetadataItem.labelSingular,
4857
},
4958
initialRelationObjectMetadataItem,
5059
initialRelationType,

0 commit comments

Comments
 (0)