refactor: metadata store cleanup, SSE unification, mock metadata loading & login redirect fix (#18651)
## Summary - **SSE unification**: Replaced 11 individual SSE effect components with a single generic `MetadataStoreSSEEffect` - **Metadata store cleanup**: Merged `metadataCollectionHashesState` into `metadataStoreState` (currentCollectionHash / draftCollectionHash per entity), moved `objectMetadataItemsSelector` to `object-metadata` domain, converted `navigationMenuItemsState` to a derived selector - **Naming clarity**: Renamed `isAppMetadataReadyState` → `isMinimalMetadataReadyState`, `MetadataGater` → `MinimalMetadataGater`, `useIsLogged` → `useHasAccessTokenPair`, `patchMetadataStoreFromSSEEvent` now takes named object params - **Mock metadata loading**: Added `generate-navigation-menu-items.ts` script, rewrote `useLoadMockedMinimalMetadata` to load full objects/fields/indexes/views/navItems from generated mock data, enabling proper sign-in background rendering (table columns, view picker, navigation) - **Login/logout transitions**: `MinimalMetadataLoadEffect` manages mocked↔real metadata transitions based on auth state, `MainContextStoreProvider` computes context on auth pages for view picker support - **Login redirect fix**: `handleLoadWorkspaceAfterAuthentication` now re-enables `isAppEffectRedirectEnabled` after `loadCurrentUser()` completes, fixing the blocked post-login navigation - **Dead code removal**: Deleted `useRefreshPageLayouts`, `useApplyPageLayouts`, `useStaleMetadataEntities`, `metadataCollectionHashesState`, and all individual SSE effects ## Test plan - [x] Login from welcome page redirects to companies page - [x] Logout transitions cleanly to mocked metadata on welcome page - [x] Sign-in background shows table columns, view picker, and navigation items - [x] SSE events still update metadata store entries correctly - [x] Navigation menu items persist across page refreshes - [ ] CI: lint, typecheck, tests pass
This commit is contained in:
+2
-2
@@ -1,4 +1,4 @@
|
||||
import { isAppMetadataReadyState } from '@/metadata-store/states/isAppMetadataReadyState';
|
||||
import { isMinimalMetadataReadyState } from '@/metadata-store/states/isMinimalMetadataReadyState';
|
||||
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
|
||||
import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore';
|
||||
import { PageLayoutContentProvider } from '@/page-layout/contexts/PageLayoutContentContext';
|
||||
@@ -37,7 +37,7 @@ const meta: Meta<typeof DashboardWidgetPlaceholder> = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
|
||||
|
||||
+15
-15
@@ -8,7 +8,7 @@ import { CatalogDecorator, type CatalogStory } from 'twenty-ui/testing';
|
||||
|
||||
import { currentUserWorkspaceState } from '@/auth/states/currentUserWorkspaceState';
|
||||
import { ApolloCoreClientContext } from '@/object-metadata/contexts/ApolloCoreClientContext';
|
||||
import { isAppMetadataReadyState } from '@/metadata-store/states/isAppMetadataReadyState';
|
||||
import { isMinimalMetadataReadyState } from '@/metadata-store/states/isMinimalMetadataReadyState';
|
||||
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
|
||||
import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore';
|
||||
import { CoreObjectNameSingular } from 'twenty-shared/types';
|
||||
@@ -281,7 +281,7 @@ export const WithNumberChart: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -368,7 +368,7 @@ export const WithGaugeChart: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -459,7 +459,7 @@ export const WithBarChart: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -553,7 +553,7 @@ export const SmallWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -651,7 +651,7 @@ export const MediumWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -749,7 +749,7 @@ export const LargeWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -843,7 +843,7 @@ export const WideWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -941,7 +941,7 @@ export const TallWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(widget);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
@@ -1035,7 +1035,7 @@ export const WithManyToOneRelationFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
PageLayoutType.RECORD_PAGE,
|
||||
@@ -1154,7 +1154,7 @@ export const WithOneToManyRelationFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
PageLayoutType.RECORD_PAGE,
|
||||
@@ -1265,7 +1265,7 @@ export const OneToManyRelationFieldWidgetWithSeeAllButton: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
PageLayoutType.RECORD_PAGE,
|
||||
@@ -1403,7 +1403,7 @@ export const OnMobile: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
PageLayoutType.RECORD_PAGE,
|
||||
@@ -1501,7 +1501,7 @@ export const InSidePanel: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
PageLayoutType.RECORD_PAGE,
|
||||
@@ -1660,7 +1660,7 @@ export const Catalog: CatalogStory<Story, typeof WidgetRenderer> = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
|
||||
if (state === 'hover') {
|
||||
jotaiStore.set(
|
||||
|
||||
+18
-18
@@ -5,7 +5,7 @@ import { MemoryRouter } from 'react-router-dom';
|
||||
import { expect, userEvent, waitFor, within } from 'storybook/test';
|
||||
|
||||
import { ApolloCoreClientContext } from '@/object-metadata/contexts/ApolloCoreClientContext';
|
||||
import { isAppMetadataReadyState } from '@/metadata-store/states/isAppMetadataReadyState';
|
||||
import { isMinimalMetadataReadyState } from '@/metadata-store/states/isMinimalMetadataReadyState';
|
||||
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
|
||||
import { CoreObjectNameSingular } from 'twenty-shared/types';
|
||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||
@@ -360,7 +360,7 @@ export const TextFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -454,7 +454,7 @@ export const AddressFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -551,7 +551,7 @@ export const NumberFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -645,7 +645,7 @@ export const LinkFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -739,7 +739,7 @@ export const ManyToOneRelationFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -843,7 +843,7 @@ export const OneToManyRelationFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -939,7 +939,7 @@ export const BooleanFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -1032,7 +1032,7 @@ export const CurrencyFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -1125,7 +1125,7 @@ export const EmailsFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
personObjectMetadataItem.id,
|
||||
@@ -1219,7 +1219,7 @@ export const PhonesFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
personObjectMetadataItem.id,
|
||||
@@ -1313,7 +1313,7 @@ export const SelectFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
opportunityObjectMetadataItem.id,
|
||||
@@ -1408,7 +1408,7 @@ export const MultiSelectFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -1506,7 +1506,7 @@ export const TimelineActivityRelationFieldWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
timelineActivityObjectMetadataItem.id,
|
||||
@@ -1605,7 +1605,7 @@ export const ManyToOneRelationCardWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -1717,7 +1717,7 @@ export const OneToManyRelationCardWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
@@ -1812,7 +1812,7 @@ export const TimelineActivityRelationCardWidget: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
timelineActivityObjectMetadataItem.id,
|
||||
@@ -1973,7 +1973,7 @@ export const OneToManyRelationCardWidgetWithProgressiveLoading: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
const pageLayoutData = createPageLayoutWithWidget(
|
||||
widget,
|
||||
companyObjectMetadataItem.id,
|
||||
|
||||
+77
-129
@@ -4,10 +4,8 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
import { expect, waitFor, within } from 'storybook/test';
|
||||
|
||||
import { isAppMetadataReadyState } from '@/metadata-store/states/isAppMetadataReadyState';
|
||||
import { isMinimalMetadataReadyState } from '@/metadata-store/states/isMinimalMetadataReadyState';
|
||||
import { ApolloCoreClientContext } from '@/object-metadata/contexts/ApolloCoreClientContext';
|
||||
import { CoreObjectNameSingular } from 'twenty-shared/types';
|
||||
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
|
||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||
import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
import { PageLayoutContentProvider } from '@/page-layout/contexts/PageLayoutContentContext';
|
||||
@@ -23,8 +21,8 @@ import { FieldsWidget } from '@/page-layout/widgets/fields/components/FieldsWidg
|
||||
import { WidgetComponentInstanceContext } from '@/page-layout/widgets/states/contexts/WidgetComponentInstanceContext';
|
||||
import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext';
|
||||
import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore';
|
||||
import { coreViewsState } from '@/views/states/coreViewState';
|
||||
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
|
||||
import { CoreObjectNameSingular } from 'twenty-shared/types';
|
||||
import { ComponentDecorator } from 'twenty-ui/testing';
|
||||
import {
|
||||
ViewOpenRecordIn as CoreViewOpenRecordIn,
|
||||
@@ -41,6 +39,8 @@ import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMeta
|
||||
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
|
||||
import { getMockFieldMetadataItemOrThrow } from '~/testing/utils/getMockFieldMetadataItemOrThrow';
|
||||
import { getMockObjectMetadataItemOrThrow } from '~/testing/utils/getMockObjectMetadataItemOrThrow';
|
||||
import { setTestCoreViewsInMetadataStore } from '~/testing/utils/setTestCoreViewsInMetadataStore';
|
||||
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
|
||||
|
||||
const companyObjectMetadataItem = getMockObjectMetadataItemOrThrow(
|
||||
CoreObjectNameSingular.Company,
|
||||
@@ -206,6 +206,39 @@ const createCoreView = (
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const createViewField = (
|
||||
id: string,
|
||||
fieldMetadataId: string,
|
||||
position: number,
|
||||
viewFieldGroupId?: string,
|
||||
) => ({
|
||||
id,
|
||||
fieldMetadataId,
|
||||
position,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
...(viewFieldGroupId !== undefined && { viewFieldGroupId }),
|
||||
});
|
||||
|
||||
const createViewFieldGroup = (
|
||||
id: string,
|
||||
name: string,
|
||||
position: number,
|
||||
viewFields: ReturnType<typeof createViewField>[],
|
||||
isVisible = true,
|
||||
) => ({
|
||||
id,
|
||||
name,
|
||||
position,
|
||||
isVisible,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
viewFields,
|
||||
});
|
||||
|
||||
const meta: Meta<typeof FieldsWidget> = {
|
||||
title: 'Modules/PageLayout/Widgets/FieldsWidget',
|
||||
component: FieldsWidget,
|
||||
@@ -229,88 +262,38 @@ type Story = StoryObj<typeof FieldsWidget>;
|
||||
|
||||
export const WithViewFieldGroups: Story = {
|
||||
render: () => {
|
||||
const contactInfoFields = [
|
||||
createViewField('vf-name', nameField.id, 0, 'group-contact-info'),
|
||||
createViewField('vf-address', addressField.id, 1, 'group-contact-info'),
|
||||
createViewField('vf-linkedin', linkedinField.id, 2, 'group-contact-info'),
|
||||
];
|
||||
|
||||
const businessFields = [
|
||||
createViewField('vf-employees', employeesField.id, 0, 'group-business'),
|
||||
createViewField(
|
||||
'vf-arr',
|
||||
annualRecurringRevenueField.id,
|
||||
1,
|
||||
'group-business',
|
||||
),
|
||||
createViewField(
|
||||
'vf-icp',
|
||||
idealCustomerProfileField.id,
|
||||
2,
|
||||
'group-business',
|
||||
),
|
||||
];
|
||||
|
||||
const coreView = createCoreView({
|
||||
viewFields: [...contactInfoFields, ...businessFields],
|
||||
viewFieldGroups: [
|
||||
{
|
||||
id: 'group-contact-info',
|
||||
name: 'Contact Info',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
viewFields: [
|
||||
{
|
||||
id: 'vf-name',
|
||||
fieldMetadataId: nameField.id,
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-address',
|
||||
fieldMetadataId: addressField.id,
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-linkedin',
|
||||
fieldMetadataId: linkedinField.id,
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'group-business',
|
||||
name: 'Business',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
viewFields: [
|
||||
{
|
||||
id: 'vf-employees',
|
||||
fieldMetadataId: employeesField.id,
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-arr',
|
||||
fieldMetadataId: annualRecurringRevenueField.id,
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-icp',
|
||||
fieldMetadataId: idealCustomerProfileField.id,
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
],
|
||||
},
|
||||
createViewFieldGroup(
|
||||
'group-contact-info',
|
||||
'Contact Info',
|
||||
0,
|
||||
contactInfoFields,
|
||||
),
|
||||
createViewFieldGroup('group-business', 'Business', 1, businessFields),
|
||||
],
|
||||
});
|
||||
|
||||
@@ -325,8 +308,8 @@ export const WithViewFieldGroups: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(coreViewsState.atom, [coreView]);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
|
||||
@@ -394,36 +377,9 @@ export const WithInlineViewFields: Story = {
|
||||
render: () => {
|
||||
const coreView = createCoreView({
|
||||
viewFields: [
|
||||
{
|
||||
id: 'vf-name',
|
||||
fieldMetadataId: nameField.id,
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-employees',
|
||||
fieldMetadataId: employeesField.id,
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
{
|
||||
id: 'vf-address',
|
||||
fieldMetadataId: addressField.id,
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 200,
|
||||
aggregateOperation: null,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
},
|
||||
createViewField('vf-name', nameField.id, 0),
|
||||
createViewField('vf-employees', employeesField.id, 1),
|
||||
createViewField('vf-address', addressField.id, 2),
|
||||
],
|
||||
});
|
||||
|
||||
@@ -438,8 +394,8 @@ export const WithInlineViewFields: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(coreViewsState.atom, [coreView]);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
|
||||
@@ -507,15 +463,7 @@ export const Empty: Story = {
|
||||
render: () => {
|
||||
const coreView = createCoreView({
|
||||
viewFieldGroups: [
|
||||
{
|
||||
id: 'group-empty',
|
||||
name: 'Empty Group',
|
||||
position: 0,
|
||||
isVisible: false,
|
||||
isOverridden: false,
|
||||
viewId: FIELDS_VIEW_ID,
|
||||
viewFields: [],
|
||||
},
|
||||
createViewFieldGroup('group-empty', 'Empty Group', 0, [], false),
|
||||
],
|
||||
});
|
||||
|
||||
@@ -530,8 +478,8 @@ export const Empty: Story = {
|
||||
jotaiStore,
|
||||
generatedMockObjectMetadataItems,
|
||||
);
|
||||
jotaiStore.set(isAppMetadataReadyState.atom, true);
|
||||
jotaiStore.set(coreViewsState.atom, [coreView]);
|
||||
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
|
||||
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
|
||||
jotaiStore.set(
|
||||
pageLayoutPersistedComponentState.atomFamily({
|
||||
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
|
||||
|
||||
Reference in New Issue
Block a user