import React, {useEffect, useState} from 'react'; import {Collapse, Form, Input, InputNumber, Modal, Radio, Select, Switch, Tabs, Tooltip, Typography} from "antd"; import request from "../../common/request"; import assetApi from "../../api/asset"; import tagApi from "../../api/tag"; import credentialApi from "../../api/credential"; import arrays from "../../utils/array"; import strings from "../../utils/strings"; import {ControlOutlined, DesktopOutlined} from "@ant-design/icons"; import './AssetModal.css' const {TextArea} = Input; const {Option} = Select; const {Text} = Typography; const {Panel} = Collapse; // 子级页面 // Ant form create 表单内置方法 const protocolMapping = { 'ssh': [ {text: '密码', value: 'custom'}, {text: '密钥', value: 'private-key'}, {text: '授权凭证', value: 'credential'}, ], 'rdp': [{text: '密码', value: 'custom'}, {text: '授权凭证', value: 'credential'}], 'vnc': [{text: '密码', value: 'custom'}, {text: '授权凭证', value: 'credential'}], 'telnet': [{text: '密码', value: 'custom'}, {text: '授权凭证', value: 'credential'}] } const formLayout = { labelCol: {span: 6}, wrapperCol: {span: 16}, }; const TELENETFormItemLayout = { labelCol: {span: 6}, wrapperCol: {span: 14}, }; const AssetModal = function ({ visible, handleOk, handleCancel, confirmLoading, id, copied }) { const [form] = Form.useForm(); let [accountType, setAccountType] = useState('custom'); let [protocol, setProtocol] = useState('rdp'); let [protocolOptions, setProtocolOptions] = useState(protocolMapping['rdp']); let [useSSL, setUseSSL] = useState(false); let [storages, setStorages] = useState([]); let [enableDrive, setEnableDrive] = useState(false); let [socksProxyEnable, setSocksProxyEnable] = useState(false); let [accessGateways, setAccessGateways] = useState([]); let [tags, setTags] = useState([]); let [credentials, setCredentials] = useState([]); const getStorages = async () => { const result = await request.get('/storages/shares'); if (result.code === 1) { setStorages(result['data']); } } useEffect(() => { const getItem = async () => { let asset = await assetApi.getById(id); if (asset) { asset['use-ssl'] = asset['use-ssl'] === 'true'; asset['ignore-cert'] = asset['ignore-cert'] === 'true'; asset['enable-drive'] = asset['enable-drive'] === 'true'; asset['socks-proxy-enable'] = asset['socks-proxy-enable'] === 'true'; asset['force-lossless'] = asset['force-lossless'] === 'true'; for (let key in asset) { if (asset.hasOwnProperty(key)) { if (asset[key] === '-') { asset[key] = ''; } } } if (strings.hasText(asset['tags'])) { asset['tags'] = asset['tags'].split(','); } else { asset['tags'] = []; } setAccountType(asset['accountType']); if (asset['accountType'] === 'credential') { getCredentials(); } setProtocolOptions(protocolMapping[asset['protocol']]); setProtocol(asset['protocol']); setUseSSL(asset['use-ssl']); setEnableDrive(asset['enable-drive']); setSocksProxyEnable(asset['socks-proxy-enable']); form.setFieldsValue(asset); } } const getAccessGateways = async () => { const result = await request.get('/access-gateways'); if (result.code === 1) { setAccessGateways(result['data']); } } const getTags = async () => { let tags = await tagApi.getAll(); setTags(tags); } if (visible) { if (id) { getItem(); } getTags(); getAccessGateways(); } else { form.setFieldsValue({ 'accountType': accountType, 'protocol': protocol, 'port': 3389, 'enable-drive': false, 'force-lossless': false, 'socks-proxy-enable': false, 'ignore-cert': false, 'use-ssl': false, }); } }, [visible]); const handleProtocolChange = e => { setProtocol(e.target.value) let port; switch (e.target.value) { case 'ssh': port = 22; setProtocolOptions(protocolMapping['ssh']); form.setFieldsValue({accountType: 'custom',}); handleAccountTypeChange('custom'); break; case 'rdp': port = 3389; setProtocolOptions(protocolMapping['rdp']); form.setFieldsValue({accountType: 'custom',}); handleAccountTypeChange('custom'); break; case 'vnc': port = 5900; setProtocolOptions(protocolMapping['vnc']); form.setFieldsValue({accountType: 'custom',}); handleAccountTypeChange('custom'); break; case 'telnet': port = 23; setProtocolOptions(protocolMapping['telnet']); form.setFieldsValue({accountType: 'custom',}); handleAccountTypeChange('custom'); break; case 'kubernetes': port = 6443; break default: port = 65535; } form.setFieldsValue({ port: port, }); }; const getCredentials = async () => { let items = await credentialApi.getAll(); setCredentials(items); } const handleAccountTypeChange = v => { setAccountType(v); if (v === 'credential') { getCredentials(); } } const basicView =