diff --git a/package.json b/package.json
index d0c8e0c6c..704922c45 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
"@types/facepaint": "^1.2.5",
"@types/lodash.camelcase": "^4.3.7",
"@types/lodash.merge": "^4.6.7",
+ "@types/lodash.pick": "^4.3.7",
"@types/mailparser": "^3.4.4",
"@types/nodemailer": "^6.4.14",
"add": "^2.0.6",
@@ -112,6 +113,7 @@
"lodash.kebabcase": "^4.1.1",
"lodash.merge": "^4.6.2",
"lodash.omit": "^4.5.0",
+ "lodash.pick": "^4.4.0",
"lodash.snakecase": "^4.1.1",
"lodash.upperfirst": "^4.3.1",
"luxon": "^3.3.0",
diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx
deleted file mode 100644
index 3b8f0ecb6..000000000
--- a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFormSection.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import styled from '@emotion/styled';
-
-import { validateMetadataLabel } from '@/object-metadata/utils/validateMetadataLabel';
-import { H2Title } from '@/ui/display/typography/components/H2Title';
-import { IconPicker } from '@/ui/input/components/IconPicker';
-import { TextArea } from '@/ui/input/components/TextArea';
-import { TextInput } from '@/ui/input/components/TextInput';
-import { Section } from '@/ui/layout/section/components/Section';
-
-type SettingsObjectFormSectionProps = {
- disabled?: boolean;
- icon?: string;
- singularName?: string;
- pluralName?: string;
- description?: string;
- onChange?: (
- formValues: Partial<{
- icon: string;
- labelSingular: string;
- labelPlural: string;
- description: string;
- }>,
- ) => void;
-};
-
-const StyledInputsContainer = styled.div`
- display: flex;
- gap: ${({ theme }) => theme.spacing(2)};
- margin-bottom: ${({ theme }) => theme.spacing(2)};
- width: 100%;
-`;
-
-const StyledLabel = styled.span`
- color: ${({ theme }) => theme.font.color.light};
- font-size: ${({ theme }) => theme.font.size.xs};
- font-weight: ${({ theme }) => theme.font.weight.semiBold};
- margin-bottom: ${({ theme }) => theme.spacing(1)};
- text-transform: uppercase;
-`;
-
-const StyledInputContainer = styled.div`
- display: flex;
- flex-direction: column;
-`;
-
-export const SettingsObjectFormSection = ({
- disabled,
- icon = 'IconListNumbers',
- singularName = '',
- pluralName = '',
- description = '',
- onChange,
-}: SettingsObjectFormSectionProps) => (
-
-
-
-
- Icon
- {
- onChange?.({ icon: icon.iconKey });
- }}
- />
-
- {
- if (!value || validateMetadataLabel(value)) {
- onChange?.({ labelSingular: value });
- }
- }}
- disabled={disabled}
- fullWidth
- />
- {
- if (!value || validateMetadataLabel(value)) {
- onChange?.({ labelPlural: value });
- }
- }}
- disabled={disabled}
- fullWidth
- />
-
-
-);
diff --git a/packages/twenty-front/src/modules/settings/data-model/components/__stories__/SettingsObjectFormSection.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/components/__stories__/SettingsObjectFormSection.stories.tsx
deleted file mode 100644
index 3f82ecff6..000000000
--- a/packages/twenty-front/src/modules/settings/data-model/components/__stories__/SettingsObjectFormSection.stories.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Meta, StoryObj } from '@storybook/react';
-
-import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
-
-import { SettingsObjectFormSection } from '../SettingsObjectFormSection';
-
-const meta: Meta = {
- title: 'Modules/Settings/DataModel/SettingsObjectFormSection',
- component: SettingsObjectFormSection,
- decorators: [ComponentDecorator],
-};
-
-export default meta;
-type Story = StoryObj;
-
-export const Default: Story = {};
-
-export const WithDefaultValues: Story = {
- args: {
- singularName: 'Company',
- pluralName: 'Companies',
- description: 'Lorem ipsum',
- },
-};
diff --git a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx
new file mode 100644
index 000000000..61061040d
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx
@@ -0,0 +1,120 @@
+import { Controller, useFormContext } from 'react-hook-form';
+import styled from '@emotion/styled';
+import { z } from 'zod';
+
+import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
+import { objectMetadataItemSchema } from '@/object-metadata/validation-schemas/objectMetadataItemSchema';
+import { IconPicker } from '@/ui/input/components/IconPicker';
+import { TextArea } from '@/ui/input/components/TextArea';
+import { TextInput } from '@/ui/input/components/TextInput';
+
+export const settingsDataModelObjectAboutFormSchema =
+ objectMetadataItemSchema.pick({
+ description: true,
+ icon: true,
+ labelPlural: true,
+ labelSingular: true,
+ });
+
+type SettingsDataModelObjectAboutFormValues = z.infer<
+ typeof settingsDataModelObjectAboutFormSchema
+>;
+
+type SettingsDataModelObjectAboutFormProps = {
+ disabled?: boolean;
+ objectMetadataItem?: ObjectMetadataItem;
+};
+
+const StyledInputsContainer = styled.div`
+ display: flex;
+ gap: ${({ theme }) => theme.spacing(2)};
+ margin-bottom: ${({ theme }) => theme.spacing(2)};
+ width: 100%;
+`;
+
+const StyledLabel = styled.span`
+ color: ${({ theme }) => theme.font.color.light};
+ font-size: ${({ theme }) => theme.font.size.xs};
+ font-weight: ${({ theme }) => theme.font.weight.semiBold};
+ margin-bottom: ${({ theme }) => theme.spacing(1)};
+ text-transform: uppercase;
+`;
+
+const StyledInputContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+`;
+
+export const SettingsDataModelObjectAboutForm = ({
+ disabled,
+ objectMetadataItem,
+}: SettingsDataModelObjectAboutFormProps) => {
+ const { control } = useFormContext();
+
+ return (
+ <>
+
+
+ Icon
+ (
+ onChange(iconKey)}
+ />
+ )}
+ />
+
+ {[
+ {
+ label: 'Singular',
+ fieldName: 'labelSingular' as const,
+ placeholder: 'Listing',
+ defaultValue: objectMetadataItem?.labelSingular,
+ },
+ {
+ label: 'Plural',
+ fieldName: 'labelPlural' as const,
+ placeholder: 'Listings',
+ defaultValue: objectMetadataItem?.labelPlural,
+ },
+ ].map(({ defaultValue, fieldName, label, placeholder }) => (
+ (
+
+ )}
+ />
+ ))}
+
+ (
+