blob: a512fc615d8bf11e52f827b4fa11122ce3813858 [file] [log] [blame]
import React, { useState, useEffect } from 'react';
import { List, Button, Form, Input, Select, message, Typography, Tag, Divider, Pagination } from 'antd';
import { BugOutlined } from '@ant-design/icons';
import WorkAPI from '../api/workApi';
import type { BugReport } from '../api/otherType';
const { Text } = Typography;
const { Option } = Select;
const { TextArea } = Input;
interface BugReportForm {
title: string;
description: string;
severity: 'low' | 'medium' | 'high';
}
const BugReportSection: React.FC<{ workId: number }> = ({ workId }) => {
const [bugs, setBugs] = useState<BugReport[]>([]);
const [loading, setLoading] = useState(false);
const [form] = Form.useForm();
const [currentPage, setCurrentPage] = useState(1);
const [pageSize, setPageSize] = useState(5); // 每页显示5条
// 加载Bug反馈列表
useEffect(() => {
const loadBugs = async () => {
try {
setLoading(true);
const bugList = await WorkAPI.getBugReports(workId);
setBugs(bugList);
} catch (error) {
message.error('加载Bug反馈失败');
} finally {
setLoading(false);
}
};
loadBugs();
}, [workId]);
// 获取当前页的Bug数据
const getCurrentPageBugs = () => {
const startIndex = (currentPage - 1) * pageSize;
const endIndex = startIndex + pageSize;
return bugs.slice(startIndex, endIndex);
};
// 提交Bug反馈
const handleSubmit = async (values: BugReportForm) => {
try {
await WorkAPI.reportBug(workId, values);
message.success('Bug反馈提交成功');
form.resetFields();
// 重新加载Bug列表
const bugList = await WorkAPI.getBugReports(workId);
setBugs(bugList);
// 重置到第一页
setCurrentPage(1);
} catch (error) {
message.error('Bug反馈提交失败');
}
};
const getSeverityColor = (severity: string) => {
switch (severity) {
case 'high': return 'red';
case 'medium': return 'orange';
default: return 'green';
}
};
return (
<div className="bug-report-section">
<Divider orientation="left">
<BugOutlined /> Bug反馈
</Divider>
<Form form={form} onFinish={handleSubmit} layout="vertical">
<Form.Item
name="title"
label="Bug标题"
rules={[{ required: true, message: '请输入Bug标题' }]}
>
<Input placeholder="简要描述Bug" />
</Form.Item>
<Form.Item
name="severity"
label="严重程度"
initialValue="medium"
rules={[{ required: true }]}
>
<Select>
<Option value="low">低</Option>
<Option value="medium">中</Option>
<Option value="high">高</Option>
</Select>
</Form.Item>
<Form.Item
name="description"
label="详细描述"
rules={[{ required: true, message: '请详细描述Bug' }]}
>
<TextArea rows={4} placeholder="请详细描述Bug出现的步骤、现象和预期结果" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
提交Bug
</Button>
</Form.Item>
</Form>
<Divider orientation="left">Bug列表</Divider>
<List
dataSource={getCurrentPageBugs()}
loading={loading}
renderItem={bug => (
<List.Item>
<div className="bug-item">
<div className="bug-header">
<Text strong>{bug.title}</Text>
<Tag color={getSeverityColor(bug.severity)}>
{bug.severity === 'high' ? '严重' : bug.severity === 'medium' ? '中等' : '轻微'}
</Tag>
</div>
<Text type="secondary">报告人: {bug.reporter} | 时间: {new Date(bug.createTime).toLocaleString()}</Text>
<div className="bug-content">
<Text>{bug.description}</Text>
</div>
<Tag color={bug.status === 'open' ? 'red' : bug.status === 'resolved' ? 'green' : 'gray'}>
{bug.status === 'open' ? '未解决' : bug.status === 'resolved' ? '已解决' : '不予解决'}
</Tag>
</div>
</List.Item>
)}
/>
<div style={{ textAlign: 'right', marginTop: 16 }}>
<Pagination
current={currentPage}
pageSize={pageSize}
total={bugs.length}
onChange={(page, size) => {
setCurrentPage(page);
setPageSize(size);
}}
showSizeChanger
showQuickJumper
showTotal={total => `共 ${total} 条`}
/>
</div>
</div>
);
};
export default BugReportSection;