208 lines
7.3 KiB
JavaScript
208 lines
7.3 KiB
JavaScript
import React, {useEffect, useState} from 'react';
|
|
import {Form, Input, InputNumber, Modal, Radio, Select, Tooltip} from "antd/lib/index";
|
|
|
|
const {TextArea} = Input;
|
|
const {Option} = Select;
|
|
|
|
// 子级页面
|
|
// Ant form create 表单内置方法
|
|
|
|
const protocolMapping = {
|
|
'ssh': [
|
|
{text: '自定义', value: 'custom'},
|
|
{text: '授权凭证', value: 'credential'},
|
|
{text: '私钥', value: 'private-key'}
|
|
],
|
|
'rdp': [{text: '自定义', value: 'custom'}, {text: '授权凭证', value: 'credential'}],
|
|
'vnc': [{text: '自定义', value: 'custom'}, {text: '授权凭证', value: 'credential'}],
|
|
'telnet': [{text: '自定义', value: 'custom'}, {text: '授权凭证', value: 'credential'}]
|
|
}
|
|
|
|
const AssetModal = function ({title, visible, handleOk, handleCancel, confirmLoading, credentials, model}) {
|
|
|
|
const [form] = Form.useForm();
|
|
|
|
let [accountType, setAccountType] = useState(model.accountType);
|
|
|
|
let initAccountTypes = []
|
|
if (model.protocol) {
|
|
initAccountTypes = protocolMapping[model.protocol];
|
|
}
|
|
let [accountTypes, setAccountTypes] = useState(initAccountTypes);
|
|
|
|
useEffect(() => {
|
|
setAccountType(model.accountType);
|
|
});
|
|
|
|
for (let key in model) {
|
|
if (model.hasOwnProperty(key)) {
|
|
if (model[key] === '-') {
|
|
model[key] = '';
|
|
}
|
|
}
|
|
}
|
|
|
|
const formItemLayout = {
|
|
labelCol: {span: 6},
|
|
wrapperCol: {span: 14},
|
|
};
|
|
|
|
const handleProtocolChange = e => {
|
|
let port;
|
|
switch (e.target.value) {
|
|
case 'ssh':
|
|
port = 22;
|
|
setAccountTypes(protocolMapping['ssh']);
|
|
form.setFieldsValue({
|
|
accountType: 'custom',
|
|
});
|
|
handleAccountTypeChange('custom');
|
|
break;
|
|
case 'rdp':
|
|
port = 3389;
|
|
setAccountTypes(protocolMapping['rdp']);
|
|
form.setFieldsValue({
|
|
accountType: 'custom',
|
|
});
|
|
handleAccountTypeChange('custom');
|
|
break;
|
|
case 'vnc':
|
|
port = 5901;
|
|
setAccountTypes(protocolMapping['vnc']);
|
|
form.setFieldsValue({
|
|
accountType: 'custom',
|
|
});
|
|
handleAccountTypeChange('custom');
|
|
break;
|
|
case 'telnet':
|
|
port = 23;
|
|
setAccountTypes(protocolMapping['telnet']);
|
|
form.setFieldsValue({
|
|
accountType: 'custom',
|
|
});
|
|
handleAccountTypeChange('custom');
|
|
break;
|
|
default:
|
|
port = 65535;
|
|
}
|
|
|
|
form.setFieldsValue({
|
|
port: port,
|
|
});
|
|
};
|
|
|
|
const handleAccountTypeChange = v => {
|
|
setAccountType(v);
|
|
model.accountType = v;
|
|
}
|
|
|
|
return (
|
|
|
|
<Modal
|
|
title={title}
|
|
visible={visible}
|
|
maskClosable={false}
|
|
onOk={() => {
|
|
form
|
|
.validateFields()
|
|
.then(values => {
|
|
form.resetFields();
|
|
handleOk(values);
|
|
})
|
|
.catch(info => {
|
|
});
|
|
}}
|
|
onCancel={handleCancel}
|
|
confirmLoading={confirmLoading}
|
|
okText='确定'
|
|
cancelText='取消'
|
|
>
|
|
|
|
<Form form={form} {...formItemLayout} initialValues={model}>
|
|
<Form.Item name='id' noStyle>
|
|
<Input hidden={true}/>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="资产名称" name='name' rules={[{required: true, message: "请输入资产名称"}]}>
|
|
<Input placeholder="请输入资产名称"/>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="IP" name='ip' rules={[{required: true, message: '请输入资产IP'}]}>
|
|
<Input placeholder="请输入资产IP"/>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="接入协议" name='protocol' rules={[{required: true, message: '请选择接入协议'}]}>
|
|
<Radio.Group onChange={handleProtocolChange}>
|
|
<Radio value="rdp">rdp</Radio>
|
|
<Radio value="ssh">ssh</Radio>
|
|
<Radio value="vnc">vnc</Radio>
|
|
<Radio value="telnet">telnet</Radio>
|
|
</Radio.Group>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="端口" name='port' rules={[{required: true, message: '请输入资产端口'}]}>
|
|
<InputNumber min={1} max={65535}/>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="账户类型" name='accountType' rules={[{required: true, message: '请选择接账户类型'}]}>
|
|
<Select onChange={handleAccountTypeChange}>
|
|
{accountTypes.map(item => {
|
|
return (<Option key={item.value} value={item.value}>{item.text}</Option>)
|
|
})}
|
|
</Select>
|
|
</Form.Item>
|
|
|
|
|
|
{
|
|
accountType === 'credential' ?
|
|
<Form.Item label="授权凭证" name='credentialId' rules={[{required: true, message: '请选择授权凭证'}]}>
|
|
<Select onChange={() => null}>
|
|
{credentials.map(item => {
|
|
return (
|
|
<Option key={item.id} value={item.id}>
|
|
<Tooltip placement="topLeft" title={item.name}>
|
|
{item.name}
|
|
</Tooltip>
|
|
</Option>
|
|
);
|
|
})}
|
|
</Select>
|
|
</Form.Item>
|
|
: null
|
|
}
|
|
|
|
{
|
|
accountType === 'custom' ?
|
|
<>
|
|
<Form.Item label="授权账户" name='username' noStyle={!(accountType === 'custom')}>
|
|
<Input placeholder="输入授权账户"/>
|
|
</Form.Item>
|
|
|
|
<Form.Item label="授权密码" name='password' noStyle={!(accountType === 'custom')}>
|
|
<Input placeholder="输入授权密码"/>
|
|
</Form.Item>
|
|
</>
|
|
: null
|
|
}
|
|
|
|
{
|
|
accountType === 'private-key' ?
|
|
<>
|
|
<Form.Item label="私钥" name='privateKey' rules={[{required: true, message: '请输入私钥'}]}>
|
|
<TextArea rows={4}/>
|
|
</Form.Item>
|
|
<Form.Item label="私钥密码" name='passphrase'>
|
|
<TextArea rows={1}/>
|
|
</Form.Item>
|
|
</>
|
|
|
|
|
|
: null
|
|
}
|
|
</Form>
|
|
</Modal>
|
|
)
|
|
}
|
|
|
|
export default AssetModal;
|