* WIP * Minor fixes * Added TODO * Fix post merge * Fix * Fixed warnings * Fixed comments * Fixed comments * Fixed naming * Removed comment * WIP * WIP 2 * Finished working version * Fixes * Fixed typing * Fixes * Fixes * Fixes * Naming fixes * WIP * Fix import * WIP * Working version on title * Fixed create record id overwrite * Removed unecessary callback * Masterpiece * Fixed delete on click outside drawer or delete * Cleaned * Cleaned * Cleaned * Minor fixes * Fixes * Fixed naming * WIP * Fix * Fixed create from target inline cell * Removed console.log * Fixed delete activity optimistic effect * Fixed no title * Fixed debounce and title body creation --------- Co-authored-by: Charles Bochet <charles@twenty.com>
166 lines
4.0 KiB
TypeScript
166 lines
4.0 KiB
TypeScript
import { useRecoilValue } from 'recoil';
|
|
|
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
|
|
|
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
|
|
|
export const useMapFieldMetadataToGraphQLQuery = () => {
|
|
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
|
|
|
const mapFieldMetadataToGraphQLQuery = ({
|
|
field,
|
|
maxDepthForRelations = 2,
|
|
onlyTypenameAndIdOnDeepestRelationFields = false,
|
|
}: {
|
|
field: FieldMetadataItem;
|
|
maxDepthForRelations?: number;
|
|
onlyTypenameAndIdOnDeepestRelationFields?: boolean;
|
|
}): any => {
|
|
if (maxDepthForRelations <= 0) {
|
|
return '';
|
|
}
|
|
|
|
// TODO: parse
|
|
const fieldType = field.type as FieldType;
|
|
|
|
const fieldIsSimpleValue = (
|
|
[
|
|
'UUID',
|
|
'TEXT',
|
|
'PHONE',
|
|
'DATE_TIME',
|
|
'EMAIL',
|
|
'NUMBER',
|
|
'BOOLEAN',
|
|
'RATING',
|
|
'SELECT',
|
|
] as FieldType[]
|
|
).includes(fieldType);
|
|
|
|
if (fieldIsSimpleValue) {
|
|
return field.name;
|
|
} else if (
|
|
fieldType === 'RELATION' &&
|
|
field.toRelationMetadata?.relationType === 'ONE_TO_MANY'
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
(field.toRelationMetadata as any)?.fromObjectMetadata?.id,
|
|
);
|
|
|
|
let subfieldQuery = '';
|
|
|
|
if (maxDepthForRelations > 0) {
|
|
subfieldQuery = `${(relationMetadataItem?.fields ?? [])
|
|
.map((field) =>
|
|
mapFieldMetadataToGraphQLQuery({
|
|
field,
|
|
maxDepthForRelations: maxDepthForRelations - 1,
|
|
onlyTypenameAndIdOnDeepestRelationFields,
|
|
}),
|
|
)
|
|
.join('\n')}`;
|
|
}
|
|
|
|
return `${field.name}
|
|
{
|
|
__typename
|
|
id
|
|
${subfieldQuery}
|
|
}`;
|
|
} else if (
|
|
fieldType === 'RELATION' &&
|
|
field.toRelationMetadata?.relationType === 'ONE_TO_ONE'
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
(field.toRelationMetadata as any)?.fromObjectMetadata?.id,
|
|
);
|
|
|
|
let subfieldQuery = '';
|
|
|
|
if (maxDepthForRelations > 0) {
|
|
subfieldQuery = `${(relationMetadataItem?.fields ?? [])
|
|
.map((field) =>
|
|
mapFieldMetadataToGraphQLQuery({
|
|
field,
|
|
maxDepthForRelations: maxDepthForRelations - 1,
|
|
onlyTypenameAndIdOnDeepestRelationFields,
|
|
}),
|
|
)
|
|
.join('\n')}`;
|
|
}
|
|
|
|
return `${field.name}
|
|
{
|
|
__typename
|
|
id
|
|
${subfieldQuery}
|
|
}`;
|
|
} else if (
|
|
fieldType === 'RELATION' &&
|
|
field.fromRelationMetadata?.relationType === 'ONE_TO_MANY'
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
(field.fromRelationMetadata as any)?.toObjectMetadata?.id,
|
|
);
|
|
|
|
let subfieldQuery = '';
|
|
|
|
if (maxDepthForRelations > 0) {
|
|
subfieldQuery = `${(relationMetadataItem?.fields ?? [])
|
|
.map((field) =>
|
|
mapFieldMetadataToGraphQLQuery({
|
|
field,
|
|
maxDepthForRelations: maxDepthForRelations - 1,
|
|
onlyTypenameAndIdOnDeepestRelationFields,
|
|
}),
|
|
)
|
|
.join('\n')}`;
|
|
}
|
|
|
|
return `${field.name}
|
|
{
|
|
edges {
|
|
node {
|
|
__typename
|
|
id
|
|
${subfieldQuery}
|
|
}
|
|
}
|
|
}`;
|
|
} else if (fieldType === 'LINK') {
|
|
return `
|
|
${field.name}
|
|
{
|
|
label
|
|
url
|
|
}
|
|
`;
|
|
} else if (fieldType === 'CURRENCY') {
|
|
return `
|
|
${field.name}
|
|
{
|
|
amountMicros
|
|
currencyCode
|
|
}
|
|
`;
|
|
} else if (fieldType === 'FULL_NAME') {
|
|
return `
|
|
${field.name}
|
|
{
|
|
firstName
|
|
lastName
|
|
}
|
|
`;
|
|
}
|
|
};
|
|
|
|
return mapFieldMetadataToGraphQLQuery;
|
|
};
|