U 优化克隆发布配置

pull/467/head
vapao 2022-04-01 23:13:55 +08:00
parent e45104f12f
commit 214aa83760
2 changed files with 51 additions and 64 deletions

View File

@ -3,68 +3,56 @@
* Copyright (c) <spug.dev@gmail.com> * Copyright (c) <spug.dev@gmail.com>
* Released under the AGPL-3.0 License. * Released under the AGPL-3.0 License.
*/ */
import React from 'react'; import React, { useState, useEffect } from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import { Cascader, Form, Alert } from 'antd'; import { Select, Form } from 'antd';
import envStore from 'pages/config/environment/store'; import envStore from 'pages/config/environment/store';
import { includes } from 'libs';
import store from './store'; import store from './store';
import lds from 'lodash'; import lds from 'lodash';
import { toJS } from "mobx";
@observer export default observer(function (props) {
class CloneConfirm extends React.Component { const [form] = Form.useForm()
handleLoadData = (selectedOptions) => { const [apps] = useState(Object.values(store.records))
const targetOption = selectedOptions[selectedOptions.length - 1]; const [appId, setAppId] = useState()
if (targetOption.deploys === undefined) { const [deploys, setDeploys] = useState([])
targetOption.loading = true;
store.loadDeploys(targetOption.value).then(() => targetOption.loading = false) useEffect(() => {
if (appId) {
props.onChange(null)
form.setFieldsValue({env_id: undefined})
store.loadDeploys(appId)
.then(res => setDeploys(res))
} }
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [appId])
function handleChange(deployId) {
const deploy = lds.find(deploys, {id: deployId})
props.onChange(deploy)
} }
handleData = records => { return (
return records.map(x => { <Form form={form} layout="vertical" style={{marginTop: 24}}>
const option = { <Form.Item required label="克隆的应用">
label: x.name, <Select showSearch filterOption={(i, o) => includes(o.children, i)} placeholder="请选择要克隆的应用" onChange={setAppId}>
value: x.id, {apps.map(item => (
deploys: x.deploys, <Select.Option key={item.id} value={item.id}>{item.name}</Select.Option>
isLeaf: false ))}
} </Select>
if (x.children) { </Form.Item>
option.children = x.children <Form.Item required name="env_id" label="克隆的环境">
} else if (x.deploys) { <Select
option.children = x.deploys.map(item => ({ showSearch
label: lds.get(envStore.idMap, `${item.env_id}.name`), filterOption={(i, o) => includes(o.children, i)}
value: JSON.stringify(item), placeholder="请选择要克隆的环境"
id: `${x.id},${item.env_id}`, disabled={deploys.length === 0}
})) onChange={handleChange}>
} {deploys.map(item => (
return option <Select.Option key={item.id} value={item.id}>{envStore.idMap[item.env_id]?.name}</Select.Option>
}) ))}
} </Select>
</Form.Item>
filter = (inputValue, path) => { </Form>
return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1); )
} })
render() {
const options = this.handleData(Object.values(toJS(store.records)));
return (
<Form layout="vertical" style={{marginTop: 24}}>
<Form.Item
required
label="应用及环境"
help="克隆配置,将基于选择对象的配置来创建新的发布配置。"
extra={<Alert showIcon type="warning" message="使用搜索进行选择时可能需要选择两次。"/>}>
<Cascader
options={options}
placeholder="请选择目标应用及环境"
loadData={this.handleLoadData}
onChange={this.props.onChange}
showSearch={{filter: this.filter}}/>
</Form.Item>
</Form>
)
}
}
export default CloneConfirm

View File

@ -24,19 +24,18 @@ import lds from 'lodash';
function ComTable() { function ComTable() {
function handleClone(e, id) { function handleClone(e, id) {
e.stopPropagation(); e.stopPropagation();
let cloneObj = null; let deploy = null;
Modal.confirm({ Modal.confirm({
icon: <ExclamationCircleOutlined/>, icon: <ExclamationCircleOutlined/>,
title: '选择克隆对象', title: '选择克隆对象',
content: <CloneConfirm onChange={v => cloneObj = v[1]}/>, content: <CloneConfirm onChange={v => deploy = v}/>,
onOk: () => { onOk: () => {
if (!cloneObj) { if (!deploy) {
message.error('请选择目标应用及环境') message.error('请选择要克隆的应用及环境')
return Promise.reject() return Promise.reject()
} }
const info = JSON.parse(cloneObj); deploy.env_id = undefined;
info.env_id = undefined; store.showExtForm(null, id, deploy, true)
store.showExtForm(null, id, info, true)
}, },
}) })
} }