You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by he...@apache.org on 2022/07/01 07:40:55 UTC

[inlong] 01/03: [INLONG-4820][Dashboard] Support cluster tag management (#4829)

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

healchow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git

commit 46aeec88b7c327f8621243bdf5fc9c6b5b455980
Author: Daniel <le...@outlook.com>
AuthorDate: Fri Jul 1 14:56:02 2022 +0800

    [INLONG-4820][Dashboard] Support cluster tag management (#4829)
---
 inlong-dashboard/package-lock.json                 | 715 +++++++++++++++------
 inlong-dashboard/package.json                      |   2 +-
 .../src/components/HighSelect/index.tsx            |  28 +-
 inlong-dashboard/src/configs/menus/index.ts        |  11 +-
 inlong-dashboard/src/configs/routes/index.tsx      |   5 +
 inlong-dashboard/src/i18n.ts                       |   2 +
 .../ClusterBindModal.tsx}                          |  92 +--
 .../src/pages/ClusterTags/ClusterList.tsx          | 203 ++++++
 .../TagDetailModal.tsx}                            |  40 +-
 .../src/pages/ClusterTags/index.module.less        |  30 +
 inlong-dashboard/src/pages/ClusterTags/index.tsx   | 195 ++++++
 .../src/pages/Clusters/CreateModal.tsx             |   4 +-
 .../src/pages/Clusters/config/index.tsx            |  27 +-
 inlong-dashboard/src/themes/cover.less             |   4 -
 14 files changed, 1076 insertions(+), 282 deletions(-)

diff --git a/inlong-dashboard/package-lock.json b/inlong-dashboard/package-lock.json
index 37c46a83d..e891898f7 100644
--- a/inlong-dashboard/package-lock.json
+++ b/inlong-dashboard/package-lock.json
@@ -89,9 +89,9 @@
       }
     },
     "@ant-design/react-slick": {
-      "version": "0.28.3",
-      "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.3.tgz",
-      "integrity": "sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg==",
+      "version": "0.28.4",
+      "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.4.tgz",
+      "integrity": "sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg==",
       "requires": {
         "@babel/runtime": "^7.10.4",
         "classnames": "^2.2.5",
@@ -3813,85 +3813,100 @@
       }
     },
     "antd": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/antd/-/antd-4.15.1.tgz",
-      "integrity": "sha512-zTZz8GY9yERNjSnH6xWU3Rw5sC3RtHEs/LOTKcSMTtU3Q5jHXIbAHKd1C6bYLQT6Ru75p+/UyKvJoNip/ax/WQ==",
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/antd/-/antd-4.17.1.tgz",
+      "integrity": "sha512-GNVuVnWJjFE1r3AGYc7vhy+gzlDAimAAZMTNCZdAncLBDN7gCTrf8euSb+C0TEqr7UV26yNGBQ9yGoeUcHUdSA==",
       "requires": {
         "@ant-design/colors": "^6.0.0",
-        "@ant-design/icons": "^4.6.2",
+        "@ant-design/icons": "^4.7.0",
         "@ant-design/react-slick": "~0.28.1",
         "@babel/runtime": "^7.12.5",
+        "@ctrl/tinycolor": "^3.4.0",
         "array-tree-filter": "^2.1.0",
         "classnames": "^2.2.6",
         "copy-to-clipboard": "^3.2.0",
         "lodash": "^4.17.21",
         "moment": "^2.25.3",
-        "rc-cascader": "~1.4.0",
+        "rc-cascader": "~2.1.0",
         "rc-checkbox": "~2.3.0",
         "rc-collapse": "~3.1.0",
-        "rc-dialog": "~8.5.1",
-        "rc-drawer": "~4.3.0",
+        "rc-dialog": "~8.6.0",
+        "rc-drawer": "~4.4.2",
         "rc-dropdown": "~3.2.0",
-        "rc-field-form": "~1.20.0",
-        "rc-image": "~5.2.4",
-        "rc-input-number": "~7.0.1",
-        "rc-mentions": "~1.5.0",
-        "rc-menu": "~8.10.0",
-        "rc-motion": "^2.4.0",
-        "rc-notification": "~4.5.2",
-        "rc-pagination": "~3.1.6",
-        "rc-picker": "~2.5.10",
+        "rc-field-form": "~1.21.0",
+        "rc-image": "~5.2.5",
+        "rc-input-number": "~7.3.0",
+        "rc-mentions": "~1.6.1",
+        "rc-menu": "~9.0.12",
+        "rc-motion": "^2.4.4",
+        "rc-notification": "~4.5.7",
+        "rc-pagination": "~3.1.9",
+        "rc-picker": "~2.5.17",
         "rc-progress": "~3.1.0",
         "rc-rate": "~2.9.0",
         "rc-resize-observer": "^1.0.0",
-        "rc-select": "~12.1.6",
-        "rc-slider": "~9.7.1",
+        "rc-select": "~13.1.0-alpha.0",
+        "rc-slider": "~9.7.4",
         "rc-steps": "~4.1.0",
         "rc-switch": "~3.2.0",
-        "rc-table": "~7.13.0",
-        "rc-tabs": "~11.7.0",
+        "rc-table": "~7.19.0",
+        "rc-tabs": "~11.10.0",
         "rc-textarea": "~0.3.0",
-        "rc-tooltip": "~5.1.0",
-        "rc-tree": "~4.1.0",
-        "rc-tree-select": "~4.3.0",
-        "rc-trigger": "^5.2.1",
-        "rc-upload": "~4.2.0-alpha.0",
-        "rc-util": "^5.9.4",
-        "scroll-into-view-if-needed": "^2.2.25",
-        "warning": "^4.0.3"
+        "rc-tooltip": "~5.1.1",
+        "rc-tree": "~5.2.0",
+        "rc-tree-select": "~4.6.0",
+        "rc-trigger": "^5.2.10",
+        "rc-upload": "~4.3.0",
+        "rc-util": "^5.14.0",
+        "scroll-into-view-if-needed": "^2.2.25"
       },
       "dependencies": {
         "@ant-design/icons": {
-          "version": "4.6.2",
-          "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.6.2.tgz",
-          "integrity": "sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==",
+          "version": "4.7.0",
+          "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz",
+          "integrity": "sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==",
           "requires": {
             "@ant-design/colors": "^6.0.0",
-            "@ant-design/icons-svg": "^4.0.0",
+            "@ant-design/icons-svg": "^4.2.1",
             "@babel/runtime": "^7.11.2",
             "classnames": "^2.2.6",
             "rc-util": "^5.9.4"
           }
         },
+        "@ant-design/icons-svg": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz",
+          "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="
+        },
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
           }
         },
         "rc-util": {
-          "version": "5.9.8",
-          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.8.tgz",
-          "integrity": "sha512-typLSHYGf5irvGLYQshs0Ra3aze086h0FhzsAkyirMunYZ7b3Te8gKa5PVaanoHaZa9sS6qx98BxgysoRP+6Tw==",
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
           "requires": {
-            "@babel/runtime": "^7.12.5",
+            "@babel/runtime": "^7.18.3",
             "react-is": "^16.12.0",
             "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
           }
         }
       }
@@ -4142,9 +4157,9 @@
       "dev": true
     },
     "async-validator": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz",
-      "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ=="
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.1.1.tgz",
+      "integrity": "sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA=="
     },
     "asynckit": {
       "version": "0.4.0",
@@ -6591,9 +6606,9 @@
       }
     },
     "date-fns": {
-      "version": "2.21.0",
-      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.0.tgz",
-      "integrity": "sha512-lbAFpaKz7QuVxm6m1rmioh4BB2gmLx1r1JMYXU2A/ufT5ly4zEG7HYH4fvS/QfbdyC5rkYyiS30mYz4Q7XCO+w=="
+      "version": "2.28.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+      "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
     },
     "dayjs": {
       "version": "1.10.4",
@@ -6953,9 +6968,9 @@
       "dev": true
     },
     "dom-align": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz",
-      "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA=="
+      "version": "1.12.3",
+      "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.3.tgz",
+      "integrity": "sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA=="
     },
     "dom-converter": {
       "version": "0.2.0",
@@ -11471,7 +11486,7 @@
     "json2mq": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
-      "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=",
+      "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
       "requires": {
         "string-convert": "^0.2.0"
       }
@@ -12696,15 +12711,6 @@
         }
       }
     },
-    "mini-store": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.6.tgz",
-      "integrity": "sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==",
-      "requires": {
-        "hoist-non-react-statics": "^3.3.2",
-        "shallowequal": "^1.0.2"
-      }
-    },
     "minimalistic-assert": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -15508,24 +15514,26 @@
       }
     },
     "rc-align": {
-      "version": "4.0.9",
-      "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz",
-      "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==",
+      "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz",
+      "integrity": "sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
         "dom-align": "^1.7.0",
+        "lodash": "^4.17.21",
         "rc-util": "^5.3.0",
         "resize-observer-polyfill": "^1.5.1"
       }
     },
     "rc-cascader": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.2.tgz",
-      "integrity": "sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ==",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-2.1.5.tgz",
+      "integrity": "sha512-FiGPfSxKmSft2CT2XSr6HeKihqcxM+1ozmH6FGXTDthVNNvV0ai82CA6l30iPmMmlflwDfSm/623qkekqNq4BQ==",
       "requires": {
         "@babel/runtime": "^7.12.5",
         "array-tree-filter": "^2.1.0",
+        "rc-tree-select": "~4.6.0",
         "rc-trigger": "^5.0.4",
         "rc-util": "^5.0.1",
         "warning": "^4.0.1"
@@ -15541,9 +15549,9 @@
       }
     },
     "rc-collapse": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.0.tgz",
-      "integrity": "sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.4.tgz",
+      "integrity": "sha512-WayrhswKMwuJab9xbqFxXTgV0m6X8uOPEO6zm/GJ5YJiJ/wIh/Dd2VtWeI06HYUEnTFv0HNcYv+zWbB+p6OD2A==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
@@ -15553,9 +15561,9 @@
       }
     },
     "rc-dialog": {
-      "version": "8.5.2",
-      "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz",
-      "integrity": "sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==",
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.6.0.tgz",
+      "integrity": "sha512-GSbkfqjqxpZC5/zc+8H332+q5l/DKUhpQr0vdX2uDsxo5K0PhvaMEVjyoJUTkZ3+JstEADQji1PVLVb/2bJeOQ==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.6",
@@ -15564,9 +15572,9 @@
       }
     },
     "rc-drawer": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.3.1.tgz",
-      "integrity": "sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==",
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.4.3.tgz",
+      "integrity": "sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.6",
@@ -15574,9 +15582,9 @@
       }
     },
     "rc-dropdown": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz",
-      "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==",
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.5.tgz",
+      "integrity": "sha512-dVO2eulOSbEf+F4OyhCY5iGiMVhUYY/qeXxL7Ex2jDBt/xc89jU07mNoowV6aWxwVOc70pxEINff0oM2ogjluA==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.6",
@@ -15584,30 +15592,30 @@
       }
     },
     "rc-field-form": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.0.tgz",
-      "integrity": "sha512-jkzsIfXR7ywEYdeAtktt1aLff88wxIPDLpq7KShHNl4wlsWrCE+TzkXBfjvVzYOVZt5GGrD8YDqNO/q6eaR/eA==",
+      "version": "1.21.2",
+      "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.21.2.tgz",
+      "integrity": "sha512-LR/bURt/Tf5g39mb0wtMtQuWn42d/7kEzpzlC5fNC7yaRVmLTtlPP4sBBlaViETM9uZQKLoaB0Pt9Mubhm9gow==",
       "requires": {
         "@babel/runtime": "^7.8.4",
-        "async-validator": "^3.0.3",
+        "async-validator": "^4.0.2",
         "rc-util": "^5.8.0"
       }
     },
     "rc-image": {
-      "version": "5.2.4",
-      "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.4.tgz",
-      "integrity": "sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q==",
+      "version": "5.2.5",
+      "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.5.tgz",
+      "integrity": "sha512-qUfZjYIODxO0c8a8P5GeuclYXZjzW4hV/5hyo27XqSFo1DmTCs2HkVeQObkcIk5kNsJtgsj1KoPThVsSc/PXOw==",
       "requires": {
         "@babel/runtime": "^7.11.2",
         "classnames": "^2.2.6",
-        "rc-dialog": "~8.5.0",
+        "rc-dialog": "~8.6.0",
         "rc-util": "^5.0.6"
       }
     },
     "rc-input-number": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.0.6.tgz",
-      "integrity": "sha512-J5DIoCKIunoPb16FEghaEOyNDuZXD5F9LxLNcqd31z/0e37XtuHgo4QF/TonKLsESwdg7UAzWhiD0K6PPrN3YQ==",
+      "version": "7.3.4",
+      "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.4.tgz",
+      "integrity": "sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.5",
@@ -15615,59 +15623,150 @@
       },
       "dependencies": {
         "rc-util": {
-          "version": "5.9.8",
-          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.8.tgz",
-          "integrity": "sha512-typLSHYGf5irvGLYQshs0Ra3aze086h0FhzsAkyirMunYZ7b3Te8gKa5PVaanoHaZa9sS6qx98BxgysoRP+6Tw==",
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
           "requires": {
-            "@babel/runtime": "^7.12.5",
+            "@babel/runtime": "^7.18.3",
             "react-is": "^16.12.0",
             "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
           }
         }
       }
     },
     "rc-mentions": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.5.3.tgz",
-      "integrity": "sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ==",
+      "version": "1.6.5",
+      "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.6.5.tgz",
+      "integrity": "sha512-CUU4+q+awG2pA0l/tG2kPB2ytWbKQUkFxVeKwacr63w7crE/yjfzrFXxs/1fxhyEbQUWdAZt/L25QBieukYQ5w==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.6",
-        "rc-menu": "^8.0.1",
+        "rc-menu": "~9.3.2",
         "rc-textarea": "^0.3.0",
         "rc-trigger": "^5.0.4",
         "rc-util": "^5.0.1"
+      },
+      "dependencies": {
+        "rc-menu": {
+          "version": "9.3.2",
+          "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.3.2.tgz",
+          "integrity": "sha512-h3m45oY1INZyqphGELkdT0uiPnFzxkML8m0VMhJnk2fowtqfiT7F5tJLT3znEVaPIY80vMy1bClCkgq8U91CzQ==",
+          "requires": {
+            "@babel/runtime": "^7.10.1",
+            "classnames": "2.x",
+            "rc-motion": "^2.4.3",
+            "rc-overflow": "^1.2.0",
+            "rc-trigger": "^5.1.2",
+            "rc-util": "^5.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.21.5",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+              "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              },
+              "dependencies": {
+                "@babel/runtime": {
+                  "version": "7.18.3",
+                  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+                  "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+                  "requires": {
+                    "regenerator-runtime": "^0.13.4"
+                  }
+                }
+              }
+            }
+          }
+        }
       }
     },
     "rc-menu": {
-      "version": "8.10.7",
-      "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.10.7.tgz",
-      "integrity": "sha512-m/ypV7OjkkUsMdutzMUxEI8tWyi0Y1TQ5YkSDk7k2uv2aCKkHYEoDKsDAfcPeejo3HMo2z5unWE+jD+dCphraw==",
+      "version": "9.0.14",
+      "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.0.14.tgz",
+      "integrity": "sha512-CIox5mZeLDAi32SlHrV7UeSjv7tmJJhwRyxQtZCKt351w3q59XlL4WMFOmtT9gwIfP9h0XoxdBZUMe/xzkp78A==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
-        "mini-store": "^3.0.1",
-        "rc-motion": "^2.0.1",
+        "rc-motion": "^2.4.3",
+        "rc-overflow": "^1.2.0",
         "rc-trigger": "^5.1.2",
-        "rc-util": "^5.7.0",
-        "resize-observer-polyfill": "^1.5.0",
+        "rc-util": "^5.12.0",
         "shallowequal": "^1.1.0"
+      },
+      "dependencies": {
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
+        }
       }
     },
     "rc-motion": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz",
-      "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==",
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.0.tgz",
+      "integrity": "sha512-1MDWA9+i174CZ0SIDenSYm2Wb9YbRkrexjZWR0CUFu7D6f23E8Y0KsTgk9NGOLJsGak5ELZK/Y5lOlf5wQdzbw==",
       "requires": {
         "@babel/runtime": "^7.11.1",
         "classnames": "^2.2.1",
-        "rc-util": "^5.2.1"
+        "rc-util": "^5.21.0"
+      },
+      "dependencies": {
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
+        }
       }
     },
     "rc-notification": {
-      "version": "4.5.5",
-      "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.5.tgz",
-      "integrity": "sha512-YIfhTSw+h5GsSdgMnuMx24wqiPlg3FeamuOlkh9RkyHx+SeZVAKzQ0juy2NGvPEF2hDWi5xTqxUqLdo0L2AmGg==",
+      "version": "4.5.7",
+      "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.7.tgz",
+      "integrity": "sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
@@ -15676,46 +15775,67 @@
       }
     },
     "rc-overflow": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.1.1.tgz",
-      "integrity": "sha512-bkGrxvWtz6xQfxBPBQcN8xOEHFCeG0R4pfLAku6kFLQF9NPMTt5HvT+Bq0+stqom9eI3WRlun6RPzfjTamPwew==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.6.tgz",
+      "integrity": "sha512-YqbocgzuQxfq2wZy72vdAgrgzzEuM/5d4gF9TBEodCpXPbUeXGrUXNm1J6G1MSkCU2N0ePIgCEu5qD/0Ldi63Q==",
       "requires": {
         "@babel/runtime": "^7.11.1",
         "classnames": "^2.2.1",
         "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.5.1"
+        "rc-util": "^5.19.2"
       },
       "dependencies": {
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
           }
+        },
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
         }
       }
     },
     "rc-pagination": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.6.tgz",
-      "integrity": "sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw==",
+      "version": "3.1.16",
+      "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.16.tgz",
+      "integrity": "sha512-GFcHXJ7XxeJDf9B+ndP4PRDt46maSSgYhiwofBMiIGKIlBhJ0wfu8DMCEvaWJJLpI2u4Gb6zF1dHpiqPFrosPg==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.1"
       }
     },
     "rc-picker": {
-      "version": "2.5.10",
-      "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.10.tgz",
-      "integrity": "sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA==",
+      "version": "2.5.19",
+      "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.19.tgz",
+      "integrity": "sha512-u6myoCu/qiQ0vLbNzSzNrzTQhs7mldArCpPHrEI6OUiifs+IPXmbesqSm0zilJjfzrZJLgYeyyOMSznSlh0GKA==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.1",
-        "date-fns": "^2.15.0",
+        "date-fns": "2.x",
+        "dayjs": "1.x",
         "moment": "^2.24.0",
         "rc-trigger": "^5.0.4",
         "rc-util": "^5.4.0",
@@ -15723,18 +15843,18 @@
       }
     },
     "rc-progress": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.3.tgz",
-      "integrity": "sha512-Jl4fzbBExHYMoC6HBPzel0a9VmhcSXx24LVt/mdhDM90MuzoMCJjXZAlhA0V0CJi+SKjMhfBoIQ6Lla1nD4QNw==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.4.tgz",
+      "integrity": "sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.6"
       }
     },
     "rc-rate": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz",
-      "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==",
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz",
+      "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.5",
@@ -15753,9 +15873,9 @@
       }
     },
     "rc-select": {
-      "version": "12.1.9",
-      "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-12.1.9.tgz",
-      "integrity": "sha512-jsqcdby3Ag9ohYQ0d4vS4Q2jeWjj6kb2NHS9WcQSse0/5lCb3mqXI/1fkKRRIhdQvMBklYh4ctSox3mDrZiB8A==",
+      "version": "13.1.1",
+      "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-13.1.1.tgz",
+      "integrity": "sha512-Oy4L27x5QgGR8902pw0bJVjrTWFnKPKvdLHzJl5pjiA+jM1hpzDfLGg/bY2ntk5ElxxQKZUwbFKUeqfCQU7SrQ==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
@@ -15767,33 +15887,65 @@
       },
       "dependencies": {
         "rc-util": {
-          "version": "5.9.8",
-          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.8.tgz",
-          "integrity": "sha512-typLSHYGf5irvGLYQshs0Ra3aze086h0FhzsAkyirMunYZ7b3Te8gKa5PVaanoHaZa9sS6qx98BxgysoRP+6Tw==",
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
           "requires": {
-            "@babel/runtime": "^7.12.5",
+            "@babel/runtime": "^7.18.3",
             "react-is": "^16.12.0",
             "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
           }
         }
       }
     },
     "rc-slider": {
-      "version": "9.7.2",
-      "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.2.tgz",
-      "integrity": "sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g==",
+      "version": "9.7.5",
+      "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.5.tgz",
+      "integrity": "sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.5",
         "rc-tooltip": "^5.0.1",
-        "rc-util": "^5.0.0",
+        "rc-util": "^5.16.1",
         "shallowequal": "^1.1.0"
+      },
+      "dependencies": {
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
+        }
       }
     },
     "rc-steps": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.3.tgz",
-      "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.4.tgz",
+      "integrity": "sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==",
       "requires": {
         "@babel/runtime": "^7.10.2",
         "classnames": "^2.2.3",
@@ -15811,133 +15963,264 @@
       }
     },
     "rc-table": {
-      "version": "7.13.3",
-      "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.13.3.tgz",
-      "integrity": "sha512-oP4fknjvKCZAaiDnvj+yzBaWcg+JYjkASbeWonU1BbrLcomkpKvMUgPODNEzg0QdXA9OGW0PO86h4goDSW06Kg==",
+      "version": "7.19.2",
+      "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.19.2.tgz",
+      "integrity": "sha512-NdpnoM50MK02H5/hGOsObfxCvGFUG5cHB9turE5BKJ81T5Ycbq193w5tLhnpILXe//Oanzr47MdMxkUnVGP+qg==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.5",
         "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.4.0",
+        "rc-util": "^5.14.0",
         "shallowequal": "^1.1.0"
       },
       "dependencies": {
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
           }
+        },
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
         }
       }
     },
     "rc-tabs": {
-      "version": "11.7.3",
-      "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.3.tgz",
-      "integrity": "sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w==",
+      "version": "11.10.8",
+      "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.10.8.tgz",
+      "integrity": "sha512-uK+x+eJ8WM4jiXoqGa+P+JUQX2Wlkj9f0o/5dyOw42B6YLnHJN80uTVcCeAmtA1N0xjPW0GNSZvUm4SU3jAYpw==",
       "requires": {
         "@babel/runtime": "^7.11.2",
         "classnames": "2.x",
-        "rc-dropdown": "^3.1.3",
-        "rc-menu": "^8.6.1",
+        "rc-dropdown": "^3.2.0",
+        "rc-menu": "~9.3.2",
         "rc-resize-observer": "^1.0.0",
         "rc-util": "^5.5.0"
       },
       "dependencies": {
+        "rc-menu": {
+          "version": "9.3.2",
+          "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.3.2.tgz",
+          "integrity": "sha512-h3m45oY1INZyqphGELkdT0uiPnFzxkML8m0VMhJnk2fowtqfiT7F5tJLT3znEVaPIY80vMy1bClCkgq8U91CzQ==",
+          "requires": {
+            "@babel/runtime": "^7.10.1",
+            "classnames": "2.x",
+            "rc-motion": "^2.4.3",
+            "rc-overflow": "^1.2.0",
+            "rc-trigger": "^5.1.2",
+            "rc-util": "^5.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.21.5",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+              "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              },
+              "dependencies": {
+                "@babel/runtime": {
+                  "version": "7.18.3",
+                  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+                  "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+                  "requires": {
+                    "regenerator-runtime": "^0.13.4"
+                  }
+                }
+              }
+            }
+          }
+        },
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.21.5",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+              "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              },
+              "dependencies": {
+                "@babel/runtime": {
+                  "version": "7.18.3",
+                  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+                  "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+                  "requires": {
+                    "regenerator-runtime": "^0.13.4"
+                  }
+                }
+              }
+            }
           }
         }
       }
     },
     "rc-textarea": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.4.tgz",
-      "integrity": "sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==",
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.7.tgz",
+      "integrity": "sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "^2.2.1",
         "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.7.0"
+        "rc-util": "^5.7.0",
+        "shallowequal": "^1.1.0"
       },
       "dependencies": {
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.21.5",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+              "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              },
+              "dependencies": {
+                "@babel/runtime": {
+                  "version": "7.18.3",
+                  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+                  "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+                  "requires": {
+                    "regenerator-runtime": "^0.13.4"
+                  }
+                }
+              }
+            }
           }
         }
       }
     },
     "rc-tooltip": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz",
-      "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.1.tgz",
+      "integrity": "sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==",
       "requires": {
         "@babel/runtime": "^7.11.2",
         "rc-trigger": "^5.0.0"
       }
     },
     "rc-tree": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz",
-      "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==",
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.2.2.tgz",
+      "integrity": "sha512-ZQPGi5rGmipXvSUqeMbh0Rm0Cn2zFVWQFvS3sinH+lis5VNCChkFs2dAFpWZnb9/d/SZPeMfYG/x2XFq/q3UTA==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
         "rc-motion": "^2.0.1",
         "rc-util": "^5.0.0",
-        "rc-virtual-list": "^3.0.1"
+        "rc-virtual-list": "^3.4.1"
       }
     },
     "rc-tree-select": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.1.tgz",
-      "integrity": "sha512-OeV8u5kBEJ8MbatP04Rh8T3boOHGjdGBTEm1a0bubBbB2GNNhlMOr4ZxezkHYtXf02JdBS/WyydmI/RMjXgtJA==",
+      "version": "4.6.3",
+      "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.6.3.tgz",
+      "integrity": "sha512-VymfystOnW8EfoWaWehgB8zpYKgRZf4ILu9KHf7FJZVZ/1dnBEHDqg1bBi43/1BYLwYFKSKKSjkYyNYntWJM4A==",
       "requires": {
         "@babel/runtime": "^7.10.1",
         "classnames": "2.x",
-        "rc-select": "^12.0.0",
-        "rc-tree": "^4.0.0",
-        "rc-util": "^5.0.5"
+        "rc-select": "~13.1.0-alpha.0",
+        "rc-tree": "~5.2.0",
+        "rc-util": "^5.7.0"
       }
     },
     "rc-trigger": {
-      "version": "5.2.5",
-      "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.5.tgz",
-      "integrity": "sha512-RlF5RpWqK+JeiFeQVOzwjLFzpNe2FowoXc/42azz+20wr/bYF1Q/MwprUK+3+vs/oFhLC0ht3/NlrslAo/OoWA==",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.1.tgz",
+      "integrity": "sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==",
       "requires": {
-        "@babel/runtime": "^7.11.2",
+        "@babel/runtime": "^7.18.3",
         "classnames": "^2.2.6",
         "rc-align": "^4.0.0",
         "rc-motion": "^2.0.0",
-        "rc-util": "^5.5.0"
+        "rc-util": "^5.19.2"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.18.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+          "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          }
+        }
       }
     },
     "rc-upload": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.2.0.tgz",
-      "integrity": "sha512-BXtvBs1PnwLjaUzBBU5z4yb9NMSaxc6mUIoPmS9LUAzaTz12L3TLrwu+8dnopYUiyLmYFS3LEO7aUfEWBqJfSA==",
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz",
+      "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==",
       "requires": {
-        "@babel/runtime": "^7.10.1",
+        "@babel/runtime": "^7.18.3",
         "classnames": "^2.2.5",
         "rc-util": "^5.2.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.18.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+          "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        }
       }
     },
     "rc-util": {
@@ -15951,25 +16234,45 @@
       }
     },
     "rc-virtual-list": {
-      "version": "3.2.6",
-      "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz",
-      "integrity": "sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==",
+      "version": "3.4.8",
+      "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.8.tgz",
+      "integrity": "sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg==",
       "requires": {
         "classnames": "^2.2.6",
         "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.0.7"
+        "rc-util": "^5.15.0"
       },
       "dependencies": {
         "rc-resize-observer": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
-          "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz",
+          "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==",
           "requires": {
             "@babel/runtime": "^7.10.1",
             "classnames": "^2.2.1",
-            "rc-util": "^5.0.0",
+            "rc-util": "^5.15.0",
             "resize-observer-polyfill": "^1.5.1"
           }
+        },
+        "rc-util": {
+          "version": "5.21.5",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.21.5.tgz",
+          "integrity": "sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          },
+          "dependencies": {
+            "@babel/runtime": {
+              "version": "7.18.3",
+              "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+              "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+              "requires": {
+                "regenerator-runtime": "^0.13.4"
+              }
+            }
+          }
         }
       }
     },
@@ -17400,9 +17703,9 @@
       "integrity": "sha512-dYaNuOdzr+kc6J6CFcBrzkLCfyGcMg+gWkJ8us93IQ7y1cevhQAugFsaCdMHb6lw8KV3xPzSxzH7zM1dQap9mA=="
     },
     "scroll-into-view-if-needed": {
-      "version": "2.2.28",
-      "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz",
-      "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==",
+      "version": "2.2.29",
+      "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz",
+      "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==",
       "requires": {
         "compute-scroll-into-view": "^1.0.17"
       }
diff --git a/inlong-dashboard/package.json b/inlong-dashboard/package.json
index b9261cfc5..e0e55a6d4 100644
--- a/inlong-dashboard/package.json
+++ b/inlong-dashboard/package.json
@@ -6,7 +6,7 @@
     "@ant-design/icons": "^4.5.0",
     "@ant-design/pro-layout": "^6.15.0",
     "ahooks": "^2.10.0",
-    "antd": "^4.15.1",
+    "antd": "^4.17.1",
     "dayjs": "^1.10.4",
     "echarts": "^5.2.2",
     "i18next": "^20.3.1",
diff --git a/inlong-dashboard/src/components/HighSelect/index.tsx b/inlong-dashboard/src/components/HighSelect/index.tsx
index 47b18a66a..774b99a47 100644
--- a/inlong-dashboard/src/components/HighSelect/index.tsx
+++ b/inlong-dashboard/src/components/HighSelect/index.tsx
@@ -24,6 +24,7 @@ import React, { useMemo, useState, useEffect } from 'react';
 import { Select, Space, Input } from 'antd';
 import type { SelectProps, OptionProps } from 'antd/es/select';
 import { useRequest } from '@/hooks';
+import debounce from 'lodash/debounce';
 
 // example options: {
 //   requestService: '/basic/schema/listAll',
@@ -40,9 +41,10 @@ export interface HighSelectProps extends Omit<SelectProps<any>, 'options'> {
   options?:
     | OptionProps
     | {
-        requestService?: unknown;
+        requestService: unknown;
         requestParams?: unknown;
         requestAuto?: boolean;
+        requestTrigger?: 'onOpen' | 'onSearch'[];
       };
   asyncValueLabel?: string;
   useInput?: boolean;
@@ -65,6 +67,10 @@ const HighSelect: React.FC<HighSelectProps> = ({
     ...options?.requestParams,
   });
 
+  const debounceGetList = debounce(value => {
+    getList(value);
+  }, 300);
+
   const optionList = useMemo(() => {
     const output = Array.isArray(options) ? options : list;
 
@@ -86,8 +92,21 @@ const HighSelect: React.FC<HighSelectProps> = ({
     return <Select {...rest} />;
   }
 
+  const onSearch = value => {
+    if (options?.requestService && options?.requestTrigger?.includes('onSearch')) {
+      debounceGetList(value);
+    }
+    if (rest.onSearch) {
+      rest.onSearch(value);
+    }
+  };
+
   const onDropdownVisibleChange = (open: boolean) => {
-    if (open) {
+    if (
+      open &&
+      options?.requestService &&
+      (!options?.requestTrigger || options?.requestTrigger?.includes('onOpen'))
+    ) {
       getList();
     }
     if (rest.onDropdownVisibleChange) {
@@ -121,8 +140,11 @@ const HighSelect: React.FC<HighSelectProps> = ({
 
   const SelectComponent = (
     <Select
-      showSearch={optionList.length > 5}
+      showSearch={
+        options?.requestTrigger?.includes('onSearch') ? rest.showSearch : optionList.length > 5
+      }
       {...rest}
+      onSearch={options?.requestTrigger?.includes('onSearch') ? onSearch : rest.onSearch}
       onDropdownVisibleChange={onDropdownVisibleChange}
       onChange={onSelectChange}
       value={
diff --git a/inlong-dashboard/src/configs/menus/index.ts b/inlong-dashboard/src/configs/menus/index.ts
index 45dcb6707..d92f5cdec 100644
--- a/inlong-dashboard/src/configs/menus/index.ts
+++ b/inlong-dashboard/src/configs/menus/index.ts
@@ -35,8 +35,17 @@ const menus: MenuItemType[] = [
     name: i18n.t('configs.menus.DataConsumption'),
   },
   {
-    path: '/clusters',
     name: i18n.t('configs.menus.Clusters'),
+    children: [
+      {
+        path: '/clusters',
+        name: i18n.t('configs.menus.Clusters'),
+      },
+      {
+        path: '/clusterTags',
+        name: i18n.t('configs.menus.ClusterTags'),
+      },
+    ],
   },
   {
     path: '/audit',
diff --git a/inlong-dashboard/src/configs/routes/index.tsx b/inlong-dashboard/src/configs/routes/index.tsx
index 081445351..9ecd804af 100644
--- a/inlong-dashboard/src/configs/routes/index.tsx
+++ b/inlong-dashboard/src/configs/routes/index.tsx
@@ -115,6 +115,11 @@ const routes: RouteProps[] = [
       },
     ],
   },
+  {
+    path: '/clusterTags',
+    component: () => import('@/pages/ClusterTags'),
+    exact: true,
+  },
   {
     component: () => import('@/pages/Error/404'),
   },
diff --git a/inlong-dashboard/src/i18n.ts b/inlong-dashboard/src/i18n.ts
index 374184dd7..c9ba70cfd 100644
--- a/inlong-dashboard/src/i18n.ts
+++ b/inlong-dashboard/src/i18n.ts
@@ -30,6 +30,7 @@ const resources = {
       'configs.menus.DataConsumption': 'Data Consumption',
       'configs.menus.Datasources': 'Data Sources',
       'configs.menus.Clusters': 'Clusters',
+      'configs.menus.ClusterTags': 'ClusterTags',
       'configs.menus.SystemManagement': 'System',
     },
   },
@@ -40,6 +41,7 @@ const resources = {
       'configs.menus.DataConsumption': '数据消费',
       'configs.menus.Datasources': '数据源服务器',
       'configs.menus.Clusters': '集群管理',
+      'configs.menus.ClusterTags': '标签管理',
       'configs.menus.SystemManagement': '系统管理',
     },
   },
diff --git a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx b/inlong-dashboard/src/pages/ClusterTags/ClusterBindModal.tsx
similarity index 54%
copy from inlong-dashboard/src/pages/Clusters/CreateModal.tsx
copy to inlong-dashboard/src/pages/ClusterTags/ClusterBindModal.tsx
index b874a734f..cd190456b 100644
--- a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx
+++ b/inlong-dashboard/src/pages/ClusterTags/ClusterBindModal.tsx
@@ -17,58 +17,33 @@
  * under the License.
  */
 
-import React, { useMemo } from 'react';
+import React, { useCallback } from 'react';
 import { Modal, message } from 'antd';
 import { ModalProps } from 'antd/es/modal';
 import FormGenerator, { useForm } from '@/components/FormGenerator';
-import { useRequest, useUpdateEffect } from '@/hooks';
-import request from '@/utils/request';
-import { Clusters } from './config';
+import { useUpdateEffect } from '@/hooks';
 import i18n from '@/i18n';
+import request from '@/utils/request';
 
 export interface Props extends ModalProps {
-  type: string;
-  // Require when edit
-  id?: string;
+  tagId: number;
 }
 
-const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
+const Comp: React.FC<Props> = ({ tagId, ...modalProps }) => {
   const [form] = useForm();
 
-  const { run: getData } = useRequest(
-    id => ({
-      url: `/cluster/get/${id}`,
-    }),
-    {
-      manual: true,
-      formatResult: result => ({
-        ...result,
-        inCharges: result.inCharges.split(','),
-      }),
-      onSuccess: result => {
-        form.setFieldsValue(result);
-      },
-    },
-  );
-
   const onOk = async () => {
     const values = await form.validateFields();
-    const isUpdate = id;
     const submitData = {
+      tagId,
       ...values,
-      type,
-      inCharges: values.inCharges?.join(','),
     };
-    if (isUpdate) {
-      submitData.id = id;
-      // submitData.version = data?.version;
-    }
     await request({
-      url: `/cluster/${isUpdate ? 'update' : 'save'}`,
+      url: '/cluster/tag/bind',
       method: 'POST',
       data: submitData,
     });
-    await modalProps?.onOk(submitData);
+    await modalProps?.onOk(values);
     message.success(i18n.t('basic.OperatingSuccess'));
   };
 
@@ -76,24 +51,49 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
     if (modalProps.visible) {
       // open
       form.resetFields();
-      if (id) {
-        getData(id);
-      }
     }
   }, [modalProps.visible]);
 
-  const content = useMemo(() => {
-    const current = Clusters.find(item => item.value === type);
-    return current?.config;
-  }, [type]);
+  const getCreateFormContent = useCallback(
+    () => [
+      {
+        type: 'select',
+        label: i18n.t('pages.Clusters.Name'),
+        name: 'clusters',
+        rules: [{ required: true }],
+        props: {
+          mode: 'multiple',
+          filterOption: false,
+          options: {
+            requestTrigger: ['onOpen', 'onSearch'],
+            requestService: keyword => ({
+              url: '/cluster/list',
+              method: 'POST',
+              data: {
+                keyword,
+                pageNum: 1,
+                pageSize: 20,
+                type: '',
+              },
+            }),
+            requestParams: {
+              formatResult: result =>
+                result?.list?.map(item => ({
+                  ...item,
+                  label: item.clusterTag,
+                  value: item.clusterTag,
+                })),
+            },
+          },
+        },
+      },
+    ],
+    [],
+  );
 
   return (
-    <Modal
-      {...modalProps}
-      title={id ? i18n.t('pages.Clusters.Edit') : i18n.t('pages.Clusters.Create')}
-      onOk={onOk}
-    >
-      <FormGenerator content={content} form={form} useMaxWidth />
+    <Modal {...modalProps} title={i18n.t('pages.ClusterTags.BindCluster')} onOk={onOk}>
+      <FormGenerator content={getCreateFormContent()} form={form} useMaxWidth />
     </Modal>
   );
 };
diff --git a/inlong-dashboard/src/pages/ClusterTags/ClusterList.tsx b/inlong-dashboard/src/pages/ClusterTags/ClusterList.tsx
new file mode 100644
index 000000000..2b20da331
--- /dev/null
+++ b/inlong-dashboard/src/pages/ClusterTags/ClusterList.tsx
@@ -0,0 +1,203 @@
+/*
+ * 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, { useCallback, useEffect, useMemo, useState } from 'react';
+import { Button, Modal, message } from 'antd';
+import i18n from '@/i18n';
+import HighTable from '@/components/HighTable';
+import { defaultSize } from '@/configs/pagination';
+import { useRequest } from '@/hooks';
+import { Clusters } from '@/pages/Clusters/config';
+import ClusterBindModal from './ClusterBindModal';
+import request from '@/utils/request';
+
+export interface ClusterListProps {
+  tagId: number;
+  clusterTag: string;
+}
+
+const getFilterFormContent = defaultValues => [
+  {
+    type: 'inputsearch',
+    name: 'keyword',
+  },
+  {
+    type: 'select',
+    name: 'type',
+    label: i18n.t('pages.Clusters.Type'),
+    initialValue: defaultValues.type,
+    props: {
+      options: [
+        {
+          label: i18n.t('pages.Clusters.TypeAll'),
+          value: '',
+        },
+      ].concat(
+        Clusters.map(item => ({
+          label: item.label,
+          value: item.value,
+        })),
+      ),
+    },
+  },
+];
+
+const Comp: React.FC<ClusterListProps> = ({ tagId, clusterTag }) => {
+  const [options, setOptions] = useState({
+    keyword: '',
+    pageSize: defaultSize,
+    pageNum: 1,
+    type: '',
+  });
+
+  const [clusterBindModal, setClusterBindModal] = useState<Record<string, unknown>>({
+    visible: false,
+  });
+
+  const { data, loading, run: getList } = useRequest(
+    {
+      url: '/cluster/list',
+      method: 'POST',
+      data: {
+        ...options,
+        clusterTag,
+      },
+    },
+    {
+      manual: true,
+    },
+  );
+
+  useEffect(() => {
+    if (clusterTag) {
+      getList();
+    }
+  }, [options, clusterTag, getList]);
+
+  const onDelete = useCallback(
+    ({ id }) => {
+      Modal.confirm({
+        title: i18n.t('basic.DeleteConfirm'),
+        onOk: async () => {
+          await request({
+            url: `/cluster/delete/${id}`,
+            method: 'DELETE',
+          });
+          await getList();
+          message.success(i18n.t('basic.DeleteSuccess'));
+        },
+      });
+    },
+    [getList],
+  );
+
+  const onChange = ({ current: pageNum, pageSize }) => {
+    setOptions(prev => ({
+      ...prev,
+      pageNum,
+      pageSize,
+    }));
+  };
+
+  const onFilter = allValues => {
+    setOptions(prev => ({
+      ...prev,
+      ...allValues,
+      pageNum: 1,
+    }));
+  };
+
+  const pagination = {
+    pageSize: +options.pageSize,
+    current: +options.pageNum,
+    total: data?.total,
+  };
+
+  const columns = useMemo(() => {
+    const defaultColumns = [
+      {
+        title: i18n.t('pages.Clusters.Name'),
+        dataIndex: 'name',
+        ellipsisMulti: 2,
+      },
+      {
+        title: i18n.t('pages.Clusters.InCharges'),
+        dataIndex: 'inCharges',
+        ellipsisMulti: 2,
+      },
+    ];
+
+    return defaultColumns.concat([
+      {
+        title: i18n.t('basic.Operating'),
+        dataIndex: 'action',
+        width: 200,
+        render: (text, record) => (
+          <>
+            {/* <Button type="link">{i18n.t('basic.Detail')}</Button> */}
+            <Button type="link" onClick={() => onDelete(record)} style={{ display: 'none' }}>
+              {i18n.t('pages.ClusterTags.DelCluster')}
+            </Button>
+          </>
+        ),
+      } as any,
+    ]);
+  }, [onDelete]);
+
+  return (
+    <>
+      <HighTable
+        filterForm={{
+          content: getFilterFormContent(options),
+          onFilter,
+        }}
+        suffix={
+          <Button
+            type="primary"
+            onClick={() => setClusterBindModal({ visible: true })}
+            style={{ display: 'none' }}
+          >
+            {i18n.t('pages.ClusterTags.BindCluster')}
+          </Button>
+        }
+        table={{
+          columns,
+          rowKey: 'id',
+          dataSource: data?.list,
+          pagination,
+          loading,
+          onChange,
+        }}
+      />
+
+      <ClusterBindModal
+        {...clusterBindModal}
+        tagId={tagId}
+        visible={clusterBindModal.visible as boolean}
+        onOk={async () => {
+          await getList();
+          setClusterBindModal({ visible: false });
+        }}
+        onCancel={() => setClusterBindModal({ visible: false })}
+      />
+    </>
+  );
+};
+
+export default Comp;
diff --git a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx b/inlong-dashboard/src/pages/ClusterTags/TagDetailModal.tsx
similarity index 72%
copy from inlong-dashboard/src/pages/Clusters/CreateModal.tsx
copy to inlong-dashboard/src/pages/ClusterTags/TagDetailModal.tsx
index b874a734f..07ebc7664 100644
--- a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx
+++ b/inlong-dashboard/src/pages/ClusterTags/TagDetailModal.tsx
@@ -18,32 +18,30 @@
  */
 
 import React, { useMemo } from 'react';
+import i18n from '@/i18n';
 import { Modal, message } from 'antd';
 import { ModalProps } from 'antd/es/modal';
 import FormGenerator, { useForm } from '@/components/FormGenerator';
 import { useRequest, useUpdateEffect } from '@/hooks';
+import StaffSelect from '@/components/StaffSelect';
 import request from '@/utils/request';
-import { Clusters } from './config';
-import i18n from '@/i18n';
 
-export interface Props extends ModalProps {
-  type: string;
-  // Require when edit
-  id?: string;
+export interface TagDetailModalProps extends ModalProps {
+  id?: number;
 }
 
-const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
+const TagDetailModal: React.FC<TagDetailModalProps> = ({ id, ...modalProps }) => {
   const [form] = useForm();
 
   const { run: getData } = useRequest(
     id => ({
-      url: `/cluster/get/${id}`,
+      url: `/cluster/tag/get/${id}`,
     }),
     {
       manual: true,
       formatResult: result => ({
         ...result,
-        inCharges: result.inCharges.split(','),
+        inCharges: result.inCharges ? result.inCharges.split(',') : [],
       }),
       onSuccess: result => {
         form.setFieldsValue(result);
@@ -56,15 +54,13 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
     const isUpdate = id;
     const submitData = {
       ...values,
-      type,
       inCharges: values.inCharges?.join(','),
     };
     if (isUpdate) {
       submitData.id = id;
-      // submitData.version = data?.version;
     }
     await request({
-      url: `/cluster/${isUpdate ? 'update' : 'save'}`,
+      url: `/cluster/tag/${isUpdate ? 'update' : 'save'}`,
       method: 'POST',
       data: submitData,
     });
@@ -83,14 +79,24 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
   }, [modalProps.visible]);
 
   const content = useMemo(() => {
-    const current = Clusters.find(item => item.value === type);
-    return current?.config;
-  }, [type]);
+    return [
+      {
+        type: 'input',
+        label: i18n.t('pages.ClusterTags.Name'),
+        name: 'clusterTag',
+      },
+      {
+        type: <StaffSelect mode="multiple" currentUserClosable={false} />,
+        label: i18n.t('pages.ClusterTags.InCharges'),
+        name: 'inCharges',
+      },
+    ];
+  }, []);
 
   return (
     <Modal
       {...modalProps}
-      title={id ? i18n.t('pages.Clusters.Edit') : i18n.t('pages.Clusters.Create')}
+      title={i18n.t(id ? 'basic.Edit' : 'basic.Create') + i18n.t('pages.ClusterTags.Name')}
       onOk={onOk}
     >
       <FormGenerator content={content} form={form} useMaxWidth />
@@ -98,4 +104,4 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
   );
 };
 
-export default Comp;
+export default TagDetailModal;
diff --git a/inlong-dashboard/src/pages/ClusterTags/index.module.less b/inlong-dashboard/src/pages/ClusterTags/index.module.less
new file mode 100644
index 000000000..8b54a693f
--- /dev/null
+++ b/inlong-dashboard/src/pages/ClusterTags/index.module.less
@@ -0,0 +1,30 @@
+
+/*
+* 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.
+*/
+
+.listItem {
+ cursor: pointer;
+
+ &:global {
+    &:hover,
+    &.is-selected {
+      background-color: #f6f7fb;
+    }
+  }
+}
diff --git a/inlong-dashboard/src/pages/ClusterTags/index.tsx b/inlong-dashboard/src/pages/ClusterTags/index.tsx
new file mode 100644
index 000000000..0280196af
--- /dev/null
+++ b/inlong-dashboard/src/pages/ClusterTags/index.tsx
@@ -0,0 +1,195 @@
+/*
+ * 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, { useState, useCallback, useMemo } from 'react';
+import { Button, Card, List, Col, Row, Descriptions, Input, Modal, message } from 'antd';
+import { PageContainer } from '@/components/PageContainer';
+import { useRequest } from '@/hooks';
+import i18n from '@/i18n';
+import request from '@/utils/request';
+import ClusterList from './ClusterList';
+import TagDetailModal from './TagDetailModal';
+import styles from './index.module.less';
+
+const Comp: React.FC = () => {
+  const [options, setOptions] = useState({
+    keyword: '',
+    pageSize: 20,
+    pageNum: 1,
+  });
+
+  const [tagId, setTagId] = useState<number>();
+
+  const [tagDetailModal, setTagDetailModal] = useState<Record<string, unknown>>({
+    visible: false,
+  });
+
+  const { data, loading, run: getList } = useRequest(
+    {
+      url: '/cluster/tag/list',
+      method: 'POST',
+      data: {
+        ...options,
+      },
+    },
+    {
+      refreshDeps: [options],
+      onSuccess: result => {
+        const defaultTag = result?.list?.[0];
+        if (defaultTag) {
+          setTagId(defaultTag.id);
+        }
+      },
+    },
+  );
+
+  const currentTag = useMemo(() => {
+    return data?.list.find(item => item.id === tagId) || {};
+  }, [tagId, data]);
+
+  const onListPageChange = (pageNum, pageSize) => {
+    setOptions(prev => ({
+      ...prev,
+      pageNum,
+      pageSize,
+    }));
+  };
+
+  const onEdit = useCallback(({ id }) => {
+    setTagDetailModal({ visible: true, id });
+  }, []);
+
+  const onDelete = useCallback(
+    ({ id }) => {
+      Modal.confirm({
+        title: i18n.t('basic.DeleteConfirm'),
+        onOk: async () => {
+          await request({
+            url: `/cluster/tag/delete/${id}`,
+            method: 'DELETE',
+          });
+          await getList();
+          message.success(i18n.t('basic.DeleteSuccess'));
+        },
+      });
+    },
+    [getList],
+  );
+
+  return (
+    <PageContainer useDefaultBreadcrumb={false} useDefaultContainer={false}>
+      <Row gutter={20}>
+        <Col style={{ flex: '0 0 350px' }}>
+          <List
+            size="small"
+            itemLayout="horizontal"
+            loading={loading}
+            pagination={{
+              size: 'small',
+              onChange: onListPageChange,
+              pageSize: 20,
+              total: data?.total,
+            }}
+            dataSource={data?.list}
+            header={
+              <div style={{ display: 'flex', justifyContent: 'space-between', padding: '0 16px' }}>
+                <Input.Search
+                  style={{ flex: '0 1 150px' }}
+                  onSearch={keyword =>
+                    setOptions(prev => ({
+                      ...prev,
+                      keyword,
+                    }))
+                  }
+                />
+                <Button type="primary" onClick={() => setTagDetailModal({ visible: true })}>
+                  {i18n.t('basic.Create')}
+                </Button>
+              </div>
+            }
+            renderItem={(item: Record<string, any>) => (
+              <List.Item
+                actions={[
+                  {
+                    title: i18n.t('basic.Edit'),
+                    action: onEdit,
+                  },
+                  {
+                    title: i18n.t('basic.Delete'),
+                    action: onDelete,
+                  },
+                ].map((k, idx) => (
+                  <Button
+                    key={idx}
+                    type="link"
+                    size="small"
+                    style={{ padding: 0 }}
+                    onClick={e => {
+                      e.stopPropagation();
+                      k.action(item);
+                    }}
+                  >
+                    {k.title}
+                  </Button>
+                ))}
+                className={`${styles.listItem} ${tagId === item.id ? 'is-selected' : ''}`}
+                onClick={() => setTagId(item.id)}
+              >
+                {item.clusterTag}
+              </List.Item>
+            )}
+            style={{ background: '#fff', height: '100%' }}
+          />
+        </Col>
+
+        <Col style={{ flex: '1' }}>
+          <Card style={{ marginBottom: 20 }}>
+            <Descriptions title={currentTag.clusterTag}>
+              <Descriptions.Item label={i18n.t('pages.ClusterTags.InCharges')}>
+                {currentTag.inCharges}
+              </Descriptions.Item>
+              <Descriptions.Item label={i18n.t('pages.ClusterTags.Modifier')}>
+                {currentTag.modifier}
+              </Descriptions.Item>
+              <Descriptions.Item label={i18n.t('pages.ClusterTags.ModifyTime')}>
+                {currentTag.modifyTime}
+              </Descriptions.Item>
+            </Descriptions>
+          </Card>
+
+          <Card>
+            <ClusterList tagId={1} clusterTag={currentTag.clusterTag} />
+          </Card>
+        </Col>
+      </Row>
+
+      <TagDetailModal
+        {...tagDetailModal}
+        visible={tagDetailModal.visible as boolean}
+        onOk={async () => {
+          await getList();
+          setTagDetailModal({ visible: false });
+        }}
+        onCancel={() => setTagDetailModal({ visible: false })}
+      />
+    </PageContainer>
+  );
+};
+
+export default Comp;
diff --git a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx b/inlong-dashboard/src/pages/Clusters/CreateModal.tsx
index b874a734f..a0e3a150f 100644
--- a/inlong-dashboard/src/pages/Clusters/CreateModal.tsx
+++ b/inlong-dashboard/src/pages/Clusters/CreateModal.tsx
@@ -43,7 +43,8 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
       manual: true,
       formatResult: result => ({
         ...result,
-        inCharges: result.inCharges.split(','),
+        inCharges: result.inCharges?.split(','),
+        clusterTags: result.clusterTags?.split(','),
       }),
       onSuccess: result => {
         form.setFieldsValue(result);
@@ -58,6 +59,7 @@ const Comp: React.FC<Props> = ({ type, id, ...modalProps }) => {
       ...values,
       type,
       inCharges: values.inCharges?.join(','),
+      clusterTags: values.clusterTags?.join(','),
     };
     if (isUpdate) {
       submitData.id = id;
diff --git a/inlong-dashboard/src/pages/Clusters/config/index.tsx b/inlong-dashboard/src/pages/Clusters/config/index.tsx
index 8f7e22628..f28ea28d0 100644
--- a/inlong-dashboard/src/pages/Clusters/config/index.tsx
+++ b/inlong-dashboard/src/pages/Clusters/config/index.tsx
@@ -61,12 +61,33 @@ export const Clusters: ClusterItemType[] = [
       _inTable: true,
     },
     {
-      type: 'input',
+      type: 'select',
       label: i18n.t('pages.Clusters.Tag'),
-      name: 'clusterTag',
+      name: 'clusterTags',
       rules: [{ required: true }],
       props: {
-        maxLength: 128,
+        mode: 'multiple',
+        filterOption: false,
+        options: {
+          requestTrigger: ['onOpen', 'onSearch'],
+          requestService: keyword => ({
+            url: '/cluster/tag/list',
+            method: 'POST',
+            data: {
+              keyword,
+              pageNum: 1,
+              pageSize: 20,
+            },
+          }),
+          requestParams: {
+            formatResult: result =>
+              result?.list?.map(item => ({
+                ...item,
+                label: item.clusterTag,
+                value: item.clusterTag,
+              })),
+          },
+        },
       },
       _inTable: true,
     },
diff --git a/inlong-dashboard/src/themes/cover.less b/inlong-dashboard/src/themes/cover.less
index baf9b34a5..e6f43430d 100644
--- a/inlong-dashboard/src/themes/cover.less
+++ b/inlong-dashboard/src/themes/cover.less
@@ -45,10 +45,6 @@
   }
 }
 
-.ant-spin-nested-loading,
-.ant-spin-container {
-  height: 100%;
-}
 .ant-spin-nested-loading > div > .ant-spin {
   max-height: initial;
 }