a88d1f4442
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
84 lines
3.3 KiB
TypeScript
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>
|
|
);
|
|
};
|