|
|
import React, { useState, forwardRef, useImperativeHandle, useEffect } from 'react';
|
|
|
import { Form, Grid, Input, Message, Select, InputNumber } from '@arco-design/web-react';
|
|
|
import { submitEnvConfig } from '@/api/componentDeployEnv';
|
|
|
|
|
|
const FormItem = Form.Item;
|
|
|
const Option = Select.Option;
|
|
|
const TextArea = Input.TextArea;
|
|
|
|
|
|
// 定义组件 Props 类型
|
|
|
interface FormEditorProps {
|
|
|
record: any;
|
|
|
envTypeOptions: { id: string | number; classifyType: string; classifyName: string, dictKey: string }[];
|
|
|
setVisible: (visible: boolean) => void;
|
|
|
onOk?: () => void;
|
|
|
setConfirmLoading?: (loading: boolean) => void;
|
|
|
onSuccess?: (value) => void;
|
|
|
}
|
|
|
|
|
|
// 定义暴露给父组件的实例类型
|
|
|
export interface FormEditorInstance {
|
|
|
handleOk: () => void;
|
|
|
}
|
|
|
|
|
|
const FormEditor = forwardRef<FormEditorInstance, FormEditorProps>(({
|
|
|
record,
|
|
|
envTypeOptions,
|
|
|
setConfirmLoading,
|
|
|
onSuccess
|
|
|
}, ref) => {
|
|
|
const [form] = Form.useForm();
|
|
|
|
|
|
// 暴露方法给父组件调用
|
|
|
useImperativeHandle(ref, () => ({
|
|
|
handleOk
|
|
|
}));
|
|
|
|
|
|
// 处理完成/确认逻辑
|
|
|
const handleOk = async () => {
|
|
|
try {
|
|
|
const values = await form.validate();
|
|
|
const params = {
|
|
|
...values,
|
|
|
instanceCount: '',
|
|
|
description: values.description ? values.description : ''
|
|
|
};
|
|
|
|
|
|
// 设置确认按钮为加载状态
|
|
|
setConfirmLoading && setConfirmLoading(true);
|
|
|
|
|
|
try {
|
|
|
// 等待接口回调
|
|
|
const res = await submitEnvConfig(params);
|
|
|
Message.success('环境创建成功');
|
|
|
|
|
|
// 如果有onSuccess回调,则调用它(用于切换步骤)
|
|
|
if (onSuccess) {
|
|
|
onSuccess(res.data);
|
|
|
}
|
|
|
} catch (error) {
|
|
|
Message.error('环境创建失败: ' + error.message);
|
|
|
// 保持模态框打开,让用户可以看到错误信息
|
|
|
} finally {
|
|
|
// 无论成功还是失败,都取消加载状态
|
|
|
setConfirmLoading && setConfirmLoading(false);
|
|
|
}
|
|
|
} catch (error) {
|
|
|
// 表单验证失败,不关闭模态框
|
|
|
console.log('表单验证失败:', error);
|
|
|
setConfirmLoading && setConfirmLoading(false);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (record) form.setFieldsValue(record);
|
|
|
else form.resetFields();
|
|
|
}, [record]);
|
|
|
|
|
|
return (
|
|
|
<Form form={form} layout="vertical">
|
|
|
<Grid.Row gutter={8}>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="环境IP:" field="ip" required rules={[
|
|
|
{
|
|
|
validator(value, cb) {
|
|
|
if (!value) {
|
|
|
return cb('请输入环境IP');
|
|
|
}
|
|
|
const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
|
if (!ipRegex.test(value)) {
|
|
|
return cb('请输入正确的IP地址:范围在0.0.0.0-255.255.255.255之间');
|
|
|
}
|
|
|
|
|
|
return cb();
|
|
|
}
|
|
|
}
|
|
|
]}>
|
|
|
<Input style={{ width: '90%' }} allowClear placeholder="请输入环境IP" />
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="docker端口:" field="dockerTcpPort" required rules={[
|
|
|
{
|
|
|
validator(value, cb) {
|
|
|
if (!value) {
|
|
|
return cb('请输入docker端口');
|
|
|
}
|
|
|
|
|
|
const portRegex = /^(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
|
|
|
if (!portRegex.test(value)) {
|
|
|
return cb('docker端口只能是1-65535之间');
|
|
|
}
|
|
|
|
|
|
return cb();
|
|
|
}
|
|
|
}
|
|
|
]}>
|
|
|
<InputNumber style={{ width: '90%' }} placeholder="请输入docker端口" />
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
</Grid.Row>
|
|
|
<Grid.Row gutter={8}>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="环境类型:" field="type" required rules={[
|
|
|
{
|
|
|
validator(value, cb) {
|
|
|
if (!value) {
|
|
|
return cb('请选择环境类型');
|
|
|
}
|
|
|
|
|
|
return cb();
|
|
|
}
|
|
|
}
|
|
|
]}>
|
|
|
<Select
|
|
|
placeholder="请选择环境类型"
|
|
|
style={{ width: '90%' }}
|
|
|
>
|
|
|
{envTypeOptions.map((option, index) => (
|
|
|
<Option key={option.id} value={option.dictKey}>
|
|
|
{option.classifyName}
|
|
|
</Option>
|
|
|
))}
|
|
|
</Select>
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="架构类型:" field="arch" required rules={[
|
|
|
{
|
|
|
validator(value, cb) {
|
|
|
if (!value) {
|
|
|
return cb('请选择架构类型');
|
|
|
}
|
|
|
|
|
|
return cb();
|
|
|
}
|
|
|
}
|
|
|
]}>
|
|
|
<Select
|
|
|
placeholder="请选择架构类型"
|
|
|
style={{ width: '90%' }}
|
|
|
>
|
|
|
{['x86_64', 'aarch64'].map((option, index) => (
|
|
|
<Option key={option} disabled={index === 3} value={option}>
|
|
|
{option}
|
|
|
</Option>
|
|
|
))}
|
|
|
</Select>
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
</Grid.Row>
|
|
|
<Grid.Row gutter={8}>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="环境别名:" field="name" required rules={[
|
|
|
{
|
|
|
validator(value, cb) {
|
|
|
if (!value) {
|
|
|
return cb('请输入环境别名');
|
|
|
}
|
|
|
|
|
|
return cb();
|
|
|
}
|
|
|
}
|
|
|
]}>
|
|
|
<Input style={{ width: '90%' }} allowClear placeholder="请输入环境别名" />
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
<Grid.Col span={12}>
|
|
|
<FormItem label="备注:" field="description">
|
|
|
<TextArea style={{ width: '90%' }} allowClear placeholder="请输入备注" />
|
|
|
</FormItem>
|
|
|
</Grid.Col>
|
|
|
</Grid.Row>
|
|
|
</Form>
|
|
|
|
|
|
);
|
|
|
});
|
|
|
|
|
|
export default FormEditor; |