From 6ec06be18d839748ef1f85e0633642819ccb2be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Tue, 25 Mar 2025 22:17:29 +0100 Subject: [PATCH] Overwrite standard translations (#11134) Manage overwriting translations for standard fields and standard objects properties --- .../SettingsDataModelFieldIconLabelForm.tsx | 7 +- .../SettingsDataModelObjectAboutForm.tsx | 76 +- .../appearance/components/LocalePicker.tsx | 13 +- .../dtos/field-standard-overrides.dto.ts | 19 +- .../field-metadata/field-metadata.resolver.ts | 7 +- .../field-metadata/field-metadata.service.ts | 21 +- .../before-update-one-field.hook.spec.ts | 554 +++++++++++++ .../hooks/before-update-one-field.hook.ts | 201 ++++- .../dtos/object-standard-overrides.dto.ts | 20 +- .../before-update-one-object.hook.spec.ts | 753 ++++++++++++++++++ .../hooks/before-update-one-object.hook.ts | 230 +++++- .../object-metadata.resolver.ts | 7 +- .../object-metadata.service.ts | 23 +- 13 files changed, 1809 insertions(+), 122 deletions(-) create mode 100644 packages/twenty-server/src/engine/metadata-modules/field-metadata/hooks/__tests__/before-update-one-field.hook.spec.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/object-metadata/hooks/__tests__/before-update-one-object.hook.spec.ts 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 1b87c1ac7..934425ff7 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 @@ -105,7 +105,6 @@ export const SettingsDataModelFieldIconLabelForm = ({ const fillNameFromLabel = (label: string) => { isDefined(label) && - fieldMetadataItem?.isCustom && setValue('name', computeMetadataNameFromLabel(label), { shouldDirty: true, }); @@ -141,7 +140,11 @@ export const SettingsDataModelFieldIconLabelForm = ({ } }} error={getErrorMessageFromError(errors.label?.message)} - disabled={isLabelSyncedWithName === true} + disabled={ + isLabelSyncedWithName === true && + fieldMetadataItem && + !fieldMetadataItem?.isCustom + } maxLength={maxLength} fullWidth /> 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 index 6106d2cf7..6d73859b5 100644 --- 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 @@ -100,6 +100,7 @@ export const SettingsDataModelObjectAboutForm = ({ setValue('labelPlural', labelPluralFromSingularLabel, { shouldDirty: true, }); + fillNamePluralFromLabelPlural(labelPluralFromSingularLabel); }; const fillNameSingularFromLabelSingular = ( @@ -161,7 +162,11 @@ export const SettingsDataModelObjectAboutForm = ({ } }} onBlur={() => onNewDirtyField?.()} - disabled={!objectMetadataItem?.isCustom && isLabelSyncedWithName} + disabled={ + objectMetadataItem && + !objectMetadataItem?.isCustom && + isLabelSyncedWithName + } fullWidth maxLength={OBJECT_NAME_MAXIMUM_LENGTH} /> @@ -187,7 +192,11 @@ export const SettingsDataModelObjectAboutForm = ({ } }} onBlur={() => onNewDirtyField?.()} - disabled={!objectMetadataItem?.isCustom && isLabelSyncedWithName} + disabled={ + objectMetadataItem && + !objectMetadataItem?.isCustom && + isLabelSyncedWithName + } fullWidth maxLength={OBJECT_NAME_MAXIMUM_LENGTH} /> @@ -293,37 +302,40 @@ export const SettingsDataModelObjectAboutForm = ({ ), )} - - ( - - { - onChange(value); - onNewDirtyField?.(); + {(!objectMetadataItem || objectMetadataItem?.isCustom) && ( + + ( + + { + onChange(value); + onNewDirtyField?.(); - if ( - value === true && - isDefined(objectMetadataItem) && - objectMetadataItem.isCustom - ) { - fillNamePluralFromLabelPlural(labelPlural); - fillNameSingularFromLabelSingular(labelSingular); - } - }} - /> - - )} - /> - + if ( + value === true && + ((isDefined(objectMetadataItem) && + objectMetadataItem.isCustom) || + !isDefined(objectMetadataItem)) + ) { + fillNamePluralFromLabelPlural(labelPlural); + fillNameSingularFromLabelSingular(labelSingular); + } + }} + /> + + )} + /> + + )} diff --git a/packages/twenty-front/src/pages/settings/profile/appearance/components/LocalePicker.tsx b/packages/twenty-front/src/pages/settings/profile/appearance/components/LocalePicker.tsx index d3902630e..6660cb3a1 100644 --- a/packages/twenty-front/src/pages/settings/profile/appearance/components/LocalePicker.tsx +++ b/packages/twenty-front/src/pages/settings/profile/appearance/components/LocalePicker.tsx @@ -9,10 +9,10 @@ import { Select } from '@/ui/input/components/Select'; import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItem'; import { useLingui } from '@lingui/react/macro'; -import { dynamicActivate } from '~/utils/i18n/dynamicActivate'; -import { logError } from '~/utils/logError'; import { APP_LOCALES } from 'twenty-shared/translations'; import { isDefined } from 'twenty-shared/utils'; +import { dynamicActivate } from '~/utils/i18n/dynamicActivate'; +import { logError } from '~/utils/logError'; const StyledContainer = styled.div` display: flex; @@ -62,7 +62,7 @@ export const LocalePicker = () => { await refreshObjectMetadataItems(); }; - const localeOptions: Array<{ + const unsortedLocaleOptions: Array<{ label: string; value: (typeof APP_LOCALES)[keyof typeof APP_LOCALES]; }> = [ @@ -187,13 +187,18 @@ export const LocalePicker = () => { value: APP_LOCALES['vi-VN'], }, ]; + if (isDebugMode) { - localeOptions.push({ + unsortedLocaleOptions.push({ label: t`Pseudo-English`, value: APP_LOCALES['pseudo-en'], }); } + const localeOptions = [...unsortedLocaleOptions].sort((a, b) => + a.label.localeCompare(b.label), + ); + return (