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}`,