123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- 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 { Button, Drawer, Input, message } from 'antd';
- import React, { useRef, useState } from 'react';
- import { FormattedMessage, useIntl } from 'umi';
- 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 [createModalVisible, handleModalVisible] = useState<boolean>(false);
- /**
- * @en-US The pop-up window of the distribution update window
- * @zh-CN 分布更新窗口的弹窗
- * */
- const [updateModalVisible, handleUpdateModalVisible] = 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={() => {
- handleUpdateModalVisible(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={() => {
- handleModalVisible(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"
- visible={createModalVisible}
- onVisibleChange={handleModalVisible}
- onFinish={async (value) => {
- const success = await handleAdd(value as API.RuleListItem);
- if (success) {
- handleModalVisible(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) {
- handleUpdateModalVisible(false);
- setCurrentRow(undefined);
- if (actionRef.current) {
- actionRef.current.reload();
- }
- }
- }}
- onCancel={() => {
- handleUpdateModalVisible(false);
- if (!showDetail) {
- setCurrentRow(undefined);
- }
- }}
- updateModalVisible={updateModalVisible}
- values={currentRow || {}}
- />
- <Drawer
- width={600}
- visible={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;
|