| import { addRule, removeRule, rule, updateRule } from '@/services/ant-design-pro/api'; | 
| import { PlusOutlined } from '@ant-design/icons'; | 
| import type { ActionType, ProColumns, ProDescriptionsItemProps } from '@ant-design/pro-components'; | 
| import { | 
|   FooterToolbar, | 
|   ModalForm, | 
|   PageContainer, | 
|   ProDescriptions, | 
|   ProFormText, | 
|   ProFormTextArea, | 
|   ProTable, | 
| } from '@ant-design/pro-components'; | 
| import { FormattedMessage, useIntl } from '@umijs/max'; | 
| import { Button, Drawer, Input, message } from 'antd'; | 
| import React, { useRef, useState } from 'react'; | 
| import type { FormValueType } from './components/UpdateForm'; | 
| import UpdateForm from './components/UpdateForm'; | 
|   | 
| /** | 
|  * @en-US Add node | 
|  * @zh-CN 添加节点 | 
|  * @param fields | 
|  */ | 
| const handleAdd = async (fields: API.RuleListItem) => { | 
|   const hide = message.loading('正在添加'); | 
|   try { | 
|     await addRule({ ...fields }); | 
|     hide(); | 
|     message.success('Added successfully'); | 
|     return true; | 
|   } catch (error) { | 
|     hide(); | 
|     message.error('Adding failed, please try again!'); | 
|     return false; | 
|   } | 
| }; | 
|   | 
| /** | 
|  * @en-US Update node | 
|  * @zh-CN 更新节点 | 
|  * | 
|  * @param fields | 
|  */ | 
| const handleUpdate = async (fields: FormValueType) => { | 
|   const hide = message.loading('Configuring'); | 
|   try { | 
|     await updateRule({ | 
|       name: fields.name, | 
|       desc: fields.desc, | 
|       key: fields.key, | 
|     }); | 
|     hide(); | 
|   | 
|     message.success('Configuration is successful'); | 
|     return true; | 
|   } catch (error) { | 
|     hide(); | 
|     message.error('Configuration failed, please try again!'); | 
|     return false; | 
|   } | 
| }; | 
|   | 
| /** | 
|  *  Delete node | 
|  * @zh-CN 删除节点 | 
|  * | 
|  * @param selectedRows | 
|  */ | 
| const handleRemove = async (selectedRows: API.RuleListItem[]) => { | 
|   const hide = message.loading('正在删除'); | 
|   if (!selectedRows) return true; | 
|   try { | 
|     await removeRule({ | 
|       key: selectedRows.map((row) => row.key), | 
|     }); | 
|     hide(); | 
|     message.success('Deleted successfully and will refresh soon'); | 
|     return true; | 
|   } catch (error) { | 
|     hide(); | 
|     message.error('Delete failed, please try again'); | 
|     return false; | 
|   } | 
| }; | 
|   | 
| const TableList: React.FC = () => { | 
|   /** | 
|    * @en-US Pop-up window of new window | 
|    * @zh-CN 新建窗口的弹窗 | 
|    *  */ | 
|   const [createModalOpen, handleModalOpen] = useState<boolean>(false); | 
|   /** | 
|    * @en-US The pop-up window of the distribution update window | 
|    * @zh-CN 分布更新窗口的弹窗 | 
|    * */ | 
|   const [updateModalOpen, handleUpdateModalOpen] = useState<boolean>(false); | 
|   | 
|   const [showDetail, setShowDetail] = useState<boolean>(false); | 
|   | 
|   const actionRef = useRef<ActionType>(); | 
|   const [currentRow, setCurrentRow] = useState<API.RuleListItem>(); | 
|   const [selectedRowsState, setSelectedRows] = useState<API.RuleListItem[]>([]); | 
|   | 
|   /** | 
|    * @en-US International configuration | 
|    * @zh-CN 国际化配置 | 
|    * */ | 
|   const intl = useIntl(); | 
|   | 
|   const columns: ProColumns<API.RuleListItem>[] = [ | 
|     { | 
|       title: ( | 
|         <FormattedMessage | 
|           id="pages.searchTable.updateForm.ruleName.nameLabel" | 
|           defaultMessage="Rule name" | 
|         /> | 
|       ), | 
|       dataIndex: 'name', | 
|       tip: 'The rule name is the unique key', | 
|       render: (dom, entity) => { | 
|         return ( | 
|           <a | 
|             onClick={() => { | 
|               setCurrentRow(entity); | 
|               setShowDetail(true); | 
|             }} | 
|           > | 
|             {dom} | 
|           </a> | 
|         ); | 
|       }, | 
|     }, | 
|     { | 
|       title: <FormattedMessage id="pages.searchTable.titleDesc" defaultMessage="Description" />, | 
|       dataIndex: 'desc', | 
|       valueType: 'textarea', | 
|     }, | 
|     { | 
|       title: ( | 
|         <FormattedMessage | 
|           id="pages.searchTable.titleCallNo" | 
|           defaultMessage="Number of service calls" | 
|         /> | 
|       ), | 
|       dataIndex: 'callNo', | 
|       sorter: true, | 
|       hideInForm: true, | 
|       renderText: (val: string) => | 
|         `${val}${intl.formatMessage({ | 
|           id: 'pages.searchTable.tenThousand', | 
|           defaultMessage: ' 万 ', | 
|         })}`, | 
|     }, | 
|     { | 
|       title: <FormattedMessage id="pages.searchTable.titleStatus" defaultMessage="Status" />, | 
|       dataIndex: 'status', | 
|       hideInForm: true, | 
|       valueEnum: { | 
|         0: { | 
|           text: ( | 
|             <FormattedMessage | 
|               id="pages.searchTable.nameStatus.default" | 
|               defaultMessage="Shut down" | 
|             /> | 
|           ), | 
|           status: 'Default', | 
|         }, | 
|         1: { | 
|           text: ( | 
|             <FormattedMessage id="pages.searchTable.nameStatus.running" defaultMessage="Running" /> | 
|           ), | 
|           status: 'Processing', | 
|         }, | 
|         2: { | 
|           text: ( | 
|             <FormattedMessage id="pages.searchTable.nameStatus.online" defaultMessage="Online" /> | 
|           ), | 
|           status: 'Success', | 
|         }, | 
|         3: { | 
|           text: ( | 
|             <FormattedMessage | 
|               id="pages.searchTable.nameStatus.abnormal" | 
|               defaultMessage="Abnormal" | 
|             /> | 
|           ), | 
|           status: 'Error', | 
|         }, | 
|       }, | 
|     }, | 
|     { | 
|       title: ( | 
|         <FormattedMessage | 
|           id="pages.searchTable.titleUpdatedAt" | 
|           defaultMessage="Last scheduled time" | 
|         /> | 
|       ), | 
|       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: 'Please enter the reason for the exception!', | 
|               })} | 
|             /> | 
|           ); | 
|         } | 
|         return defaultRender(item); | 
|       }, | 
|     }, | 
|     { | 
|       title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="Operating" />, | 
|       dataIndex: 'option', | 
|       valueType: 'option', | 
|       render: (_, record) => [ | 
|         <a | 
|           key="config" | 
|           onClick={() => { | 
|             handleUpdateModalOpen(true); | 
|             setCurrentRow(record); | 
|           }} | 
|         > | 
|           <FormattedMessage id="pages.searchTable.config" defaultMessage="Configuration" /> | 
|         </a>, | 
|         <a key="subscribeAlert" href="https://procomponents.ant.design/"> | 
|           <FormattedMessage | 
|             id="pages.searchTable.subscribeAlert" | 
|             defaultMessage="Subscribe to alerts" | 
|           /> | 
|         </a>, | 
|       ], | 
|     }, | 
|   ]; | 
|   | 
|   return ( | 
|     <PageContainer> | 
|       <ProTable<API.RuleListItem, API.PageParams> | 
|         headerTitle={intl.formatMessage({ | 
|           id: 'pages.searchTable.title', | 
|           defaultMessage: 'Enquiry form', | 
|         })} | 
|         actionRef={actionRef} | 
|         rowKey="key" | 
|         search={{ | 
|           labelWidth: 120, | 
|         }} | 
|         toolBarRender={() => [ | 
|           <Button | 
|             type="primary" | 
|             key="primary" | 
|             onClick={() => { | 
|               handleModalOpen(true); | 
|             }} | 
|           > | 
|             <PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="New" /> | 
|           </Button>, | 
|         ]} | 
|         request={rule} | 
|         columns={columns} | 
|         rowSelection={{ | 
|           onChange: (_, selectedRows) => { | 
|             setSelectedRows(selectedRows); | 
|           }, | 
|         }} | 
|       /> | 
|       {selectedRowsState?.length > 0 && ( | 
|         <FooterToolbar | 
|           extra={ | 
|             <div> | 
|               <FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '} | 
|               <a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '} | 
|               <FormattedMessage id="pages.searchTable.item" defaultMessage="项" /> | 
|                  | 
|               <span> | 
|                 <FormattedMessage | 
|                   id="pages.searchTable.totalServiceCalls" | 
|                   defaultMessage="Total number of service calls" | 
|                 />{' '} | 
|                 {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="Batch deletion" | 
|             /> | 
|           </Button> | 
|           <Button type="primary"> | 
|             <FormattedMessage | 
|               id="pages.searchTable.batchApproval" | 
|               defaultMessage="Batch approval" | 
|             /> | 
|           </Button> | 
|         </FooterToolbar> | 
|       )} | 
|       <ModalForm | 
|         title={intl.formatMessage({ | 
|           id: 'pages.searchTable.createForm.newRule', | 
|           defaultMessage: 'New rule', | 
|         })} | 
|         width="400px" | 
|         open={createModalOpen} | 
|         onOpenChange={handleModalOpen} | 
|         onFinish={async (value) => { | 
|           const success = await handleAdd(value as API.RuleListItem); | 
|           if (success) { | 
|             handleModalOpen(false); | 
|             if (actionRef.current) { | 
|               actionRef.current.reload(); | 
|             } | 
|           } | 
|         }} | 
|       > | 
|         <ProFormText | 
|           rules={[ | 
|             { | 
|               required: true, | 
|               message: ( | 
|                 <FormattedMessage | 
|                   id="pages.searchTable.ruleName" | 
|                   defaultMessage="Rule name is required" | 
|                 /> | 
|               ), | 
|             }, | 
|           ]} | 
|           width="md" | 
|           name="name" | 
|         /> | 
|         <ProFormTextArea width="md" name="desc" /> | 
|       </ModalForm> | 
|       <UpdateForm | 
|         onSubmit={async (value) => { | 
|           const success = await handleUpdate(value); | 
|           if (success) { | 
|             handleUpdateModalOpen(false); | 
|             setCurrentRow(undefined); | 
|             if (actionRef.current) { | 
|               actionRef.current.reload(); | 
|             } | 
|           } | 
|         }} | 
|         onCancel={() => { | 
|           handleUpdateModalOpen(false); | 
|           if (!showDetail) { | 
|             setCurrentRow(undefined); | 
|           } | 
|         }} | 
|         updateModalOpen={updateModalOpen} | 
|         values={currentRow || {}} | 
|       /> | 
|   | 
|       <Drawer | 
|         width={600} | 
|         open={showDetail} | 
|         onClose={() => { | 
|           setCurrentRow(undefined); | 
|           setShowDetail(false); | 
|         }} | 
|         closable={false} | 
|       > | 
|         {currentRow?.name && ( | 
|           <ProDescriptions<API.RuleListItem> | 
|             column={2} | 
|             title={currentRow?.name} | 
|             request={async () => ({ | 
|               data: currentRow || {}, | 
|             })} | 
|             params={{ | 
|               id: currentRow?.name, | 
|             }} | 
|             columns={columns as ProDescriptionsItemProps<API.RuleListItem>[]} | 
|           /> | 
|         )} | 
|       </Drawer> | 
|     </PageContainer> | 
|   ); | 
| }; | 
|   | 
| export default TableList; |