Fix stories (#10851)
Fix storybook stories <img width="1475" alt="image" src="https://github.com/user-attachments/assets/50327d9b-f3a0-46ea-87f2-93da356ec7c9" />
This commit is contained in:
@ -36,6 +36,6 @@ export const Default: Story = {
|
|||||||
await canvas.findByText('Search');
|
await canvas.findByText('Search');
|
||||||
await canvas.findByText('Settings');
|
await canvas.findByText('Settings');
|
||||||
await canvas.findByText('Linkedin');
|
await canvas.findByText('Linkedin');
|
||||||
await canvas.findByText('All companies');
|
await canvas.findByText('Companies');
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2,6 +2,8 @@ import { Meta, StoryObj } from '@storybook/react';
|
|||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
|
|
||||||
import { TaskList } from '@/activities/tasks/components/TaskList';
|
import { TaskList } from '@/activities/tasks/components/TaskList';
|
||||||
|
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
|
||||||
|
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
@ -13,6 +15,8 @@ const meta: Meta<typeof TaskList> = {
|
|||||||
component: TaskList,
|
component: TaskList,
|
||||||
decorators: [
|
decorators: [
|
||||||
ComponentDecorator,
|
ComponentDecorator,
|
||||||
|
ContextStoreDecorator,
|
||||||
|
I18nFrontDecorator,
|
||||||
MemoryRouterDecorator,
|
MemoryRouterDecorator,
|
||||||
ObjectMetadataItemsDecorator,
|
ObjectMetadataItemsDecorator,
|
||||||
SnackBarDecorator,
|
SnackBarDecorator,
|
||||||
|
|||||||
@ -52,8 +52,11 @@ export const Readonly: Story = {
|
|||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(editor, '{{ "a": {{ "b" : "d" } }');
|
await userEvent.type(editor, '{{ "a": {{ "b" : "d" } }');
|
||||||
|
|
||||||
@ -76,8 +79,11 @@ export const SaveValidJson: Story = {
|
|||||||
onPersist: fn(),
|
onPersist: fn(),
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(editor, '{{ "a": {{ "b" : "d" } }');
|
await userEvent.type(editor, '{{ "a": {{ "b" : "d" } }');
|
||||||
|
|
||||||
@ -93,8 +99,11 @@ export const SaveValidMultilineJson: Story = {
|
|||||||
onPersist: fn(),
|
onPersist: fn(),
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(
|
await userEvent.type(
|
||||||
editor,
|
editor,
|
||||||
@ -115,8 +124,11 @@ export const MultilineWithDefaultValue: Story = {
|
|||||||
defaultValue: '{\n "a": {\n "b" : "d"\n }\n}',
|
defaultValue: '{\n "a": {\n "b" : "d"\n }\n}',
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await waitFor(() => {
|
await waitFor(() => {
|
||||||
expect((editor as HTMLElement).innerText).toBe(
|
expect((editor as HTMLElement).innerText).toBe(
|
||||||
@ -132,8 +144,11 @@ export const DoesNotIgnoreInvalidJson: Story = {
|
|||||||
onPersist: fn(),
|
onPersist: fn(),
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(editor, 'lol');
|
await userEvent.type(editor, 'lol');
|
||||||
|
|
||||||
@ -180,8 +195,11 @@ export const InsertVariableInTheMiddleOnTextInput: Story = {
|
|||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
const addVariableButton = await canvas.findByRole('button', {
|
const addVariableButton = await canvas.findByRole('button', {
|
||||||
name: 'Add variable',
|
name: 'Add variable',
|
||||||
@ -222,8 +240,11 @@ export const CanUseVariableAsObjectProperty: Story = {
|
|||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
const addVariableButton = await canvas.findByRole('button', {
|
const addVariableButton = await canvas.findByRole('button', {
|
||||||
name: 'Add variable',
|
name: 'Add variable',
|
||||||
@ -250,8 +271,11 @@ export const ClearField: Story = {
|
|||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const defaultValueStringLength = args.defaultValue!.length;
|
const defaultValueStringLength = args.defaultValue!.length;
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
userEvent.type(editor, `{Backspace>${defaultValueStringLength}}`),
|
userEvent.type(editor, `{Backspace>${defaultValueStringLength}}`),
|
||||||
@ -273,8 +297,11 @@ export const DoesNotBreakWhenUserInsertsNewlineInJsonString: Story = {
|
|||||||
onPersist: fn(),
|
onPersist: fn(),
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(editor, '"a{Enter}b"');
|
await userEvent.type(editor, '"a{Enter}b"');
|
||||||
|
|
||||||
@ -290,8 +317,11 @@ export const AcceptsJsonEncodedNewline: Story = {
|
|||||||
onPersist: fn(),
|
onPersist: fn(),
|
||||||
},
|
},
|
||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
await userEvent.type(editor, '"a\\nb"');
|
await userEvent.type(editor, '"a\\nb"');
|
||||||
|
|
||||||
@ -322,8 +352,11 @@ export const HasHistory: Story = {
|
|||||||
|
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = await waitFor(() => {
|
||||||
expect(editor).toBeVisible();
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
return editor;
|
||||||
|
});
|
||||||
|
|
||||||
const addVariableButton = await canvas.findByRole('button', {
|
const addVariableButton = await canvas.findByRole('button', {
|
||||||
name: 'Add variable',
|
name: 'Add variable',
|
||||||
|
|||||||
@ -120,8 +120,12 @@ export const WithDeletableVariable: Story = {
|
|||||||
play: async ({ canvasElement, args }) => {
|
play: async ({ canvasElement, args }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
|
expect(editor).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
const editor = canvasElement.querySelector('.ProseMirror > p');
|
const editor = canvasElement.querySelector('.ProseMirror > p');
|
||||||
expect(editor).toBeVisible();
|
|
||||||
|
|
||||||
const variable = await canvas.findByText('Name');
|
const variable = await canvas.findByText('Name');
|
||||||
expect(variable).toBeVisible();
|
expect(variable).toBeVisible();
|
||||||
|
|||||||
@ -1,13 +1,11 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect, useMemo } from 'react';
|
||||||
import { useSetRecoilState } from 'recoil';
|
import { useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
||||||
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
|
||||||
import { RelationFromManyFieldInput } from '@/object-record/record-field/meta-types/input/components/RelationFromManyFieldInput';
|
import { RelationFromManyFieldInput } from '@/object-record/record-field/meta-types/input/components/RelationFromManyFieldInput';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
import { FieldMetadataType } from '~/generated/graphql';
|
|
||||||
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
|
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
@ -17,7 +15,13 @@ import {
|
|||||||
mockedWorkspaceMemberData,
|
mockedWorkspaceMemberData,
|
||||||
} from '~/testing/mock-data/users';
|
} from '~/testing/mock-data/users';
|
||||||
|
|
||||||
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
|
import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
|
||||||
import { FieldContextProvider } from '@/object-record/record-field/meta-types/components/FieldContextProvider';
|
import { FieldContextProvider } from '@/object-record/record-field/meta-types/components/FieldContextProvider';
|
||||||
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
import { FieldMetadataType } from 'twenty-shared';
|
||||||
|
import { RelationDefinitionType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
const RelationWorkspaceSetterEffect = () => {
|
const RelationWorkspaceSetterEffect = () => {
|
||||||
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
|
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
|
||||||
@ -36,31 +40,63 @@ const RelationWorkspaceSetterEffect = () => {
|
|||||||
const RelationManyFieldInputWithContext = () => {
|
const RelationManyFieldInputWithContext = () => {
|
||||||
const setHotKeyScope = useSetHotkeyScope();
|
const setHotKeyScope = useSetHotkeyScope();
|
||||||
|
|
||||||
|
const fieldDefinition = useMemo(
|
||||||
|
() => ({
|
||||||
|
fieldMetadataId: 'relation',
|
||||||
|
label: 'People',
|
||||||
|
type: FieldMetadataType.RELATION,
|
||||||
|
iconName: 'IconLink',
|
||||||
|
metadata: {
|
||||||
|
fieldName: 'people',
|
||||||
|
relationType: RelationDefinitionType.ONE_TO_MANY,
|
||||||
|
relationObjectMetadataNamePlural: 'companies',
|
||||||
|
relationObjectMetadataNameSingular: CoreObjectNameSingular.Company,
|
||||||
|
objectMetadataNameSingular: 'company',
|
||||||
|
relationFieldMetadataId: '20202020-8c37-4163-ba06-1dada334ce3e',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
|
const setRecordStoreFieldValue = useSetRecoilState(
|
||||||
|
recordStoreFamilySelector({
|
||||||
|
fieldName: 'people',
|
||||||
|
recordId: 'recordId',
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const { openFieldInput } = useOpenFieldInputEditMode();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
setRecordStoreFieldValue([]);
|
||||||
|
|
||||||
setHotKeyScope('hotkey-scope');
|
setHotKeyScope('hotkey-scope');
|
||||||
}, [setHotKeyScope]);
|
openFieldInput({
|
||||||
|
fieldDefinition,
|
||||||
|
recordId: 'recordId',
|
||||||
|
});
|
||||||
|
}, [
|
||||||
|
fieldDefinition,
|
||||||
|
openFieldInput,
|
||||||
|
setHotKeyScope,
|
||||||
|
setRecordStoreFieldValue,
|
||||||
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<FieldContextProvider
|
<RecordFieldComponentInstanceContext.Provider
|
||||||
fieldDefinition={{
|
value={{
|
||||||
fieldMetadataId: 'relation',
|
instanceId: 'relation-from-many-field-record-id-people',
|
||||||
label: 'People',
|
|
||||||
type: FieldMetadataType.RELATION,
|
|
||||||
iconName: 'IconLink',
|
|
||||||
metadata: {
|
|
||||||
fieldName: 'people',
|
|
||||||
relationObjectMetadataNamePlural: 'companies',
|
|
||||||
relationObjectMetadataNameSingular: CoreObjectNameSingular.Company,
|
|
||||||
objectMetadataNameSingular: 'company',
|
|
||||||
relationFieldMetadataId: '20202020-8c37-4163-ba06-1dada334ce3e',
|
|
||||||
},
|
|
||||||
}}
|
}}
|
||||||
recordId={'recordId'}
|
|
||||||
>
|
>
|
||||||
<RelationWorkspaceSetterEffect />
|
<FieldContextProvider
|
||||||
<RelationFromManyFieldInput />
|
fieldDefinition={fieldDefinition}
|
||||||
</FieldContextProvider>
|
recordId={'recordId'}
|
||||||
|
>
|
||||||
|
<RelationWorkspaceSetterEffect />
|
||||||
|
<RelationFromManyFieldInput />
|
||||||
|
</FieldContextProvider>
|
||||||
|
</RecordFieldComponentInstanceContext.Provider>
|
||||||
<div data-testid="data-field-input-click-outside-div" />
|
<div data-testid="data-field-input-click-outside-div" />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -20,7 +20,6 @@ import {
|
|||||||
import { FieldContextProvider } from '@/object-record/record-field/meta-types/components/FieldContextProvider';
|
import { FieldContextProvider } from '@/object-record/record-field/meta-types/components/FieldContextProvider';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState';
|
import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState';
|
||||||
import { SingleRecordPickerComponentInstanceContext } from '@/object-record/record-picker/single-record-picker/states/contexts/SingleRecordPickerComponentInstanceContext';
|
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { getCanvasElementForDropdownTesting } from 'twenty-ui';
|
import { getCanvasElementForDropdownTesting } from 'twenty-ui';
|
||||||
import {
|
import {
|
||||||
@ -92,12 +91,8 @@ const RelationToOneFieldInputWithContext = ({
|
|||||||
instanceId: 'relation-to-one-field-input-123-Relation',
|
instanceId: 'relation-to-one-field-input-123-Relation',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<SingleRecordPickerComponentInstanceContext.Provider
|
<RelationWorkspaceSetterEffect />
|
||||||
value={{ instanceId: 'relation-to-one-field-input-123-Relation' }}
|
<RelationToOneFieldInput onSubmit={onSubmit} onCancel={onCancel} />
|
||||||
>
|
|
||||||
<RelationWorkspaceSetterEffect />
|
|
||||||
<RelationToOneFieldInput onSubmit={onSubmit} onCancel={onCancel} />
|
|
||||||
</SingleRecordPickerComponentInstanceContext.Provider>
|
|
||||||
</RecordFieldComponentInstanceContext.Provider>
|
</RecordFieldComponentInstanceContext.Provider>
|
||||||
</FieldContextProvider>
|
</FieldContextProvider>
|
||||||
<div data-testid="data-field-input-click-outside-div" />
|
<div data-testid="data-field-input-click-outside-div" />
|
||||||
@ -176,9 +171,7 @@ export const Cancel: Story = {
|
|||||||
|
|
||||||
const emptyDiv = canvas.getByTestId('data-field-input-click-outside-div');
|
const emptyDiv = canvas.getByTestId('data-field-input-click-outside-div');
|
||||||
|
|
||||||
await waitFor(() => {
|
await userEvent.click(emptyDiv);
|
||||||
userEvent.click(emptyDiv);
|
expect(cancelJestFn).toHaveBeenCalledTimes(1);
|
||||||
expect(cancelJestFn).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -39,6 +39,7 @@ export const SingleRecordPicker = ({
|
|||||||
event.target instanceof HTMLInputElement &&
|
event.target instanceof HTMLInputElement &&
|
||||||
event.target.tagName === 'INPUT'
|
event.target.tagName === 'INPUT'
|
||||||
);
|
);
|
||||||
|
|
||||||
if (weAreNotInAnHTMLInput && isDefined(onCancel)) {
|
if (weAreNotInAnHTMLInput && isDefined(onCancel)) {
|
||||||
onCancel();
|
onCancel();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext';
|
||||||
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
@ -19,12 +20,16 @@ const meta: Meta = {
|
|||||||
RecordTableDecorator,
|
RecordTableDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<RecordTableComponentInstance
|
<RecordFiltersComponentInstanceContext.Provider
|
||||||
recordTableId="persons"
|
value={{ instanceId: 'record-filters-component-instance' }}
|
||||||
onColumnsChange={() => {}}
|
|
||||||
>
|
>
|
||||||
<Story />
|
<RecordTableComponentInstance
|
||||||
</RecordTableComponentInstance>
|
recordTableId="persons"
|
||||||
|
onColumnsChange={() => {}}
|
||||||
|
>
|
||||||
|
<Story />
|
||||||
|
</RecordTableComponentInstance>
|
||||||
|
</RecordFiltersComponentInstanceContext.Provider>
|
||||||
</SnackBarProviderScope>
|
</SnackBarProviderScope>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { ComponentDecorator } from 'twenty-ui';
|
|||||||
|
|
||||||
import { SettingsAccountsCalendarChannelDetails } from '@/settings/accounts/components/SettingsAccountsCalendarChannelDetails';
|
import { SettingsAccountsCalendarChannelDetails } from '@/settings/accounts/components/SettingsAccountsCalendarChannelDetails';
|
||||||
import { CalendarChannelVisibility } from '~/generated/graphql';
|
import { CalendarChannelVisibility } from '~/generated/graphql';
|
||||||
|
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
|
|
||||||
@ -12,6 +13,7 @@ const meta: Meta<typeof SettingsAccountsCalendarChannelDetails> = {
|
|||||||
component: SettingsAccountsCalendarChannelDetails,
|
component: SettingsAccountsCalendarChannelDetails,
|
||||||
decorators: [
|
decorators: [
|
||||||
ComponentDecorator,
|
ComponentDecorator,
|
||||||
|
I18nFrontDecorator,
|
||||||
ObjectMetadataItemsDecorator,
|
ObjectMetadataItemsDecorator,
|
||||||
SnackBarDecorator,
|
SnackBarDecorator,
|
||||||
],
|
],
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { ComponentDecorator } from 'twenty-ui';
|
|||||||
import { MessageChannelContactAutoCreationPolicy } from '@/accounts/types/MessageChannel';
|
import { MessageChannelContactAutoCreationPolicy } from '@/accounts/types/MessageChannel';
|
||||||
import { SettingsAccountsMessageChannelDetails } from '@/settings/accounts/components/SettingsAccountsMessageChannelDetails';
|
import { SettingsAccountsMessageChannelDetails } from '@/settings/accounts/components/SettingsAccountsMessageChannelDetails';
|
||||||
import { MessageChannelVisibility } from '~/generated/graphql';
|
import { MessageChannelVisibility } from '~/generated/graphql';
|
||||||
|
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
|
|
||||||
@ -13,6 +14,7 @@ const meta: Meta<typeof SettingsAccountsMessageChannelDetails> = {
|
|||||||
component: SettingsAccountsMessageChannelDetails,
|
component: SettingsAccountsMessageChannelDetails,
|
||||||
decorators: [
|
decorators: [
|
||||||
ComponentDecorator,
|
ComponentDecorator,
|
||||||
|
I18nFrontDecorator,
|
||||||
ObjectMetadataItemsDecorator,
|
ObjectMetadataItemsDecorator,
|
||||||
SnackBarDecorator,
|
SnackBarDecorator,
|
||||||
],
|
],
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { TRIGGER_STEP_ID } from '@/workflow/workflow-trigger/constants/TriggerSt
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
import { expect, userEvent, waitFor, within } from '@storybook/test';
|
import { expect, userEvent, waitFor, within } from '@storybook/test';
|
||||||
import { graphql, HttpResponse } from 'msw';
|
import { HttpResponse, graphql } from 'msw';
|
||||||
import { useSetRecoilState } from 'recoil';
|
import { useSetRecoilState } from 'recoil';
|
||||||
import { ComponentDecorator, RouterDecorator } from 'twenty-ui';
|
import { ComponentDecorator, RouterDecorator } from 'twenty-ui';
|
||||||
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
|
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
|
||||||
@ -63,8 +63,25 @@ const meta: Meta<typeof RightDrawerWorkflowRunViewStep> = {
|
|||||||
msw: {
|
msw: {
|
||||||
handlers: [
|
handlers: [
|
||||||
graphql.query('FindOneWorkflowRun', () => {
|
graphql.query('FindOneWorkflowRun', () => {
|
||||||
|
const workflowRunContext =
|
||||||
|
oneFailedWorkflowRunQueryResult.workflowRun.context;
|
||||||
|
|
||||||
|
// Rendering the whole objectMetadata information in the JSON viewer is too long for storybook
|
||||||
|
// so we remove it for the story
|
||||||
return HttpResponse.json({
|
return HttpResponse.json({
|
||||||
data: oneFailedWorkflowRunQueryResult,
|
data: {
|
||||||
|
...oneFailedWorkflowRunQueryResult,
|
||||||
|
workflowRun: {
|
||||||
|
...oneFailedWorkflowRunQueryResult.workflowRun,
|
||||||
|
context: {
|
||||||
|
...workflowRunContext,
|
||||||
|
trigger: {
|
||||||
|
...workflowRunContext.trigger,
|
||||||
|
objectMetadata: undefined,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
...graphqlMocks.handlers,
|
...graphqlMocks.handlers,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { useStepsOutputSchema } from '@/workflow/hooks/useStepsOutputSchema';
|
import { useStepsOutputSchema } from '@/workflow/hooks/useStepsOutputSchema';
|
||||||
import { WorkflowStepContextProvider } from '@/workflow/states/context/WorkflowStepContext';
|
import { WorkflowStepContextProvider } from '@/workflow/states/context/WorkflowStepContext';
|
||||||
|
import { flowState } from '@/workflow/states/flowState';
|
||||||
import { workflowIdState } from '@/workflow/states/workflowIdState';
|
import { workflowIdState } from '@/workflow/states/workflowIdState';
|
||||||
import { WorkflowVersion } from '@/workflow/types/Workflow';
|
import { WorkflowVersion } from '@/workflow/types/Workflow';
|
||||||
import { workflowSelectedNodeState } from '@/workflow/workflow-diagram/states/workflowSelectedNodeState';
|
import { workflowSelectedNodeState } from '@/workflow/workflow-diagram/states/workflowSelectedNodeState';
|
||||||
@ -14,6 +15,7 @@ import {
|
|||||||
export const WorkflowStepDecorator: Decorator = (Story) => {
|
export const WorkflowStepDecorator: Decorator = (Story) => {
|
||||||
const setWorkflowId = useSetRecoilState(workflowIdState);
|
const setWorkflowId = useSetRecoilState(workflowIdState);
|
||||||
const setWorkflowSelectedNode = useSetRecoilState(workflowSelectedNodeState);
|
const setWorkflowSelectedNode = useSetRecoilState(workflowSelectedNodeState);
|
||||||
|
const setFlow = useSetRecoilState(flowState);
|
||||||
const workflowVersion = getWorkflowMock().versions.edges[0]
|
const workflowVersion = getWorkflowMock().versions.edges[0]
|
||||||
.node as WorkflowVersion;
|
.node as WorkflowVersion;
|
||||||
const { populateStepsOutputSchema } = useStepsOutputSchema();
|
const { populateStepsOutputSchema } = useStepsOutputSchema();
|
||||||
@ -22,6 +24,11 @@ export const WorkflowStepDecorator: Decorator = (Story) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setWorkflowId(getWorkflowMock().id);
|
setWorkflowId(getWorkflowMock().id);
|
||||||
setWorkflowSelectedNode(getWorkflowNodeIdMock());
|
setWorkflowSelectedNode(getWorkflowNodeIdMock());
|
||||||
|
setFlow({
|
||||||
|
workflowVersionId: workflowVersion.id,
|
||||||
|
trigger: workflowVersion.trigger,
|
||||||
|
steps: workflowVersion.steps,
|
||||||
|
});
|
||||||
populateStepsOutputSchema(workflowVersion);
|
populateStepsOutputSchema(workflowVersion);
|
||||||
setReady(true);
|
setReady(true);
|
||||||
}, [
|
}, [
|
||||||
@ -29,6 +36,7 @@ export const WorkflowStepDecorator: Decorator = (Story) => {
|
|||||||
setWorkflowSelectedNode,
|
setWorkflowSelectedNode,
|
||||||
populateStepsOutputSchema,
|
populateStepsOutputSchema,
|
||||||
workflowVersion,
|
workflowVersion,
|
||||||
|
setFlow,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user