Morph-front-display-table (#13979)

## Add Morph Relation Field Display Support for Tables (one to many &
many to one)

**Features:**
- Display morph relation fields (one-to-many, many-to-one) in table
cells
- Multi-field record retrieval for improved performance
- Enhanced table cell rendering with morph relation support

**Components Added:**
- `MorphRelationManyToOneFieldDisplay` - Shows many-to-one morph
relations
- `MorphRelationOneToManyFieldDisplay` - Shows one-to-many morph
relations


TODO : 
handle notes and tasks case if we choose these kind of objects as
targets/source for a morph relation

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Guillim
2025-08-25 16:12:49 +02:00
committed by GitHub
parent dff00e813c
commit 3d1842dcb3
75 changed files with 1656 additions and 1098 deletions
@@ -2,19 +2,25 @@ import { type ReactNode, useEffect, useState } from 'react';
import { useSetRecoilState } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
export const JestObjectMetadataItemSetter = ({
children,
objectMetadataItems,
}: {
children: ReactNode;
objectMetadataItems?: ObjectMetadataItem[];
}) => {
const setObjectMetadataItems = useSetRecoilState(objectMetadataItemsState);
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
setObjectMetadataItems(generatedMockObjectMetadataItems);
setObjectMetadataItems(
objectMetadataItems ?? generatedMockObjectMetadataItems,
);
setIsLoaded(true);
}, [setObjectMetadataItems]);
}, [objectMetadataItems, setObjectMetadataItems]);
return isLoaded ? <>{children}</> : null;
};
@@ -4,6 +4,7 @@ import { RecoilRoot, type MutableSnapshot } from 'recoil';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
import { SnackBarComponentInstanceContext } from '@/ui/feedback/snack-bar-manager/contexts/SnackBarComponentInstanceContext';
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
@@ -15,12 +16,14 @@ export const getJestMetadataAndApolloMocksWrapper = ({
apolloMocks,
cache,
onInitializeRecoilSnapshot,
objectMetadataItems,
}: {
cache?: InMemoryCache;
apolloMocks?:
| readonly MockedResponse<Record<string, any>, Record<string, any>>[]
| undefined;
onInitializeRecoilSnapshot?: (snapshot: MutableSnapshot) => void;
objectMetadataItems?: ObjectMetadataItem[];
}) => {
return ({ children }: { children: ReactNode }) => (
<RecoilRoot initializeState={onInitializeRecoilSnapshot}>
@@ -34,7 +37,9 @@ export const getJestMetadataAndApolloMocksWrapper = ({
<ViewComponentInstanceContext.Provider
value={{ instanceId: 'instanceId' }}
>
<JestObjectMetadataItemSetter>
<JestObjectMetadataItemSetter
objectMetadataItems={objectMetadataItems}
>
<ContextStoreComponentInstanceContext.Provider
value={{ instanceId: 'instanceId' }}
>