From 21e46e4b0405f71b86055e7e92340ea95c5e7fd2 Mon Sep 17 00:00:00 2001 From: sid0-0 Date: Wed, 2 Oct 2024 00:28:17 +0530 Subject: [PATCH] dynamically prefilling relation label and icon source --- .../SettingsDataModelFieldIconLabelForm.tsx | 38 ++++++++++++++++++- .../SettingsObjectNewFieldStep2.tsx | 22 ++++++++--- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldIconLabelForm.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldIconLabelForm.tsx index d4771446e5d3..c3b82ccddd8c 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldIconLabelForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldIconLabelForm.tsx @@ -3,10 +3,14 @@ import { Controller, useFormContext } from 'react-hook-form'; import { z } from 'zod'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { fieldMetadataItemSchema } from '@/object-metadata/validation-schemas/fieldMetadataItemSchema'; import { getErrorMessageFromError } from '@/settings/data-model/fields/forms/utils/errorMessages'; +import { RelationType } from '@/settings/data-model/types/RelationType'; import { IconPicker } from '@/ui/input/components/IconPicker'; import { TextInput } from '@/ui/input/components/TextInput'; +import { useEffect, useState } from 'react'; +import { RelationDefinitionType } from '~/generated-metadata/graphql'; export const settingsDataModelFieldIconLabelFormSchema = ( existingOtherLabels: string[] = [], @@ -32,19 +36,47 @@ type SettingsDataModelFieldIconLabelFormProps = { disabled?: boolean; fieldMetadataItem?: FieldMetadataItem; maxLength?: number; + relationObjectMetadataItem?: ObjectMetadataItem; + relationType?: RelationType; }; export const SettingsDataModelFieldIconLabelForm = ({ disabled, fieldMetadataItem, maxLength, + relationObjectMetadataItem, + relationType, }: SettingsDataModelFieldIconLabelFormProps) => { const { control, trigger, formState: { errors }, + setValue, } = useFormContext(); + const [labelEditedManually, setLabelEditedManually] = useState(false); + const [iconEditedManually, setIconEditedManually] = useState(false); + + useEffect(() => { + if (labelEditedManually) return; + const label = [ + RelationDefinitionType.ManyToOne, + RelationDefinitionType.ManyToMany, + ].includes(relationType ?? RelationDefinitionType.OneToMany) + ? relationObjectMetadataItem?.labelPlural + : relationObjectMetadataItem?.labelSingular; + setValue('label', label ?? ''); + + if (iconEditedManually) return; + setValue('icon', relationObjectMetadataItem?.icon ?? 'IconUsers'); + }, [ + labelEditedManually, + iconEditedManually, + relationObjectMetadataItem, + setValue, + relationType, + ]); + return ( onChange(iconKey)} + onChange={({ iconKey }) => { + setIconEditedManually(true); + onChange(iconKey); + }} variant="primary" /> )} @@ -69,6 +104,7 @@ export const SettingsDataModelFieldIconLabelForm = ({ placeholder="Employees" value={value} onChange={(e) => { + setLabelEditedManually(true); onChange(e); trigger('label'); }} diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx index 90a1e4d1020e..8a8033eed2f3 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx @@ -2,6 +2,7 @@ import { useCreateOneRelationMetadataItem } from '@/object-metadata/hooks/useCre import { useFieldMetadataItem } from '@/object-metadata/hooks/useFieldMetadataItem'; import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; +import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { RecordFieldValueSelectorContextProvider } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext'; import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons'; @@ -50,7 +51,7 @@ export const SettingsObjectNewFieldStep2 = () => { const { enqueueSnackBar } = useSnackBar(); const [isConfigureStep, setIsConfigureStep] = useState(false); - const { findActiveObjectMetadataItemBySlug } = + const { findActiveObjectMetadataItemBySlug, findObjectMetadataItemById } = useFilteredObjectMetadataItems(); const activeObjectMetadataItem = @@ -66,6 +67,13 @@ export const SettingsObjectNewFieldStep2 = () => { ), }); + const fieldMetadataItem: Pick = + { + icon: formConfig.watch('icon'), + label: formConfig.watch('label') || 'Employees', + type: formConfig.watch('type'), + }; + useEffect(() => { if (!activeObjectMetadataItem) { navigate(AppPath.NotFound); @@ -91,6 +99,10 @@ export const SettingsObjectNewFieldStep2 = () => { const relationObjectMetadataId = formConfig.watch( 'relation.objectMetadataId', ); + const relationType = formConfig.watch('relation.type'); + const relationObjectMetadataItem = findObjectMetadataItemById( + relationObjectMetadataId, + ); useFindManyRecords({ objectNameSingular: CoreObjectNameSingular.View, @@ -238,6 +250,8 @@ export const SettingsObjectNewFieldStep2 = () => { description="The name and icon of this field" /> @@ -249,11 +263,7 @@ export const SettingsObjectNewFieldStep2 = () => {