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 <[email protected]> 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; }
