From 7a3338b4dee9130fdf025e86ee8857e3e76cf4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tha=C3=AFs?= Date: Tue, 24 Oct 2023 08:33:35 +0200 Subject: [PATCH] feat: save edited custom object (#2204) Closes #2153 Co-authored-by: Charles Bochet --- .../metadata/hooks/useObjectMetadata.ts | 12 +++ .../components/SettingsObjectFormSection.tsx | 8 +- .../settings/data-model/SettingsNewObject.tsx | 14 +-- .../data-model/SettingsObjectEdit.tsx | 100 ++++++++++++++---- 4 files changed, 104 insertions(+), 30 deletions(-) diff --git a/front/src/modules/metadata/hooks/useObjectMetadata.ts b/front/src/modules/metadata/hooks/useObjectMetadata.ts index 0b30dc02f..4a41d4529 100644 --- a/front/src/modules/metadata/hooks/useObjectMetadata.ts +++ b/front/src/modules/metadata/hooks/useObjectMetadata.ts @@ -15,6 +15,17 @@ export const useObjectMetadata = () => { const { updateOneMetadataObject } = useUpdateOneMetadataObject(); + const editObject = (metadataObject: MetadataObject) => + updateOneMetadataObject({ + idToUpdate: metadataObject.id, + updatePayload: { + description: metadataObject.description ?? null, + icon: metadataObject.icon, + labelPlural: metadataObject.labelPlural, + labelSingular: metadataObject.labelSingular, + }, + }); + const activateObject = (metadataObject: MetadataObject) => updateOneMetadataObject({ idToUpdate: metadataObject.id, @@ -32,5 +43,6 @@ export const useObjectMetadata = () => { disableObject, activeObjects: activeMetadataObjects, disabledObjects: disabledMetadataObjects, + editObject, }; }; diff --git a/front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx b/front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx index 77a1e3ce1..336846ff8 100644 --- a/front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx +++ b/front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx @@ -12,8 +12,8 @@ type SettingsObjectFormSectionProps = { description?: string; onChange?: ( formValues: Partial<{ - singularName: string; - pluralName: string; + labelSingular: string; + labelPlural: string; description: string; }>, ) => void; @@ -43,7 +43,7 @@ export const SettingsObjectFormSection = ({ label="Singular" placeholder="Investor" value={singularName} - onChange={(value) => onChange?.({ singularName: value })} + onChange={(value) => onChange?.({ labelSingular: value })} disabled={disabled} fullWidth /> @@ -51,7 +51,7 @@ export const SettingsObjectFormSection = ({ label="Plural" placeholder="Investors" value={pluralName} - onChange={(value) => onChange?.({ pluralName: value })} + onChange={(value) => onChange?.({ labelPlural: value })} disabled={disabled} fullWidth /> diff --git a/front/src/pages/settings/data-model/SettingsNewObject.tsx b/front/src/pages/settings/data-model/SettingsNewObject.tsx index bc34e3aa9..9f279472d 100644 --- a/front/src/pages/settings/data-model/SettingsNewObject.tsx +++ b/front/src/pages/settings/data-model/SettingsNewObject.tsx @@ -23,16 +23,16 @@ export const SettingsNewObject = () => { const [customFormValues, setCustomFormValues] = useState< Partial<{ - pluralName: string; - singularName: string; + labelPlural: string; + labelSingular: string; description: string; }> >({}); const canSave = selectedObjectType === 'Custom' && - !!customFormValues.pluralName && - !!customFormValues.singularName; + !!customFormValues.labelPlural && + !!customFormValues.labelSingular; return ( @@ -64,10 +64,10 @@ export const SettingsNewObject = () => { {selectedObjectType === 'Custom' && ( <> - + { setCustomFormValues((previousValues) => ({ diff --git a/front/src/pages/settings/data-model/SettingsObjectEdit.tsx b/front/src/pages/settings/data-model/SettingsObjectEdit.tsx index 2e5dc3a5e..38cf5944c 100644 --- a/front/src/pages/settings/data-model/SettingsObjectEdit.tsx +++ b/front/src/pages/settings/data-model/SettingsObjectEdit.tsx @@ -1,7 +1,9 @@ -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useObjectMetadata } from '@/metadata/hooks/useObjectMetadata'; +import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons'; +import { SettingsHeaderContainer } from '@/settings/components/SettingsHeaderContainer'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { SettingsObjectFormSection } from '@/settings/data-model/components/SettingsObjectFormSection'; import { SettingsObjectIconSection } from '@/settings/data-model/object-edit/SettingsObjectIconSection'; @@ -17,40 +19,100 @@ export const SettingsObjectEdit = () => { const navigate = useNavigate(); const { pluralObjectName = '' } = useParams(); - const { activeObjects, disableObject } = useObjectMetadata(); + const { activeObjects, disableObject, editObject } = useObjectMetadata(); const activeObject = activeObjects.find( (activeObject) => activeObject.namePlural === pluralObjectName, ); + const [formValues, setFormValues] = useState< + Partial<{ + icon: string; + labelSingular: string; + labelPlural: string; + description: string; + }> + >({}); + useEffect(() => { - if (activeObjects.length && !activeObject) navigate(AppPath.NotFound); - }, [activeObject, activeObjects.length, navigate]); + if (!activeObjects.length) return; + + if (!activeObject) { + navigate(AppPath.NotFound); + return; + } + + if (!Object.keys(formValues).length) { + setFormValues({ + icon: activeObject.icon ?? undefined, + labelSingular: activeObject.labelSingular, + labelPlural: activeObject.labelPlural, + description: activeObject.description ?? undefined, + }); + } + }, [activeObject, activeObjects.length, formValues, navigate]); + + const areRequiredFieldsFilled = + !!formValues.labelSingular && !!formValues.labelPlural; + + const hasChanges = + formValues.description !== activeObject?.description || + formValues.icon !== activeObject?.icon || + formValues.labelPlural !== activeObject?.labelPlural || + formValues.labelSingular !== activeObject?.labelSingular; + + const canSave = areRequiredFieldsFilled && hasChanges; return ( - + + + {!!activeObject?.isCustom && ( + { + navigate(`/settings/objects/${pluralObjectName}`); + }} + onSave={() => { + editObject({ ...activeObject, ...formValues }); + navigate(`/settings/objects/${pluralObjectName}`); + }} + /> + )} + {activeObject && ( <> + setFormValues((previousFormValues) => ({ + ...previousFormValues, + icon: iconKey, + })) + } /> + setFormValues((previousFormValues) => ({ + ...previousFormValues, + ...values, + })) + } />