export-flow-modal.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { IFlowData, IFlowUpdateParam } from '@/types/flow';
  2. import { Button, Form, Input, Modal, Radio, message } from 'antd';
  3. import { useTranslation } from 'react-i18next';
  4. import { ReactFlowInstance } from 'reactflow';
  5. type Props = {
  6. reactFlow: ReactFlowInstance<any, any>;
  7. flowInfo?: IFlowUpdateParam;
  8. isExportFlowModalOpen: boolean;
  9. setIsExportFlowModalOpen: (value: boolean) => void;
  10. };
  11. export const ExportFlowModal: React.FC<Props> = ({
  12. reactFlow,
  13. flowInfo,
  14. isExportFlowModalOpen,
  15. setIsExportFlowModalOpen,
  16. }) => {
  17. const { t } = useTranslation();
  18. const [form] = Form.useForm();
  19. const [messageApi, contextHolder] = message.useMessage();
  20. const onFlowExport = async (values: any) => {
  21. if (values.format === 'json') {
  22. const flowData = reactFlow.toObject() as IFlowData;
  23. const blob = new Blob([JSON.stringify(flowData)], {
  24. type: 'text/plain;charset=utf-8',
  25. });
  26. const url = URL.createObjectURL(blob);
  27. const a = document.createElement('a');
  28. a.href = url;
  29. a.download = values.file_name || 'flow.json';
  30. a.click();
  31. } else {
  32. const linkUrl = `${process.env.API_BASE_URL ?? ''}/api/v2/serve/awel/flow/export/${values.uid}?export_type=${values.export_type}&format=${values.format}`;
  33. window.open(linkUrl);
  34. }
  35. messageApi.success(t('Export_Flow_Success'));
  36. setIsExportFlowModalOpen(false);
  37. };
  38. return (
  39. <>
  40. <Modal
  41. title={t('Export_Flow')}
  42. open={isExportFlowModalOpen}
  43. onCancel={() => setIsExportFlowModalOpen(false)}
  44. footer={[
  45. <Button key='cancel' onClick={() => setIsExportFlowModalOpen(false)}>
  46. {t('cancel')}
  47. </Button>,
  48. <Button key='submit' type='primary' onClick={() => form.submit()}>
  49. {t('verify')}
  50. </Button>,
  51. ]}
  52. >
  53. <Form
  54. form={form}
  55. className='mt-6'
  56. labelCol={{ span: 6 }}
  57. wrapperCol={{ span: 16 }}
  58. onFinish={onFlowExport}
  59. initialValues={{
  60. export_type: 'json',
  61. format: 'file',
  62. uid: flowInfo?.uid,
  63. }}
  64. >
  65. <Form.Item label={t('Export_File_Type')} name='export_type'>
  66. <Radio.Group>
  67. <Radio value='json'>JSON</Radio>
  68. <Radio value='dbgpts'>DBGPTS</Radio>
  69. </Radio.Group>
  70. </Form.Item>
  71. <Form.Item label={t('Export_File_Format')} name='format'>
  72. <Radio.Group>
  73. <Radio value='file'>File</Radio>
  74. <Radio value='json'>JSON</Radio>
  75. </Radio.Group>
  76. </Form.Item>
  77. <Form.Item hidden name='uid'>
  78. <Input />
  79. </Form.Item>
  80. </Form>
  81. </Modal>
  82. {contextHolder}
  83. </>
  84. );
  85. };