Skip to content

Commit b693f7d

Browse files
author
sid0-0
committed
Prefill Relation Fields with Initiating Object Icon and Name
1 parent 491fe80 commit b693f7d

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

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

+33-4
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ 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';
1718
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
19+
import { useEffect, useState } from 'react';
1820
import { RelationDefinitionType } from '~/generated-metadata/graphql';
1921

2022
export const settingsDataModelFieldRelationFormSchema = z.object({
@@ -39,6 +41,7 @@ export type SettingsDataModelFieldRelationFormValues = z.infer<
3941

4042
type SettingsDataModelFieldRelationFormProps = {
4143
fieldMetadataItem: Pick<FieldMetadataItem, 'type'>;
44+
objectMetadataItem: SettingsDataModelFieldPreviewCardProps['objectMetadataItem'];
4245
};
4346

4447
const StyledContainer = styled.div`
@@ -79,26 +82,49 @@ const RELATION_TYPE_OPTIONS = Object.entries(RELATION_TYPES)
7982

8083
export const SettingsDataModelFieldRelationForm = ({
8184
fieldMetadataItem,
85+
objectMetadataItem,
8286
}: SettingsDataModelFieldRelationFormProps) => {
83-
const { control, watch: watchFormValue } =
84-
useFormContext<SettingsDataModelFieldRelationFormValues>();
87+
const {
88+
control,
89+
watch: watchFormValue,
90+
setValue,
91+
} = useFormContext<SettingsDataModelFieldRelationFormValues>();
8592
const { getIcon } = useIcons();
8693
const { objectMetadataItems, findObjectMetadataItemById } =
8794
useFilteredObjectMetadataItems();
8895

96+
const [labelEditedManually, setLabelEditedManually] = useState(false);
97+
8998
const {
9099
disableFieldEdition,
91100
disableRelationEdition,
92101
initialRelationFieldMetadataItem,
93102
initialRelationObjectMetadataItem,
94103
initialRelationType,
95-
} = useRelationSettingsFormInitialValues({ fieldMetadataItem });
104+
} = useRelationSettingsFormInitialValues({
105+
fieldMetadataItem,
106+
objectMetadataItem,
107+
});
96108

97109
const selectedObjectMetadataItem = findObjectMetadataItemById(
98110
watchFormValue('relation.objectMetadataId'),
99111
);
100112

101113
const isMobile = useIsMobile();
114+
const relationType = watchFormValue('relation.type');
115+
116+
useEffect(() => {
117+
if (labelEditedManually) return;
118+
setValue(
119+
'relation.field.label',
120+
[
121+
RelationDefinitionType.ManyToMany,
122+
RelationDefinitionType.ManyToOne,
123+
].includes(relationType)
124+
? objectMetadataItem.labelPlural
125+
: objectMetadataItem.labelSingular,
126+
);
127+
}, [labelEditedManually, objectMetadataItem, relationType, setValue]);
102128

103129
return (
104130
<StyledContainer>
@@ -169,7 +195,10 @@ export const SettingsDataModelFieldRelationForm = ({
169195
disabled={disableFieldEdition}
170196
placeholder="Field name"
171197
value={value}
172-
onChange={onChange}
198+
onChange={(newValue) => {
199+
setLabelEditedManually(true);
200+
onChange(newValue);
201+
}}
173202
fullWidth
174203
maxLength={FIELD_NAME_MAXIMUM_LENGTH}
175204
/>

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

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export const SettingsDataModelFieldRelationSettingsFormCard = ({
114114
form={
115115
<SettingsDataModelFieldRelationForm
116116
fieldMetadataItem={fieldMetadataItem}
117+
objectMetadataItem={objectMetadataItem}
117118
/>
118119
}
119120
/>

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)