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 ? (
暂无选项
) : (
值(value) 标签(label)
{value.map((opt, index) => (
{index + 1}
handleUpdate(index, 'value', e.target.value)} style={{ width: '160px', borderRadius: '6px' }} /> handleUpdate(index, 'label', e.target.value)} style={{ width: '160px', borderRadius: '6px' }} />
))}
)} {options.length > 0 && ( )}
); }; 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) => ( ), }, ]; return (
} onClick={() => showModal()}> 添加字段 } > } onCancel={handleCancel} footer={null} width={600} >
{selectedFieldType === 'select' ? ( ) : ( )}
); } export default TicketFieldManagement;