This PR was created by \[GitStart\](<https://gitstart.com/>) to address the requirements from this ticket: \[TWNTY-6447\](<https://clients.gitstart.com/twenty/5449/tickets/TWNTY-6447>). This ticket was imported from: <https://github.com/twentyhq/twenty/issues/6447> ### Description \- We added a new field type ### Refs #6447 ### Demo <https://jam.dev/c/2b4d7853-ea89-4e9d-a561-6edcb4fdb34b> Fixes #6447 --------- Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com> Co-authored-by: Charles Bochet <charles@twenty.com>
176 lines
3.8 KiB
TypeScript
176 lines
3.8 KiB
TypeScript
import { isUndefined } from '@sniptt/guards';
|
|
|
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
|
|
import {
|
|
FieldMetadataType,
|
|
RelationDefinitionType,
|
|
} from '~/generated-metadata/graphql';
|
|
|
|
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
|
|
|
// TODO: change ObjectMetadataItems mock before refactoring with relationDefinition computed field
|
|
export const mapFieldMetadataToGraphQLQuery = ({
|
|
objectMetadataItems,
|
|
field,
|
|
relationrecordFields,
|
|
computeReferences = false,
|
|
}: {
|
|
objectMetadataItems: ObjectMetadataItem[];
|
|
field: Pick<FieldMetadataItem, 'name' | 'type' | 'relationDefinition'>;
|
|
relationrecordFields?: Record<string, any>;
|
|
computeReferences?: boolean;
|
|
}): any => {
|
|
const fieldType = field.type;
|
|
|
|
const fieldIsSimpleValue = [
|
|
FieldMetadataType.Uuid,
|
|
FieldMetadataType.Text,
|
|
FieldMetadataType.Phone,
|
|
FieldMetadataType.DateTime,
|
|
FieldMetadataType.Date,
|
|
FieldMetadataType.Email,
|
|
FieldMetadataType.Number,
|
|
FieldMetadataType.Boolean,
|
|
FieldMetadataType.Rating,
|
|
FieldMetadataType.Select,
|
|
FieldMetadataType.MultiSelect,
|
|
FieldMetadataType.Position,
|
|
FieldMetadataType.RawJson,
|
|
FieldMetadataType.RichText,
|
|
FieldMetadataType.Array,
|
|
].includes(fieldType);
|
|
|
|
if (fieldIsSimpleValue) {
|
|
return field.name;
|
|
}
|
|
|
|
if (
|
|
fieldType === FieldMetadataType.Relation &&
|
|
field.relationDefinition?.direction === RelationDefinitionType.ManyToOne
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
field.relationDefinition?.targetObjectMetadata.id,
|
|
);
|
|
|
|
if (isUndefined(relationMetadataItem)) {
|
|
return '';
|
|
}
|
|
|
|
return `${field.name}
|
|
${mapObjectMetadataToGraphQLQuery({
|
|
objectMetadataItems,
|
|
objectMetadataItem: relationMetadataItem,
|
|
recordGqlFields: relationrecordFields,
|
|
computeReferences: computeReferences,
|
|
isRootLevel: false,
|
|
})}`;
|
|
}
|
|
|
|
if (
|
|
fieldType === FieldMetadataType.Relation &&
|
|
field.relationDefinition?.direction === RelationDefinitionType.OneToMany
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
field.relationDefinition?.targetObjectMetadata.id,
|
|
);
|
|
|
|
if (isUndefined(relationMetadataItem)) {
|
|
return '';
|
|
}
|
|
|
|
return `${field.name}
|
|
{
|
|
edges {
|
|
node ${mapObjectMetadataToGraphQLQuery({
|
|
objectMetadataItems,
|
|
objectMetadataItem: relationMetadataItem,
|
|
recordGqlFields: relationrecordFields,
|
|
computeReferences,
|
|
isRootLevel: false,
|
|
})}
|
|
}
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Link) {
|
|
return `${field.name}
|
|
{
|
|
label
|
|
url
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Links) {
|
|
return `${field.name}
|
|
{
|
|
primaryLinkUrl
|
|
primaryLinkLabel
|
|
secondaryLinks
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Currency) {
|
|
return `${field.name}
|
|
{
|
|
amountMicros
|
|
currencyCode
|
|
}
|
|
`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.FullName) {
|
|
return `${field.name}
|
|
{
|
|
firstName
|
|
lastName
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Address) {
|
|
return `${field.name}
|
|
{
|
|
addressStreet1
|
|
addressStreet2
|
|
addressCity
|
|
addressState
|
|
addressCountry
|
|
addressPostcode
|
|
addressLat
|
|
addressLng
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Actor) {
|
|
return `${field.name}
|
|
{
|
|
source
|
|
workspaceMemberId
|
|
name
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Emails) {
|
|
return `${field.name}
|
|
{
|
|
primaryEmail
|
|
additionalEmails
|
|
}`;
|
|
}
|
|
|
|
if (fieldType === FieldMetadataType.Phones) {
|
|
return `${field.name}
|
|
{
|
|
primaryPhoneNumber
|
|
primaryPhoneCountryCode
|
|
additionalPhones
|
|
}`;
|
|
}
|
|
|
|
return '';
|
|
};
|