| import React, { useState, useRef, useEffect } from 'react'; |
| import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined } from '@ant-design/icons'; |
| import { |
| Button, |
| message, |
| Drawer, |
| Modal, |
| Form, |
| Input, |
| Select, |
| DatePicker, |
| Card, |
| Layout, |
| } from 'antd'; |
| import type { FormInstance } from 'antd'; |
| import { |
| ProTable, |
| ActionType, |
| ProColumns, |
| FooterToolbar, |
| ProDescriptions, |
| ProDescriptionsItemProps, |
| } from '@ant-design/pro-components'; |
| import type { TrackerProject } from '../data.d.ts'; |
| import { |
| listTrackerProject, |
| getTrackerProject, |
| addTrackerProject, |
| updateTrackerProject, |
| removeTrackerProject, |
| } from '../service'; |
| |
| const { Content } = Layout; |
| |
| const TrackerProjectPage: React.FC = () => { |
| const actionRef = useRef<ActionType>(); |
| const [detailVisible, setDetailVisible] = useState(false); |
| const [editVisible, setEditVisible] = useState(false); |
| const [current, setCurrent] = useState<TrackerProject>(); |
| const [form] = Form.useForm(); |
| |
| const columns: ProColumns<TrackerProject>[] = [ |
| { |
| title: '项目ID', |
| dataIndex: 'projectId', |
| render: (_, row) => ( |
| <a |
| onClick={async () => { |
| const res = await getTrackerProject(row.projectId!); |
| setCurrent(res.data); |
| setDetailVisible(true); |
| }} |
| > |
| {row.projectId} |
| </a> |
| ), |
| }, |
| { title: '项目名称', dataIndex: 'projectName' }, |
| { title: '描述', dataIndex: 'description', hideInSearch: true }, |
| { title: '状态', dataIndex: 'status', valueEnum: { active: { text: '激活' }, inactive: { text: '不活跃' } } }, |
| { title: '创建者', dataIndex: 'createBy', hideInSearch: true }, |
| { title: '创建时间', dataIndex: 'createTime', hideInSearch: true }, |
| { title: '更新时间', dataIndex: 'updateTime', hideInSearch: true }, |
| { |
| title: '操作', |
| valueType: 'option', |
| render: (_, row) => [ |
| <Button |
| key="view" |
| type="link" |
| icon={<EyeOutlined />} |
| onClick={async () => { |
| const res = await getTrackerProject(row.projectId!); |
| setCurrent(res.data); |
| setDetailVisible(true); |
| }} |
| > |
| 查看 |
| </Button>, |
| <Button |
| key="edit" |
| type="link" |
| icon={<EditOutlined />} |
| onClick={() => { |
| setCurrent(row); |
| form.setFieldsValue(row); |
| setEditVisible(true); |
| }} |
| > |
| 编辑 |
| </Button>, |
| <Button |
| key="delete" |
| type="link" |
| icon={<DeleteOutlined />} |
| danger |
| onClick={() => { |
| Modal.confirm({ |
| title: '删除项目', |
| content: '确认删除该项目?', |
| onOk: async () => { |
| await removeTrackerProject([row.projectId!]); |
| message.success('删除成功'); |
| actionRef.current?.reload(); |
| }, |
| }); |
| }} |
| > |
| 删除 |
| </Button>, |
| ], |
| }, |
| ]; |
| |
| /** 新增或更新 */ |
| const handleSubmit = async (values: any) => { |
| if (current?.projectId) { |
| await updateTrackerProject({ ...current, ...values }); |
| message.success('更新成功'); |
| } else { |
| await addTrackerProject(values); |
| message.success('新增成功'); |
| } |
| setEditVisible(false); |
| actionRef.current?.reload(); |
| }; |
| |
| return ( |
| <Content> |
| <Card bordered={false}> |
| <ProTable<TrackerProject> |
| headerTitle="项目列表" |
| actionRef={actionRef} |
| rowKey="projectId" |
| search={{ labelWidth: 100 }} |
| toolBarRender={() => [ |
| <Button |
| key="add" |
| type="primary" |
| icon={<PlusOutlined />} |
| onClick={() => { |
| form.resetFields(); |
| setCurrent(undefined); |
| setEditVisible(true); |
| }} |
| > |
| 新增 |
| </Button>, |
| ]} |
| request={async (params) => { |
| const res = await listTrackerProject(params); |
| return { data: res.rows, success: true, total: res.total }; |
| }} |
| columns={columns} |
| /> |
| |
| {/* 详情 Drawer */} |
| <Drawer |
| width={500} |
| open={detailVisible} |
| onClose={() => setDetailVisible(false)} |
| > |
| {current && ( |
| <ProDescriptions<TrackerProject> |
| column={1} |
| title="项目详情" |
| dataSource={current} |
| columns={columns as ProDescriptionsItemProps<TrackerProject>[]} |
| /> |
| )} |
| </Drawer> |
| |
| {/* 新增/编辑 Modal */} |
| <Modal |
| title={current?.projectId ? '编辑项目' : '新增项目'} |
| open={editVisible} |
| onCancel={() => setEditVisible(false)} |
| onOk={() => { |
| form.validateFields().then(handleSubmit); |
| }} |
| > |
| <Form form={form} layout="vertical"> |
| <Form.Item name="projectName" label="项目名称" rules={[{ required: true }]}> |
| <Input /> |
| </Form.Item> |
| <Form.Item name="description" label="描述"> |
| <Input.TextArea /> |
| </Form.Item> |
| <Form.Item name="status" label="状态" initialValue="active"> |
| <Select> |
| <Select.Option value="active">激活</Select.Option> |
| <Select.Option value="inactive">不活跃</Select.Option> |
| </Select> |
| </Form.Item> |
| {/* TODO: 补充其他字段 */} |
| </Form> |
| </Modal> |
| </Card> |
| </Content> |
| ); |
| }; |
| |
| export default TrackerProjectPage; |