import React, { useState, useEffect } from 'react';
import {
Table,
Button,
Modal,
Form,
Input,
Select,
message,
Card,
Space,
InputNumber,
Switch,
} from 'antd';
import {
PlusOutlined,
EditOutlined,
DeleteOutlined,
PlusCircleOutlined,
MinusCircleOutlined,
} from '@ant-design/icons';
import axios from 'axios';
import CloseButton from '../components/CloseButton';
const { Option } = Select;
const OptionsEditor = ({ value, onChange }) => {
const options = Array.isArray(value) ? value : [];
const handleAdd = () => {
onChange([...options, { value: '', label: '' }]);
};
const handleRemove = index => {
onChange(options.filter((_, i) => i !== index));
};
const handleUpdate = (index, field, fieldValue) => {
const newOptions = options.map((opt, i) =>
i === index ? { ...opt, [field]: fieldValue } : opt
);
onChange(newOptions);
};
return (
{options.length === 0 ? (
暂无选项
}
onClick={handleAdd}
style={{
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
border: 'none',
borderRadius: '6px',
height: '36px',
}}
>
添加第一个选项
) : (
值(value)
标签(label)
{value.map((opt, index) => (
))}
)}
{options.length > 0 && (
}
onClick={handleAdd}
style={{
width: '100%',
height: '40px',
borderRadius: '8px',
borderColor: '#d9d9d9',
color: '#666',
}}
>
添加选项
)}
);
};
function TicketFieldManagement() {
const [fields, setFields] = useState([]);
const [loading, setLoading] = useState(true);
const [modalVisible, setModalVisible] = useState(false);
const [editingField, setEditingField] = useState(null);
const [selectedFieldType, setSelectedFieldType] = useState('string');
const [form] = Form.useForm();
const fetchFields = async () => {
try {
setLoading(true);
const response = await axios.get('/api/ticket-fields');
setFields(response.data.sort((a, b) => a.order - b.order));
} catch (error) {
message.error('获取字段列表失败');
console.error('获取字段列表失败:', error);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchFields();
}, []);
const showModal = (field = null) => {
setEditingField(field);
if (field) {
const fieldData = {
...field,
options: field.options || [],
};
setSelectedFieldType(field.fieldType || 'string');
form.setFieldsValue(fieldData);
} else {
form.resetFields();
setSelectedFieldType('string');
}
setModalVisible(true);
};
const handleCancel = () => {
setModalVisible(false);
setEditingField(null);
setSelectedFieldType('string');
};
const handleFieldTypeChange = value => {
setSelectedFieldType(value);
if (value !== 'select') {
form.setFieldsValue({ options: [] });
}
};
const handleSubmit = async values => {
try {
const fieldData = {
...values,
options: values.options && values.options.length > 0 ? values.options : null,
};
if (editingField) {
await axios.put(`/api/ticket-fields/${editingField.fieldId}`, fieldData);
message.success('字段更新成功');
} else {
await axios.post('/api/ticket-fields', fieldData);
message.success('字段创建成功');
}
setModalVisible(false);
fetchFields();
setEditingField(null);
setSelectedFieldType('string');
} catch (error) {
message.error(editingField ? '字段更新失败' : '字段创建失败');
console.error(error);
}
};
const handleDelete = async fieldId => {
Modal.confirm({
title: '确认删除',
content: '确定要删除这个字段吗?',
okText: '删除',
okType: 'danger',
cancelText: '取消',
onOk: async () => {
try {
await axios.delete(`/api/ticket-fields/${fieldId}`);
message.success('字段删除成功');
fetchFields();
} catch (error) {
message.error('字段删除失败');
console.error('字段删除失败:', error);
}
},
});
};
const columns = [
{
title: '字段名称',
dataIndex: 'fieldName',
key: 'fieldName',
},
{
title: '显示名称',
dataIndex: 'displayName',
key: 'displayName',
},
{
title: '字段类型',
dataIndex: 'fieldType',
key: 'fieldType',
render: type => {
const typeMap = {
string: '文本',
number: '数字',
boolean: '布尔值',
select: '下拉选择',
date: '日期',
datetime: '日期时间',
textarea: '多行文本',
device: '设备选择',
};
return typeMap[type] || type;
},
},
{
title: '必填',
dataIndex: 'required',
key: 'required',
render: required => ,
},
{
title: '可见',
dataIndex: 'visible',
key: 'visible',
render: visible => ,
},
{
title: '顺序',
dataIndex: 'order',
key: 'order',
},
{
title: '操作',
key: 'action',
render: (_, record) => (
}
onClick={() => showModal(record)}
size="small"
>
编辑
}
onClick={() => handleDelete(record.fieldId)}
size="small"
>
删除
),
},
];
return (
);
}
export default TicketFieldManagement;