diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index a2d71ff5b..5d3281ecd 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -1,5 +1,6 @@ import { track } from "@/customization/utils/analytics"; import useFlowStore from "@/stores/flowStore"; +import { FlowType } from "@/types/flow"; import { ReactNode, forwardRef, useEffect, useState } from "react"; import IconComponent from "../../components/common/genericIconComponent"; import EditFlowSettings from "../../components/core/editFlowSettingsComponent"; @@ -16,11 +17,21 @@ import { downloadFlow, removeApiKeys } from "../../utils/reactflowUtils"; import BaseModal from "../baseModal"; const ExportModal = forwardRef( - (props: { children: ReactNode }, ref): JSX.Element => { + ( + props: { + children?: ReactNode; + open?: boolean; + setOpen?: (open: boolean) => void; + flowData?: FlowType; + }, + ref, + ): JSX.Element => { const version = useDarkStore((state) => state.version); + const setSuccessData = useAlertStore((state) => state.setSuccessData); const setNoticeData = useAlertStore((state) => state.setNoticeData); const [checked, setChecked] = useState(false); - const currentFlow = useFlowStore((state) => state.currentFlow); + const currentFlowOnPage = useFlowStore((state) => state.currentFlow); + const currentFlow = props.flowData ?? currentFlowOnPage; const isBuilding = useFlowStore((state) => state.isBuilding); useEffect(() => { setName(currentFlow?.name ?? ""); @@ -30,7 +41,13 @@ const ExportModal = forwardRef( const [description, setDescription] = useState( currentFlow?.description ?? "", ); - const [open, setOpen] = useState(false); + + const [customOpen, customSetOpen] = useState(false); + const [open, setOpen] = + props.open !== undefined && props.setOpen !== undefined + ? [props.open, props.setOpen] + : [customOpen, customSetOpen]; + return ( { + setSuccessData({ + title: "Flow exported successfully", + }); + }); setOpen(false); track("Flow Exported", { flowId: currentFlow!.id }); }} > - {props.children} + {props.children ?? <>} Export - + ); }, diff --git a/src/frontend/src/pages/MainPage/components/dropdown/index.tsx b/src/frontend/src/pages/MainPage/components/dropdown/index.tsx index d76b16f8e..3d15110e6 100644 --- a/src/frontend/src/pages/MainPage/components/dropdown/index.tsx +++ b/src/frontend/src/pages/MainPage/components/dropdown/index.tsx @@ -2,25 +2,24 @@ import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; import useAlertStore from "@/stores/alertStore"; import { FlowType } from "@/types/flow"; -import { downloadFlow } from "@/utils/reactflowUtils"; import useDuplicateFlow from "../../hooks/use-handle-duplicate"; import useSelectOptionsChange from "../../hooks/use-select-options-change"; type DropdownComponentProps = { flowData: FlowType; setOpenDelete: (open: boolean) => void; - handlePlaygroundClick?: () => void; + handleExport: () => void; handleEdit: () => void; }; const DropdownComponent = ({ flowData, setOpenDelete, + handleExport, handleEdit, }: DropdownComponentProps) => { const setSuccessData = useAlertStore((state) => state.setSuccessData); const setErrorData = useAlertStore((state) => state.setErrorData); - const { handleDuplicate } = useDuplicateFlow({ flow: flowData }); const duplicateFlow = () => { @@ -31,16 +30,12 @@ const DropdownComponent = ({ ); }; - const handleExport = () => { - downloadFlow(flowData, flowData.name, flowData.description); - setSuccessData({ title: `${flowData.name} exported successfully` }); - }; const { handleSelectOptionsChange } = useSelectOptionsChange( [flowData.id], setErrorData, setOpenDelete, - duplicateFlow, handleExport, + duplicateFlow, handleEdit, ); @@ -74,7 +69,7 @@ const DropdownComponent = ({ aria-hidden="true" className="mr-2 h-4 w-4" /> - Download + Export { diff --git a/src/frontend/src/pages/MainPage/components/header/index.tsx b/src/frontend/src/pages/MainPage/components/header/index.tsx index 1651a5078..96e4f7b40 100644 --- a/src/frontend/src/pages/MainPage/components/header/index.tsx +++ b/src/frontend/src/pages/MainPage/components/header/index.tsx @@ -82,6 +82,7 @@ const HeaderComponent = ({ const handleDownload = () => { downloadFlows({ ids: selectedFlows }); + setSuccessData({ title: "Flows downloaded successfully" }); }; const handleDelete = () => { @@ -190,13 +191,15 @@ const HeaderComponent = ({
0 && "w-36 opacity-100", )} >
- {openDelete && ( )} + void, setOpenDelete: (value: boolean) => void, - handleDuplicate: () => void, handleExport: () => void, + handleDuplicate: () => void, handleEdit: () => void, ) => { const handleSelectOptionsChange = useCallback( @@ -33,8 +33,8 @@ const useSelectOptionsChange = ( setErrorData, setOpenDelete, handleDuplicate, - handleExport, handleEdit, + handleExport, ], ); diff --git a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts index 5ed13cf48..fed320126 100644 --- a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts +++ b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts @@ -35,6 +35,9 @@ test( await page.getByTestId("icon-ChevronLeft").last().click(); await page.getByTestId("home-dropdown-menu").nth(0).click(); await page.getByTestId("btn-download-json").last().click(); + await page.getByText("Export").first().isVisible(); + await page.getByTestId("modal-export-button").isVisible(); + await page.getByTestId("modal-export-button").click(); await expect(page.getByText(/.*exported successfully/)).toBeVisible({ timeout: 10000, }); @@ -42,6 +45,9 @@ test( await page.getByText("Flows", { exact: true }).click(); await page.getByTestId("home-dropdown-menu").nth(0).click(); await page.getByTestId("btn-download-json").last().click(); + await page.getByText("Export").first().isVisible(); + await page.getByTestId("modal-export-button").isVisible(); + await page.getByTestId("modal-export-button").click(); await expect(page.getByText(/.*exported successfully/).last()).toBeVisible({ timeout: 10000, }); diff --git a/src/frontend/tests/extended/features/bulk-actions.spec.ts b/src/frontend/tests/extended/features/bulk-actions.spec.ts index 3596735a5..4d5f7ce54 100644 --- a/src/frontend/tests/extended/features/bulk-actions.spec.ts +++ b/src/frontend/tests/extended/features/bulk-actions.spec.ts @@ -58,9 +58,8 @@ test( await expect(secondCheckbox).toBeChecked(); await expect(thirdCheckbox).toBeChecked(); // Test bulk download - await page.getByTestId("home-dropdown-menu").first().click(); - await page.getByTestId("btn-download-json").last().click(); - await expect(page.getByText(/.*exported successfully/)).toBeVisible({ + await page.getByTestId("download-bulk-btn").last().click(); + await expect(page.getByText(/.*downloaded successfully/)).toBeVisible({ timeout: 10000, });