diff --git a/src/api/componentDeployEnv.ts b/src/api/componentDeployEnv.ts index c21ce27..890d35a 100644 --- a/src/api/componentDeployEnv.ts +++ b/src/api/componentDeployEnv.ts @@ -26,4 +26,9 @@ export function downloadEnvConfigFile(id: string) { // 环境测试 export function testEnv(id: string) { return axios.get(`${urlPrefix}/componentDeployEnv/check?id=${id}`); +} + +// 主机列表 +export function getHostList(params) { + return axios.get(`${urlPrefix}/componentDeployEnv/list`, { params }); } \ No newline at end of file diff --git a/src/pages/componentDevelopment/componentDeployment/addModal.tsx b/src/pages/componentDevelopment/componentDeployment/addModal.tsx index 4223b41..7f36cef 100644 --- a/src/pages/componentDevelopment/componentDeployment/addModal.tsx +++ b/src/pages/componentDevelopment/componentDeployment/addModal.tsx @@ -1,7 +1,9 @@ import React, { useEffect, useState } from 'react' ; -import { Modal, Form, Select, Grid, Slider, Switch, Input } from '@arco-design/web-react'; +import { Modal, Form, Select, Grid, Slider, Switch, Input, Message } from '@arco-design/web-react'; import EditableTable from '@/components/EditableTable'; import { getComponentClassify } from '@/api/componentClassify'; +import { getHostList } from '@/api/componentDeployEnv'; +import { createInstance } from '@/api/componentInstance'; const FormItem = Form.Item; const Option = Select.Option; @@ -75,45 +77,95 @@ const deviceColumns = [ } ]; -const AddModal = ({ visible, setVisible }) => { +const AddModal = ({ addItem, visible, setVisible }) => { + const [form] = Form.useForm(); const [currentRunType, setCurrentRunType] = useState('local'); const [envType, setEnvType] = useState([]); // 环境类型 - const [tableData, setTableData] = useState([ - { - key: '1', - name: 'Jane Doe', - salary: 23000, - email: 'jane.doe@example.com' - } - ]); + const [hostOptions, setHostOptions] = useState([]); // 主机 + const [tableData, setTableData] = useState([]); + const [loading, setLoading] = useState(false); const getEnvOptions = async () => { const res: any = await getComponentClassify('docker-env'); if (res.code === 200) setEnvType(res.data); }; + const getHostOptions = async () => { + const res: any = await getHostList({ + type: 'docker-env', + componentBaseId: addItem.componentBaseId + }); + if (res.code === 200) setHostOptions(res.data); + }; + useEffect(() => { - getEnvOptions(); - }, []); + if (visible) { + getHostOptions(); + getEnvOptions(); + } + else { + // 关闭时重置表单 + form.resetFields(); + setCurrentRunType('local'); + setTableData([]); + } + }, [visible]); + + // 处理取消 + const handleCancel = () => { + form.resetFields(); + setCurrentRunType('local'); + setTableData([]); + setVisible(false); + }; + + // 处理确认 + const handleOk = async () => { + if (currentRunType === 'local') { + // TODO: 本地运行逻辑,由用户自己实现 + Message.info('本地运行逻辑待实现'); + return; + } + + // 线上运行 - 校验表单 + try { + const values = await form.validate(); + + // 整理参数 + const params = { + deployEnvId: values.deployEnvId, + componentBaseId: addItem.componentBaseId + }; + + const res: any = await createInstance(params); + console.log('新增实例CB:', res); + + Message.info('接口调用逻辑待实现'); + + } catch (error) { + console.error('表单校验失败:', error); + } + }; return ( setVisible(false)} - onCancel={() => setVisible(false)} + onOk={handleOk} + onCancel={handleCancel} + confirmLoading={loading} autoFocus={false} focusLock={true} - style={{ width: '75%' }} + style={{ width: '35%' }} > -
+ */} + {/* */} + {/**/} - - - - - - + { + if (!value) { + return cb('请选择主机'); + } + return cb(null); + } + } + ]} + > diff --git a/src/pages/componentDevelopment/componentDeployment/collapseList.tsx b/src/pages/componentDevelopment/componentDeployment/collapseList.tsx index cf68d3e..a63dd95 100644 --- a/src/pages/componentDevelopment/componentDeployment/collapseList.tsx +++ b/src/pages/componentDevelopment/componentDeployment/collapseList.tsx @@ -19,6 +19,7 @@ const CollapseList: React.FC = ({ searchKeyword, runStatus }) const [showOffSaleModal, setShowOffSaleModal] = useState(false); const [selectedItem, setSelectedItem] = useState(null); // 选中的折叠面板数据 const [expandedItem, setExpandedItem] = useState(null); // 当前展开的折叠面板数据 + const [addItem, setAddItem] = useState(null); // 点击新增实例按钮时记录当前信息 // 获取组件列表 const getList = async () => { @@ -73,6 +74,7 @@ const CollapseList: React.FC = ({ searchKeyword, runStatus }) getList(); }, [searchKeyword, runStatus]); + // 折叠面板头部 const headerNode = (item) => { const getRunStatus = () => { return runStatusDic.find((v) => v.value === runStatusConstant[item.runStatus]) || { @@ -91,10 +93,10 @@ const CollapseList: React.FC = ({ searchKeyword, runStatus }) {item.componentClassify} - {item.arches} {getRunStatus().label}
+ 实例数: {item.instanceCount}
@@ -102,13 +104,17 @@ const CollapseList: React.FC = ({ searchKeyword, runStatus }) ); }; + // 折叠面板右侧的额外节点 const extraNode = (item) => { return (
{/*新增实例*/} {item.runStatus === 'RUN' && ( -
setVisible(true)}> +
{ + setAddItem(item); + setVisible(true); + }}> 新增实例
@@ -182,6 +188,7 @@ const CollapseList: React.FC = ({ searchKeyword, runStatus })
diff --git a/src/pages/componentDevelopment/componentDeployment/style/collapseList.module.less b/src/pages/componentDevelopment/componentDeployment/style/collapseList.module.less index 9a6f22c..c4726fc 100644 --- a/src/pages/componentDevelopment/componentDeployment/style/collapseList.module.less +++ b/src/pages/componentDevelopment/componentDeployment/style/collapseList.module.less @@ -1,11 +1,11 @@ .collapse-list { - :global(.arco-collapse-item-header-extra) { - .flex-box { - display: flex; - align-items: center; - } + .flex-box { + display: flex; + align-items: center; + } + :global(.arco-collapse-item-header-extra) { .custom-red { color: #F53F3F;