Files
twenty/packages/twenty-front/src/testing/jest/getJestMetadataAndApolloMocksAndCommandMenuWrapper.tsx
T
Raphaël Bosi a88d1f4442 Introduce standalone page (#19675)
Add support for standalone pages: a new `PageLayout` type
(`STANDALONE_PAGE`) that can be rendered independently at
`/page/:pageLayoutId`, not tied to any record or object context.

- New `STANDALONE_PAGE` page layout type
- New `PAGE_LAYOUT` navigation menu item type: adds a `pageLayoutId`
foreign key to `NavigationMenuItemEntity`, allowing sidebar items to
link directly to standalone pages
- New `GLOBAL_OBJECT_CONTEXT` command menu availability type: separates
object-context-dependent commands (Create Record, Import, Export, See
Deleted, Create View, Hide Deleted) from truly global ones, so
standalone pages only show relevant commands
- Frontend routing & rendering: adds a `/page/:pageLayoutId` route with
its own page component, header, and command menu
- Widget rendering refactor
- Instance commands: two fast 1.22 migrations: `pageLayoutId` column +
`STANDALONE_PAGE` enum, and `GLOBAL_OBJECT_CONTEXT` availability type
enum
- Workspace command: backfills existing command menu items from `GLOBAL`
to `GLOBAL_OBJECT_CONTEXT` where appropriate
- Dev seeds: adds a sample "Star History" standalone page with an iframe
widget for local development
2026-04-14 15:52:45 +00:00

84 lines
3.3 KiB
TypeScript

import { CommandMenuComponentInstanceContext } from '@/command-menu/states/contexts/CommandMenuComponentInstanceContext';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { type MockedResponse } from '@apollo/client/testing';
import { type ReactNode } from 'react';
import type { Store } from 'jotai/vanilla/store';
import { isDefined } from 'twenty-shared/utils';
import {
JestContextStoreSetter,
type JestContextStoreSetterMocks,
} from '~/testing/jest/JestContextStoreSetter';
import { JestRecordIndexContextProviderWrapper } from '~/testing/jest/JestRecordIndexContextProviderWrapper';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { getMockObjectMetadataItemOrThrow } from '~/testing/utils/getMockObjectMetadataItemOrThrow';
export type GetJestMetadataAndApolloMocksAndCommandMenuWrapperProps = {
apolloMocks:
| readonly MockedResponse<Record<string, any>, Record<string, any>>[]
| undefined;
onInitializeJotaiStore?: (store: Store) => void;
componentInstanceId: string;
} & JestContextStoreSetterMocks;
export const getJestMetadataAndApolloMocksAndCommandMenuWrapper = ({
apolloMocks,
onInitializeJotaiStore,
contextStoreTargetedRecordsRule,
contextStoreCurrentViewId,
contextStoreCurrentViewType,
contextStoreCurrentPageType,
contextStoreNumberOfSelectedRecords,
contextStoreCurrentObjectMetadataNameSingular,
contextStoreFilters,
componentInstanceId,
}: GetJestMetadataAndApolloMocksAndCommandMenuWrapperProps) => {
const Wrapper = getJestMetadataAndApolloMocksWrapper({
apolloMocks,
onInitializeJotaiStore,
});
const mockObjectMetadataItem = getMockObjectMetadataItemOrThrow(
contextStoreCurrentObjectMetadataNameSingular ?? '',
);
if (!isDefined(mockObjectMetadataItem)) {
throw new Error(
`Mock object metadata item ${contextStoreCurrentObjectMetadataNameSingular} not found`,
);
}
return ({ children }: { children: ReactNode }) => (
<Wrapper>
<ContextStoreComponentInstanceContext.Provider
value={{ instanceId: componentInstanceId }}
>
<CommandMenuComponentInstanceContext.Provider
value={{
instanceId: componentInstanceId,
}}
>
<JestRecordIndexContextProviderWrapper
objectMetadataItem={mockObjectMetadataItem}
>
<JestContextStoreSetter
contextStoreCurrentViewId={contextStoreCurrentViewId}
contextStoreFilters={contextStoreFilters}
contextStoreTargetedRecordsRule={contextStoreTargetedRecordsRule}
contextStoreNumberOfSelectedRecords={
contextStoreNumberOfSelectedRecords
}
contextStoreCurrentObjectMetadataNameSingular={
contextStoreCurrentObjectMetadataNameSingular
}
contextStoreCurrentViewType={contextStoreCurrentViewType}
contextStoreCurrentPageType={contextStoreCurrentPageType}
>
{children}
</JestContextStoreSetter>
</JestRecordIndexContextProviderWrapper>
</CommandMenuComponentInstanceContext.Provider>
</ContextStoreComponentInstanceContext.Provider>
</Wrapper>
);
};