This is an automated email from the ASF dual-hosted git repository.

kerwin612 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new a5ed7e6e [Improve] Add Batch Enable/Disable for Selectors and Rules 
(#452)
a5ed7e6e is described below

commit a5ed7e6e59ac3e2c5e6f34396cc3d4b96501cf43
Author: VampireAchao <[email protected]>
AuthorDate: Sun May 26 19:35:12 2024 +0800

    [Improve] Add Batch Enable/Disable for Selectors and Rules (#452)
    
    * [Improve] Add Batch Enable/Disable for Selectors and Rules
    
    * Revert "[Improve] Add Batch Enable/Disable for Selectors and Rules"
    
    This reverts commit cb346ad2c36ff196cb9e0e0735fb627733796c61.
    
    * [Improve] Add Batch Enable/Disable for Selectors and Rules
    
    * [Improve] Update Batch Enable/Disable for Selectors and Rules to One 
Button
    
    * [Improve] Update Batch Enable/Disable for Selectors and Rules Button to 
Search Header
---
 src/index.less                    |   1 +
 src/locales/en-US.json            |   2 +
 src/locales/zh-CN.json            |   2 +
 src/routes/Plugin/Common/index.js | 127 +++++++++++++++++++++++++++++++++++---
 4 files changed, 122 insertions(+), 10 deletions(-)

diff --git a/src/index.less b/src/index.less
index 0fcea48a..6637fa49 100644
--- a/src/index.less
+++ b/src/index.less
@@ -89,6 +89,7 @@ ol {
 }
 
 :global(.table-header) {
+  white-space: nowrap;
   display: flex;
   align-items: center;
   justify-content: space-between;
diff --git a/src/locales/en-US.json b/src/locales/en-US.json
index 6325af3d..e99a8125 100644
--- a/src/locales/en-US.json
+++ b/src/locales/en-US.json
@@ -77,6 +77,8 @@
   "SHENYU.MENU.CONFIG.MANAGMENT": "BasicConfig",
   "SHENYU.PLUGIN.SELECTOR.LIST.TITLE": "SelectorList",
   "SHENYU.PLUGIN.SELECTOR.LIST.ADD": "Add",
+  "SHENYU.PLUGIN.SELECTOR.BATCH.OPENED": "Batch Opened",
+  "SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED": "Batch Closed",
   "SHENYU.PLUGIN.SELECTOR.RULE.LIST": "RulesList",
   "SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.NAME": "Name",
   "SHENYU.PLUGIN.SEARCH.SELECTOR.NAME": "Name",
diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json
index 70501b07..ee6e6500 100644
--- a/src/locales/zh-CN.json
+++ b/src/locales/zh-CN.json
@@ -78,6 +78,8 @@
   "SHENYU.MENU.CONFIG.MANAGMENT": "基础配置",
   "SHENYU.PLUGIN.SELECTOR.LIST.TITLE": "选择器列表",
   "SHENYU.PLUGIN.SELECTOR.LIST.ADD": "添加选择器",
+  "SHENYU.PLUGIN.SELECTOR.BATCH.OPENED": "批量开启",
+  "SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED": "批量关闭",
   "SHENYU.PLUGIN.SELECTOR.RULE.LIST": "选择器规则列表",
   "SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.NAME": "名称",
   "SHENYU.PLUGIN.SEARCH.SELECTOR.NAME": "选择器名称",
diff --git a/src/routes/Plugin/Common/index.js 
b/src/routes/Plugin/Common/index.js
index bf665623..ebf4125b 100644
--- a/src/routes/Plugin/Common/index.js
+++ b/src/routes/Plugin/Common/index.js
@@ -17,22 +17,22 @@
 
 import React, { Component } from "react";
 import {
-  Table,
-  Row,
-  Col,
   Button,
+  Col,
   Input,
   message,
   Popconfirm,
+  Row,
   Switch,
-  Typography,
+  Table,
   Tag,
+  Typography,
 } from "antd";
 import { connect } from "dva";
 import styles from "../index.less";
 import Selector from "./Selector";
 import Rule from "./Rule";
-import { getIntlContent, getCurrentLocale } from "../../../utils/IntlUtils";
+import { getCurrentLocale, getIntlContent } from "../../../utils/IntlUtils";
 import AuthButton from "../../../utils/AuthButton";
 import { getUpdateModal, updatePluginsEnabled } from "../../../utils/plugin";
 
@@ -49,8 +49,10 @@ export default class Common extends Component {
     this.state = {
       selectorPage: 1,
       selectorPageSize: 12,
+      selectorSelectedRowKeys: [],
       rulePage: 1,
       rulePageSize: 12,
+      ruleSelectedRowKeys: [],
       popup: "",
       localeName: "",
       selectorName: undefined,
@@ -127,6 +129,8 @@ export default class Common extends Component {
         name: selectorName,
       },
     });
+    this.setState({ selectorSelectedRowKeys: [] });
+    this.setState({ ruleSelectedRowKeys: [] });
   };
 
   getAllRules = (page, pageSize) => {
@@ -142,6 +146,8 @@ export default class Common extends Component {
         name: ruleName,
       },
     });
+    this.setState({ selectorSelectedRowKeys: [] });
+    this.setState({ ruleSelectedRowKeys: [] });
   };
 
   getPlugin = (plugins, name) => {
@@ -568,6 +574,28 @@ export default class Common extends Component {
     });
   };
 
+  onSelectorSelectChange = (selectorSelectedRowKeys) => {
+    this.setState({ selectorSelectedRowKeys });
+  };
+
+  openSelectorClick = () => {
+    const { selectorSelectedRowKeys } = this.state;
+    const { selectorList } = this.props;
+    if (selectorSelectedRowKeys && selectorSelectedRowKeys.length > 0) {
+      let anyEnabled = selectorList.some(
+        (selector) =>
+          selectorSelectedRowKeys.includes(selector.id) && selector.enabled,
+      );
+      this.enableSelector({
+        list: selectorSelectedRowKeys,
+        enabled: !anyEnabled,
+      });
+    } else {
+      message.destroy();
+      message.warn("Please select data");
+    }
+  };
+
   deleteSelector = (record) => {
     const { dispatch, plugins } = this.props;
     const { selectorPage, selectorPageSize } = this.state;
@@ -698,6 +726,27 @@ export default class Common extends Component {
     });
   };
 
+  onRuleSelectChange = (ruleSelectedRowKeys) => {
+    this.setState({ ruleSelectedRowKeys });
+  };
+
+  openRuleClick = () => {
+    const { ruleSelectedRowKeys } = this.state;
+    const { ruleList } = this.props;
+    if (ruleSelectedRowKeys && ruleSelectedRowKeys.length > 0) {
+      let anyEnabled = ruleList.some(
+        (rule) => ruleSelectedRowKeys.includes(rule.id) && rule.enabled,
+      );
+      this.enableRule({
+        list: ruleSelectedRowKeys,
+        enabled: !anyEnabled,
+      });
+    } else {
+      message.destroy();
+      message.warn("Please select data");
+    }
+  };
+
   deleteRule = (record) => {
     const { dispatch, currentSelector, ruleList } = this.props;
     const { rulePage, rulePageSize } = this.state;
@@ -737,8 +786,15 @@ export default class Common extends Component {
   }
 
   render() {
-    const { popup, selectorPage, selectorPageSize, rulePage, rulePageSize } =
-      this.state;
+    const {
+      popup,
+      selectorPage,
+      selectorPageSize,
+      selectorSelectedRowKeys,
+      rulePage,
+      rulePageSize,
+      ruleSelectedRowKeys,
+    } = this.state;
     const {
       selectorList,
       ruleList,
@@ -827,6 +883,15 @@ export default class Common extends Component {
         },
       },
     ];
+    const selectorRowSelection = {
+      selectedRowKeys: selectorSelectedRowKeys,
+      onChange: this.onSelectorSelectChange,
+    };
+
+    const ruleRowSelection = {
+      selectedRowKeys: ruleSelectedRowKeys,
+      onChange: this.onRuleSelectChange,
+    };
 
     const rulesColumns = [
       {
@@ -955,7 +1020,14 @@ export default class Common extends Component {
             </Title>
             <Tag color={tag.color}>{tag.text}</Tag>
           </div>
-          <div style={{ display: "flex", alignItems: "end", gap: 10 }}>
+          <div
+            style={{
+              display: "flex",
+              alignItems: "end",
+              gap: 10,
+              minHeight: 32,
+            }}
+          >
             <Switch
               checked={this.state.isPluginEnabled ?? false}
               onChange={this.togglePluginStatus}
@@ -968,7 +1040,7 @@ export default class Common extends Component {
           </div>
         </Row>
         <Row gutter={20}>
-          <Col span={8}>
+          <Col span={10}>
             <div className="table-header">
               <h3 style={{ margin: 0, overflow: "visible" }}>
                 {getIntlContent("SHENYU.PLUGIN.SELECTOR.LIST.TITLE")}
@@ -992,6 +1064,23 @@ export default class Common extends Component {
                     {getIntlContent("SHENYU.PLUGIN.SELECTOR.LIST.ADD")}
                   </Button>
                 </AuthButton>
+                <AuthButton perms={`plugin:${name}Selector:edit`}>
+                  <Button
+                    type="primary"
+                    onClick={this.openSelectorClick}
+                    style={{ marginLeft: 10 }}
+                  >
+                    {getIntlContent(
+                      selectorList.some(
+                        (selector) =>
+                          selectorSelectedRowKeys.includes(selector.id) &&
+                          selector.enabled,
+                      )
+                        ? "SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED"
+                        : "SHENYU.PLUGIN.SELECTOR.BATCH.OPENED",
+                    )}
+                  </Button>
+                </AuthButton>
               </div>
             </div>
             <Table
@@ -1007,6 +1096,7 @@ export default class Common extends Component {
               bordered
               columns={selectColumns}
               dataSource={selectorList}
+              rowSelection={selectorRowSelection}
               pagination={{
                 total: selectorTotal,
                 showTotal: (showTotal) => `${showTotal}`,
@@ -1026,7 +1116,7 @@ export default class Common extends Component {
               }}
             />
           </Col>
-          <Col span={16}>
+          <Col span={14}>
             <div className="table-header">
               <div style={{ display: "flex", alignItems: "center" }}>
                 <h3 style={{ margin: 0, marginRight: 30 }}>
@@ -1061,6 +1151,22 @@ export default class Common extends Component {
                     {getIntlContent("SHENYU.COMMON.ADD.RULE")}
                   </Button>
                 </AuthButton>
+                <AuthButton perms={`plugin:${name}Rule:edit`}>
+                  <Button
+                    type="primary"
+                    onClick={this.openRuleClick}
+                    style={{ marginLeft: 10 }}
+                  >
+                    {getIntlContent(
+                      ruleList.some(
+                        (rule) =>
+                          ruleSelectedRowKeys.includes(rule.id) && 
rule.enabled,
+                      )
+                        ? "SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED"
+                        : "SHENYU.PLUGIN.SELECTOR.BATCH.OPENED",
+                    )}
+                  </Button>
+                </AuthButton>
               </div>
             </div>
             <Table
@@ -1070,6 +1176,7 @@ export default class Common extends Component {
               columns={rulesColumns}
               expandedRowRender={expandedRowRender}
               dataSource={ruleList}
+              rowSelection={ruleRowSelection}
               pagination={{
                 total: ruleTotal,
                 showTotal: (showTotal) => `${showTotal}`,

Reply via email to