Unique fields - fixes (#13848)
- Enable update to unique for composite field with defaultValue different from default defaultValue on subfield not included in unique constraint - Enable update to unique for standard field + Disable update to non-unique for standard index - Fix typo Fixes https://github.com/twentyhq/core-team-issues/issues/1360
This commit is contained in:
+19
-2
@@ -2,6 +2,7 @@ import { Controller, useFormContext } from 'react-hook-form';
|
||||
|
||||
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||
|
||||
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { Separator } from '@/settings/components/Separator';
|
||||
import { SettingsOptionCardContentSelect } from '@/settings/components/SettingsOptions/SettingsOptionCardContentSelect';
|
||||
import { canBeUnique } from '@/settings/data-model/fields/forms/utils/canBeUnique.util';
|
||||
@@ -14,15 +15,30 @@ type SettingsDataModelFieldIsUniqueFormValues = {
|
||||
};
|
||||
|
||||
type SettingsDataModelFieldIsUniqueFormProps = {
|
||||
fieldMetadataItem: Pick<FieldMetadataItem, 'isUnique' | 'type' | 'isCustom'>;
|
||||
fieldMetadataItem: Pick<
|
||||
FieldMetadataItem,
|
||||
'icon' | 'label' | 'type' | 'isCustom' | 'settings' | 'isUnique'
|
||||
> &
|
||||
Partial<{ id: string }>;
|
||||
objectMetadataItem: Pick<ObjectMetadataItem, 'indexMetadatas'>;
|
||||
};
|
||||
|
||||
export const SettingsDataModelFieldIsUniqueForm = ({
|
||||
fieldMetadataItem,
|
||||
objectMetadataItem,
|
||||
}: SettingsDataModelFieldIsUniqueFormProps) => {
|
||||
const { control } =
|
||||
useFormContext<SettingsDataModelFieldIsUniqueFormValues>();
|
||||
|
||||
const hasStandardUniqueIndex = objectMetadataItem.indexMetadatas.some(
|
||||
(index) =>
|
||||
index.isUnique &&
|
||||
!index.isCustom &&
|
||||
index.indexFieldMetadatas?.some(
|
||||
(field) => field.fieldMetadataId === fieldMetadataItem.id,
|
||||
),
|
||||
);
|
||||
|
||||
if (!canBeUnique(fieldMetadataItem)) {
|
||||
return null;
|
||||
}
|
||||
@@ -41,12 +57,13 @@ export const SettingsDataModelFieldIsUniqueForm = ({
|
||||
<SettingsOptionCardContentSelect
|
||||
Icon={IconKey}
|
||||
title={t`Unique`}
|
||||
description={t`Prevent from assigining the same value to different records`}
|
||||
description={t`Prevent from assigning the same value to different records`}
|
||||
>
|
||||
<Toggle
|
||||
toggleSize="small"
|
||||
value={isUnique}
|
||||
onChange={(value) => onChange(value)}
|
||||
disabled={hasStandardUniqueIndex}
|
||||
/>
|
||||
</SettingsOptionCardContentSelect>
|
||||
</>
|
||||
|
||||
+1
@@ -265,6 +265,7 @@ export const SettingsDataModelFieldSettingsFormCard = ({
|
||||
form={
|
||||
<SettingsDataModelFieldIsUniqueForm
|
||||
fieldMetadataItem={fieldMetadataItem}
|
||||
objectMetadataItem={objectMetadataItem}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
|
||||
+4
-2
@@ -15,8 +15,9 @@ type SettingsDataModelFieldTextSettingsFormCardProps = {
|
||||
disabled?: boolean;
|
||||
fieldMetadataItem: Pick<
|
||||
FieldMetadataItem,
|
||||
'icon' | 'label' | 'type' | 'defaultValue' | 'isUnique' | 'isCustom'
|
||||
>;
|
||||
'icon' | 'label' | 'type' | 'isCustom' | 'settings'
|
||||
> &
|
||||
Partial<{ id: string }>;
|
||||
} & Pick<SettingsDataModelFieldPreviewCardProps, 'objectMetadataItem'>;
|
||||
|
||||
const StyledFieldPreviewCard = styled(SettingsDataModelFieldPreviewCard)`
|
||||
@@ -49,6 +50,7 @@ export const SettingsDataModelFieldTextSettingsFormCard = ({
|
||||
/>
|
||||
<SettingsDataModelFieldIsUniqueForm
|
||||
fieldMetadataItem={fieldMetadataItem}
|
||||
objectMetadataItem={objectMetadataItem}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
|
||||
+4
-2
@@ -18,8 +18,9 @@ type SettingsDataModelFieldDateSettingsFormCardProps = {
|
||||
disabled?: boolean;
|
||||
fieldMetadataItem: Pick<
|
||||
FieldMetadataItem,
|
||||
'icon' | 'label' | 'type' | 'isUnique' | 'isCustom' | 'settings'
|
||||
>;
|
||||
'icon' | 'label' | 'type' | 'isCustom' | 'settings' | 'isUnique'
|
||||
> &
|
||||
Partial<{ id: string }>;
|
||||
} & Pick<SettingsDataModelFieldPreviewCardProps, 'objectMetadataItem'>;
|
||||
|
||||
const StyledFieldPreviewCard = styled(SettingsDataModelFieldPreviewCard)`
|
||||
@@ -68,6 +69,7 @@ export const SettingsDataModelFieldDateSettingsFormCard = ({
|
||||
/>
|
||||
<SettingsDataModelFieldIsUniqueForm
|
||||
fieldMetadataItem={fieldMetadataItem}
|
||||
objectMetadataItem={objectMetadataItem}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
|
||||
+4
-2
@@ -14,8 +14,9 @@ type SettingsDataModelFieldNumberSettingsFormCardProps = {
|
||||
disabled?: boolean;
|
||||
fieldMetadataItem: Pick<
|
||||
FieldMetadataItem,
|
||||
'icon' | 'label' | 'type' | 'defaultValue' | 'isUnique' | 'isCustom'
|
||||
>;
|
||||
'icon' | 'label' | 'type' | 'isCustom' | 'settings' | 'isUnique'
|
||||
> &
|
||||
Partial<{ id: string }>;
|
||||
} & Pick<SettingsDataModelFieldPreviewCardProps, 'objectMetadataItem'>;
|
||||
|
||||
const StyledFieldPreviewCard = styled(SettingsDataModelFieldPreviewCard)`
|
||||
@@ -52,6 +53,7 @@ export const SettingsDataModelFieldNumberSettingsFormCard = ({
|
||||
|
||||
<SettingsDataModelFieldIsUniqueForm
|
||||
fieldMetadataItem={fieldMetadataItem}
|
||||
objectMetadataItem={objectMetadataItem}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
|
||||
+4
-2
@@ -15,8 +15,9 @@ type SettingsDataModelFieldPhonesSettingsFormCardProps = {
|
||||
disabled?: boolean;
|
||||
fieldMetadataItem: Pick<
|
||||
FieldMetadataItem,
|
||||
'icon' | 'label' | 'type' | 'defaultValue' | 'isUnique' | 'isCustom'
|
||||
>;
|
||||
'icon' | 'label' | 'type' | 'isCustom' | 'settings'
|
||||
> &
|
||||
Partial<{ id: string }>;
|
||||
} & Pick<SettingsDataModelFieldPreviewCardProps, 'objectMetadataItem'>;
|
||||
|
||||
const StyledFieldPreviewCard = styled(SettingsDataModelFieldPreviewCard)`
|
||||
@@ -44,6 +45,7 @@ export const SettingsDataModelFieldPhonesSettingsFormCard = ({
|
||||
/>
|
||||
<SettingsDataModelFieldIsUniqueForm
|
||||
fieldMetadataItem={fieldMetadataItem}
|
||||
objectMetadataItem={objectMetadataItem}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
|
||||
-4
@@ -6,10 +6,6 @@ import { FieldMetadataType } from 'twenty-shared/types';
|
||||
export const canBeUnique = (
|
||||
field: Pick<FieldMetadataItem, 'type' | 'isCustom'>,
|
||||
) => {
|
||||
if (field.isCustom === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
[FieldMetadataType.MORPH_RELATION, FieldMetadataType.RELATION].includes(
|
||||
field.type,
|
||||
|
||||
Reference in New Issue
Block a user