|
|
import React, { useEffect, useState } from 'react';
|
|
|
import {
|
|
|
Modal,
|
|
|
Form,
|
|
|
Input,
|
|
|
Select,
|
|
|
Space,
|
|
|
Button,
|
|
|
Message
|
|
|
} from '@arco-design/web-react';
|
|
|
import { getComponentClassify } from '@/api/componentClassify';
|
|
|
import { copyAllMarket, copyDesignMarket } from '@/api/componentMarket';
|
|
|
import EditorSection from '@/components/EditorSection';
|
|
|
|
|
|
const FormItem = Form.Item;
|
|
|
const Option = Select.Option;
|
|
|
|
|
|
interface CopyComponentModalProps {
|
|
|
visible: boolean;
|
|
|
componentInfo: any;
|
|
|
onCancel: () => void;
|
|
|
onSuccess?: () => void;
|
|
|
}
|
|
|
|
|
|
const CopyComponentModal: React.FC<CopyComponentModalProps> = ({
|
|
|
visible,
|
|
|
componentInfo,
|
|
|
onCancel,
|
|
|
onSuccess
|
|
|
}) => {
|
|
|
const [form] = Form.useForm();
|
|
|
const [classifyList, setClassifyList] = useState([]);
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
const [description, setDescription] = useState('');
|
|
|
|
|
|
// 组件语言选项
|
|
|
const codeLanguageOptions = [
|
|
|
{ label: 'Java:8', value: 'Java' },
|
|
|
{ label: 'Python:3.10.12', value: 'Python' }
|
|
|
];
|
|
|
|
|
|
// 组件类型选项
|
|
|
const componentTypeOptions = [
|
|
|
{ label: '普通组件', value: 'normal' },
|
|
|
{ label: '监听组件', value: 'loop' }
|
|
|
];
|
|
|
|
|
|
// 获取组件分类列表
|
|
|
const getComponentClassifyList = async () => {
|
|
|
try {
|
|
|
const res: any = await getComponentClassify('component');
|
|
|
if (res.code === 200) {
|
|
|
const data = res.data.map((item) => ({
|
|
|
label: item.classifyName,
|
|
|
value: item.id
|
|
|
}));
|
|
|
setClassifyList(data);
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('获取组件分类失败:', error);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
useEffect(() => {
|
|
|
getComponentClassifyList();
|
|
|
}, []);
|
|
|
|
|
|
// 当弹窗打开时,设置表单初始值
|
|
|
useEffect(() => {
|
|
|
if (visible && componentInfo) {
|
|
|
form.setFieldsValue({
|
|
|
name: componentInfo.name || '',
|
|
|
projectId: '', // 复制时项目标识需要重新填写
|
|
|
componentClassify: componentInfo.componentClassify || '',
|
|
|
codeLanguage: componentInfo.codeLanguage || '',
|
|
|
type: componentInfo.type || 'normal'
|
|
|
});
|
|
|
setDescription(componentInfo.desc || '');
|
|
|
}
|
|
|
}, [visible, componentInfo, form]);
|
|
|
|
|
|
// 仅复制设计
|
|
|
const handleCopyDesign = async () => {
|
|
|
try {
|
|
|
await form.validate();
|
|
|
const formData = form.getFields();
|
|
|
|
|
|
setLoading(true);
|
|
|
const params = {
|
|
|
id: componentInfo.id,
|
|
|
name: formData.name,
|
|
|
projectId: formData.projectId,
|
|
|
componentClassify: formData.componentClassify,
|
|
|
codeLanguage: formData.codeLanguage,
|
|
|
type: formData.type,
|
|
|
desc: description
|
|
|
};
|
|
|
|
|
|
const res: any = await copyDesignMarket(params);
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
Message.success('仅复制设计成功');
|
|
|
onSuccess?.();
|
|
|
handleClose();
|
|
|
}
|
|
|
else {
|
|
|
Message.error(res.message || '复制失败');
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('复制失败:', error);
|
|
|
Message.error('复制失败');
|
|
|
} finally {
|
|
|
setLoading(false);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// 复制设计和代码
|
|
|
const handleCopyAll = async () => {
|
|
|
try {
|
|
|
await form.validate();
|
|
|
const formData = form.getFields();
|
|
|
|
|
|
setLoading(true);
|
|
|
const params = {
|
|
|
id: componentInfo.id,
|
|
|
name: formData.name,
|
|
|
projectId: formData.projectId,
|
|
|
componentClassify: formData.componentClassify,
|
|
|
codeLanguage: formData.codeLanguage,
|
|
|
type: formData.type,
|
|
|
desc: description
|
|
|
};
|
|
|
|
|
|
const res: any = await copyAllMarket(params);
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
Message.success('复制设计和代码成功');
|
|
|
onSuccess?.();
|
|
|
handleClose();
|
|
|
}
|
|
|
else {
|
|
|
Message.error(res.message || '复制失败');
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('复制失败:', error);
|
|
|
Message.error('复制失败');
|
|
|
} finally {
|
|
|
setLoading(false);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const handleClose = () => {
|
|
|
form.resetFields();
|
|
|
onCancel();
|
|
|
};
|
|
|
|
|
|
return (
|
|
|
<Modal
|
|
|
title="复制组件到我的组件"
|
|
|
visible={visible}
|
|
|
onCancel={handleClose}
|
|
|
footer={
|
|
|
<Space>
|
|
|
<Button onClick={handleClose}>取消</Button>
|
|
|
<Button
|
|
|
type="primary"
|
|
|
onClick={handleCopyDesign}
|
|
|
loading={loading}
|
|
|
>
|
|
|
仅复制设计
|
|
|
</Button>
|
|
|
<Button
|
|
|
type="primary"
|
|
|
status="success"
|
|
|
onClick={handleCopyAll}
|
|
|
loading={loading}
|
|
|
>
|
|
|
复制设计和代码
|
|
|
</Button>
|
|
|
</Space>
|
|
|
}
|
|
|
style={{ width: '70%', maxWidth: 900 }}
|
|
|
>
|
|
|
<Form
|
|
|
form={form}
|
|
|
layout="vertical"
|
|
|
autoComplete="off"
|
|
|
>
|
|
|
<FormItem
|
|
|
label="组件名称"
|
|
|
field="name"
|
|
|
rules={[{ required: true, message: '请输入组件名称' }]}
|
|
|
>
|
|
|
<Input placeholder="请输入组件名称" />
|
|
|
</FormItem>
|
|
|
|
|
|
<FormItem
|
|
|
label="组件标识"
|
|
|
field="projectId"
|
|
|
rules={[
|
|
|
{ required: true, message: '请输入组件标识' },
|
|
|
{
|
|
|
validator: (value, callback) => {
|
|
|
if (value && !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)) {
|
|
|
callback('组件标识必须以字母开头,只能包含字母、数字和下划线');
|
|
|
}
|
|
|
else {
|
|
|
callback();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
<Input placeholder="请输入组件标识,如:my_component" />
|
|
|
</FormItem>
|
|
|
|
|
|
<FormItem
|
|
|
label="组件分类"
|
|
|
field="componentClassify"
|
|
|
rules={[{ required: true, message: '请选择组件分类' }]}
|
|
|
>
|
|
|
<Select placeholder="请选择组件分类">
|
|
|
{classifyList.map((item) => (
|
|
|
<Option key={item.value} value={item.label}>
|
|
|
{item.label}
|
|
|
</Option>
|
|
|
))}
|
|
|
</Select>
|
|
|
</FormItem>
|
|
|
|
|
|
<FormItem
|
|
|
label="代码语言"
|
|
|
field="codeLanguage"
|
|
|
rules={[{ required: true, message: '请选择代码语言' }]}
|
|
|
>
|
|
|
<Select placeholder="请选择代码语言" disabled>
|
|
|
{codeLanguageOptions.map((item) => (
|
|
|
<Option key={item.value} value={item.value}>
|
|
|
{item.label}
|
|
|
</Option>
|
|
|
))}
|
|
|
</Select>
|
|
|
</FormItem>
|
|
|
|
|
|
<FormItem
|
|
|
label="组件类型"
|
|
|
field="type"
|
|
|
rules={[{ required: true, message: '请选择组件类型' }]}
|
|
|
>
|
|
|
<Select placeholder="请选择组件类型">
|
|
|
{componentTypeOptions.map((item) => (
|
|
|
<Option key={item.value} value={item.value}>
|
|
|
{item.label}
|
|
|
</Option>
|
|
|
))}
|
|
|
</Select>
|
|
|
</FormItem>
|
|
|
|
|
|
<FormItem label="描述">
|
|
|
<EditorSection
|
|
|
visible={visible}
|
|
|
initialContent={description}
|
|
|
/>
|
|
|
</FormItem>
|
|
|
</Form>
|
|
|
</Modal>
|
|
|
);
|
|
|
};
|
|
|
|
|
|
export default CopyComponentModal;
|