feat: add Relation field form (#2572)

* feat: add useCreateOneRelationMetadata and useRelationMetadata

Closes #2423

* feat: add Relation field form

Closes #2003

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Thaïs
2023-11-17 23:38:39 +01:00
committed by GitHub
parent fea0bbeb2a
commit 18dac1a2b6
34 changed files with 1285 additions and 643 deletions

View File

@ -35,6 +35,11 @@ export const useObjectMetadataItemForSettings = () => {
(objectMetadataItem) => objectMetadataItem.id === id,
);
const findObjectMetadataItemByNamePlural = (namePlural: string) =>
objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.namePlural === namePlural,
);
const { createOneObjectMetadataItem } =
useCreateOneObjectRecordMetadataItem();
const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem();
@ -88,6 +93,8 @@ export const useObjectMetadataItemForSettings = () => {
eraseObjectMetadataItem,
findActiveObjectMetadataItemBySlug,
findObjectMetadataItemById,
findObjectMetadataItemByNamePlural,
loading,
objectMetadataItems,
};
};

View File

@ -1,39 +1,51 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FieldDefinitionRelationType } from '@/ui/object/field/types/FieldDefinition';
import {
FieldMetadataType,
RelationMetadataType,
} from '~/generated-metadata/graphql';
import { isDefined } from '~/utils/isDefined';
export const parseFieldRelationType = (
field: FieldMetadataItem | undefined,
): FieldDefinitionRelationType | undefined => {
if (field && field.type === 'RELATION') {
if (
isDefined(field.fromRelationMetadata) &&
field.fromRelationMetadata.relationType === 'ONE_TO_MANY'
) {
return 'FROM_NAMY_OBJECTS';
} else if (
isDefined(field.toRelationMetadata) &&
field.toRelationMetadata.relationType === 'ONE_TO_MANY'
) {
return 'TO_ONE_OBJECT';
} else if (
isDefined(field.fromRelationMetadata) &&
field.fromRelationMetadata.relationType === 'MANY_TO_MANY'
) {
return 'FROM_NAMY_OBJECTS';
} else if (
isDefined(field.toRelationMetadata) &&
field.toRelationMetadata.relationType === 'MANY_TO_MANY'
) {
return 'TO_MANY_OBJECTS';
}
if (!field || field.type !== FieldMetadataType.Relation) return;
throw new Error(
`Cannot determine field relation type for field : ${JSON.stringify(
field,
)}.`,
);
} else {
return undefined;
const config: Record<
RelationMetadataType,
{ from: FieldDefinitionRelationType; to: FieldDefinitionRelationType }
> = {
[RelationMetadataType.ManyToMany]: {
from: 'FROM_MANY_OBJECTS',
to: 'TO_MANY_OBJECTS',
},
[RelationMetadataType.OneToMany]: {
from: 'FROM_MANY_OBJECTS',
to: 'TO_ONE_OBJECT',
},
[RelationMetadataType.OneToOne]: {
from: 'FROM_ONE_OBJECT',
to: 'TO_ONE_OBJECT',
},
};
if (
isDefined(field.fromRelationMetadata) &&
field.fromRelationMetadata.relationType in config
) {
return config[field.fromRelationMetadata.relationType].from;
}
if (
isDefined(field.toRelationMetadata) &&
field.toRelationMetadata.relationType in config
) {
return config[field.toRelationMetadata.relationType].to;
}
throw new Error(
`Cannot determine field relation type for field : ${JSON.stringify(
field,
)}.`,
);
};