Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions e2e/templates/createWorkflowPanel.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ test.describe(
await page.locator('[data-testid="msla-templates-workflowName"]').fill(workflowName);
await page.getByText('Stateless', { exact: true }).click();

await page.getByRole('button', { name: 'Next' }).click();
await page.getByTestId('template-footer-button-0').click();

await expect(page.getByText('BasicWorkflowOnly', { exact: true })).not.toBeVisible();
await expect(page.getByText('Stateful', { exact: true })).not.toBeVisible();
Expand Down Expand Up @@ -58,7 +58,7 @@ test.describe(

await page.getByRole('tab', { name: 'Parameters' }).click();
await page.locator('[data-testid="msla-templates-parameter-value-LogicMessage_#workflowname#"]').fill(parameterValue);
await page.getByRole('button', { name: 'Next' }).click();
await page.getByTestId('template-footer-button-0').click();

await expect(page.getByText('----', { exact: true })).not.toBeVisible();
await expect(page.getByText(parameterValue, { exact: true })).toBeVisible();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@ import type { AppStore } from '../../../../core/state/templates/store';
import { setupStore } from '../../../../core/state/templates/store';
import { StandardTemplateService, InitTemplateService, type Template } from '@microsoft/logic-apps-shared';
import { renderWithProviders } from '../../../../__test__/template-test-utils';
import { screen } from '@testing-library/react';
import { screen, fireEvent, waitFor } from '@testing-library/react';
import type { TemplateState } from '../../../../core/state/templates/templateSlice';
import { TemplatePanelView } from '../../../../core/state/templates/panelSlice';
import constants from '../../../../common/constants';
import { MockHttpClient } from '../../../../__test__/mock-http-client';
import { QueryClientProvider } from '@tanstack/react-query';
import { getReactQueryClient } from '../../../../core';
// biome-ignore lint/correctness/noUnusedImports: <explanation>
import React from 'react';
import { CreateWorkflowPanel } from '../createWorkflowPanel/createWorkflowPanel';
import { CreateWorkflowPanel, CreateWorkflowPanelHeader } from '../createWorkflowPanel/createWorkflowPanel';

describe('panel/templatePanel/createWorkflowPanel', () => {
let store: AppStore;
Expand Down Expand Up @@ -158,7 +157,7 @@ describe('panel/templatePanel/createWorkflowPanel', () => {
errors: {
workflow: undefined,
kind: undefined,
},
} as any,
connectionKeys: [],
},
},
Expand All @@ -177,7 +176,7 @@ describe('panel/templatePanel/createWorkflowPanel', () => {
workflows: {},
parameters: {},
connections: undefined,
},
} as any,
};
const minimalStoreData = {
template: templateSliceData,
Expand All @@ -192,10 +191,12 @@ describe('panel/templatePanel/createWorkflowPanel', () => {

beforeEach(() => {
const queryClient = getReactQueryClient();

const ref = React.createRef<HTMLDivElement>();
renderWithProviders(
<QueryClientProvider client={queryClient}>
<CreateWorkflowPanel createWorkflow={vi.fn()} />
<div ref={ref}>
<CreateWorkflowPanel createWorkflow={vi.fn()} mountNode={ref.current} />
</div>
</QueryClientProvider>,
{ store }
);
Expand Down Expand Up @@ -276,3 +277,73 @@ describe('panel/templatePanel/createWorkflowPanel', () => {
expect(screen.queryByText(constants.TEMPLATE_PANEL_TAB_NAMES.REVIEW_AND_CREATE)).toBeDefined();
});
});

describe('panel/templatePanel/CreateWorkflowPanelHeader', () => {
it('Renders header with default title when headerTitle is not provided', () => {
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" />, { store: setupStore({}) });
expect(screen.getByText('Create a new workflow from template')).toBeDefined();
});

it('Renders header with custom headerTitle when provided', () => {
renderWithProviders(<CreateWorkflowPanelHeader headerTitle="Custom Header" title="Test Template" summary="Test Summary" />, {
store: setupStore({}),
});
expect(screen.getByText('Custom Header')).toBeDefined();
});

it('Shows close button when onClose is provided', () => {
const onCloseMock = vi.fn();
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" onClose={onCloseMock} />, {
store: setupStore({}),
});
expect(screen.getByText('Close Panel')).toBeDefined();
});

it('Does not show close button when onClose is not provided', () => {
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" />, { store: setupStore({}) });
expect(screen.queryByText('Close Panel')).toBeNull();
});

it('Calls onClose when close button is clicked', () => {
const onCloseMock = vi.fn();
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" onClose={onCloseMock} />, {
store: setupStore({}),
});
const closeButton = screen.getByText('Close Panel');
fireEvent.click(closeButton);
expect(onCloseMock).toHaveBeenCalledTimes(1);
});

it('Template details section is collapsed by default', () => {
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" />, { store: setupStore({}) });
expect(screen.getByText('Template details')).toBeDefined();
expect(screen.queryByText('Name')).toBeNull();
expect(screen.queryByText('Description')).toBeNull();
});

it('Expands template details when toggle is clicked', async () => {
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" />, { store: setupStore({}) });
const toggle = screen.getByText('Template details');
fireEvent.click(toggle);
await waitFor(() => {
expect(screen.getByText('Name')).toBeDefined();
expect(screen.getByText('Description')).toBeDefined();
expect(screen.getByText('Test Template')).toBeDefined();
expect(screen.getByText('Test Summary')).toBeDefined();
});
});

it('Collapses template details when toggle is clicked twice', async () => {
renderWithProviders(<CreateWorkflowPanelHeader title="Test Template" summary="Test Summary" />, { store: setupStore({}) });
const toggle = screen.getByText('Template details');
fireEvent.click(toggle);
await waitFor(() => {
expect(screen.getByText('Name')).toBeDefined();
});
fireEvent.click(toggle);
await waitFor(() => {
expect(screen.queryByText('Name')).toBeNull();
expect(screen.queryByText('Description')).toBeNull();
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,12 @@ describe('panel/templatePanel/quickViewPanel', () => {

beforeEach(() => {
const queryClient = getReactQueryClient();

const ref = React.createRef<HTMLDivElement>();
renderWithProviders(
<QueryClientProvider client={queryClient}>
<QuickViewPanel showCreate={true} workflowId={defaultWorkflowId} />
<div ref={ref}>
<QuickViewPanel showCreate={true} workflowId={defaultWorkflowId} mountNode={ref.current} />
</div>
</QueryClientProvider>,
{ store }
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const useStyles = makeStyles({
drawer: {
zIndex: 1000,
height: '100%',
position: 'fixed',
},
header: {
...shorthands.padding('0', tokens.spacingHorizontalL),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@ export interface CreateWorkflowPanelProps {
clearDetailsOnClose?: boolean;
panelWidth?: string;
showCloseButton?: boolean;
mountNode: HTMLElement | null;
onClose?: () => void;
}

export const CreateWorkflowPanel = ({
createWorkflow,
onClose,
mountNode,
panelWidth = '50%',
clearDetailsOnClose = true,
showCloseButton = true,
Expand Down Expand Up @@ -125,7 +127,13 @@ export const CreateWorkflowPanel = ({
open={isOpen && currentPanelView === TemplatePanelView.CreateWorkflow}
onOpenChange={(_, { open }) => !open && shouldCloseByDefault && dismissPanel()}
position="end"
style={{ width: panelWidth }}
style={{
width: panelWidth,
}}
mountNode={{
element: mountNode,
}}
type={'overlay'}
>
<DrawerHeader className={styles.header}>{onRenderHeaderContent()}</DrawerHeader>
<DrawerBody className={styles.body}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const useStyles = makeStyles({
drawer: {
zIndex: 1000,
height: '100%',
position: 'fixed',
},
header: {
...shorthands.padding('0', tokens.spacingHorizontalL),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { useStyles } from './quickViewPanel.styles';
export interface QuickViewPanelProps {
showCreate: boolean;
workflowId: string;
mountNode: HTMLElement | null;
clearDetailsOnClose?: boolean;
panelWidth?: string;
showCloseButton?: boolean;
Expand All @@ -27,6 +28,7 @@ export const QuickViewPanel = ({
onClose,
showCreate,
workflowId,
mountNode,
panelWidth = '50%',
showCloseButton = true,
clearDetailsOnClose = true,
Expand Down Expand Up @@ -103,6 +105,10 @@ export const QuickViewPanel = ({
onOpenChange={(_, { open }) => !open && shouldCloseByDefault && dismissPanel()}
position="end"
style={{ width: panelWidth }}
mountNode={{
element: mountNode,
}}
type={'overlay'}
>
<DrawerHeader className={styles.header}>{onRenderHeaderContent()}</DrawerHeader>
<DrawerBody className={styles.body}>
Expand Down
Loading
Loading