[WIP] Whole FE migrated (#2517)

* Wip

* WIP

* Removed concole log

* Add relations to workspace init (#2511)

* Add relations to workspace init

* remove logs

* update prefill

* add missing isSystem

* comment relation fields

* Migrate v2 core models to graphql schema (#2509)

* migrate v2 core models to graphql schema

* Migrate to new workspace member schema

* Continue work

* migrated-main

* Finished accountOwner nested field integration on companies

* Introduce bug

* Fix

---------

Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
Charles Bochet
2023-11-15 15:46:06 +01:00
committed by GitHub
parent 1f49ed2acf
commit 6129444c5c
129 changed files with 3468 additions and 1497 deletions

View File

@ -27,7 +27,6 @@ export const FIND_MANY_METADATA_OBJECTS = gql`
label
description
icon
placeholder
isCustom
isActive
isNullable
@ -36,10 +35,34 @@ export const FIND_MANY_METADATA_OBJECTS = gql`
fromRelationMetadata {
id
relationType
toObjectMetadata {
id
dataSourceId
nameSingular
namePlural
}
fromObjectMetadata {
id
dataSourceId
nameSingular
namePlural
}
}
toRelationMetadata {
id
relationType
toObjectMetadata {
id
dataSourceId
nameSingular
namePlural
}
fromObjectMetadata {
id
dataSourceId
nameSingular
namePlural
}
}
}
}

View File

@ -10,7 +10,7 @@ import {
import { logError } from '~/utils/logError';
import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
import { formatPagedObjectMetadataItemsToObjectMetadataItems } from '../utils/formatPagedObjectMetadataItemsToObjectMetadataItems';
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
import { useApolloMetadataClient } from './useApolloMetadataClient';
@ -59,7 +59,7 @@ export const useFindManyObjectMetadataItems = ({
});
const objectMetadataItems = useMemo(() => {
return formatPagedObjectMetadataItemsToObjectMetadataItems({
return mapPaginatedObjectMetadataItemsToObjectMetadataItems({
pagedObjectMetadataItems: data,
});
}, [data]);

View File

@ -0,0 +1,74 @@
import { useMemo } from 'react';
import { useQuery } from '@apollo/client';
import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
import {
ObjectFilter,
ObjectMetadataItemsQuery,
ObjectMetadataItemsQueryVariables,
} from '~/generated-metadata/graphql';
import { logError } from '~/utils/logError';
import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
import { useApolloMetadataClient } from './useApolloMetadataClient';
// TODO: test fetchMore
export const useFindManyObjectMetadataItems = ({
skip,
filter,
}: { skip?: boolean; filter?: ObjectFilter } = {}) => {
const apolloMetadataClient = useApolloMetadataClient();
const { enqueueSnackBar } = useSnackBar();
const {
data,
fetchMore: fetchMoreInternal,
loading,
error,
} = useQuery<ObjectMetadataItemsQuery, ObjectMetadataItemsQueryVariables>(
FIND_MANY_METADATA_OBJECTS,
{
variables: {
filter,
},
client: apolloMetadataClient ?? undefined,
skip: skip || !apolloMetadataClient,
onError: (error) => {
logError('useFindManyObjectMetadataItems error : ' + error);
enqueueSnackBar(
`Error during useFindManyObjectMetadataItems, ${error.message}`,
{
variant: 'error',
},
);
},
onCompleted: () => {},
},
);
const hasMore = data?.objects?.pageInfo?.hasNextPage;
const fetchMore = () =>
fetchMoreInternal({
variables: {
afterCursor: data?.objects?.pageInfo?.endCursor,
},
});
const objectMetadataItems = useMemo(() => {
return mapPaginatedObjectMetadataItemsToObjectMetadataItems({
pagedObjectMetadataItems: data,
});
}, [data]);
return {
objectMetadataItems,
hasMore,
fetchMore,
loading,
error,
};
};

View File

@ -1,10 +1,10 @@
import { gql } from '@apollo/client';
import { generateCreateOneObjectMutation } from '@/object-record/utils/generateCreateOneObjectMutation';
import { generateDeleteOneObjectMutation } from '@/object-record/utils/generateDeleteOneObjectMutation';
import { generateFindManyCustomObjectsQuery } from '@/object-record/utils/generateFindManyCustomObjectsQuery';
import { generateFindOneCustomObjectQuery } from '@/object-record/utils/generateFindOneCustomObjectQuery';
import { generateUpdateOneObjectMutation } from '@/object-record/utils/generateUpdateOneObjectMutation';
import { useGenerateCreateOneObjectMutation } from '@/object-record/utils/generateCreateOneObjectMutation';
import { useGenerateDeleteOneObjectMutation } from '@/object-record/utils/useGenerateDeleteOneObjectMutation';
import { useGenerateFindManyCustomObjectsQuery } from '@/object-record/utils/useGenerateFindManyCustomObjectsQuery';
import { useGenerateFindOneCustomObjectQuery } from '@/object-record/utils/useGenerateFindOneCustomObjectQuery';
import { useGenerateUpdateOneObjectMutation } from '@/object-record/utils/useGenerateUpdateOneObjectMutation';
import { useLazyLoadIcons } from '@/ui/input/hooks/useLazyLoadIcons';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
@ -16,13 +16,13 @@ import { formatFieldMetadataItemsAsSortDefinitions } from '../utils/formatFieldM
import { useFindManyObjectMetadataItems } from './useFindManyObjectMetadataItems';
const EMPTY_QUERY = gql`
export const EMPTY_QUERY = gql`
query EmptyQuery {
empty
}
`;
const EMPTY_MUTATION = gql`
export const EMPTY_MUTATION = gql`
mutation EmptyMutation {
empty
}
@ -74,35 +74,25 @@ export const useFindOneObjectMetadataItem = ({
icons,
});
const findManyQuery = foundObjectMetadataItem
? generateFindManyCustomObjectsQuery({
objectMetadataItem: foundObjectMetadataItem,
})
: EMPTY_QUERY;
const findManyQuery = useGenerateFindManyCustomObjectsQuery({
objectMetadataItem: foundObjectMetadataItem,
});
const findOneQuery = foundObjectMetadataItem
? generateFindOneCustomObjectQuery({
objectMetadataItem: foundObjectMetadataItem,
})
: EMPTY_QUERY;
const findOneQuery = useGenerateFindOneCustomObjectQuery({
objectMetadataItem: foundObjectMetadataItem,
});
const createOneMutation = foundObjectMetadataItem
? generateCreateOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
})
: EMPTY_MUTATION;
const createOneMutation = useGenerateCreateOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
});
const updateOneMutation = foundObjectMetadataItem
? generateUpdateOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
})
: EMPTY_MUTATION;
const updateOneMutation = useGenerateUpdateOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
});
const deleteOneMutation = foundObjectMetadataItem
? generateDeleteOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
})
: EMPTY_MUTATION;
const deleteOneMutation = useGenerateDeleteOneObjectMutation({
objectMetadataItem: foundObjectMetadataItem,
});
return {
foundObjectMetadataItem,

View File

@ -0,0 +1,86 @@
import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems';
import { FieldType } from '@/ui/object/field/types/FieldType';
import { FieldMetadataItem } from '../types/FieldMetadataItem';
export const useMapFieldMetadataToGraphQLQuery = () => {
const { objectMetadataItems } = useFindManyObjectMetadataItems();
const mapFieldMetadataToGraphQLQuery = (field: FieldMetadataItem): any => {
// TODO: parse
const fieldType = field.type as FieldType;
const fieldIsSimpleValue = (
[
'TEXT',
'PHONE',
'DATE',
'EMAIL',
'NUMBER',
'BOOLEAN',
'DATE',
] as FieldType[]
).includes(fieldType);
const fieldIsURL = fieldType === 'URL' || fieldType === 'URL_V2';
const fieldIsMoneyAmount =
fieldType === 'MONEY' || fieldType === 'MONEY_AMOUNT_V2';
if (fieldIsSimpleValue) {
return field.name;
} else if (
fieldType === 'RELATION' &&
field.toRelationMetadata?.relationType === 'ONE_TO_MANY'
) {
console.log({ objectMetadataItems, field });
const relationMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.id ===
(field.toRelationMetadata as any)?.fromObjectMetadata?.id,
);
console.log({ relationMetadataItem });
return `${field.name}
{
id
${relationMetadataItem?.fields
.filter((field) => field.type !== 'RELATION')
.map((field) => field.name)
.join('\n')}
}`;
} else if (
fieldType === 'RELATION' &&
field.fromRelationMetadata?.relationType === 'ONE_TO_MANY'
) {
return `${field.name}
{
edges {
node {
id
}
}
}`;
} else if (fieldIsURL) {
return `
${field.name}
{
text
link
}
`;
} else if (fieldIsMoneyAmount) {
return `
${field.name}
{
amount
currency
}
`;
}
};
return mapFieldMetadataToGraphQLQuery;
};

View File

@ -1,65 +0,0 @@
import { FieldType } from '@/ui/object/field/types/FieldType';
import { FieldMetadataItem } from '../types/FieldMetadataItem';
export const mapFieldMetadataToGraphQLQuery = (field: FieldMetadataItem) => {
// TODO: parse
const fieldType = field.type as FieldType;
const fieldIsSimpleValue = (
[
'TEXT',
'PHONE',
'DATE',
'EMAIL',
'NUMBER',
'BOOLEAN',
'DATE',
] as FieldType[]
).includes(fieldType);
const fieldIsURL = fieldType === 'URL' || fieldType === 'URL_V2';
const fieldIsMoneyAmount =
fieldType === 'MONEY' || fieldType === 'MONEY_AMOUNT_V2';
if (fieldIsSimpleValue) {
return field.name;
} else if (
fieldType === 'RELATION' &&
field.toRelationMetadata?.relationType === 'ONE_TO_MANY'
) {
return `${field.name}
{
id
}`;
} else if (
fieldType === 'RELATION' &&
field.fromRelationMetadata?.relationType === 'ONE_TO_MANY'
) {
return `${field.name}
{
edges {
node {
id
}
}
}`;
} else if (fieldIsURL) {
return `
${field.name}
{
text
link
}
`;
} else if (fieldIsMoneyAmount) {
return `
${field.name}
{
amount
currency
}
`;
}
};

View File

@ -2,8 +2,8 @@ import { ObjectMetadataItemsQuery } from '~/generated-metadata/graphql';
import { ObjectMetadataItem } from '../types/ObjectMetadataItem';
export const formatPagedObjectMetadataItemsToObjectMetadataItems = ({
pagedObjectMetadataItems: pagedObjectMetadataItems,
export const mapPaginatedObjectMetadataItemsToObjectMetadataItems = ({
pagedObjectMetadataItems,
}: {
pagedObjectMetadataItems: ObjectMetadataItemsQuery | undefined;
}) => {