src/routes/System/Alert/index.js (310 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React, { Component } from "react"; import { Table, Button, message, Popconfirm, Switch } from "antd"; import dayjs from "dayjs"; import { connect } from "dva"; import AddModal from "./AddModal"; import { getCurrentLocale, getIntlContent } from "../../../utils/IntlUtils"; import AuthButton from "../../../utils/AuthButton"; import { Type } from "./globalData"; const DEFAULT_ALERT_TYPE = 1; @connect(({ alert, loading, global }) => ({ alert, loading: loading.effects["alert/fetch"], currentNamespaceId: global.currentNamespaceId, })) export default class Alert extends Component { constructor(props) { super(props); this.state = { currentPage: 1, pageSize: 12, selectedRowKeys: [], }; } componentDidMount() { this.getAllAlerts(); } onSelectChange = (selectedRowKeys) => { this.setState({ selectedRowKeys }); }; getAllAlerts = () => { const { dispatch, currentNamespaceId } = this.props; const { currentPage, pageSize } = this.state; dispatch({ type: "alert/fetch", payload: { currentPage, pageSize, namespaceId: currentNamespaceId, }, }); }; pageOnchange = (page) => { this.setState({ currentPage: page }, this.getAllAlerts); }; onShowSizeChange = (currentPage, pageSize) => { this.setState({ currentPage: 1, pageSize }, this.getAllAlerts); }; closeModal = () => { this.setState({ popup: "" }); }; editClick = (record) => { const { dispatch } = this.props; const { currentPage, pageSize } = this.state; dispatch({ type: "alert/fetchItem", payload: { id: record.id, }, callback: (alert) => { this.setState({ popup: ( <AddModal {...alert} handleOk={(values) => { dispatch({ type: "alert/update", payload: { ...alert, ...values }, fetchValue: { currentPage, pageSize, }, callback: () => { this.setState({ selectedRowKeys: [] }); this.closeModal(); this.getAllAlerts(); }, }); }} handleCancel={() => { this.closeModal(); }} handleSendTest={(values) => { dispatch({ type: "alert/sendTest", payload: values, }); }} /> ), }); }, }); }; deleteClick = () => { const { dispatch } = this.props; const { currentPage, pageSize, selectedRowKeys } = this.state; if (selectedRowKeys && selectedRowKeys.length > 0) { dispatch({ type: "alert/delete", payload: { list: selectedRowKeys, }, fetchValue: { currentPage, pageSize, }, callback: () => { this.setState({ selectedRowKeys: [] }); }, }); } else { message.destroy(); message.warn("Please select data"); } }; addClick = () => { const { currentPage, pageSize } = this.state; this.setState({ popup: ( <AddModal type={DEFAULT_ALERT_TYPE} handleOk={(values) => { const { dispatch } = this.props; dispatch({ type: "alert/add", payload: values, fetchValue: { currentPage, pageSize, }, callback: () => { this.setState({ selectedRowKeys: [] }); this.closeModal(); this.getAllAlerts(); }, }); }} handleCancel={() => { this.closeModal(); }} handleSendTest={(values) => { this.props.dispatch({ type: "alert/sendTest", payload: values, }); }} /> ), }); }; // eslint-disable-next-line react/no-unused-class-component-methods changeLocale(locale) { this.setState({ localeName: locale, }); getCurrentLocale(this.state.localeName); } render() { const { alert, loading, dispatch } = this.props; const { alertList, total } = alert; const { currentPage, pageSize, selectedRowKeys, popup } = this.state; const alertColumns = [ { align: "center", title: getIntlContent("SHENYU.SYSTEM.ALERT.NAME"), dataIndex: "name", key: "name", ellipsis: true, sorter: (a, b) => (a.name > b.name ? 1 : -1), }, { align: "center", title: getIntlContent("SHENYU.SYSTEM.ALERT.TYPE"), dataIndex: "type", key: "type", render: (type) => getIntlContent(Type[type]), ellipsis: true, sorter: (a, b) => (a.type > b.type ? 1 : -1), }, { align: "center", title: getIntlContent("SHENYU.SYSTEM.ALERT.CONFIGURATION"), dataIndex: "config", render: (_, row) => { switch (row.type) { case 1: return row.email; case 5: return row.accessToken; default: return null; } }, key: "config", ellipsis: true, }, { align: "center", title: getIntlContent("SHENYU.SYSTEM.ALERT.ENABLE"), dataIndex: "enable", key: "enable", ellipsis: true, render: (text, row) => ( <Switch checkedChildren={getIntlContent("SHENYU.COMMON.OPEN")} unCheckedChildren={getIntlContent("SHENYU.COMMON.CLOSE")} checked={text} onChange={(checked) => { dispatch({ type: "alert/update", payload: { ...row, enable: checked, }, callback: () => { this.getAllAlerts(); }, }); }} /> ), }, { align: "center", title: getIntlContent("SHENYU.SYSTEM.UPDATETIME"), dataIndex: "dateUpdated", key: "dateUpdated", render: (dateUpdated) => dayjs(dateUpdated).format("YYYY-MM-DD HH:mm:ss"), ellipsis: true, sorter: (a, b) => (a.dateUpdated > b.dateUpdated ? 1 : -1), }, { align: "center", title: getIntlContent("SHENYU.COMMON.OPERAT"), dataIndex: "operate", key: "operate", ellipsis: true, render: (text, record) => { return ( <div> <AuthButton perms="system:alert:edit"> <span className="edit" onClick={() => { this.editClick(record); }} > {getIntlContent("SHENYU.SYSTEM.EDITOR")} </span> </AuthButton> </div> ); }, }, ]; const rowSelection = { selectedRowKeys, onChange: this.onSelectChange, }; return ( <div className="plug-content-wrap"> <div style={{ display: "flex" }}> <AuthButton perms="system:alert:delete"> <Popconfirm title={getIntlContent("SHENYU.COMMON.DELETE")} placement="bottom" onConfirm={() => { this.deleteClick(); }} okText={getIntlContent("SHENYU.COMMON.SURE")} cancelText={getIntlContent("SHENYU.COMMON.CALCEL")} > <Button type="danger"> {getIntlContent("SHENYU.SYSTEM.DELETEDATA")} </Button> </Popconfirm> </AuthButton> <AuthButton perms="system:alert:add"> <Button style={{ marginLeft: 20 }} type="primary" onClick={this.addClick} > {getIntlContent("SHENYU.SYSTEM.ADDDATA")} </Button> </AuthButton> </div> <Table size="small" style={{ marginTop: 30 }} bordered loading={loading} columns={alertColumns} dataSource={alertList} rowSelection={rowSelection} rowKey="id" pagination={{ total, showTotal: (showTotal) => `${showTotal}`, showSizeChanger: true, pageSizeOptions: ["12", "20", "50", "100"], current: currentPage, pageSize, onShowSizeChange: this.onShowSizeChange, onChange: this.pageOnchange, }} /> {popup} </div> ); } }