import { addTask, queryTaskList, removeTask, updateTask, } from '@/services/demo/task'; import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import type { ActionType, ProColumns } from '@ant-design/pro-components'; import { ModalForm, PageContainer, ProFormSelect, ProFormText, ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; import { Button, Tag, message } from 'antd'; import { useRef, useState } from 'react'; import type { TaskItem } from './data'; export default () => { const actionRef = useRef(); const [createModalOpen, handleModalOpen] = useState(false); const [currentRow, setCurrentRow] = useState(); const [updateModalOpen, handleUpdateModalOpen] = useState(false); const intl = useIntl(); const columns: ProColumns[] = [ { title: intl.formatMessage({ id: 'pages.demo.task.id', defaultMessage: 'Task ID', }), dataIndex: 'id', hideInSearch: true, width: 80, }, { title: intl.formatMessage({ id: 'pages.demo.task.title', defaultMessage: 'Title', }), dataIndex: 'title', copyable: true, ellipsis: true, tip: 'The task title is unique key', formItemProps: { rules: [ { required: true, message: intl.formatMessage({ id: 'pages.demo.task.title', defaultMessage: 'Title', }) + ' is required', }, ], }, }, { title: intl.formatMessage({ id: 'pages.demo.task.status', defaultMessage: 'Status', }), dataIndex: 'status', filters: true, onFilter: true, valueEnum: { todo: { text: intl.formatMessage({ id: 'pages.demo.task.status.todo', defaultMessage: 'To Do', }), status: 'Default', }, doing: { text: intl.formatMessage({ id: 'pages.demo.task.status.doing', defaultMessage: 'Doing', }), status: 'Processing', }, done: { text: intl.formatMessage({ id: 'pages.demo.task.status.done', defaultMessage: 'Done', }), status: 'Success', }, }, render: (_, record) => { const colorMap: Record = { todo: 'default', doing: 'orange', done: 'success', }; // handle undefined status const color = colorMap[record.status || 'todo'] || 'default'; const statusText = record.status ? intl.formatMessage({ id: `pages.demo.task.status.${record.status}`, defaultMessage: record.status.toUpperCase(), }) : '-'; return {statusText}; }, }, { title: intl.formatMessage({ id: 'pages.demo.task.priority', defaultMessage: 'Priority', }), dataIndex: 'priority', valueType: 'digit', sorter: true, hideInForm: true, hideInSearch: true, }, { title: intl.formatMessage({ id: 'pages.demo.task.createdAt', defaultMessage: 'Created At', }), dataIndex: 'createdAt', valueType: 'dateTime', sorter: true, hideInSearch: true, hideInForm: true, }, { title: intl.formatMessage({ id: 'pages.demo.task.action', defaultMessage: 'Action', }), dataIndex: 'option', valueType: 'option', render: (_, record) => [ , , ], }, ]; return ( headerTitle={intl.formatMessage({ id: 'menu.demo.task-board', defaultMessage: 'Task List', })} actionRef={actionRef} rowKey="id" form={{ layout: 'vertical', }} search={{ labelWidth: 'auto', }} toolBarRender={() => [ , ]} request={async (params) => { // ProTable already integrates useRequest logic internally when 'request' is provided const msg = await queryTaskList({ ...params }); return { data: msg.data, success: msg.success, total: msg.total, }; }} columns={columns} /> {/* Create Form */} { await addTask(value as TaskItem); message.success('Added successfully'); handleModalOpen(false); actionRef.current?.reload(); return true; }} > {/* Edit Form */} { const data = { ...currentRow, ...value }; await updateTask(data as TaskItem); message.success('Updated successfully'); handleUpdateModalOpen(false); actionRef.current?.reload(); return true; }} initialValues={currentRow} modalProps={{ destroyOnClose: true, }} > ); };