ToolBar.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import React from 'react';
  2. import { message, Modal, Form, Input } from 'antd';
  3. import { Menu, Toolbar } from '@antv/x6-react-components';
  4. import '@antv/x6-react-components/es/menu/style/index.css';
  5. import '@antv/x6-react-components/es/toolbar/style/index.css';
  6. // import { MainAreaWidget, ReactWidget } from '@jupyterlab/apputils';
  7. // import { JupyterFrontEnd } from '@jupyterlab/application';
  8. // import { dagDataIcon } from './icons';
  9. import {
  10. ZoomInOutlined,
  11. ZoomOutOutlined,
  12. ToolOutlined,
  13. PlayCircleOutlined,
  14. SaveOutlined
  15. } from '@ant-design/icons';
  16. import { DagToData } from './utils';
  17. // import MediateDataTable from './MediateDataTable';
  18. import { uploadFile, postRequirements, getRequirementsStatus } from './request';
  19. const Item = Toolbar.Item; // eslint-disable-line
  20. const Group = Toolbar.Group; // eslint-disable-line
  21. export default class ToolBar extends React.Component<any, any> {
  22. constructor(props: any) {
  23. super(props);
  24. this.state = {
  25. modalVisible: false,
  26. packageData: '',
  27. status: ''
  28. };
  29. }
  30. showModal = () => {
  31. this.setState({ modalVisible: true });
  32. };
  33. submitEdit = async () => {
  34. const { data } = await postRequirements({
  35. requirements: this.state.packageData,
  36. dag_uuid: this.props.dagId
  37. });
  38. if (data.code === 200) {
  39. this.props.saveGraph(
  40. DagToData(this.props.graph, this.props.dagId, this.state.packageData)
  41. );
  42. this.setState({ modalVisible: false });
  43. message.success('添加成功');
  44. } else {
  45. message.success(data.msg);
  46. }
  47. };
  48. onClick = (name: string) => {
  49. switch (name) {
  50. case 'save':
  51. const text = this.props.context.current;
  52. text.ready.then(() => {
  53. const dagJson: any = text.model.toJSON();
  54. this.props.saveGraph(
  55. DagToData(this.props.graph, this.props.dagId, dagJson.requirements)
  56. );
  57. message.success('保存成功!');
  58. });
  59. break;
  60. case 'zoomOut':
  61. this.props.graph.zoom(-0.1, {
  62. center: { x: 0, y: 0 }
  63. });
  64. break;
  65. case 'zoomIn':
  66. this.props.graph.zoom(0.1, {
  67. center: { x: 0, y: 0 }
  68. });
  69. break;
  70. default:
  71. }
  72. };
  73. uploadDagFile() {
  74. const text = this.props.context.current;
  75. const filename = text.path.split('/').pop();
  76. text.ready.then(async () => {
  77. const dagJson: any = text.model.toJSON();
  78. const content = JSON.stringify(
  79. DagToData(this.props.graph, this.props.dagId, dagJson.requirements)
  80. );
  81. let blob = new Blob([content], { type: 'text/plain;charset=utf-8' });
  82. let file = new File([blob], filename, {
  83. lastModified: Date.now()
  84. });
  85. const dagfile = new FormData();
  86. dagfile.append('file', file);
  87. dagfile.append('project_id', 'test');
  88. dagfile.append('file_type', 'dag');
  89. const { data } = await uploadFile(dagfile);
  90. if (data.code === 200) {
  91. message.success('上传成功');
  92. } else {
  93. message.error(data.msg);
  94. }
  95. });
  96. }
  97. openRequirements() {
  98. const text = this.props.context.current;
  99. text.ready.then(async () => {
  100. const dagJson: any = text.model.toJSON();
  101. const { data } = await getRequirementsStatus(this.props.dagId);
  102. if (data.code === 200) {
  103. this.setState({
  104. modalVisible: true,
  105. packageData: dagJson.requirements,
  106. status: data.data
  107. });
  108. } else {
  109. message.success(data.msg);
  110. }
  111. });
  112. }
  113. DropDown(toolType: string) {
  114. const MenuItem = Menu.Item; // eslint-disable-line
  115. return (
  116. <>
  117. {toolType === 'run' && (
  118. <Menu>
  119. <MenuItem name="start" onClick={this.props.runDag}>
  120. 启动执行
  121. </MenuItem>
  122. </Menu>
  123. )}
  124. {toolType === 'tool' && (
  125. <Menu>
  126. {/* <MenuItem
  127. name="dataList"
  128. onClick={() => {
  129. const widget = new MainAreaWidget({
  130. content: ReactWidget.create(<MediateDataTable />)
  131. });
  132. widget.title.label = '中间数据列表';
  133. widget.title.icon = dagDataIcon;
  134. const app: JupyterFrontEnd = (window as any).jupyterlab;
  135. app.shell.add(widget, 'main');
  136. }}
  137. >
  138. 中间数据列表
  139. </MenuItem> */}
  140. <MenuItem
  141. name="packageEdit"
  142. onClick={() => {
  143. this.openRequirements();
  144. }}
  145. >
  146. 依赖编辑
  147. </MenuItem>
  148. <MenuItem
  149. name="uploadDag"
  150. onClick={() => {
  151. this.uploadDagFile();
  152. }}
  153. >
  154. 上传至项目目录
  155. </MenuItem>
  156. </Menu>
  157. )}
  158. </>
  159. );
  160. }
  161. render() {
  162. return (
  163. <div style={{ paddingRight: 16 }} className={this.props.className}>
  164. <Toolbar hoverEffect={true} size="big" onClick={this.onClick}>
  165. <Group>
  166. <Item
  167. name="save"
  168. icon={<SaveOutlined />}
  169. // tooltip="Save (Cmd/Ctrl + S)"
  170. />
  171. </Group>
  172. <Group>
  173. <Item
  174. name="run"
  175. dropdown={this.DropDown('run')}
  176. icon={<PlayCircleOutlined />}
  177. />
  178. </Group>
  179. <Group>
  180. <Item
  181. name="tool"
  182. dropdown={this.DropDown('tool')}
  183. icon={<ToolOutlined />}
  184. />
  185. </Group>
  186. <Group>
  187. <Item name="zoomOut" icon={<ZoomOutOutlined />} />
  188. <Item name="zoomIn" icon={<ZoomInOutlined />} />
  189. </Group>
  190. </Toolbar>
  191. {/* 脚本编辑弹窗 */}
  192. <Modal
  193. title="依赖编辑"
  194. open={this.state.modalVisible}
  195. onOk={this.submitEdit}
  196. okText="确定"
  197. destroyOnClose={true}
  198. className="package-modal"
  199. cancelText="取消"
  200. onCancel={() => {
  201. this.setState({ modalVisible: false });
  202. }}
  203. >
  204. <Form
  205. labelCol={{ span: 4 }}
  206. wrapperCol={{ span: 18 }}
  207. initialValues={{
  208. packageData: this.state.packageData
  209. }}
  210. >
  211. <Form.Item label="依赖编辑" name="packageData" required>
  212. <Input.TextArea
  213. placeholder="请输入节点需要的依赖"
  214. style={{ height: '80px' }}
  215. onChange={e => {
  216. this.setState({ packageData: e.target.value });
  217. }}
  218. />
  219. </Form.Item>
  220. <Form.Item label="状态" name="status">
  221. <span>{this.state.status}</span>
  222. </Form.Item>
  223. </Form>
  224. </Modal>
  225. </div>
  226. );
  227. }
  228. }