import { PlusOutlined } from '@ant-design/icons'; import { Button, message, Input, Drawer, notification } from 'antd'; import React, { useState, useRef } from 'react'; import { useIntl, FormattedMessage, useActivate, useUnactivate } from 'umi'; import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; import type { ProColumns, ActionType } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; import { ModalForm, ProFormText, ProFormTextArea } from '@ant-design/pro-form'; import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions'; import ProDescriptions from '@ant-design/pro-descriptions'; import type { FormValueType } from './components/UpdateForm'; import UpdateForm from './components/UpdateForm'; import type { TableListItem } from './data.d'; import { queryRule, updateRule, addRule, removeRule } from './service'; /** * 添加节点 * @param fields */ const handleAdd = async (fields: TableListItem) => { const hide = message.loading('正在添加'); try { await addRule({ ...fields }); hide(); message.success('添加成功'); return true; } catch (error) { hide(); message.error('添加失败请重试!'); return false; } }; /** * 更新节点 * @param fields */ const handleUpdate = async (fields: FormValueType) => { const hide = message.loading('正在配置'); try { await updateRule({ name: fields.name, desc: fields.desc, key: fields.key, }); hide(); message.success('配置成功'); return true; } catch (error) { hide(); message.error('配置失败请重试!'); return false; } }; /** * 删除节点 * @param selectedRows */ const handleRemove = async (selectedRows: TableListItem[]) => { const hide = message.loading('正在删除'); if (!selectedRows) return true; try { await removeRule({ key: selectedRows.map((row) => row.key), }); hide(); message.success('删除成功,即将刷新'); return true; } catch (error) { hide(); message.error('删除失败,请重试'); return false; } }; const TableList: React.FC<{}> = () => { useActivate(() => { notification.success({ message: '[列表页] activated' }) }) useUnactivate(() => { notification.warning({ message: '[列表页] unactivated' }) }) /** * 新建窗口的弹窗 */ const [createModalVisible, handleModalVisible] = useState<boolean>(false); /** * 分布更新窗口的弹窗 */ const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false); const [showDetail, setShowDetail] = useState<boolean>(false); const actionRef = useRef<ActionType>(); const [currentRow, setCurrentRow] = useState<TableListItem>(); const [selectedRowsState, setSelectedRows] = useState<TableListItem[]>([]); /** * 国际化配置 */ const intl = useIntl(); const columns: ProColumns<TableListItem>[] = [ { title: ( <FormattedMessage id="pages.searchTable.updateForm.ruleName.nameLabel" defaultMessage="规则名称" /> ), dataIndex: 'name', tip: '规则名称是唯一的 key', render: (dom, entity) => { return ( <a onClick={() => { setCurrentRow(entity); setShowDetail(true); }} > {dom} </a> ); }, }, { title: <FormattedMessage id="pages.searchTable.titleDesc" defaultMessage="描述" />, dataIndex: 'desc', valueType: 'textarea', }, { title: <FormattedMessage id="pages.searchTable.titleCallNo" defaultMessage="服务调用次数" />, dataIndex: 'callNo', sorter: true, hideInForm: true, renderText: (val: string) => `${val}${intl.formatMessage({ id: 'pages.searchTable.tenThousand', defaultMessage: ' 万 ', })}`, }, { title: <FormattedMessage id="pages.searchTable.titleStatus" defaultMessage="状态" />, dataIndex: 'status', hideInForm: true, valueEnum: { 0: { text: ( <FormattedMessage id="pages.searchTable.nameStatus.default" defaultMessage="关闭" /> ), status: 'Default', }, 1: { text: ( <FormattedMessage id="pages.searchTable.nameStatus.running" defaultMessage="运行中" /> ), status: 'Processing', }, 2: { text: ( <FormattedMessage id="pages.searchTable.nameStatus.online" defaultMessage="已上线" /> ), status: 'Success', }, 3: { text: ( <FormattedMessage id="pages.searchTable.nameStatus.abnormal" defaultMessage="异常" /> ), status: 'Error', }, }, }, { title: ( <FormattedMessage id="pages.searchTable.titleUpdatedAt" defaultMessage="上次调度时间" /> ), sorter: true, dataIndex: 'updatedAt', valueType: 'dateTime', renderFormItem: (item, { defaultRender, ...rest }, form) => { const status = form.getFieldValue('status'); if (`${status}` === '0') { return false; } if (`${status}` === '3') { return ( <Input {...rest} placeholder={intl.formatMessage({ id: 'pages.searchTable.exception', defaultMessage: '请输入异常原因!', })} /> ); } return defaultRender(item); }, }, { title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />, dataIndex: 'option', valueType: 'option', render: (_, record) => [ <a onClick={() => { handleUpdateModalVisible(true); setCurrentRow(record); }} > <FormattedMessage id="pages.searchTable.config" defaultMessage="配置" /> </a>, <a href="https://procomponents.ant.design/"> <FormattedMessage id="pages.searchTable.subscribeAlert" defaultMessage="订阅警报" /> </a>, ], }, ]; return ( <PageContainer> <ProTable<TableListItem> headerTitle={intl.formatMessage({ id: 'pages.searchTable.title', defaultMessage: '查询表格', })} actionRef={actionRef} rowKey="key" search={{ labelWidth: 120, }} toolBarRender={() => [ <Button type="primary" key="primary" onClick={() => handleModalVisible(true)}> <PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="新建" /> </Button>, ]} request={(params, sorter, filter) => queryRule({ ...params, sorter, filter })} columns={columns} rowSelection={{ onChange: (_, selectedRows) => setSelectedRows(selectedRows), }} /> {selectedRowsState?.length > 0 && ( <FooterToolbar extra={ <div> <FormattedMessage id="pages.searchTable.chosen" defaultMessage="已选择" />{' '} <a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '} <FormattedMessage id="pages.searchTable.item" defaultMessage="项" /> <span> <FormattedMessage id="pages.searchTable.totalServiceCalls" defaultMessage="服务调用次数总计" />{' '} {selectedRowsState.reduce((pre, item) => pre + item.callNo, 0)}{' '} <FormattedMessage id="pages.searchTable.tenThousand" defaultMessage="万" /> </span> </div> } > <Button onClick={async () => { await handleRemove(selectedRowsState); setSelectedRows([]); actionRef.current?.reloadAndRest?.(); }} > <FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="批量删除" /> </Button> <Button type="primary"> <FormattedMessage id="pages.searchTable.batchApproval" defaultMessage="批量审批" /> </Button> </FooterToolbar> )} <ModalForm title={intl.formatMessage({ id: 'pages.searchTable.createForm.newRule', defaultMessage: '新建规则', })} width="400px" visible={createModalVisible} onVisibleChange={handleModalVisible} onFinish={async (value) => { const success = await handleAdd(value as TableListItem); if (success) { handleModalVisible(false); if (actionRef.current) { actionRef.current.reload(); } } }} > <ProFormText rules={[ { required: true, message: ( <FormattedMessage id="pages.searchTable.ruleName" defaultMessage="规则名称为必填项" /> ), }, ]} width="m" name="name" /> <ProFormTextArea width="m" name="desc" /> </ModalForm> <UpdateForm onSubmit={async (value) => { const success = await handleUpdate(value); if (success) { handleUpdateModalVisible(false); setCurrentRow(undefined); if (actionRef.current) { actionRef.current.reload(); } } }} onCancel={() => { handleUpdateModalVisible(false); setCurrentRow(undefined); }} updateModalVisible={updateModalVisible} values={currentRow || {}} /> <Drawer width={600} visible={showDetail} onClose={() => { setCurrentRow(undefined); setShowDetail(false); }} closable={false} > {currentRow?.name && ( <ProDescriptions<TableListItem> column={2} title={currentRow?.name} request={async () => ({ data: currentRow || {}, })} params={{ id: currentRow?.name, }} columns={columns as ProDescriptionsItemProps<TableListItem>[]} /> )} </Drawer> </PageContainer> ); }; export default TableList