[fix] Some fixes (#17674)

- fixes
[sentry](https://twenty-v7.sentry.io/issues/7239112455/?environment=prod&environment=prod-eu&project=4507072563183616&query=anything%20else&referrer=issue-stream&sort=date)
- adapt useClearField logic to morph relations
- adapt useClearField logic to one-to-many relations (early return)
- fix creation of objects without "name" field from specific parts of
the product (which involved a "name" field)
This commit is contained in:
Marie
2026-02-04 15:51:33 +01:00
committed by GitHub
parent d4303469ff
commit 6a5974e06c
2 changed files with 46 additions and 4 deletions
@@ -6,6 +6,8 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue';
import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext';
import { getForeignKeyNameFromRelationFieldName } from '@/object-record/utils/getForeignKeyNameFromRelationFieldName';
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
export const useClearField = () => {
const {
@@ -37,6 +39,19 @@ export const useClearField = () => {
throw new Error('Field metadata item cannot be found');
}
const isRelation =
foundFieldMetadataItem.type === FieldMetadataType.RELATION ||
foundFieldMetadataItem.type === FieldMetadataType.MORPH_RELATION;
const shouldSkipClearingBecauseInvolvesMultipleRecords =
isRelation &&
foundFieldMetadataItem.settings?.relationType ===
RelationType.ONE_TO_MANY;
if (shouldSkipClearingBecauseInvolvesMultipleRecords) {
return;
}
const fieldName = fieldDefinition.metadata.fieldName;
const emptyFieldValue = generateEmptyFieldValue({
@@ -48,11 +63,27 @@ export const useClearField = () => {
emptyFieldValue,
);
const isManyToOneRelation =
isRelation &&
foundFieldMetadataItem.settings?.relationType ===
RelationType.MANY_TO_ONE;
const updateFieldName = isManyToOneRelation
? getForeignKeyNameFromRelationFieldName(fieldName)
: fieldName;
if (isManyToOneRelation) {
set(
recordStoreFamilySelector({ recordId, fieldName: updateFieldName }),
emptyFieldValue,
);
}
updateRecord?.({
variables: {
where: { id: recordId },
updateOneRecordInput: {
[fieldName]: emptyFieldValue,
[updateFieldName]: emptyFieldValue,
},
},
});
@@ -1,6 +1,7 @@
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
type BuildRecordLabelPayloadArgs = {
id: string;
@@ -16,17 +17,27 @@ export const buildRecordLabelPayload = ({
const labelIdentifierField =
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
if (labelIdentifierField?.type === FieldMetadataType.FULL_NAME) {
if (
!isDefined(labelIdentifierField) ||
(labelIdentifierField.type !== FieldMetadataType.TEXT &&
labelIdentifierField.type !== FieldMetadataType.FULL_NAME)
) {
return { id };
}
const fieldName = labelIdentifierField.name;
if (labelIdentifierField.type === FieldMetadataType.FULL_NAME) {
const words = searchInput?.split(' ') ?? [];
const hasMultipleWords = words.length > 1;
return {
id,
name: hasMultipleWords
[fieldName]: hasMultipleWords
? { firstName: words[0], lastName: words.slice(1).join(' ') }
: { firstName: searchInput ?? '', lastName: '' },
};
}
return { id, name: searchInput ?? '' };
return { id, [fieldName]: searchInput ?? '' };
};