diff --git a/.gitignore b/.gitignore index 3d2b2bf12..ffcf91cbe 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ src/plugins/pluginList.ts .env config/config.odcPlugin.js yarn-error.log -yarn.lock \ No newline at end of file +# yarn.lock +pnpm-lock.yaml \ No newline at end of file diff --git a/README.md b/README.md index 73804fa5d..b0ab2a1f7 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ pnpm run prepack obclient #### Install Dependencies ```shell -pnpm install +pnpm run install-odc ``` #### Configure ODC Server Address diff --git a/build/electron-build.config.js b/build/electron-build.config.js index 9edb9b46a..dc6f408d8 100644 --- a/build/electron-build.config.js +++ b/build/electron-build.config.js @@ -21,9 +21,13 @@ const config = { writeUpdateInfo: false }, win: { + publisherName: 'OceanBase', target: 'nsis', rfc3161TimeStampServer: "http://sha256timestamp.ws.symantec.com/sha256/timestamp", - signingHashAlgorithms: ["sha256"] + signingHashAlgorithms: ["sha256"], + signtoolOptions: { + sign: "./scripts/client/winsign.js" + } }, nsis: { differentialPackage: false, diff --git a/pnpm-lock.yaml b/hidden.yaml similarity index 92% rename from pnpm-lock.yaml rename to hidden.yaml index 68c485d6f..ce274d70f 100644 --- a/pnpm-lock.yaml +++ b/hidden.yaml @@ -52,17 +52,17 @@ importers: specifier: ^3.2.2 version: 3.2.2(react@17.0.2) '@oceanbase-odc/monaco-plugin-ob': - specifier: ~1.4.2 - version: 1.4.2(monaco-editor@0.36.1) + specifier: ~1.5.3 + version: 1.5.3(monaco-editor@0.36.1) '@oceanbase-odc/ob-intl-cli': - specifier: ^2.1.3 - version: 2.1.4(chokidar@3.6.0)(encoding@0.1.13)(prettier@2.8.8)(typescript@4.9.5) + specifier: ^2.2.0 + version: 2.2.0(chokidar@3.6.0)(encoding@0.1.13)(prettier@2.8.8)(typescript@5.9.2) '@oceanbase-odc/ob-parser-js': - specifier: ^3.0.5 - version: 3.0.5 + specifier: ^3.1.2 + version: 3.1.2 '@oceanbase-odc/ob-react-data-grid': specifier: ^4.0.0 - version: 4.0.0(antd@5.25.4(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lodash@4.17.21)(react-dnd-html5-backend@11.1.3)(react-dnd@11.1.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + version: 4.0.0(antd@5.26.1(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lodash@4.17.21)(react-dnd-html5-backend@11.1.3)(react-dnd@11.1.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@sentry/react': specifier: ^7.88.0 version: 7.120.3(react@17.0.2) @@ -80,13 +80,13 @@ importers: version: 22.2.3 '@types/lodash': specifier: ^4.14.168 - version: 4.17.17 + version: 4.17.18 '@types/memoize-one': specifier: ^4.1.1 version: 4.1.1 '@types/node': - specifier: ^9.6.0 - version: 9.6.61 + specifier: ^16.7.0 + version: 16.18.126 '@types/react': specifier: ^16.0.0 version: 16.14.65 @@ -106,8 +106,8 @@ importers: specifier: ^3.0.0 version: 3.0.0 '@umijs/max': - specifier: ^4.0.66 - version: 4.4.11(@babel/core@7.27.4)(@types/node@9.6.61)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lightningcss@1.22.1)(prettier@2.8.8)(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + specifier: ^4.4.12 + version: 4.4.12(@babel/core@7.28.3)(@types/node@16.18.126)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lightningcss@1.22.1)(prettier@2.8.8)(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0) adm-zip: specifier: ^0.5.5 version: 0.5.16 @@ -119,7 +119,7 @@ importers: version: 6.23.0 antd: specifier: ^5.23.4 - version: 5.25.4(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + version: 5.26.1(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) antlr4: specifier: ~4.8.0 version: 4.8.0 @@ -131,7 +131,7 @@ importers: version: 2.1692.0 axios: specifier: ^1.7.7 - version: 1.9.0 + version: 1.10.0 bignumber.js: specifier: ^9.0.0 version: 9.3.0 @@ -152,7 +152,7 @@ importers: version: 3.3.3 core-js: specifier: ^3 - version: 3.42.0 + version: 3.43.0 cron-parser: specifier: ^4.6.0 version: 4.9.0 @@ -227,7 +227,7 @@ importers: version: 0.36.1 monaco-editor-webpack-plugin: specifier: ^7.0.1 - version: 7.1.0(monaco-editor@0.36.1)(webpack@4.47.0(webpack-cli@3.3.12)) + version: 7.1.0(monaco-editor@0.36.1)(webpack@4.47.0) path-to-regexp: specifier: ^2.1.0 version: 2.4.0 @@ -254,7 +254,7 @@ importers: version: 14.16.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-table: specifier: ^7.26.0 - version: 7.51.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + version: 7.51.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-virtual-list: specifier: ~3.4.13 version: 3.4.13(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -278,7 +278,7 @@ importers: version: 17.0.2(react@17.0.2) react-intl: specifier: ^5.20.10 - version: 5.25.1(react@17.0.2)(typescript@4.9.5) + version: 5.25.1(react@17.0.2)(typescript@5.9.2) react-resizable: specifier: ^1.10.1 version: 1.11.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -311,10 +311,10 @@ importers: version: 1.2.2 ts-loader: specifier: 8.4.0 - version: 8.4.0(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + version: 8.4.0(typescript@5.9.2)(webpack@4.47.0) typescript: - specifier: ^4.0.0 - version: 4.9.5 + specifier: ^5.9.2 + version: 5.9.2 webpack: specifier: ^4.28.0 version: 4.47.0(webpack-cli@3.3.12) @@ -369,6 +369,12 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' + '@ant-design/cssinjs@1.24.0': + resolution: {integrity: sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + '@ant-design/fast-color@2.0.6': resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} engines: {node: '>=8.x'} @@ -393,55 +399,55 @@ packages: '@ant-design/moment-webpack-plugin@0.0.3': resolution: {integrity: sha512-MLm1FUpg02fP615ShQnCUN9la2E4RylDxKyolkGqAWTIHO4HyGM0A5x71AMALEyP/bC+UEEWBGSQ+D4/8hQ+ww==} - '@ant-design/pro-card@2.9.7': - resolution: {integrity: sha512-uDDYowmYH1ldRfG8Mb4QOwcEEz6ptRBQDLO1tkVADCRkdOMwz82xlZneR4uVuFyKcuNmgHzarYNncozBKhFuaA==} + '@ant-design/pro-card@2.10.0': + resolution: {integrity: sha512-sLONn1odmE0Wkbse8pol4WiaEzBV8JU5s3FAMflPpycfUcbSaa1ktXzQ7LCo2SAvOS7gkfmpFjBPtrfbigKh4g==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' - '@ant-design/pro-components@2.8.7': - resolution: {integrity: sha512-QhibkPsUJryEjI1QmwUn+XCngGHidu0ekvricL6TIEvPgP+AUAca29XutN5+Mmn8Xfja1ca9HFTHTgFoV74Z7Q==} + '@ant-design/pro-components@2.8.10': + resolution: {integrity: sha512-QHnnIXdmC5GTAtm6i8eeJy5yT9npPlFyxpDm+duiDrTRKRFaAQBduArxlH3DA/hoRCCypzPONxfK9BQNIhIyZA==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-descriptions@2.6.7': - resolution: {integrity: sha512-fgn2d0kDWUODGDWKpgziZuuqPlmIoKxQFJY9Yg4nbaRp8GDDKZeSSqgvW+OxjpYM8dxq31fiz1dZlZnOPoYKpg==} + '@ant-design/pro-descriptions@2.6.10': + resolution: {integrity: sha512-+4MbiOfumnWlW0Awm4m8JML5o3lR649FD24AaivCmr8BQvIAAXdTITnDMXEg8BqvdP4KOvNsStZrvYfqoev33A==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' - '@ant-design/pro-field@3.0.4': - resolution: {integrity: sha512-nJSng/6/pPZFdiFeTtZcBQLNrHg9tIeiKFR1+zzbnQbI3qBOFP9aBZS/+LwkQZcI2G71vrRgz2x5OhHb7AX0wQ==} + '@ant-design/pro-field@3.1.0': + resolution: {integrity: sha512-+Dgp31WjD+iwg9KIRAMgNkfQivkJKMcYBrIBmho1e8ep/O0HgWSp48g70tBIWi/Lfem/Ky2schF7O8XCFouczw==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' - '@ant-design/pro-form@2.31.7': - resolution: {integrity: sha512-0TCtIC/ynbLPoes8sLBFwFbi0tkeNmSU6the2EcyKIKDLfWHDbfkLM1OSFrzv3QD+H8OgFWMkTSOjhMOKSsOBg==} + '@ant-design/pro-form@2.32.0': + resolution: {integrity: sha512-GZnVAMeYv+YHJb17lJ7rX5PYuQPvEA6EotQnPbHi9tGLN3PfexcAd21rqzuO+OrulU2x7TEMDIxtY9MzvvOGbg==} peerDependencies: antd: ^4.24.15 || ^5.11.2 rc-field-form: '>=1.22.0' react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-layout@7.22.4': - resolution: {integrity: sha512-X2WO4L2itXemX4zhS+0NG+8kXQD5SX9sG+zjx/15BmIO3FvsUGqOHgoCg0vhd424EiyPj7WtdMZJ39G1xdgDwA==} + '@ant-design/pro-layout@7.22.7': + resolution: {integrity: sha512-fvmtNA1r9SaasVIQIQt611VSlNxtVxDbQ3e+1GhYQza3tVJi/3gCZuDyfMfTnbLmf3PaW/YvLkn7MqDbzAzoLA==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-list@2.6.7': - resolution: {integrity: sha512-6k/En7pioMgepho/1HMf2DAnkSTZiat1lDg2ggCok2lhSgqXzir7x22ewJQRgPvEiVb6/qqaFQNd7a8dnrFj1w==} + '@ant-design/pro-list@2.6.10': + resolution: {integrity: sha512-xSWwnqCr+hPEYR4qY7nFUaxO5RQBxNlFaPNmobP2i+Im31slk9JuAusgWeIYO0mNhLJuLbxd8CCma2AZij3fBQ==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-provider@2.15.4': - resolution: {integrity: sha512-DBX0JNUNOYXAucVqd/zTdqtXckCDqr2Lo85KIku2YzWdhptDPDZRTNqL04JShjGejDl8fzwQ8yREHgVUfzn6Gg==} + '@ant-design/pro-provider@2.16.2': + resolution: {integrity: sha512-0KmCH1EaOND787Jz6VRMYtLNZmqfT0JPjdUfxhyOxFfnBRfrjyfZgIa6CQoAJLEUMWv57PccWS8wRHVUUk2Yiw==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' @@ -454,16 +460,16 @@ packages: react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-table@3.19.0': - resolution: {integrity: sha512-nL25734d5q5oqtmG7Apn2TNJUnJE8m9dkopXMQdoNZnv8qeRQLBH+i5cZT1yh7FIO8z6QLXleg+KnR/cI7VRRw==} + '@ant-design/pro-table@3.21.0': + resolution: {integrity: sha512-sI81d3FYRv5sXamUc+M5CsHZ9CchuUQgOAPzo5H4oPAVL5h+mkYGRsBzPsxQX7khTNpWjrAtPoRm5ipx3vvWog==} peerDependencies: antd: ^4.24.15 || ^5.11.2 rc-field-form: '>=1.22.0' react: '>=17.0.0' react-dom: '>=17.0.0' - '@ant-design/pro-utils@2.17.0': - resolution: {integrity: sha512-hHKUISjMEoS+E5ltJWyvNTrlEA3IimZNxtDrEhorRIbgVYAlmEN5Mj/ESSofzDM3+UlxiI5+A/Y6IHkByTfDEA==} + '@ant-design/pro-utils@2.18.0': + resolution: {integrity: sha512-8+ikyrN8L8a8Ph4oeHTOJEiranTj18+9+WHCHjKNdEfukI7Rjn8xpYdLJWb2AUJkb9d4eoAqjd5+k+7w81Df0w==} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' @@ -492,8 +498,8 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.3': - resolution: {integrity: sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} '@babel/core@7.23.6': @@ -504,6 +510,10 @@ packages: resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.23.3': resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -511,8 +521,8 @@ packages: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 - '@babel/eslint-parser@7.27.1': - resolution: {integrity: sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==} + '@babel/eslint-parser@7.27.5': + resolution: {integrity: sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 @@ -521,8 +531,12 @@ packages: '@babel/generator@7.2.0': resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==} - '@babel/generator@7.27.3': - resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -550,6 +564,10 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -564,6 +582,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} @@ -608,16 +632,25 @@ packages: resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.4': - resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.25.9': resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.4': - resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true @@ -825,8 +858,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.3': - resolution: {integrity: sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==} + '@babel/plugin-transform-block-scoping@7.27.5': + resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1071,8 +1104,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.4': - resolution: {integrity: sha512-Glp/0n8xuj+E1588otw5rjJkTXfzW7FjH3IIUrfqiZOPQCd2vbg8e+DQE8jK9g4V5/zrxFW+D9WM9gboRPELpQ==} + '@babel/plugin-transform-regenerator@7.27.5': + resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1172,16 +1205,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.27.4': - resolution: {integrity: sha512-H7QhL0ucCGOObsUETNbB2PuzF4gAvN8p32P6r91bX7M/hk4bx+3yz2hTwHL9d/Efzwu1upeb4/cd7oSxCzup3w==} + '@babel/runtime-corejs3@7.27.6': + resolution: {integrity: sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==} engines: {node: '>=6.9.0'} '@babel/runtime@7.23.6': resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.4': - resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': @@ -1192,8 +1229,16 @@ packages: resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.3': - resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@bloomberg/record-tuple-polyfill@0.0.4': @@ -1760,6 +1805,14 @@ packages: '@iconify/utils@2.1.1': resolution: {integrity: sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1796,6 +1849,9 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -1808,15 +1864,21 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} @@ -1984,17 +2046,17 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs - '@oceanbase-odc/monaco-plugin-ob@1.4.2': - resolution: {integrity: sha512-ftDJ+d0W0iKD1Ex81DSQBfiWGdNfLh2DpKL0Bpv0ECnURp/+ldv2ihHl7ORwsDu+BAcLzRUWz/puePY8l4Da4w==} + '@oceanbase-odc/monaco-plugin-ob@1.5.3': + resolution: {integrity: sha512-Wbc/K7rMp3AWxEwgSgKhd5ix3+vCqCfXTuBLx1IbyzzGmwLRASVymEtzSlso7y0PfdgHVlI51gPdR775nUurAw==} peerDependencies: monaco-editor: ~0.38.0 - '@oceanbase-odc/ob-intl-cli@2.1.4': - resolution: {integrity: sha512-AKoGr7cWn3AyvTYB2xoFZtfikBgyRxDWUya1IXbVGZeoBd4GGE7JcwFLmFplYNmtUFrOhyP7Vdkz2SNFAH6gQg==} + '@oceanbase-odc/ob-intl-cli@2.2.0': + resolution: {integrity: sha512-qCJriKatOEwHICu9sGM5b7PYYtWxtVtB1V+P/ZBTwACXQHhQEgFlBCnt9CDAoMIOM9iDEeFvV13VSWt/kGW8ig==} hasBin: true - '@oceanbase-odc/ob-parser-js@3.0.5': - resolution: {integrity: sha512-MwINKzUu/SQV/0XT8NBanS9BR4d4ikEnjKMLvKaimQTj2scYmzKpIeakGiExUq4HFByAI+A+lwuWt9orEXhwAw==} + '@oceanbase-odc/ob-parser-js@3.1.2': + resolution: {integrity: sha512-BWtccGg7zR4q0Rc7J+byT4kyOVKtK1993oMW2myGH8pBSDRiagAZMjm5Af2tZUVbJs67UxV52SVDDnJ097NToA==} '@oceanbase-odc/ob-react-data-grid@4.0.0': resolution: {integrity: sha512-CYmeqa+Ocpwt8PpzEiihgT0NS3bDz7futJT5QPUczZJG/rtfOLKpnbZ/CacMDAKRQob3Sdo6dSB0yAk0nfa3BA==} @@ -2067,8 +2129,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/trigger@2.2.6': - resolution: {integrity: sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==} + '@rc-component/trigger@2.2.7': + resolution: {integrity: sha512-Qggj4Z0AA2i5dJhzlfFSmg1Qrziu8dsdHOihROL5Kl18seO2Eh/ZaTYt2c8a/CyGaTChnFry7BEYew1+/fhSbA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -2199,6 +2261,10 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@stagewise/toolbar@0.6.2': + resolution: {integrity: sha512-WN7PWaOT6YQKjJYL4/85V5UU0eZEws+/UBT/J4wJOEbFxoluLuchqh7xVTmUZTtw0q0xpzlgX8Vb0kAZf/pjmw==} + deprecated: 'This package is deprecated and has been replaced by the stagewise CLI. Get started with the CLI here: https://stagewise.io/docs' + '@stylelint/postcss-css-in-js@0.37.3': resolution: {integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -2305,72 +2371,72 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.11.29': - resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} + '@swc/core-darwin-arm64@1.12.4': + resolution: {integrity: sha512-HihKfeitjZU2ab94Zf893sxzFryLKX0TweGsNXXOLNtkSMLw50auuYfpRM0BOL9/uXXtuCWgRIF6P030SAX5xQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.29': - resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} + '@swc/core-darwin-x64@1.12.4': + resolution: {integrity: sha512-meYCXHyYb6RDdu2N5PNAf0EelyxPBFhRcVo4kBFLuvuNb0m6EUg///VWy8MUMXq9/s9uzGS9kJVXXdRdr/d6FA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.29': - resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} + '@swc/core-linux-arm-gnueabihf@1.12.4': + resolution: {integrity: sha512-szfDbf7mE8V64of0q/LSqbk+em+T+TD3uqnH40Z7Qu/aL8vi5CHgyLjWG2SLkLLpyjgkAUF6AKrupgnBYcC2NA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.29': - resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} + '@swc/core-linux-arm64-gnu@1.12.4': + resolution: {integrity: sha512-n0IY76w+Scx8m3HIVRvLkoResuwsQgjDfAk9bxn99dq4leQO+mE0fkPl0Yw/1BIsPh+kxGfopIJH9zsZ1Z2YrA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.11.29': - resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} + '@swc/core-linux-arm64-musl@1.12.4': + resolution: {integrity: sha512-wE5jmFi5cEQyLy8WmCWmNwfKETrnzy2D8YNi/xpYWpLPWqPhcelpa6tswkfYlbsMmmOh7hQNoTba1QdGu0jvHQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-x64-gnu@1.11.29': - resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} + '@swc/core-linux-x64-gnu@1.12.4': + resolution: {integrity: sha512-6S50Xd/7ePjEwrXyHMxpKTZ+KBrgUwMA8hQPbArUOwH4S5vHBr51heL0iXbUkppn1bkSr0J0IbOove5hzn+iqQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.11.29': - resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} + '@swc/core-linux-x64-musl@1.12.4': + resolution: {integrity: sha512-hbYRyaHhC13vYKuGG5BrAG5fjjWEQFfQetuFp/4QKEoXDzdnabJoixxWTQACDL3m0JW32nJ+gUzsYIPtFYkwXg==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.11.29': - resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} + '@swc/core-win32-arm64-msvc@1.12.4': + resolution: {integrity: sha512-e6EbfjPL8GA/bb1lc9Omtxjlz+1ThTsAuBsy4Q3Kpbuh6B3jclg8KzxU/6t91v23wG593mieTyR5f3Pr7X3AWw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.29': - resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} + '@swc/core-win32-ia32-msvc@1.12.4': + resolution: {integrity: sha512-RG2FzmllBTUf4EksANlIvLckcBrLZEA0t13LIa6L213UZKQfEuDNHezqESgoVhJMg2S/tWauitATOCFgZNSmjg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.29': - resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} + '@swc/core-win32-x64-msvc@1.12.4': + resolution: {integrity: sha512-oRHKnZlR83zaMeVUCmHENa4j5uNRAWbmEpjYbzRcfC45LPFNWKGWGAGERLx0u87XMUtTGqnVYxnBTHN/rzDHOw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.29': - resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} + '@swc/core@1.12.4': + resolution: {integrity: sha512-hn30ebV4njAn0NAUM+3a0qCF+MJgqTNSrfA/hUAbC6TVjOQy2OYGQwkUvCu/V7S2+rZxrUsTpKOnZ7qqECZV9Q==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -2384,8 +2450,8 @@ packages: '@swc/helpers@0.5.1': resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -2395,18 +2461,18 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@4.39.1': - resolution: {integrity: sha512-E1g5oEiBq8l1xU1ELXieEBD55oZQscn4kaHidsxdCH1egAk9Tx4sTi8rgQiayoaEWESOurRdDEf2wJHp9/BRDg==} + '@tanstack/query-core@4.40.0': + resolution: {integrity: sha512-7MJTtZkCSuehMC7IxMOCGsLvHS3jHx4WjveSrGsG1Nc1UQLjaFwwkpLA2LmPfvOAxnH4mszMOBFD6LlZE+aB+Q==} - '@tanstack/react-query-devtools@4.39.1': - resolution: {integrity: sha512-Sv1RdoM6jGpXzvCtHNMBh6Fi9WVpSNap9NS+KUhVt+iPdV9exS5cNna4EjyvLWQ4fIKv/y67M9zStxlq1WV3bw==} + '@tanstack/react-query-devtools@4.40.1': + resolution: {integrity: sha512-g8g2CCDt91CNhkLsKLVXVBVQSUubExnBdprwwjY5FFM+ZBjv1WfCpGiX1UOezgjVhNxqoi1Is+iMYShdOMoI8Q==} peerDependencies: - '@tanstack/react-query': ^4.39.1 + '@tanstack/react-query': ^4.40.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/react-query@4.39.1': - resolution: {integrity: sha512-eV8PchGpgqE5OMQ5LEfYmgwdKI3uZLSXekfkCpqvLNExE1bDFsPL1zFlFid5CSe7gf2zGju00PnsBoJcEBUJMw==} + '@tanstack/react-query@4.40.1': + resolution: {integrity: sha512-mgD07S5N8e5v81CArKDWrHE4LM7HxZ9k/KLeD3+NUD9WimGZgKIqojUZf/rXkfAMYZU9p0Chzj2jOXm7xpgHHQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2457,8 +2523,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -2568,8 +2634,8 @@ packages: '@types/eslint@7.29.0': resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -2593,6 +2659,11 @@ packages: '@types/hoist-non-react-statics@3.3.6': resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==} + '@types/hoist-non-react-statics@3.3.7': + resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} + peerDependencies: + '@types/react': ^16.0.0 + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -2629,8 +2700,8 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash@4.17.17': - resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} + '@types/lodash@4.17.18': + resolution: {integrity: sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -2647,9 +2718,6 @@ packages: '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - '@types/node@9.6.61': - resolution: {integrity: sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2659,8 +2727,8 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} '@types/react-dom@16.9.25': resolution: {integrity: sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==} @@ -2849,38 +2917,38 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@umijs/ast@4.4.11': - resolution: {integrity: sha512-TeOYsiFS4SdKd9MpeeL1C4hD8ht3WV/6F43vqhbS5I1hyoV999euuFECnKevcd9tXI72HOMPKqa3e+AxRTinoA==} + '@umijs/ast@4.4.12': + resolution: {integrity: sha512-+u7W9uO9NKwm9SsI2f8l8JTYqrD+Ff/GaxyHeK+YzieSnS0kr9kMs6PoDxxGMmYWbKszPBGckXJHvAXtC1GVoA==} - '@umijs/babel-preset-umi@4.4.11': - resolution: {integrity: sha512-hod7QZ9Kx2lDup0W1RrhJkTVUkH8tR3DWiGwzcyVCB1ArGmOzyfVUj2CyxfM3p5e1Iz8sfrc8WiArrdQtw77Jg==} + '@umijs/babel-preset-umi@4.4.12': + resolution: {integrity: sha512-c63MHYgEWid8jZbA7Wst9PZIhRk5HTKvvCsJ0WJH7cROjC0+DjXlm9yl11omAY5Jj43iLv00w6vZOkNQc4WWYw==} - '@umijs/bundler-esbuild@4.4.11': - resolution: {integrity: sha512-8gNB7hZtA1iRZcHYFwopmrNFrtkzd2yAGxBkdxAXd+Ntcsr6GY/3AF/VInn21mTNFRaQnu5qJKENnIAxKNl8Yg==} + '@umijs/bundler-esbuild@4.4.12': + resolution: {integrity: sha512-MZGITWDR9LyO4DW/gLLWScz1523ZfhMKNsnWxOdqQWRG2Y0ft2SxU+domO/JOcOB4fiTD0rauG2x5V2sV7ULDw==} hasBin: true '@umijs/bundler-mako@0.11.10': resolution: {integrity: sha512-RNop0kmMXJUOLQYp61ZW3NVdD8ikOPW0zoCmgkN+nIUVw+QKcA+9tSPEcT6Rr8id9+Ed3lMjLqktev20guRp1g==} - '@umijs/bundler-utils@4.4.11': - resolution: {integrity: sha512-H9XNvR8d45Zh7efzhRkSkcDcqVJUWji2Df9rXrxQA/VBUQkk87RTQlfpoIzfgfsWFZTQ3NC+ggRAoQUGMeUySA==} + '@umijs/bundler-utils@4.4.12': + resolution: {integrity: sha512-V78hkr3o6XnYqMEdpKlDmKzDaDGI4c7SBphIzt1eNUKaha/WcuVuXyQ0mnX6SzbFmNIF/PwHjZ2SOGxlJFyiHQ==} - '@umijs/bundler-vite@4.4.11': - resolution: {integrity: sha512-7Qex4G1bWTEsyW9OoWn73MPdmBBRXUo5qDj2e0/HYejSfaT7mSoIpaq9JML5pPW0FSv+trrs8l3cc0fJNM9n1Q==} + '@umijs/bundler-vite@4.4.12': + resolution: {integrity: sha512-C/qE6zQ0ZrtM2Vsyw8NRtYOyGOZ7ptbldmhQS33dwLSBx4fncEUvkxNi6HYhgMPLDkjVO/WACfvJ3FOUnAqFHw==} hasBin: true - '@umijs/bundler-webpack@4.4.11': - resolution: {integrity: sha512-2u2WlR/WtNxeOnjGFUMV0az2ekQVeTbVYnTkvIHGslCUnhZ8YpgiUkMHIdqviPUgCANA+u9vH1mZzELCyod2PA==} + '@umijs/bundler-webpack@4.4.12': + resolution: {integrity: sha512-ih4SxtyJLJw1sg+r9+KWNr+57n4Lg+dmI+z4wSjwSoWuVdGyd346iindqcqBJwttRmxS+OIh4IVn30/Y2l15Ww==} hasBin: true '@umijs/case-sensitive-paths-webpack-plugin@1.0.1': resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==} - '@umijs/core@4.4.11': - resolution: {integrity: sha512-gND+hLhnvjOKH/vQJ/llPfD4Ogde3TP4fgJUVjHk3kNF3DbBiHqYKhViH5SMamGyPhhrun4A3Mic3YQvmjVtBg==} + '@umijs/core@4.4.12': + resolution: {integrity: sha512-Pz5fWUsH3OzDqIZvLp03GQwwe+YtvEn/VZ8177COkRXqLXZkIVMfE8+t7gNvC6thVPcZwnur1c1Fg2tdKMExdQ==} - '@umijs/did-you-know@1.0.3': - resolution: {integrity: sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw==} + '@umijs/did-you-know@1.0.4': + resolution: {integrity: sha512-eAHGNRZe9b7nOXINBIWNga/Nh0LWyTILXtFVcEDiJBXhehUi5OtpPHnA18KCgfmsOFxYPt5fzdumHTYQKm92Vw==} '@umijs/es-module-parser-darwin-arm64@0.0.7': resolution: {integrity: sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw==} @@ -2951,8 +3019,8 @@ packages: '@umijs/history@5.3.1': resolution: {integrity: sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA==} - '@umijs/lint@4.4.11': - resolution: {integrity: sha512-vzbladpPXc740mE4Ru+h7PiwDxSSOf0F7Qjd3PggFk7DQ9tfQYJmub0/GMnHm6/hPANt0Oyn4JEDzoA5R5oZdg==} + '@umijs/lint@4.4.12': + resolution: {integrity: sha512-Kh/pDGlfDFkS0TrdxV99QsnxQIH1cRClh1mS50FZFSK79NsmWO75H3VdgOo8UUH01i4IWt8zaTDwgL1H3vHrBg==} '@umijs/mako-darwin-arm64@0.11.10': resolution: {integrity: sha512-kCn0mJx2Hq4RIkMNIzMDOdO4JSWq120auFmSEleHkfrFFFqSWX2qgz5mR5VI7kaPH0GUh0+hwfRkjEVGysJGjA==} @@ -3011,21 +3079,21 @@ packages: engines: {node: '>= 16'} hasBin: true - '@umijs/max@4.4.11': - resolution: {integrity: sha512-x6V7A23jiESHCsMW1uR9bCO7rZ7/Wfu3cjvLwVWavjYrRSNjYSh7qhbtjbbtqmiVjX/O6SftkzaGa5L0OgW5IQ==} + '@umijs/max@4.4.12': + resolution: {integrity: sha512-9BWHNE7CWnjxZwJGE5M8ylwu2dmuPDxHnSblYXZblqRMRr4c6YdNuPKk3EtRJKp4yLnHLeiqli7DPXRFMSaFRA==} hasBin: true - '@umijs/mfsu@4.4.11': - resolution: {integrity: sha512-FDT2162gdBrDga3obwijuqe+2PC7w/5Al4C+W+vi9tlbK28rrgn0ZYXWK7dvidbcSrzekVqB8b1jkfAAj4KOcQ==} + '@umijs/mfsu@4.4.12': + resolution: {integrity: sha512-QS9ZKJqPJ1roxQzcZnwmrpTLmC3TwhiUIlVqeNeYU58eOS00Yw+QAhp+ngpOrfqqPpxyxzfCnz5bxn05QaoNwQ==} - '@umijs/plugin-run@4.4.11': - resolution: {integrity: sha512-IFHcwX5fQO+/CDhdJv/qVtJECa7WCQi8pmKn81EQ39bmsgitio9WarRu3Mr46rA5FchRRjVVagdjaTXsriEACg==} + '@umijs/plugin-run@4.4.12': + resolution: {integrity: sha512-npZ04MFY8yjir3tIluzWD1RTOfZ8Jjg9P2qukqDmoSyerY79kzC+CB/u4tc6myYa1xDtz3+Z0gxQLjoUUTIx8Q==} - '@umijs/plugins@4.4.11': - resolution: {integrity: sha512-5I3cuCSr5yW+uDlBVwwghOcOj9Q+Gqy0X3mWzKCoPfKWtxDK5q4CxoR1OfiBzRJ+asS+/CPHg4CVDJA+cmxSTA==} + '@umijs/plugins@4.4.12': + resolution: {integrity: sha512-OWvttY1KAVa2LOuak30l5vT0Vf0/kpBu7595h9ftTFcHEUUIu+69DSZXiSZ72VeQOMYaB3vri4RO1iMp8EyHww==} - '@umijs/preset-umi@4.4.11': - resolution: {integrity: sha512-Ea3IM3ZI0hsIQo9mY7dr2zRTXRzmltJD8OWGuQFVi/sb3g4ViKwEaukvTI91yY7v60qP5kDP9SyHoZsFoMxJ9w==} + '@umijs/preset-umi@4.4.12': + resolution: {integrity: sha512-Z1ZvfHDfdMuPMDEt2uB5fMDLfVVo9ZSf4uGX344DSy+A0iWsLg7xEWrLlAh4SgpxQjrQ+tGPGQgK61s+PJ/JAw==} '@umijs/react-refresh-webpack-plugin@0.5.11': resolution: {integrity: sha512-RtFvB+/GmjRhpHcqNgnw8iWZpTlxOnmNxi8eDcecxMmxmSgeDj25LV0jr4Q6rOhv3GTIfVGBhkwz+khGT5tfmg==} @@ -3053,8 +3121,8 @@ packages: webpack-plugin-serve: optional: true - '@umijs/renderer-react@4.4.11': - resolution: {integrity: sha512-+K2wY1LgpSZIs/Vz2tZ2nKkUNCTf+M43yb1bwTirLy+WQ2VZTB+qM0ti2abhXjZvwzq+WJKkCxhn9s3oJRKDpA==} + '@umijs/renderer-react@4.4.12': + resolution: {integrity: sha512-vG6klDjXAWi+aH1q1hGmDkSbqT4OvECJI3AVsaXZPaq53mhkli3OdiTnQj52zFD5FE3At5cgPK159bxuD/UXNA==} peerDependencies: react: '>=16.8' react-dom: '>=16.8' @@ -3062,11 +3130,11 @@ packages: '@umijs/route-utils@4.0.1': resolution: {integrity: sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==} - '@umijs/server@4.4.11': - resolution: {integrity: sha512-W6e7fOWZRMogB46IrIK1bgUvK5+9OVuFiCcwgISmof22anqvvrs9BdgUyMJSyrsDzXoXAUIo8lODOAMDg3mRfQ==} + '@umijs/server@4.4.12': + resolution: {integrity: sha512-t4qX/A4/ROQ3+JiBJi8YugK6d+pEIv4xXqckQjDnL8YBooG1OC5gIdCMczTQser4PVzNxy2q8ufJ9lPAj79MTA==} - '@umijs/test@4.4.11': - resolution: {integrity: sha512-RkYsfqPg7VKQwoR/prAV3CQ95VD2PGooGXJ5ZNc00Ej/5iOi8LUAOTuSCRkGd0Zhm3ZoH7xAphPyqxg0/pU00w==} + '@umijs/test@4.4.12': + resolution: {integrity: sha512-jzX2aLckXIES7uaGQPnJX3VNZZ6veaSzVwAKVp1qBPNkjn3YwUdo4EqeLIrMe3jKiA+0JgB1vIsrw7Yf3tjFTQ==} '@umijs/ui@3.0.1': resolution: {integrity: sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw==} @@ -3076,14 +3144,14 @@ packages: peerDependencies: react: '*' - '@umijs/utils@4.4.11': - resolution: {integrity: sha512-xhXia0yU8JZzpW75TIKDc0tlzvvDGPuuUUXaN3F6FlSSfR13bCCzX+fOTzjo95M4Sz43Vsgub0MK27hXwpCHlQ==} + '@umijs/utils@4.4.12': + resolution: {integrity: sha512-1Ea+STKP6IxI7yhsURJooCRX//BXnSjgD86XoR4JiYB9MSOhAeS/vpY9f48PpEe/jpKO+JfieqbY4hWHGZGJZw==} '@umijs/valtio@1.0.4': resolution: {integrity: sha512-2PmAU4rNQbBqrWpJ86Si9UGC23JapkYw8k7Hna6V8DHLaEYJENdp2e/IKLPHSPghzrdQtbUHSoOAUsBd4i4OzQ==} - '@umijs/zod2ts@4.4.11': - resolution: {integrity: sha512-B4CGKU6N9Qws5zNEu8TJjQgp61xAEdrBEmXGStXLl32f3zz0oUcIq/N4vBYciCDbwjHQKviqGcl3iSy2pbn7BA==} + '@umijs/zod2ts@4.4.12': + resolution: {integrity: sha512-NZVCmNwryU6r/M3Ymyv7FyJWoeucTZmeO2OK+eCgPkQbIst3mfTBeDmXAgL3+Lr3bB1m6u489AQRJLEP844Bzg==} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -3184,8 +3252,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -3306,8 +3374,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - antd@5.25.4: - resolution: {integrity: sha512-yXdWqq1NJSZnD1HoPZWnWuQJGVYYnB3h0Ufsz4sbt3T0N9SdJ4G9GPpLMk8Gn9zWtwBekfR4THPVZ9uzAyhBHQ==} + antd@5.26.1: + resolution: {integrity: sha512-CiLGZ2Ftld+fuoj+U3OL8uouuqUppqFJnW4O/4bOgSWzM9XsJGibpNtUa9QArhrZ5ndfnzlPP/4RVXUK/xfSvQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -3525,8 +3593,8 @@ packages: axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -3571,10 +3639,10 @@ packages: peerDependencies: styled-components: '>= 2' - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -3673,11 +3741,11 @@ packages: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -3715,6 +3783,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -3810,8 +3883,11 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001720: - resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} + caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + + caniuse-lite@1.0.30001735: + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4027,8 +4103,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} compute-scroll-into-view@1.0.20: @@ -4111,17 +4187,20 @@ packages: copy-to@2.0.1: resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} - core-js-compat@3.42.0: - resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + core-js-compat@3.43.0: + resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} - core-js-pure@3.42.0: - resolution: {integrity: sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==} + core-js-pure@3.43.0: + resolution: {integrity: sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==} + + core-js-pure@3.45.0: + resolution: {integrity: sha512-OtwjqcDpY2X/eIIg1ol/n0y/X8A9foliaNt1dSK0gV3J2/zw+89FcNG3mPK+N8YWts4ZFUPxnrAzsxs/lf8yDA==} core-js@3.34.0: resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==} - core-js@3.42.0: - resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} + core-js@3.43.0: + resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -4242,8 +4321,8 @@ packages: css-what@2.1.3: resolution: {integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} css@3.0.0: @@ -4675,8 +4754,11 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - electron-to-chromium@1.5.161: - resolution: {integrity: sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==} + electron-to-chromium@1.5.171: + resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} + + electron-to-chromium@1.5.207: + resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} electron@22.3.27: resolution: {integrity: sha512-7Rht21vHqj4ZFRnKuZdFqZFsvMBCmDqmjetiMqPtF+TmTBiGne1mnstVXOA/SRGhN2Qy5gY5bznJKpiqogjM8A==} @@ -4716,8 +4798,8 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} end-or-error@1.0.1: resolution: {integrity: sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==} @@ -4727,8 +4809,8 @@ packages: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} enhanced-resolve@5.9.3: @@ -5182,8 +5264,8 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5274,6 +5356,15 @@ packages: flush-write-stream@1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -5313,8 +5404,12 @@ packages: resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} engines: {node: '>= 0.12'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} formdata-polyfill@4.0.10: @@ -5365,8 +5460,8 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} fs-write-stream-atomic@1.0.10: resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} @@ -6456,8 +6551,8 @@ packages: engines: {node: '>=6'} hasBin: true - less@4.3.0: - resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + less@4.4.1: + resolution: {integrity: sha512-X9HKyiXPi0f/ed0XhgUlBeFfxrlDP3xR4M7768Zl+WXLUViuL9AOPPJP4nCV0tgRWvTYvpNmN0SFhZOQzy16PA==} engines: {node: '>=14'} hasBin: true @@ -6866,8 +6961,8 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -7214,8 +7309,8 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} once@1.4.0: @@ -7807,8 +7902,8 @@ packages: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -7944,8 +8039,8 @@ packages: pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -8353,15 +8448,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-table@7.50.5: - resolution: {integrity: sha512-FDZu8aolhSYd3v9KOc3lZOVAU77wmRRu44R0Wfb8Oj1dXRUsloFaXMSl6f7yuWZUxArJTli7k8TEOX2mvhDl4A==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-table@7.51.0: - resolution: {integrity: sha512-7ZlvW6lB0IDKaSFInD6OfJsCepSJJtfsQv2PZLtzEeZd/PLzQnKliXPaoZqkqDdLdJ3jxE2x4sane4DjxcAg+g==} + rc-table@7.51.1: + resolution: {integrity: sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -9200,8 +9288,8 @@ packages: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + socks@2.8.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@2.8.0: @@ -9256,9 +9344,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} spawn-command@0.0.2: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} @@ -9590,8 +9678,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - swr@2.3.3: - resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -9644,8 +9732,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - terser@5.40.0: - resolution: {integrity: sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -9872,16 +9960,16 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - umi@4.4.11: - resolution: {integrity: sha512-KWPe91DJOyuNurSjzFTbEUypxrFjV0wVEdEXFid6m2IhM2iOepvkfeqk37GpvE9rMoLwo+i/1MIZm2xKhZATbQ==} + umi@4.4.12: + resolution: {integrity: sha512-xOI6bDP5wwHil+acmWOmTVvCEnjeEE5/ULXT3zRZOckgi+JQ5Omw2z5uo1xLRcVJjFz0qc7ywEL07wES9gIFew==} engines: {node: '>=14'} hasBin: true @@ -10354,8 +10442,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.25.49: - resolution: {integrity: sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zrender@5.6.1: resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} @@ -10406,14 +10494,26 @@ snapshots: '@ant-design/cssinjs-utils@1.1.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) '@ant-design/cssinjs@1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + stylis: 4.3.6 + + '@ant-design/cssinjs@1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@babel/runtime': 7.28.3 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -10425,7 +10525,7 @@ snapshots: '@ant-design/fast-color@2.0.6': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@ant-design/icons-svg@4.4.2': {} @@ -10433,7 +10533,7 @@ snapshots: dependencies: '@ant-design/colors': 6.0.0 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 lodash: 4.17.21 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -10444,7 +10544,7 @@ snapshots: dependencies: '@ant-design/colors': 7.2.1 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -10452,13 +10552,13 @@ snapshots: '@ant-design/moment-webpack-plugin@0.0.3': {} - '@ant-design/pro-card@2.9.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-card@2.10.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -10467,33 +10567,33 @@ snapshots: transitivePeerDependencies: - react-dom - '@ant-design/pro-components@2.8.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-components@2.8.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/pro-card': 2.9.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-descriptions': 2.6.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-field': 3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-form': 2.31.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-layout': 7.22.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-list': 2.6.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-card': 2.10.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-descriptions': 2.6.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-field': 3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-form': 2.32.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-layout': 7.22.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-list': 2.6.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/pro-skeleton': 2.2.1(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-table': 3.19.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-table': 3.21.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) transitivePeerDependencies: - rc-field-form - '@ant-design/pro-descriptions@2.6.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-descriptions@2.6.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/pro-field': 3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-form': 2.31.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-field': 3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-form': 2.32.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/pro-skeleton': 2.2.1(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-resize-observer: 0.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -10502,12 +10602,12 @@ snapshots: - rc-field-form - react-dom - '@ant-design/pro-field@3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-field@3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 '@chenshuai2144/sketch-color': 1.0.9(react@17.0.2) antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 @@ -10516,17 +10616,17 @@ snapshots: lodash-es: 4.17.21 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 - swr: 2.3.3(react@17.0.2) + swr: 2.3.6(react@17.0.2) transitivePeerDependencies: - react-dom - '@ant-design/pro-form@2.31.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-form@2.32.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-field': 3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-field': 3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 '@chenshuai2144/sketch-color': 1.0.9(react@17.0.2) '@umijs/use-params': 1.0.9(react@17.0.2) antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -10540,13 +10640,13 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@ant-design/pro-layout@7.22.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-layout@7.22.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 '@umijs/route-utils': 4.0.1 '@umijs/use-params': 1.0.9(react@17.0.2) antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -10558,18 +10658,18 @@ snapshots: rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - swr: 2.3.3(react@17.0.2) + swr: 2.3.6(react@17.0.2) warning: 4.0.3 - '@ant-design/pro-list@2.6.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-list@2.6.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-card': 2.9.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-field': 3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-table': 3.19.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-card': 2.10.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-field': 3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-table': 3.21.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 dayjs: 1.11.13 @@ -10580,35 +10680,35 @@ snapshots: transitivePeerDependencies: - rc-field-form - '@ant-design/pro-provider@2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-provider@2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 '@ctrl/tinycolor': 3.6.1 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) dayjs: 1.11.13 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - swr: 2.3.3(react@17.0.2) + swr: 2.3.6(react@17.0.2) '@ant-design/pro-skeleton@2.2.1(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@ant-design/pro-table@3.19.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-table@3.21.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-card': 2.9.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-field': 3.0.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-form': 2.31.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-utils': 2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-card': 2.10.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-field': 3.1.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-form': 2.32.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/pro-utils': 2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 '@dnd-kit/core': 6.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react@17.0.2) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react@17.0.2) @@ -10624,11 +10724,11 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@ant-design/pro-utils@2.17.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@ant-design/pro-utils@2.18.0(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@ant-design/pro-provider': 2.15.4(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@babel/runtime': 7.27.4 + '@ant-design/pro-provider': 2.16.2(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.28.3 antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 dayjs: 1.11.13 @@ -10638,11 +10738,11 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) safe-stable-stringify: 2.5.0 - swr: 2.3.3(react@17.0.2) + swr: 2.3.6(react@17.0.2) '@ant-design/react-slick@1.0.2(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 json2mq: 0.2.0 react: 17.0.2 @@ -10651,7 +10751,7 @@ snapshots: '@ant-design/react-slick@1.1.2(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 json2mq: 0.2.0 react: 17.0.2 @@ -10675,20 +10775,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.3': {} + '@babel/compat-data@7.27.5': {} '@babel/core@7.23.6': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.23.6) - '@babel/helpers': 7.27.4 - '@babel/parser': 7.27.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.23.6) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -10701,14 +10801,34 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 + '@babel/generator': 7.27.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.4 - '@babel/parser': 7.27.4 + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -10725,7 +10845,7 @@ snapshots: eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/eslint-parser@7.27.1(@babel/core@7.27.4)(eslint@7.32.0)': + '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@7.32.0)': dependencies: '@babel/core': 7.27.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 @@ -10735,27 +10855,35 @@ snapshots: '@babel/generator@7.2.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 jsesc: 2.5.2 lodash: 4.17.21 source-map: 0.5.7 trim-right: 1.0.1 - '@babel/generator@7.27.3': + '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.3 + '@babel/compat-data': 7.27.5 '@babel/helper-validator-option': 7.27.1 browserslist: 4.25.0 lru-cache: 5.1.1 @@ -10774,6 +10902,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -10792,41 +10933,61 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.23.6)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.23.6)': + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-plugin-utils@7.27.1': {} @@ -10848,17 +11009,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.27.1': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -10872,14 +11042,19 @@ snapshots: dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.4': + '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 '@babel/highlight@7.25.9': dependencies: @@ -10888,9 +11063,13 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.27.4': + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + + '@babel/parser@7.28.3': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: @@ -10948,24 +11127,24 @@ snapshots: dependencies: '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.4)': @@ -10973,23 +11152,28 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-do-expressions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-do-expressions@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-extensions@7.0.0-beta.32(@babel/core@7.27.4)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-function-bind@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-export-extensions@7.0.0-beta.32(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 + + '@babel/plugin-syntax-function-bind@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': @@ -11002,14 +11186,19 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': @@ -11017,44 +11206,49 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': @@ -11062,6 +11256,11 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -11096,7 +11295,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 @@ -11217,10 +11416,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-simple-access': 7.27.1 transitivePeerDependencies: @@ -11234,6 +11433,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -11302,6 +11509,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -11341,14 +11556,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': @@ -11358,7 +11573,7 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -11368,7 +11583,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.4(@babel/core@7.27.4)': + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 @@ -11423,6 +11638,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -11448,7 +11674,7 @@ snapshots: '@babel/preset-env@7.27.2(@babel/core@7.27.4)': dependencies: - '@babel/compat-data': 7.27.3 + '@babel/compat-data': 7.27.5 '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 @@ -11466,7 +11692,7 @@ snapshots: '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) @@ -11500,7 +11726,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-regenerator': 7.27.4(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) @@ -11516,7 +11742,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + core-js-compat: 3.43.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -11525,7 +11751,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.27.4)': @@ -11551,35 +11777,65 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime-corejs3@7.27.4': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - core-js-pure: 3.42.0 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/runtime-corejs3@7.27.6': + dependencies: + core-js-pure: 3.43.0 '@babel/runtime@7.23.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.27.4': {} + '@babel/runtime@7.27.6': {} + + '@babel/runtime@7.28.3': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@babel/traverse@7.27.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 - '@babel/parser': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.3': + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -11592,58 +11848,58 @@ snapshots: reactcss: 1.2.3(react@17.0.2) tinycolor2: 1.6.0 - '@csstools/postcss-color-function@1.1.1(postcss@8.5.4)': + '@csstools/postcss-color-function@1.1.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.4)': + '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.4)': + '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.4)': + '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.4)': + '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.6)': dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.4)': + '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.4)': + '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.4)': + '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.4)': + '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-unset-value@1.0.2(postcss@8.5.4)': + '@csstools/postcss-unset-value@1.0.2(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': dependencies: @@ -12057,7 +12313,7 @@ snapshots: '@formatjs/intl-utils@2.3.0': {} - '@formatjs/intl@2.2.1(typescript@4.9.5)': + '@formatjs/intl@2.2.1(typescript@5.9.2)': dependencies: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/fast-memoize': 1.2.1 @@ -12067,7 +12323,7 @@ snapshots: intl-messageformat: 9.13.0 tslib: 2.8.1 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 '@gar/promisify@1.1.3': {} @@ -12114,6 +12370,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -12139,9 +12401,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.30 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -12167,7 +12429,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -12175,7 +12437,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -12184,10 +12446,15 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -12198,18 +12465,25 @@ snapshots: '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@juggle/resize-observer@3.4.0': {} '@loadable/component@5.15.2(react@17.0.2)': @@ -12366,41 +12640,41 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@oceanbase-odc/monaco-plugin-ob@1.4.2(monaco-editor@0.36.1)': + '@oceanbase-odc/monaco-plugin-ob@1.5.3(monaco-editor@0.36.1)': dependencies: - '@oceanbase-odc/ob-parser-js': 3.0.5 + '@oceanbase-odc/ob-parser-js': 3.1.2 antlr4: 4.8.0 comlink: 4.4.2 monaco-editor: 0.36.1 - '@oceanbase-odc/ob-intl-cli@2.1.4(chokidar@3.6.0)(encoding@0.1.13)(prettier@2.8.8)(typescript@4.9.5)': - dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.3 - '@babel/parser': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-do-expressions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-export-extensions': 7.0.0-beta.32(@babel/core@7.27.4) - '@babel/plugin-syntax-function-bind': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 - '@swc/cli': 0.3.14(@swc/core@1.11.29)(chokidar@3.6.0) - '@swc/core': 1.11.29 + '@oceanbase-odc/ob-intl-cli@2.2.0(chokidar@3.6.0)(encoding@0.1.13)(prettier@2.8.8)(typescript@5.9.2)': + dependencies: + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-do-expressions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-export-extensions': 7.0.0-beta.32(@babel/core@7.28.3) + '@babel/plugin-syntax-function-bind': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + '@swc/cli': 0.3.14(@swc/core@1.12.4)(chokidar@3.6.0) + '@swc/core': 1.12.4 colors: 1.4.0 commander: 11.1.0 glob: 10.4.5 google-translate-api-x: 10.7.2 lodash: 4.17.21 node-fetch: 2.6.7(encoding@0.1.13) - prettier-eslint: 16.4.2(typescript@4.9.5) - prettier-plugin-organize-imports: 3.2.4(prettier@2.8.8)(typescript@4.9.5) + prettier-eslint: 16.4.2(typescript@5.9.2) + prettier-plugin-organize-imports: 3.2.4(prettier@2.8.8)(typescript@5.9.2) prettier-plugin-packagejson: 2.5.15(prettier@2.8.8) transitivePeerDependencies: - '@swc/helpers' @@ -12414,15 +12688,15 @@ snapshots: - svelte-eslint-parser - typescript - '@oceanbase-odc/ob-parser-js@3.0.5': + '@oceanbase-odc/ob-parser-js@3.1.2': dependencies: antlr4: 4.8.0 lodash: 4.17.21 - '@oceanbase-odc/ob-react-data-grid@4.0.0(antd@5.25.4(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lodash@4.17.21)(react-dnd-html5-backend@11.1.3)(react-dnd@11.1.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@oceanbase-odc/ob-react-data-grid@4.0.0(antd@5.26.1(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lodash@4.17.21)(react-dnd-html5-backend@11.1.3)(react-dnd@11.1.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@juggle/resize-observer': 3.4.0 - antd: 5.25.4(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + antd: 5.26.1(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) clsx: 1.2.1 lodash: 4.17.21 rc-menu: 9.16.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -12447,12 +12721,12 @@ snapshots: '@rc-component/async-validator@5.0.4': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/color-picker@2.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -12460,18 +12734,18 @@ snapshots: '@rc-component/context@1.4.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) '@rc-component/mini-decimal@1.1.0': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/mutate-observer@1.1.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -12479,7 +12753,7 @@ snapshots: '@rc-component/portal@1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -12487,7 +12761,7 @@ snapshots: '@rc-component/qrcode@1.0.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -12495,17 +12769,17 @@ snapshots: '@rc-component/tour@1.15.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@rc-component/trigger@2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@rc-component/trigger@2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -12725,79 +12999,81 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39))(postcss@7.0.39)': + '@stagewise/toolbar@0.6.2': {} + + '@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39)': dependencies: '@babel/core': 7.27.4 postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.5.6) transitivePeerDependencies: - supports-color - '@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2(postcss@8.5.4))(postcss@8.5.4)': + '@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@8.5.6)': dependencies: '@babel/core': 7.23.6 - postcss: 8.5.4 - postcss-syntax: 0.36.2(postcss@8.5.4) + postcss: 8.5.6 + postcss-syntax: 0.36.2(postcss@8.5.6) transitivePeerDependencies: - supports-color - '@stylelint/postcss-markdown@0.36.2(postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39))(postcss@7.0.39)': + '@stylelint/postcss-markdown@0.36.2(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39)': dependencies: postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.5.6) remark: 13.0.0 unist-util-find-all-after: 3.0.2 transitivePeerDependencies: - supports-color - '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 - '@svgr/babel-preset@6.5.1(@babel/core@7.27.4)': + '@svgr/babel-preset@6.5.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.27.4) + '@babel/core': 7.28.3 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.28.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.28.3) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.28.3) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.28.3) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.28.3) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.28.3) '@svgr/core@6.5.1': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 6.5.1(@babel/core@7.27.4) + '@babel/core': 7.28.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.28.3) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -12806,13 +13082,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@6.5.1': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 entities: 4.5.0 '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 6.5.1(@babel/core@7.27.4) + '@babel/core': 7.28.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.28.3) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -12826,10 +13102,10 @@ snapshots: deepmerge: 4.3.1 svgo: 2.8.0 - '@swc/cli@0.3.14(@swc/core@1.11.29)(chokidar@3.6.0)': + '@swc/cli@0.3.14(@swc/core@1.12.4)(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.11.29 + '@swc/core': 1.12.4 '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.3 @@ -12837,55 +13113,55 @@ snapshots: piscina: 4.9.2 semver: 7.7.2 slash: 3.0.0 - source-map: 0.7.4 + source-map: 0.7.6 optionalDependencies: chokidar: 3.6.0 - '@swc/core-darwin-arm64@1.11.29': + '@swc/core-darwin-arm64@1.12.4': optional: true - '@swc/core-darwin-x64@1.11.29': + '@swc/core-darwin-x64@1.12.4': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.29': + '@swc/core-linux-arm-gnueabihf@1.12.4': optional: true - '@swc/core-linux-arm64-gnu@1.11.29': + '@swc/core-linux-arm64-gnu@1.12.4': optional: true - '@swc/core-linux-arm64-musl@1.11.29': + '@swc/core-linux-arm64-musl@1.12.4': optional: true - '@swc/core-linux-x64-gnu@1.11.29': + '@swc/core-linux-x64-gnu@1.12.4': optional: true - '@swc/core-linux-x64-musl@1.11.29': + '@swc/core-linux-x64-musl@1.12.4': optional: true - '@swc/core-win32-arm64-msvc@1.11.29': + '@swc/core-win32-arm64-msvc@1.12.4': optional: true - '@swc/core-win32-ia32-msvc@1.11.29': + '@swc/core-win32-ia32-msvc@1.12.4': optional: true - '@swc/core-win32-x64-msvc@1.11.29': + '@swc/core-win32-x64-msvc@1.12.4': optional: true - '@swc/core@1.11.29': + '@swc/core@1.12.4': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.29 - '@swc/core-darwin-x64': 1.11.29 - '@swc/core-linux-arm-gnueabihf': 1.11.29 - '@swc/core-linux-arm64-gnu': 1.11.29 - '@swc/core-linux-arm64-musl': 1.11.29 - '@swc/core-linux-x64-gnu': 1.11.29 - '@swc/core-linux-x64-musl': 1.11.29 - '@swc/core-win32-arm64-msvc': 1.11.29 - '@swc/core-win32-ia32-msvc': 1.11.29 - '@swc/core-win32-x64-msvc': 1.11.29 + '@swc/core-darwin-arm64': 1.12.4 + '@swc/core-darwin-x64': 1.12.4 + '@swc/core-linux-arm-gnueabihf': 1.12.4 + '@swc/core-linux-arm64-gnu': 1.12.4 + '@swc/core-linux-arm64-musl': 1.12.4 + '@swc/core-linux-x64-gnu': 1.12.4 + '@swc/core-linux-x64-musl': 1.12.4 + '@swc/core-win32-arm64-msvc': 1.12.4 + '@swc/core-win32-ia32-msvc': 1.12.4 + '@swc/core-win32-x64-msvc': 1.12.4 '@swc/counter@0.1.3': {} @@ -12893,7 +13169,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.21': + '@swc/types@0.1.23': dependencies: '@swc/counter': 0.1.3 @@ -12905,20 +13181,20 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@4.39.1': {} + '@tanstack/query-core@4.40.0': {} - '@tanstack/react-query-devtools@4.39.1(@tanstack/react-query@4.39.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@tanstack/react-query-devtools@4.40.1(@tanstack/react-query@4.40.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-query': 4.39.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@tanstack/react-query': 4.40.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) superjson: 1.13.3 use-sync-external-store: 1.5.0(react@17.0.2) - '@tanstack/react-query@4.39.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@tanstack/react-query@4.40.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@tanstack/query-core': 4.39.1 + '@tanstack/query-core': 4.40.0 react: 17.0.2 use-sync-external-store: 1.5.0(react@17.0.2) optionalDependencies: @@ -12927,7 +13203,7 @@ snapshots: '@testing-library/dom@7.31.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@types/aria-query': 4.2.2 aria-query: 4.2.2 chalk: 4.1.2 @@ -12937,7 +13213,7 @@ snapshots: '@testing-library/react@11.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@testing-library/dom': 7.31.2 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -12956,37 +13232,37 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/responselike': 1.0.3 '@types/caseless@0.12.5': {} '@types/cheerio@0.22.35': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/d3-array@3.2.1': {} @@ -13111,20 +13387,20 @@ snapshots: '@types/eslint@7.29.0': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/fs-extra@9.0.13': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/geojson@7946.0.16': {} '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/hapi__joi@17.1.9': {} @@ -13132,13 +13408,18 @@ snapshots: '@types/history@5.0.0': dependencies: - history: 4.10.1 + history: 5.3.0 '@types/hoist-non-react-statics@3.3.6': dependencies: '@types/react': 16.14.65 hoist-non-react-statics: 3.3.2 + '@types/hoist-non-react-statics@3.3.7(@types/react@16.14.65)': + dependencies: + '@types/react': 16.14.65 + hoist-non-react-statics: 3.3.2 + '@types/html-minifier-terser@6.1.0': {} '@types/http-cache-semantics@4.0.4': {} @@ -13170,9 +13451,9 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 - '@types/lodash@4.17.17': {} + '@types/lodash@4.17.18': {} '@types/mdast@3.0.15': dependencies: @@ -13186,19 +13467,17 @@ snapshots: '@types/node@16.18.126': {} - '@types/node@9.6.61': {} - '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} '@types/plist@3.0.5': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 xmlbuilder: 15.1.1 optional: true - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.15': {} '@types/react-dom@16.9.25(@types/react@16.14.65)': dependencies: @@ -13219,7 +13498,7 @@ snapshots: '@types/history': 4.7.11 '@types/react': 16.14.65 '@types/react-router': 5.1.20 - redux: 3.7.2 + redux: 4.2.1 '@types/react-router@5.1.20': dependencies: @@ -13228,19 +13507,19 @@ snapshots: '@types/react-virtualized@9.22.2': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 '@types/react': 16.14.65 '@types/react@16.14.65': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 '@types/scheduler': 0.16.8 csstype: 3.1.3 '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/tough-cookie': 4.0.5 form-data: 2.5.3 @@ -13248,7 +13527,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 '@types/scheduler@0.16.8': {} @@ -13285,13 +13564,13 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 optional: true - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.35.0)(typescript@5.9.2) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) @@ -13307,22 +13586,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.35.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.35.0)(typescript@5.9.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.35.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@5.9.2) debug: 4.4.1 eslint: 8.35.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 semver: 7.7.2 - tsutils: 3.21.0(typescript@4.9.5) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -13351,28 +13630,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5)': + '@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) debug: 4.4.1 eslint: 8.35.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.1 eslint: 8.57.1 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -13403,15 +13682,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@5.62.0(eslint@8.35.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@5.9.2) debug: 4.4.1 eslint: 8.35.0 - tsutils: 3.21.0(typescript@4.9.5) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -13449,7 +13728,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -13458,9 +13751,9 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@4.9.5) + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -13479,14 +13772,14 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@8.35.0)(typescript@4.9.5)': + '@typescript-eslint/utils@5.62.0(eslint@8.35.0)(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.35.0) '@types/json-schema': 7.0.15 '@types/semver': 7.7.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) eslint: 8.35.0 eslint-scope: 5.1.1 semver: 7.7.2 @@ -13509,39 +13802,39 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@umijs/ast@4.4.11': + '@umijs/ast@4.4.12': dependencies: - '@umijs/bundler-utils': 4.4.11 + '@umijs/bundler-utils': 4.4.12 transitivePeerDependencies: - supports-color - '@umijs/babel-preset-umi@4.4.11': + '@umijs/babel-preset-umi@4.4.12': dependencies: '@babel/runtime': 7.23.6 '@bloomberg/record-tuple-polyfill': 0.0.4 - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 core-js: 3.34.0 transitivePeerDependencies: - supports-color - '@umijs/bundler-esbuild@4.4.11': + '@umijs/bundler-esbuild@4.4.12': dependencies: - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 enhanced-resolve: 5.9.3 - postcss: 8.5.4 - postcss-flexbugs-fixes: 5.0.2(postcss@8.5.4) - postcss-preset-env: 7.5.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-flexbugs-fixes: 5.0.2(postcss@8.5.6) + postcss-preset-env: 7.5.0(postcss@8.5.6) transitivePeerDependencies: - supports-color - '@umijs/bundler-mako@0.11.10(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/bundler-mako@0.11.10(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0)': dependencies: - '@umijs/bundler-utils': 4.4.11 - '@umijs/mako': 0.11.10(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + '@umijs/bundler-utils': 4.4.12 + '@umijs/mako': 0.11.10(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0) chalk: 4.1.2 - compression: 1.8.0 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 cors: 2.8.5 express: 4.21.2 @@ -13560,9 +13853,9 @@ snapshots: - typescript - webpack - '@umijs/bundler-utils@4.4.11': + '@umijs/bundler-utils@4.4.12': dependencies: - '@umijs/utils': 4.4.11 + '@umijs/utils': 4.4.12 esbuild: 0.21.4 regenerate: 1.4.2 regenerate-unicode-properties: 10.1.1 @@ -13570,18 +13863,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@umijs/bundler-vite@4.4.11(@types/node@9.6.61)(lightningcss@1.22.1)(postcss@8.5.4)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0)': + '@umijs/bundler-vite@4.4.12(@types/node@16.18.126)(lightningcss@1.22.1)(postcss@8.5.6)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1)': dependencies: '@svgr/core': 6.5.1 - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 - '@vitejs/plugin-react': 4.0.0(vite@4.5.2(@types/node@9.6.61)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.40.0)) + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 + '@vitejs/plugin-react': 4.0.0(vite@4.5.2(@types/node@16.18.126)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.43.1)) core-js: 3.34.0 less: 4.1.3 - postcss-preset-env: 7.5.0(postcss@8.5.4) + postcss-preset-env: 7.5.0(postcss@8.5.6) rollup-plugin-visualizer: 5.9.0(rollup@3.29.5) systemjs: 6.15.1 - vite: 4.5.2(@types/node@9.6.61)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.40.0) + vite: 4.5.2(@types/node@16.18.126)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - lightningcss @@ -13593,27 +13886,27 @@ snapshots: - supports-color - terser - '@umijs/bundler-webpack@4.4.11(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/bundler-webpack@4.4.12(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0)': dependencies: '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) '@types/hapi__joi': 17.1.9 - '@umijs/babel-preset-umi': 4.4.11 - '@umijs/bundler-utils': 4.4.11 + '@umijs/babel-preset-umi': 4.4.12 + '@umijs/bundler-utils': 4.4.12 '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/mfsu': 4.4.11 - '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@0.21.3)(webpack@4.47.0(webpack-cli@3.3.12)) - '@umijs/utils': 4.4.11 + '@umijs/mfsu': 4.4.12 + '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@0.21.3)(webpack@4.47.0) + '@umijs/utils': 4.4.12 cors: 2.8.5 - css-loader: 6.7.1(webpack@4.47.0(webpack-cli@3.3.12)) + css-loader: 6.7.1(webpack@4.47.0) es5-imcompatible-versions: 0.1.90 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.9.2)(webpack@4.47.0) jest-worker: 29.4.3 lightningcss: 1.22.1 node-libs-browser: 2.2.1 - postcss: 8.5.4 - postcss-preset-env: 7.5.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-preset-env: 7.5.0(postcss@8.5.6) react-error-overlay: 6.0.9 react-refresh: 0.14.0 transitivePeerDependencies: @@ -13629,14 +13922,14 @@ snapshots: '@umijs/case-sensitive-paths-webpack-plugin@1.0.1': {} - '@umijs/core@4.4.11': + '@umijs/core@4.4.12': dependencies: - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 transitivePeerDependencies: - supports-color - '@umijs/did-you-know@1.0.3': {} + '@umijs/did-you-know@1.0.4': {} '@umijs/es-module-parser-darwin-arm64@0.0.7': optional: true @@ -13680,20 +13973,20 @@ snapshots: '@umijs/fabric@3.0.0': dependencies: '@babel/core': 7.27.4 - '@babel/eslint-parser': 7.27.1(@babel/core@7.27.4)(eslint@7.32.0) + '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@7.32.0) '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) '@babel/preset-env': 7.27.2(@babel/core@7.27.4) '@babel/preset-react': 7.27.1(@babel/core@7.27.4) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) chalk: 4.1.2 eslint: 7.32.0 eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-formatter-pretty: 4.1.0 eslint-plugin-babel: 5.3.1(eslint@7.32.0) - eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) + eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5) eslint-plugin-promise: 6.6.0(eslint@7.32.0) eslint-plugin-react: 7.37.5(eslint@7.32.0) eslint-plugin-react-hooks: 4.6.2(eslint@7.32.0) @@ -13722,19 +14015,19 @@ snapshots: '@babel/runtime': 7.23.6 query-string: 6.14.1 - '@umijs/lint@4.4.11(eslint@8.35.0)(stylelint@14.8.2)(typescript@4.9.5)': + '@umijs/lint@4.4.12(eslint@8.35.0)(stylelint@14.8.2)(typescript@5.9.2)': dependencies: '@babel/core': 7.23.6 '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@8.35.0) - '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss@8.5.4))(postcss@8.5.4) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.35.0)(typescript@4.9.5) - '@umijs/babel-preset-umi': 4.4.11 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5) + '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@8.5.6) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.35.0)(typescript@5.9.2) + '@umijs/babel-preset-umi': 4.4.12 + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2) eslint-plugin-react: 7.33.2(eslint@8.35.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.35.0) - postcss: 8.5.4 - postcss-syntax: 0.36.2(postcss@8.5.4) + postcss: 8.5.6 + postcss-syntax: 0.36.2(postcss@8.5.6) stylelint-config-standard: 25.0.0(stylelint@14.8.2) transitivePeerDependencies: - eslint @@ -13772,25 +14065,25 @@ snapshots: '@umijs/mako-win32-x64-msvc@0.11.10': optional: true - '@umijs/mako@0.11.10(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/mako@0.11.10(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0)': dependencies: '@module-federation/webpack-bundler-runtime': 0.8.12 '@swc/helpers': 0.5.1 '@types/resolve': 1.20.6 chalk: 4.1.2 - enhanced-resolve: 5.18.1 - less: 4.3.0 - less-loader: 12.3.0(less@4.3.0)(webpack@4.47.0(webpack-cli@3.3.12)) + enhanced-resolve: 5.18.3 + less: 4.4.1 + less-loader: 12.3.0(less@4.4.1)(webpack@4.47.0) loader-runner: 4.3.0 loader-utils: 3.3.1 lodash: 4.17.21 node-libs-browser-okam: 2.2.5 piscina: 4.9.2 - postcss-loader: 8.1.1(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0) react-error-overlay: 6.0.9 react-refresh: 0.14.2 resolve: 1.22.10 - sass-loader: 16.0.5(webpack@4.47.0(webpack-cli@3.3.12)) + sass-loader: 16.0.5(webpack@4.47.0) semver: 7.7.2 yargs-parser: 21.1.1 optionalDependencies: @@ -13811,14 +14104,14 @@ snapshots: - typescript - webpack - '@umijs/max@4.4.11(@babel/core@7.27.4)(@types/node@9.6.61)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lightningcss@1.22.1)(prettier@2.8.8)(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/max@4.4.12(@babel/core@7.28.3)(@types/node@16.18.126)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(lightningcss@1.22.1)(prettier@2.8.8)(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0)': dependencies: - '@umijs/lint': 4.4.11(eslint@8.35.0)(stylelint@14.8.2)(typescript@4.9.5) - '@umijs/plugins': 4.4.11(@babel/core@7.27.4)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@umijs/lint': 4.4.12(eslint@8.35.0)(stylelint@14.8.2)(typescript@5.9.2) + '@umijs/plugins': 4.4.12(@babel/core@7.28.3)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) antd: 4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2) eslint: 8.35.0 stylelint: 14.8.2 - umi: 4.4.11(@babel/core@7.27.4)(@types/node@9.6.61)(@types/react@16.14.65)(eslint@8.35.0)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(stylelint@14.8.2)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) + umi: 4.4.12(@babel/core@7.28.3)(@types/node@16.18.126)(@types/react@16.14.65)(eslint@8.35.0)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(stylelint@14.8.2)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0) transitivePeerDependencies: - '@babel/core' - '@rspack/core' @@ -13858,36 +14151,36 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@umijs/mfsu@4.4.11': + '@umijs/mfsu@4.4.12': dependencies: - '@umijs/bundler-esbuild': 4.4.11 - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 + '@umijs/bundler-esbuild': 4.4.12 + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 enhanced-resolve: 5.9.3 is-equal: 1.7.0 transitivePeerDependencies: - supports-color - '@umijs/plugin-run@4.4.11': + '@umijs/plugin-run@4.4.12': dependencies: tsx: 3.12.2 - '@umijs/plugins@4.4.11(@babel/core@7.27.4)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@umijs/plugins@4.4.12(@babel/core@7.28.3)(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@ahooksjs/use-request': 2.8.15(react@17.0.2) '@ant-design/antd-theme-variable': 1.0.0 - '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@ant-design/cssinjs': 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/icons': 4.8.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/moment-webpack-plugin': 0.0.3 - '@ant-design/pro-components': 2.8.7(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@tanstack/react-query': 4.39.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@tanstack/react-query-devtools': 4.39.1(@tanstack/react-query@4.39.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@umijs/bundler-utils': 4.4.11 + '@ant-design/pro-components': 2.8.10(antd@4.24.16(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@tanstack/react-query': 4.40.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@tanstack/react-query-devtools': 4.40.1(@tanstack/react-query@4.40.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@umijs/bundler-utils': 4.4.12 '@umijs/valtio': 1.0.4(@types/react@16.14.65)(react@17.0.2) antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.13) axios: 0.27.2 babel-plugin-import: 1.13.8 - babel-plugin-styled-components: 2.1.4(@babel/core@7.27.4)(styled-components@6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)) + babel-plugin-styled-components: 2.1.4(@babel/core@7.28.3)(styled-components@6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)) dayjs: 1.11.13 dva-core: 2.0.4(redux@4.2.1) dva-immer: 1.0.2(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2)) @@ -13898,7 +14191,7 @@ snapshots: lodash: 4.17.21 moment: 2.30.1 qiankun: 2.10.16 - react-intl: 3.12.1(react@17.0.2) + react-intl: 3.12.1(@types/react@16.14.65)(react@17.0.2) react-redux: 8.1.3(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(redux@4.2.1) redux: 4.2.1 styled-components: 6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -13917,28 +14210,29 @@ snapshots: - react-native - supports-color - '@umijs/preset-umi@4.4.11(@types/node@9.6.61)(@types/react@16.14.65)(lightningcss@1.22.1)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/preset-umi@4.4.12(@types/node@16.18.126)(@types/react@16.14.65)(lightningcss@1.22.1)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0)': dependencies: '@iconify/utils': 2.1.1 + '@stagewise/toolbar': 0.6.2 '@svgr/core': 6.5.1 - '@umijs/ast': 4.4.11 - '@umijs/babel-preset-umi': 4.4.11 - '@umijs/bundler-esbuild': 4.4.11 - '@umijs/bundler-mako': 0.11.10(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) - '@umijs/bundler-utils': 4.4.11 - '@umijs/bundler-vite': 4.4.11(@types/node@9.6.61)(lightningcss@1.22.1)(postcss@8.5.4)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0) - '@umijs/bundler-webpack': 4.4.11(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) - '@umijs/core': 4.4.11 - '@umijs/did-you-know': 1.0.3 + '@umijs/ast': 4.4.12 + '@umijs/babel-preset-umi': 4.4.12 + '@umijs/bundler-esbuild': 4.4.12 + '@umijs/bundler-mako': 0.11.10(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0) + '@umijs/bundler-utils': 4.4.12 + '@umijs/bundler-vite': 4.4.12(@types/node@16.18.126)(lightningcss@1.22.1)(postcss@8.5.6)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1) + '@umijs/bundler-webpack': 4.4.12(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0) + '@umijs/core': 4.4.12 + '@umijs/did-you-know': 1.0.4 '@umijs/es-module-parser': 0.0.7 '@umijs/history': 5.3.1 - '@umijs/mfsu': 4.4.11 - '@umijs/plugin-run': 4.4.11 - '@umijs/renderer-react': 4.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@umijs/server': 4.4.11 + '@umijs/mfsu': 4.4.12 + '@umijs/plugin-run': 4.4.12 + '@umijs/renderer-react': 4.4.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@umijs/server': 4.4.12 '@umijs/ui': 3.0.1 - '@umijs/utils': 4.4.11 - '@umijs/zod2ts': 4.4.11 + '@umijs/utils': 4.4.12 + '@umijs/zod2ts': 4.4.12 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-react-compiler: 0.0.0-experimental-c23de8d-20240515 click-to-react-component: 1.1.0(@types/react@16.14.65)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -13946,11 +14240,11 @@ snapshots: current-script-polyfill: 1.0.0 enhanced-resolve: 5.9.3 fast-glob: 3.2.12 - html-webpack-plugin: 5.5.0(webpack@4.47.0(webpack-cli@3.3.12)) + html-webpack-plugin: 5.5.0(webpack@4.47.0) less-plugin-resolve: 1.0.2 path-to-regexp: 1.7.0 - postcss: 8.5.4 - postcss-prefix-selector: 1.16.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-prefix-selector: 1.16.0(postcss@8.5.6) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.3.0(react@18.3.1) @@ -13978,23 +14272,23 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@umijs/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(type-fest@0.21.3)(webpack@4.47.0(webpack-cli@3.3.12))': + '@umijs/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(type-fest@0.21.3)(webpack@4.47.0)': dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 - core-js-pure: 3.42.0 + core-js-pure: 3.45.0 error-stack-parser: 2.1.4 find-up: 5.0.0 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.14.0 schema-utils: 3.3.0 - source-map: 0.7.4 + source-map: 0.7.6 webpack: 4.47.0(webpack-cli@3.3.12) optionalDependencies: type-fest: 0.21.3 - '@umijs/renderer-react@4.4.11(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@umijs/renderer-react@4.4.12(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@babel/runtime': 7.23.6 '@loadable/component': 5.15.2(react@17.0.2) @@ -14004,7 +14298,7 @@ snapshots: react-helmet-async: 1.3.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react-router-dom: 6.3.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@umijs/renderer-react@4.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@umijs/renderer-react@4.4.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.23.6 '@loadable/component': 5.15.2(react@18.3.1) @@ -14016,9 +14310,9 @@ snapshots: '@umijs/route-utils@4.0.1': {} - '@umijs/server@4.4.11': + '@umijs/server@4.4.12': dependencies: - '@umijs/bundler-utils': 4.4.11 + '@umijs/bundler-utils': 4.4.12 history: 5.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14026,13 +14320,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@umijs/test@4.4.11(@babel/core@7.27.4)': + '@umijs/test@4.4.12(@babel/core@7.28.3)': dependencies: - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.3) '@jest/types': 27.5.1 - '@umijs/bundler-utils': 4.4.11 - '@umijs/utils': 4.4.11 - babel-jest: 29.7.0(@babel/core@7.27.4) + '@umijs/bundler-utils': 4.4.12 + '@umijs/utils': 4.4.12 + babel-jest: 29.7.0(@babel/core@7.28.3) esbuild: 0.21.4 identity-obj-proxy: 3.0.0 isomorphic-unfetch: 4.0.2 @@ -14046,7 +14340,7 @@ snapshots: dependencies: react: 17.0.2 - '@umijs/utils@4.4.11': + '@umijs/utils@4.4.12': dependencies: chokidar: 3.5.3 pino: 7.11.0 @@ -14058,17 +14352,17 @@ snapshots: - '@types/react' - react - '@umijs/zod2ts@4.4.11': {} + '@umijs/zod2ts@4.4.12': {} '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.0.0(vite@4.5.2(@types/node@9.6.61)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.40.0))': + '@vitejs/plugin-react@4.0.0(vite@4.5.2(@types/node@16.18.126)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.43.1))': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) react-refresh: 0.14.2 - vite: 4.5.2(@types/node@9.6.61)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.40.0) + vite: 4.5.2(@types/node@16.18.126)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -14184,15 +14478,15 @@ snapshots: dependencies: acorn: 7.4.1 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn@6.4.2: {} acorn@7.4.1: {} - acorn@8.14.1: {} + acorn@8.15.0: {} add-dom-event-listener@1.1.0: dependencies: @@ -14278,7 +14572,7 @@ snapshots: merge-descriptors: 1.0.3 mime: 2.6.0 platform: 1.3.6 - pump: 3.0.2 + pump: 3.0.3 qs: 6.14.0 sdk-base: 2.0.1 stream-http: 2.8.2 @@ -14329,7 +14623,7 @@ snapshots: '@ant-design/colors': 6.0.0 '@ant-design/icons': 4.8.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/react-slick': 1.0.2(react@17.0.2) - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@ctrl/tinycolor': 3.6.1 classnames: 2.5.1 copy-to-clipboard: 3.3.3 @@ -14372,7 +14666,7 @@ snapshots: react-dom: 17.0.2(react@17.0.2) scroll-into-view-if-needed: 2.2.31 - antd@5.25.4(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2): + antd@5.26.1(date-fns@2.30.0)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: '@ant-design/colors': 7.2.1 '@ant-design/cssinjs': 1.23.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -14380,12 +14674,12 @@ snapshots: '@ant-design/fast-color': 2.0.6 '@ant-design/icons': 5.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@ant-design/react-slick': 1.1.2(react@17.0.2) - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/color-picker': 2.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@rc-component/mutate-observer': 1.1.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@rc-component/qrcode': 1.0.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@rc-component/tour': 1.15.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.13 @@ -14413,7 +14707,7 @@ snapshots: rc-slider: 11.1.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-steps: 6.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-switch: 4.1.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - rc-table: 7.50.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + rc-table: 7.51.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-tabs: 15.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-textarea: 1.10.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-tooltip: 6.4.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -14449,7 +14743,7 @@ snapshots: app-builder-bin@5.0.0-alpha.10: {} - app-builder-lib@25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): + app-builder-lib@25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -14471,7 +14765,7 @@ snapshots: ejs: 3.1.10 electron-builder-squirrel-windows: 25.1.8(dmg-builder@25.1.8) electron-publish: 25.1.7 - form-data: 4.0.2 + form-data: 4.0.3 fs-extra: 10.1.0 hosted-git-info: 4.1.0 is-ci: 3.0.1 @@ -14479,7 +14773,7 @@ snapshots: js-yaml: 4.1.0 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.0.1 + minimatch: 10.0.3 resedit: 1.7.2 sanitize-filename: 1.6.3 semver: 7.7.2 @@ -14548,8 +14842,8 @@ snapshots: aria-query@4.2.2: dependencies: - '@babel/runtime': 7.27.4 - '@babel/runtime-corejs3': 7.27.4 + '@babel/runtime': 7.27.6 + '@babel/runtime-corejs3': 7.27.6 arr-diff@4.0.0: {} @@ -14673,20 +14967,20 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.4): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001720 + browserslist: 4.25.3 + caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 autoprefixer@9.8.8: dependencies: browserslist: 4.25.0 - caniuse-lite: 1.0.30001720 + caniuse-lite: 1.0.30001724 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -14716,26 +15010,26 @@ snapshots: axios@0.27.2: dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 + follow-redirects: 1.15.11 + form-data: 4.0.4 transitivePeerDependencies: - debug - axios@1.9.0: + axios@1.10.0: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.27.4): + babel-jest@29.7.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.3 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.27.4) + babel-preset-jest: 29.6.3(@babel/core@7.28.3) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -14765,13 +15059,13 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: - '@babel/compat-data': 7.27.3 + '@babel/compat-data': 7.27.5 '@babel/core': 7.27.4 '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 @@ -14782,7 +15076,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + core-js-compat: 3.43.0 transitivePeerDependencies: - supports-color @@ -14796,18 +15090,18 @@ snapshots: babel-plugin-react-compiler@0.0.0-experimental-c23de8d-20240515: dependencies: '@babel/generator': 7.2.0 - '@babel/types': 7.27.3 + '@babel/types': 7.28.2 chalk: 4.1.2 invariant: 2.2.4 pretty-format: 24.9.0 - zod: 3.25.49 - zod-validation-error: 2.1.0(zod@3.25.49) + zod: 3.25.76 + zod-validation-error: 2.1.0(zod@3.25.76) - babel-plugin-styled-components@2.1.4(@babel/core@7.27.4)(styled-components@6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)): + babel-plugin-styled-components@2.1.4(@babel/core@7.28.3)(styled-components@6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)): dependencies: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) lodash: 4.17.21 picomatch: 2.3.1 styled-components: 6.1.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -14815,30 +15109,30 @@ snapshots: - '@babel/core' - supports-color - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - - babel-preset-jest@29.6.3(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) + + babel-preset-jest@29.6.3(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) bail@1.0.5: {} @@ -14942,12 +15236,12 @@ snapshots: dependencies: big-integer: 1.6.52 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -15019,11 +15313,18 @@ snapshots: browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001720 - electron-to-chromium: 1.5.161 + caniuse-lite: 1.0.30001724 + electron-to-chromium: 1.5.171 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) + browserslist@4.25.3: + dependencies: + caniuse-lite: 1.0.30001735 + electron-to-chromium: 1.5.207 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.3) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -15193,7 +15494,9 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001720: {} + caniuse-lite@1.0.30001724: {} + + caniuse-lite@1.0.30001735: {} caseless@0.12.0: {} @@ -15423,13 +15726,13 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.8.0: + compression@1.8.1: dependencies: bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9(supports-color@6.1.0) negotiator: 0.6.4 - on-headers: 1.0.2 + on-headers: 1.1.0 safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: @@ -15463,7 +15766,7 @@ snapshots: config-file-ts@0.2.8-rc1: dependencies: glob: 10.4.5 - typescript: 5.8.3 + typescript: 5.9.2 connect-history-api-fallback@2.0.0: {} @@ -15517,15 +15820,17 @@ snapshots: copy-to@2.0.1: {} - core-js-compat@3.42.0: + core-js-compat@3.43.0: dependencies: browserslist: 4.25.0 - core-js-pure@3.42.0: {} + core-js-pure@3.43.0: {} + + core-js-pure@3.45.0: {} core-js@3.34.0: {} - core-js@3.42.0: {} + core-js@3.43.0: {} core-util-is@1.0.2: {} @@ -15544,14 +15849,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@4.9.5): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 crc-32@1.2.2: {} @@ -15630,35 +15935,35 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 - css-blank-pseudo@3.0.3(postcss@8.5.4): + css-blank-pseudo@3.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 css-color-keywords@1.0.0: {} css-functions-list@3.2.3: {} - css-has-pseudo@3.0.4(postcss@8.5.4): + css-has-pseudo@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - css-loader@6.7.1(webpack@4.47.0(webpack-cli@3.3.12)): + css-loader@6.7.1(webpack@4.47.0): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.4) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.4) - postcss-modules-scope: 3.2.1(postcss@8.5.4) - postcss-modules-values: 4.0.0(postcss@8.5.4) + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 semver: 7.7.2 webpack: 4.47.0(webpack-cli@3.3.12) - css-prefers-color-scheme@6.0.3(postcss@8.5.4): + css-prefers-color-scheme@6.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 css-select@1.2.0: dependencies: @@ -15670,7 +15975,7 @@ snapshots: css-select@4.3.0: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 6.2.2 domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 @@ -15688,7 +15993,7 @@ snapshots: css-what@2.1.3: {} - css-what@6.1.0: {} + css-what@6.2.2: {} css@3.0.0: dependencies: @@ -15779,7 +16084,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 dateformat@2.2.0: {} @@ -15926,7 +16231,7 @@ snapshots: dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) builder-util: 25.1.7 builder-util-runtime: 9.2.10 fs-extra: 10.1.0 @@ -15975,7 +16280,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 csstype: 3.1.3 dom-serializer@0.1.1: @@ -16042,21 +16347,21 @@ snapshots: duplexify@3.7.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 duplexify@4.1.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 dva-core@1.5.0-beta.2(redux@3.7.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 flatten: 1.0.3 global: 4.4.0 invariant: 2.2.4 @@ -16067,7 +16372,7 @@ snapshots: dva-core@2.0.4(redux@4.2.1): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 flatten: 1.0.3 global: 4.4.0 invariant: 2.2.4 @@ -16078,18 +16383,18 @@ snapshots: dva-immer@1.0.2(dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2)): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 dva: 2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) immer: 8.0.4 dva-loading@3.0.25(dva-core@2.0.4(redux@4.2.1)): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 dva-core: 2.0.4(redux@4.2.1) dva@2.5.0-beta.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 '@types/isomorphic-fetch': 0.0.34 '@types/react-router-dom': 4.3.5 '@types/react-router-redux': 5.0.27 @@ -16135,7 +16440,7 @@ snapshots: electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -16146,7 +16451,7 @@ snapshots: electron-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) builder-util: 25.1.7 builder-util-runtime: 9.2.10 chalk: 4.1.2 @@ -16182,7 +16487,9 @@ snapshots: transitivePeerDependencies: - supports-color - electron-to-chromium@1.5.161: {} + electron-to-chromium@1.5.171: {} + + electron-to-chromium@1.5.207: {} electron@22.3.27: dependencies: @@ -16226,7 +16533,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -16238,7 +16545,7 @@ snapshots: memory-fs: 0.5.0 tapable: 1.1.3 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.2.2 @@ -16501,22 +16808,22 @@ snapshots: eslint: 7.32.0 eslint-rule-composer: 0.3.0 - eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5): + eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5): dependencies: '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) eslint: 7.32.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5): + eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.35.0)(typescript@5.9.2) eslint: 8.35.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.35.0)(typescript@5.9.2))(eslint@8.35.0)(typescript@5.9.2) transitivePeerDependencies: - supports-color - typescript @@ -16616,7 +16923,7 @@ snapshots: eslint-template-visitor@2.3.2(eslint@7.32.0): dependencies: '@babel/core': 7.27.4 - '@babel/eslint-parser': 7.27.1(@babel/core@7.27.4)(eslint@7.32.0) + '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@7.32.0) eslint: 7.32.0 eslint-visitor-keys: 2.1.0 esquery: 1.6.0 @@ -16792,8 +17099,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -17042,7 +17349,7 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -17151,6 +17458,8 @@ snapshots: inherits: 2.0.4 readable-stream: 2.3.8 + follow-redirects@1.15.11: {} + follow-redirects@1.15.9: {} for-each@0.3.5: @@ -17166,7 +17475,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.9.2)(webpack@4.47.0): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -17180,7 +17489,7 @@ snapshots: schema-utils: 3.3.0 semver: 7.7.2 tapable: 2.2.2 - typescript: 4.9.5 + typescript: 5.9.2 webpack: 4.47.0(webpack-cli@3.3.12) form-data@2.3.3: @@ -17197,11 +17506,20 @@ snapshots: mime-types: 2.1.35 safe-buffer: 5.2.1 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 formdata-polyfill@4.0.10: @@ -17261,7 +17579,7 @@ snapshots: dependencies: minipass: 3.3.6 - fs-monkey@1.0.6: {} + fs-monkey@1.1.0: {} fs-write-stream-atomic@1.0.10: dependencies: @@ -17341,7 +17659,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.2 + pump: 3.0.3 get-stream@6.0.1: {} @@ -17593,7 +17911,7 @@ snapshots: history@4.10.1: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.3 @@ -17645,11 +17963,11 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.40.0 + terser: 5.43.1 html-tags@3.3.1: {} - html-webpack-plugin@5.5.0(webpack@4.47.0(webpack-cli@3.3.12)): + html-webpack-plugin@5.5.0(webpack@4.47.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -17754,9 +18072,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.4): + icss-utils@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 identity-obj-proxy@3.0.0: dependencies: @@ -17788,7 +18106,7 @@ snapshots: import-html-entry@1.17.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 import-lazy@4.0.0: {} @@ -18169,8 +18487,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.4 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -18210,7 +18528,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 9.6.61 + '@types/node': 16.18.126 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -18227,7 +18545,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 9.6.61 + '@types/node': 16.18.126 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -18235,14 +18553,14 @@ snapshots: jest-worker@29.4.3: dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18364,15 +18682,15 @@ snapshots: dependencies: invert-kv: 3.0.1 - less-loader@12.3.0(less@4.3.0)(webpack@4.47.0(webpack-cli@3.3.12)): + less-loader@12.3.0(less@4.4.1)(webpack@4.47.0): dependencies: - less: 4.3.0 + less: 4.4.1 optionalDependencies: webpack: 4.47.0(webpack-cli@3.3.12) less-plugin-resolve@1.0.2: dependencies: - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 less@4.1.3: dependencies: @@ -18388,7 +18706,7 @@ snapshots: needle: 3.3.1 source-map: 0.6.1 - less@4.3.0: + less@4.4.1: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -18717,7 +19035,7 @@ snapshots: memfs@3.5.3: dependencies: - fs-monkey: 1.0.6 + fs-monkey: 1.1.0 memoize-one@4.1.0: {} @@ -18819,25 +19137,25 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.3: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist-options@4.1.0: dependencies: @@ -18888,11 +19206,11 @@ snapshots: dependencies: concat-stream: 1.6.2 duplexify: 3.7.1 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 flush-write-stream: 1.1.1 from2: 2.3.0 parallel-transform: 1.2.0 - pump: 3.0.2 + pump: 3.0.3 pumpify: 1.5.1 stream-each: 1.2.3 through2: 2.0.5 @@ -18928,7 +19246,7 @@ snapshots: moment@2.30.1: {} - monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.36.1)(webpack@4.47.0(webpack-cli@3.3.12)): + monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.36.1)(webpack@4.47.0): dependencies: loader-utils: 2.0.4 monaco-editor: 0.36.1 @@ -19248,7 +19566,7 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} + on-headers@1.1.0: {} once@1.4.0: dependencies: @@ -19407,7 +19725,7 @@ snapshots: parse5@3.0.3: dependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 parseurl@1.3.3: {} @@ -19545,103 +19863,103 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-attribute-case-insensitive@5.0.2(postcss@8.5.4): + postcss-attribute-case-insensitive@5.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-clamp@4.1.0(postcss@8.5.4): + postcss-clamp@4.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@4.2.4(postcss@8.5.4): + postcss-color-functional-notation@4.2.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-hex-alpha@8.0.4(postcss@8.5.4): + postcss-color-hex-alpha@8.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@7.1.1(postcss@8.5.4): + postcss-color-rebeccapurple@7.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-media@8.0.2(postcss@8.5.4): + postcss-custom-media@8.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-properties@12.1.11(postcss@8.5.4): + postcss-custom-properties@12.1.11(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-selectors@6.0.3(postcss@8.5.4): + postcss-custom-selectors@6.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-dir-pseudo-class@6.0.5(postcss@8.5.4): + postcss-dir-pseudo-class@6.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-double-position-gradients@3.1.2(postcss@8.5.4): + postcss-double-position-gradients@3.1.2(postcss@8.5.6): dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-env-function@4.0.6(postcss@8.5.4): + postcss-env-function@4.0.6(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-flexbugs-fixes@5.0.2(postcss@8.5.4): + postcss-flexbugs-fixes@5.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-focus-visible@6.0.4(postcss@8.5.4): + postcss-focus-visible@6.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-focus-within@5.0.4(postcss@8.5.4): + postcss-focus-within@5.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-font-variant@5.0.0(postcss@8.5.4): + postcss-font-variant@5.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-gap-properties@3.0.5(postcss@8.5.4): + postcss-gap-properties@3.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-html@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39): + postcss-html@0.36.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39): dependencies: htmlparser2: 3.10.1 postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.5.6) - postcss-image-set-function@4.0.7(postcss@8.5.4): + postcss-image-set-function@4.0.7(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-initial@4.0.1(postcss@8.5.4): + postcss-initial@4.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-lab-function@4.2.1(postcss@8.5.4): + postcss-lab-function@4.2.1(postcss@8.5.6): dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-less@3.1.4: @@ -19650,135 +19968,135 @@ snapshots: postcss-less@4.0.1: dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-loader@8.1.1(postcss@8.5.4)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)): + postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@4.47.0): dependencies: - cosmiconfig: 9.0.0(typescript@4.9.5) + cosmiconfig: 9.0.0(typescript@5.9.2) jiti: 1.21.7 - postcss: 8.5.4 + postcss: 8.5.6 semver: 7.7.2 optionalDependencies: webpack: 4.47.0(webpack-cli@3.3.12) transitivePeerDependencies: - typescript - postcss-logical@5.0.4(postcss@8.5.4): + postcss-logical@5.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-media-minmax@5.0.0(postcss@8.5.4): + postcss-media-minmax@5.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.4): + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-modules-local-by-default@4.2.0(postcss@8.5.4): + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.4): + postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.4): + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 - postcss-nesting@10.2.0(postcss@8.5.4): + postcss-nesting@10.2.0(postcss@8.5.6): dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-opacity-percentage@1.1.3(postcss@8.5.4): + postcss-opacity-percentage@1.1.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-overflow-shorthand@3.0.4(postcss@8.5.4): + postcss-overflow-shorthand@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.5.4): + postcss-page-break@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-place@7.0.5(postcss@8.5.4): + postcss-place@7.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-prefix-selector@1.16.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-preset-env@7.5.0(postcss@8.5.4): - dependencies: - '@csstools/postcss-color-function': 1.1.1(postcss@8.5.4) - '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.4) - '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.4) - '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.4) - '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.4) - '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.4) - '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.4) - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.4) - '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.4) - '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.4) - autoprefixer: 10.4.21(postcss@8.5.4) - browserslist: 4.25.0 - css-blank-pseudo: 3.0.3(postcss@8.5.4) - css-has-pseudo: 3.0.4(postcss@8.5.4) - css-prefers-color-scheme: 6.0.3(postcss@8.5.4) + postcss-prefix-selector@1.16.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-preset-env@7.5.0(postcss@8.5.6): + dependencies: + '@csstools/postcss-color-function': 1.1.1(postcss@8.5.6) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.6) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.6) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.6) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.6) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.6) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.6) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.6) + autoprefixer: 10.4.21(postcss@8.5.6) + browserslist: 4.25.3 + css-blank-pseudo: 3.0.3(postcss@8.5.6) + css-has-pseudo: 3.0.4(postcss@8.5.6) + css-prefers-color-scheme: 6.0.3(postcss@8.5.6) cssdb: 6.6.3 - postcss: 8.5.4 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.4) - postcss-clamp: 4.1.0(postcss@8.5.4) - postcss-color-functional-notation: 4.2.4(postcss@8.5.4) - postcss-color-hex-alpha: 8.0.4(postcss@8.5.4) - postcss-color-rebeccapurple: 7.1.1(postcss@8.5.4) - postcss-custom-media: 8.0.2(postcss@8.5.4) - postcss-custom-properties: 12.1.11(postcss@8.5.4) - postcss-custom-selectors: 6.0.3(postcss@8.5.4) - postcss-dir-pseudo-class: 6.0.5(postcss@8.5.4) - postcss-double-position-gradients: 3.1.2(postcss@8.5.4) - postcss-env-function: 4.0.6(postcss@8.5.4) - postcss-focus-visible: 6.0.4(postcss@8.5.4) - postcss-focus-within: 5.0.4(postcss@8.5.4) - postcss-font-variant: 5.0.0(postcss@8.5.4) - postcss-gap-properties: 3.0.5(postcss@8.5.4) - postcss-image-set-function: 4.0.7(postcss@8.5.4) - postcss-initial: 4.0.1(postcss@8.5.4) - postcss-lab-function: 4.2.1(postcss@8.5.4) - postcss-logical: 5.0.4(postcss@8.5.4) - postcss-media-minmax: 5.0.0(postcss@8.5.4) - postcss-nesting: 10.2.0(postcss@8.5.4) - postcss-opacity-percentage: 1.1.3(postcss@8.5.4) - postcss-overflow-shorthand: 3.0.4(postcss@8.5.4) - postcss-page-break: 3.0.4(postcss@8.5.4) - postcss-place: 7.0.5(postcss@8.5.4) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.4) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.4) - postcss-selector-not: 5.0.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.6) + postcss-clamp: 4.1.0(postcss@8.5.6) + postcss-color-functional-notation: 4.2.4(postcss@8.5.6) + postcss-color-hex-alpha: 8.0.4(postcss@8.5.6) + postcss-color-rebeccapurple: 7.1.1(postcss@8.5.6) + postcss-custom-media: 8.0.2(postcss@8.5.6) + postcss-custom-properties: 12.1.11(postcss@8.5.6) + postcss-custom-selectors: 6.0.3(postcss@8.5.6) + postcss-dir-pseudo-class: 6.0.5(postcss@8.5.6) + postcss-double-position-gradients: 3.1.2(postcss@8.5.6) + postcss-env-function: 4.0.6(postcss@8.5.6) + postcss-focus-visible: 6.0.4(postcss@8.5.6) + postcss-focus-within: 5.0.4(postcss@8.5.6) + postcss-font-variant: 5.0.0(postcss@8.5.6) + postcss-gap-properties: 3.0.5(postcss@8.5.6) + postcss-image-set-function: 4.0.7(postcss@8.5.6) + postcss-initial: 4.0.1(postcss@8.5.6) + postcss-lab-function: 4.2.1(postcss@8.5.6) + postcss-logical: 5.0.4(postcss@8.5.6) + postcss-media-minmax: 5.0.0(postcss@8.5.6) + postcss-nesting: 10.2.0(postcss@8.5.6) + postcss-opacity-percentage: 1.1.3(postcss@8.5.6) + postcss-overflow-shorthand: 3.0.4(postcss@8.5.6) + postcss-page-break: 3.0.4(postcss@8.5.6) + postcss-place: 7.0.5(postcss@8.5.6) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.6) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6) + postcss-selector-not: 5.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - postcss-pseudo-class-any-link@7.1.6(postcss@8.5.4): + postcss-pseudo-class-any-link@7.1.6(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-replace-overflow-wrap@4.0.0(postcss@8.5.4): + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-resolve-nested-selector@0.1.6: {} @@ -19786,9 +20104,9 @@ snapshots: dependencies: postcss: 7.0.39 - postcss-safe-parser@6.0.0(postcss@8.5.4): + postcss-safe-parser@6.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-sass@0.4.4: dependencies: @@ -19799,10 +20117,10 @@ snapshots: dependencies: postcss: 7.0.39 - postcss-selector-not@5.0.0(postcss@8.5.4): + postcss-selector-not@5.0.0(postcss@8.5.6): dependencies: balanced-match: 1.0.2 - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser@6.1.2: dependencies: @@ -19814,22 +20132,22 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sorting@6.0.0(postcss@8.5.4): + postcss-sorting@6.0.0(postcss@8.5.6): dependencies: lodash: 4.17.21 - postcss: 8.5.4 + postcss: 8.5.6 - postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39): + postcss-syntax@0.36.2(postcss-html@0.36.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39))(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39): dependencies: postcss: 7.0.39 optionalDependencies: - postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) + postcss-html: 0.36.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39) postcss-less: 3.1.4 postcss-scss: 2.1.1 - postcss-syntax@0.36.2(postcss@8.5.4): + postcss-syntax@0.36.2(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser@4.2.0: {} @@ -19838,7 +20156,7 @@ snapshots: picocolors: 0.2.1 source-map: 0.6.1 - postcss@8.5.4: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -19846,9 +20164,9 @@ snapshots: prelude-ls@1.2.1: {} - prettier-eslint@16.4.2(typescript@4.9.5): + prettier-eslint@16.4.2(typescript@5.9.2): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) common-tags: 1.8.2 dlv: 1.1.3 eslint: 8.57.1 @@ -19869,6 +20187,11 @@ snapshots: prettier: 2.8.8 typescript: 4.9.5 + prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.9.2): + dependencies: + prettier: 2.8.8 + typescript: 5.9.2 + prettier-plugin-packagejson@2.4.3(prettier@2.8.8): dependencies: sort-package-json: 2.4.1 @@ -19885,9 +20208,9 @@ snapshots: prettier-plugin-two-style-order@1.0.1(prettier@2.8.8): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-less: 4.0.1 - postcss-sorting: 6.0.0(postcss@8.5.4) + postcss-sorting: 6.0.0(postcss@8.5.6) prettier: 2.8.8 prettier@2.8.8: {} @@ -19972,12 +20295,12 @@ snapshots: pump@2.0.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 pumpify@1.5.1: @@ -19996,7 +20319,7 @@ snapshots: qiankun@2.10.16: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 import-html-entry: 1.17.0 lodash: 4.17.21 single-spa: 5.9.5 @@ -20050,7 +20373,7 @@ snapshots: rc-align@4.0.15(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 dom-align: 1.12.4 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20060,7 +20383,7 @@ snapshots: rc-cascader@3.34.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-select: 14.16.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-tree: 5.13.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20070,7 +20393,7 @@ snapshots: rc-cascader@3.7.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 array-tree-filter: 2.1.0 classnames: 2.5.1 rc-select: 14.1.18(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20081,7 +20404,7 @@ snapshots: rc-checkbox@3.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20089,7 +20412,7 @@ snapshots: rc-checkbox@3.5.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20097,7 +20420,7 @@ snapshots: rc-collapse@3.4.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20107,7 +20430,7 @@ snapshots: rc-collapse@3.9.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20116,7 +20439,7 @@ snapshots: rc-dialog@9.0.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20126,7 +20449,7 @@ snapshots: rc-dialog@9.6.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20136,7 +20459,7 @@ snapshots: rc-drawer@6.3.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20146,7 +20469,7 @@ snapshots: rc-drawer@7.3.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20156,7 +20479,7 @@ snapshots: rc-dropdown@4.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-trigger: 5.3.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20165,8 +20488,8 @@ snapshots: rc-dropdown@4.2.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20174,7 +20497,7 @@ snapshots: rc-field-form@1.38.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 async-validator: 4.2.5 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20182,7 +20505,7 @@ snapshots: rc-field-form@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/async-validator': 5.0.4 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20190,7 +20513,7 @@ snapshots: rc-image@5.13.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-dialog: 9.0.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20201,7 +20524,7 @@ snapshots: rc-image@7.12.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/portal': 1.1.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-dialog: 9.6.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20212,7 +20535,7 @@ snapshots: rc-input-number@7.3.11(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20220,7 +20543,7 @@ snapshots: rc-input-number@9.5.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 rc-input: 1.8.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20230,7 +20553,7 @@ snapshots: rc-input@0.1.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20238,7 +20561,7 @@ snapshots: rc-input@1.8.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20246,7 +20569,7 @@ snapshots: rc-mentions@1.13.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-menu: 9.8.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-textarea: 0.4.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20257,8 +20580,8 @@ snapshots: rc-mentions@2.20.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-input: 1.8.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-menu: 9.16.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20269,8 +20592,8 @@ snapshots: rc-menu@9.16.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-overflow: 1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20280,7 +20603,7 @@ snapshots: rc-menu@9.8.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-overflow: 1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20291,7 +20614,7 @@ snapshots: rc-motion@2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20299,7 +20622,7 @@ snapshots: rc-notification@4.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20308,7 +20631,7 @@ snapshots: rc-notification@5.6.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20317,7 +20640,7 @@ snapshots: rc-overflow@1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20326,14 +20649,14 @@ snapshots: rc-pagination@3.2.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) rc-pagination@5.1.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20341,7 +20664,7 @@ snapshots: rc-picker@2.7.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 date-fns: 2.30.0 dayjs: 1.11.13 @@ -20354,8 +20677,8 @@ snapshots: rc-picker@4.11.3(date-fns@2.30.0)(dayjs@1.11.13)(luxon@3.6.1)(moment@2.30.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-overflow: 1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-resize-observer: 1.4.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20370,7 +20693,7 @@ snapshots: rc-progress@3.4.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20378,7 +20701,7 @@ snapshots: rc-progress@4.0.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20386,7 +20709,7 @@ snapshots: rc-rate@2.13.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20394,7 +20717,7 @@ snapshots: rc-rate@2.9.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20402,7 +20725,7 @@ snapshots: rc-resize-observer@0.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20411,7 +20734,7 @@ snapshots: rc-resize-observer@1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20420,7 +20743,7 @@ snapshots: rc-resize-observer@1.4.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20429,7 +20752,7 @@ snapshots: rc-segmented@2.3.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20438,7 +20761,7 @@ snapshots: rc-segmented@2.7.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20447,7 +20770,7 @@ snapshots: rc-select@14.1.18(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-overflow: 1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20459,8 +20782,8 @@ snapshots: rc-select@14.16.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-overflow: 1.4.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20471,7 +20794,7 @@ snapshots: rc-slider@10.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20480,7 +20803,7 @@ snapshots: rc-slider@11.1.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20488,7 +20811,7 @@ snapshots: rc-steps@5.0.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20496,7 +20819,7 @@ snapshots: rc-steps@6.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20504,7 +20827,7 @@ snapshots: rc-switch@3.2.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20512,7 +20835,7 @@ snapshots: rc-switch@4.1.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20520,7 +20843,7 @@ snapshots: rc-table@7.26.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20528,20 +20851,9 @@ snapshots: react-dom: 17.0.2(react@17.0.2) shallowequal: 1.1.0 - rc-table@7.50.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2): + rc-table@7.51.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/context': 1.4.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - classnames: 2.5.1 - rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - rc-virtual-list: 3.18.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - react: 17.0.2 - react-dom: 17.0.2(react@17.0.2) - - rc-table@7.51.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): - dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@rc-component/context': 1.4.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20552,7 +20864,7 @@ snapshots: rc-tabs@12.5.10(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-dropdown: 4.0.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-menu: 9.8.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20564,7 +20876,7 @@ snapshots: rc-tabs@15.6.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-dropdown: 4.2.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-menu: 9.16.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20576,7 +20888,7 @@ snapshots: rc-textarea@0.4.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20586,7 +20898,7 @@ snapshots: rc-textarea@1.10.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-input: 1.8.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20596,7 +20908,7 @@ snapshots: rc-tooltip@5.2.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-trigger: 5.3.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20604,8 +20916,8 @@ snapshots: rc-tooltip@6.4.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 - '@rc-component/trigger': 2.2.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@babel/runtime': 7.27.6 + '@rc-component/trigger': 2.2.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2) classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20613,7 +20925,7 @@ snapshots: rc-tree-select@5.27.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-select: 14.16.8(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-tree: 5.13.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20623,7 +20935,7 @@ snapshots: rc-tree-select@5.5.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-select: 14.1.18(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-tree: 5.7.12(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20633,7 +20945,7 @@ snapshots: rc-tree@5.13.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20643,7 +20955,7 @@ snapshots: rc-tree@5.7.12(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20653,7 +20965,7 @@ snapshots: rc-trigger@5.3.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-align: 4.0.15(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-motion: 2.9.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20663,7 +20975,7 @@ snapshots: rc-upload@4.3.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20671,7 +20983,7 @@ snapshots: rc-upload@4.9.2(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 @@ -20687,14 +20999,14 @@ snapshots: rc-util@5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-is: 18.3.1 rc-virtual-list@3.18.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20703,7 +21015,7 @@ snapshots: rc-virtual-list@3.4.13(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 classnames: 2.5.1 rc-resize-observer: 1.3.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2) rc-util: 5.44.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -20779,14 +21091,14 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - react-intl@3.12.1(react@17.0.2): + react-intl@3.12.1(@types/react@16.14.65)(react@17.0.2): dependencies: '@formatjs/intl-displaynames': 1.2.10 '@formatjs/intl-listformat': 1.4.8 '@formatjs/intl-relativetimeformat': 4.5.16 '@formatjs/intl-unified-numberformat': 3.3.7 '@formatjs/intl-utils': 2.3.0 - '@types/hoist-non-react-statics': 3.3.6 + '@types/hoist-non-react-statics': 3.3.7(@types/react@16.14.65) '@types/invariant': 2.2.37 hoist-non-react-statics: 3.3.2 intl-format-cache: 4.3.1 @@ -20794,12 +21106,14 @@ snapshots: intl-messageformat-parser: 3.6.4 react: 17.0.2 shallow-equal: 1.2.1 + transitivePeerDependencies: + - '@types/react' - react-intl@5.25.1(react@17.0.2)(typescript@4.9.5): + react-intl@5.25.1(react@17.0.2)(typescript@5.9.2): dependencies: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/icu-messageformat-parser': 2.1.0 - '@formatjs/intl': 2.2.1(typescript@4.9.5) + '@formatjs/intl': 2.2.1(typescript@5.9.2) '@formatjs/intl-displaynames': 5.4.3 '@formatjs/intl-listformat': 6.5.3 '@types/hoist-non-react-statics': 3.3.6 @@ -20809,7 +21123,7 @@ snapshots: react: 17.0.2 tslib: 2.8.1 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.2 react-is@16.13.1: {} @@ -20823,7 +21137,7 @@ snapshots: react-redux@5.1.2(react@17.0.2)(redux@3.7.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.28.3 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 loose-envify: 1.4.0 @@ -20835,8 +21149,8 @@ snapshots: react-redux@8.1.3(@types/react-dom@16.9.25(@types/react@16.14.65))(@types/react@16.14.65)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(redux@4.2.1): dependencies: - '@babel/runtime': 7.27.4 - '@types/hoist-non-react-statics': 3.3.6 + '@babel/runtime': 7.28.3 + '@types/hoist-non-react-statics': 3.3.7(@types/react@16.14.65) '@types/use-sync-external-store': 0.0.3 hoist-non-react-statics: 3.3.2 react: 17.0.2 @@ -20913,7 +21227,7 @@ snapshots: react-sortable-hoc@2.0.0(prop-types@15.8.1)(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 invariant: 2.2.4 prop-types: 15.8.1 react: 17.0.2 @@ -20933,7 +21247,7 @@ snapshots: react-virtualized@9.22.6(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 clsx: 1.2.1 dom-helpers: 5.2.1 loose-envify: 1.4.0 @@ -20944,7 +21258,7 @@ snapshots: react-window@1.8.11(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 memoize-one: 4.1.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -21066,7 +21380,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 reflect.getprototypeof@1.0.10: dependencies: @@ -21289,7 +21603,7 @@ snapshots: dependencies: open: 8.4.2 picomatch: 2.3.1 - source-map: 0.7.4 + source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: rollup: 3.29.5 @@ -21353,7 +21667,7 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@16.0.5(webpack@4.47.0(webpack-cli@3.3.12)): + sass-loader@16.0.5(webpack@4.47.0): dependencies: neo-async: 2.6.2 optionalDependencies: @@ -21598,11 +21912,11 @@ snapshots: dependencies: agent-base: 6.0.2 debug: 4.4.1 - socks: 2.8.4 + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.8.4: + socks@2.8.5: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 @@ -21668,7 +21982,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} spawn-command@0.0.2: {} @@ -21781,7 +22095,7 @@ snapshots: stream-each@1.2.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 stream-shift: 1.0.3 stream-http@2.8.2: @@ -21938,7 +22252,7 @@ snapshots: '@types/stylis': 4.2.7 css-to-react-native: 3.2.0 csstype: 3.1.3 - postcss: 8.5.4 + postcss: 8.5.6 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) shallowequal: 1.1.0 @@ -21977,8 +22291,8 @@ snapshots: stylelint@13.13.1: dependencies: - '@stylelint/postcss-css-in-js': 0.37.3(postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39))(postcss@7.0.39) - '@stylelint/postcss-markdown': 0.36.2(postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39))(postcss@7.0.39) + '@stylelint/postcss-css-in-js': 0.37.3(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39) + '@stylelint/postcss-markdown': 0.36.2(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39) autoprefixer: 9.8.8 balanced-match: 2.0.0 chalk: 4.1.2 @@ -22004,7 +22318,7 @@ snapshots: micromatch: 4.0.8 normalize-selector: 0.2.0 postcss: 7.0.39 - postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) + postcss-html: 0.36.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39) postcss-less: 3.1.4 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.6 @@ -22012,7 +22326,7 @@ snapshots: postcss-sass: 0.4.4 postcss-scss: 2.1.1 postcss-selector-parser: 6.1.2 - postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss-html@0.36.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@7.0.39))(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) postcss-value-parser: 4.2.0 resolve-from: 5.0.0 slash: 3.0.0 @@ -22057,10 +22371,10 @@ snapshots: normalize-path: 3.0.0 normalize-selector: 0.2.0 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.6 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 6.0.0(postcss@8.5.4) + postcss-safe-parser: 6.0.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -22131,7 +22445,7 @@ snapshots: picocolors: 1.1.1 stable: 0.1.8 - swr@2.3.3(react@17.0.2): + swr@2.3.6(react@17.0.2): dependencies: dequal: 2.0.3 react: 17.0.2 @@ -22165,7 +22479,7 @@ snapshots: tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 @@ -22184,7 +22498,7 @@ snapshots: async-exit-hook: 2.0.1 fs-extra: 10.1.0 - terser-webpack-plugin@1.4.6(webpack@4.47.0(webpack-cli@3.3.12)): + terser-webpack-plugin@1.4.6(webpack@4.47.0): dependencies: cacache: 12.0.4 find-cache-dir: 2.1.0 @@ -22199,15 +22513,15 @@ snapshots: terser@4.8.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 - terser@5.40.0: + terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -22252,7 +22566,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 titleize@3.0.0: {} @@ -22319,20 +22633,20 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.4.3(typescript@4.9.5): + ts-api-utils@1.4.3(typescript@5.9.2): dependencies: - typescript: 4.9.5 + typescript: 5.9.2 ts-is-present@1.2.2: {} - ts-loader@8.4.0(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)): + ts-loader@8.4.0(typescript@5.9.2)(webpack@4.47.0): dependencies: chalk: 4.1.2 enhanced-resolve: 4.5.0 loader-utils: 2.0.4 micromatch: 4.0.8 semver: 7.7.2 - typescript: 4.9.5 + typescript: 5.9.2 webpack: 4.47.0(webpack-cli@3.3.12) tslib@1.14.1: {} @@ -22346,6 +22660,11 @@ snapshots: tslib: 1.14.1 typescript: 4.9.5 + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + tsx@3.12.2: dependencies: '@esbuild-kit/cjs-loader': 2.4.4 @@ -22427,23 +22746,23 @@ snapshots: typescript@4.9.5: {} - typescript@5.8.3: {} + typescript@5.9.2: {} uc.micro@1.0.6: {} - umi@4.4.11(@babel/core@7.27.4)(@types/node@9.6.61)(@types/react@16.14.65)(eslint@8.35.0)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(stylelint@14.8.2)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)): + umi@4.4.12(@babel/core@7.28.3)(@types/node@16.18.126)(@types/react@16.14.65)(eslint@8.35.0)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(rollup@3.29.5)(stylelint@14.8.2)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0): dependencies: '@babel/runtime': 7.23.6 - '@umijs/bundler-utils': 4.4.11 - '@umijs/bundler-webpack': 4.4.11(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) - '@umijs/core': 4.4.11 - '@umijs/lint': 4.4.11(eslint@8.35.0)(stylelint@14.8.2)(typescript@4.9.5) - '@umijs/preset-umi': 4.4.11(@types/node@9.6.61)(@types/react@16.14.65)(lightningcss@1.22.1)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.40.0)(type-fest@0.21.3)(typescript@4.9.5)(webpack@4.47.0(webpack-cli@3.3.12)) - '@umijs/renderer-react': 4.4.11(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - '@umijs/server': 4.4.11 - '@umijs/test': 4.4.11(@babel/core@7.27.4) - '@umijs/utils': 4.4.11 - prettier-plugin-organize-imports: 3.2.4(prettier@2.8.8)(typescript@4.9.5) + '@umijs/bundler-utils': 4.4.12 + '@umijs/bundler-webpack': 4.4.12(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0) + '@umijs/core': 4.4.12 + '@umijs/lint': 4.4.12(eslint@8.35.0)(stylelint@14.8.2)(typescript@5.9.2) + '@umijs/preset-umi': 4.4.12(@types/node@16.18.126)(@types/react@16.14.65)(lightningcss@1.22.1)(rollup@3.29.5)(sugarss@2.0.0)(terser@5.43.1)(type-fest@0.21.3)(typescript@5.9.2)(webpack@4.47.0) + '@umijs/renderer-react': 4.4.12(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@umijs/server': 4.4.12 + '@umijs/test': 4.4.12(@babel/core@7.28.3) + '@umijs/utils': 4.4.12 + prettier-plugin-organize-imports: 3.2.4(prettier@2.8.8)(typescript@5.9.2) prettier-plugin-packagejson: 2.4.3(prettier@2.8.8) transitivePeerDependencies: - '@babel/core' @@ -22570,6 +22889,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.25.3): + dependencies: + browserslist: 4.25.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -22601,7 +22926,7 @@ snapshots: formstream: 1.5.1 humanize-ms: 1.2.1 iconv-lite: 0.6.3 - pump: 3.0.2 + pump: 3.0.3 qs: 6.14.0 statuses: 1.5.0 utility: 1.18.0 @@ -22710,18 +23035,18 @@ snapshots: unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - vite@4.5.2(@types/node@9.6.61)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.40.0): + vite@4.5.2(@types/node@16.18.126)(less@4.1.3)(lightningcss@1.22.1)(sugarss@2.0.0)(terser@5.43.1): dependencies: esbuild: 0.18.20 - postcss: 8.5.4 + postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 9.6.61 + '@types/node': 16.18.126 fsevents: 2.3.3 less: 4.1.3 lightningcss: 1.22.1 sugarss: 2.0.0 - terser: 5.40.0 + terser: 5.43.1 vm-browserify@1.1.2: {} @@ -22832,7 +23157,7 @@ snapshots: node-libs-browser: 2.2.1 schema-utils: 1.0.0 tapable: 1.1.3 - terser-webpack-plugin: 1.4.6(webpack@4.47.0(webpack-cli@3.3.12)) + terser-webpack-plugin: 1.4.6(webpack@4.47.0) watchpack: 1.7.5 webpack-sources: 1.4.3 optionalDependencies: @@ -23024,11 +23349,11 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-validation-error@2.1.0(zod@3.25.49): + zod-validation-error@2.1.0(zod@3.25.76): dependencies: - zod: 3.25.49 + zod: 3.25.76 - zod@3.25.49: {} + zod@3.25.76: {} zrender@5.6.1: dependencies: diff --git a/package.json b/package.json index 0719029cb..eeca0d74f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "odc", - "version": "4.3.4", + "version": "4.4.0", "private": true, "description": "企业级数据开发平台", "homepage": "https://www.oceanbase.com/", @@ -12,6 +12,7 @@ "name": "odc" }, "scripts": { + "install-odc": "node ./scripts/rename.js && pnpm install --registry=https://registry.npmmirror.com", "analyze": "ANALYZE=1 cross-env NODE_OPTIONS=--max_old_space_size=8192 max build", "build-main-dev": "cross-env NODE_OPTIONS=--max_old_space_size=8192 NODE_ENV=development webpack -w --config ./build/webpack.main.config.js", "build-main-prod": "cross-env NODE_OPTIONS=--max_old_space_size=8192 NODE_ENV=production webpack --config ./build/webpack.main.prod.config.js", @@ -23,7 +24,7 @@ "dev:client": "concurrently \"UMI_ENV=client npm run dev\" \"npm run build-main-dev\"", "postinstall": "node scripts/plugin/initPlugins.js && max setup", "oic:clear": "oic --configPath ./scripts/must.js --clear", - "oic:extract": "oic --configPath ./scripts/must.js --extract all", + "oic:extract": "oic --configPath ./scripts/must.js --parallel --extract all", "oic:migrate": "oic --configPath ./scripts/must.js --migrate", "prepack": "node ./scripts/clientDependencies/index.js", "pack-client:all": "node ./scripts/client/build.js all", @@ -71,14 +72,13 @@ "tree-kill": "^1.2.1" }, "devDependencies": { - "axios": "^1.7.7", + "@ant-design/icons": "^4.0.0", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "@ant-design/icons": "^4.0.0", - "@oceanbase-odc/monaco-plugin-ob": "~1.4.2", - "@oceanbase-odc/ob-intl-cli": "^2.1.3", - "@oceanbase-odc/ob-parser-js": "^3.0.5", + "@oceanbase-odc/monaco-plugin-ob": "~1.5.3", + "@oceanbase-odc/ob-intl-cli": "^2.2.0", + "@oceanbase-odc/ob-parser-js": "^3.1.2", "@oceanbase-odc/ob-react-data-grid": "^4.0.0", "@sentry/react": "^7.88.0", "@testing-library/react": "^11.2.2", @@ -87,14 +87,14 @@ "@types/jest": "^22.2.2", "@types/lodash": "^4.14.168", "@types/memoize-one": "^4.1.1", - "@types/node": "^9.6.0", + "@types/node": "^16.7.0", "@types/react": "^16.0.0", "@types/react-dom": "^16.0.0", "@types/react-resizable": "^1.7.3", "@types/react-virtualized": "^9.21.21", "@types/request": "^2.48.7", "@umijs/fabric": "^3.0.0", - "@umijs/max": "^4.0.66", + "@umijs/max": "^4.4.12", "adm-zip": "^0.5.5", "ahooks": "^2.9.0", "ali-oss": "^6.17.1", @@ -102,6 +102,7 @@ "antlr4": "~4.8.0", "array-move": "^4.0.0", "aws-sdk": "^2.1231.0", + "axios": "^1.7.7", "bignumber.js": "^9.0.0", "blueimp-md5": "^2.19.0", "cherio": "^1.0.0-rc.2", @@ -162,7 +163,7 @@ "tar": "^6.1.11", "ts-is-present": "^1.1.3", "ts-loader": "8.4.0", - "typescript": "^4.0.0", + "typescript": "^5.9.2", "webpack": "^4.28.0", "webpack-cli": "^3.2.1", "webpack-merge": "^4.2.1", diff --git a/scripts/client/winsign.js b/scripts/client/winsign.js new file mode 100644 index 000000000..559ce71db --- /dev/null +++ b/scripts/client/winsign.js @@ -0,0 +1,29 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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. + */ + +exports.default = async function(configuration) { + // do not include passwords or other sensitive data in the file + // rather create environment variables with sensitive data + const CONFIG_FILE = process.env.WINDOWS_SIGN_CONFIG_FILE; + + require("child_process").execSync( + // your commande here ! For exemple and with JSign : + ` smctl sign --keypair-alias key_1318155498 --config-file ${CONFIG_FILE} --input "${configuration.path}" -v`, + { + stdio: "inherit" + } + ); + }; \ No newline at end of file diff --git a/scripts/clientDependencies/pullJar.js b/scripts/clientDependencies/pullJar.js index 25006f807..781d3d76f 100644 --- a/scripts/clientDependencies/pullJar.js +++ b/scripts/clientDependencies/pullJar.js @@ -20,13 +20,33 @@ const jarUrl = `odc-build/${pkg.version}/jar/odc-slim.jar`; const pluginUrl = `odc-build/${pkg.version}/plugins`; const startersUrl = `odc-build/${pkg.version}/starters`; const modulesUrl = `odc-build/${pkg.version}/modules`; -const { oss } = require('./util'); +const { oss, download } = require('./util'); const isSkipJar = process.env.ODC_BUILD_SKIP_JAR; +const baseUrl = "https://odc-front.oss-cn-beijing.aliyuncs.com/"; + exports.run = async function () { if (isSkipJar) { return true; } + const [isSuccess1, isSuccess2] = await Promise.all([ + download( + baseUrl + `library/h2/h2-v1.jar`, + 'libraries/script', + 'h2-v1.jar', + ), + download( + baseUrl + `library/h2/h2-v2.jar`, + 'libraries/script', + 'h2-v2.jar', + ) + ]) + if (!isSuccess1 || !isSuccess2) { + process.exit(1); + } + console.log('h2-v1.jar and h2-v2.jar download success') + + const plugins = await oss.getOSSFolderFiles(pluginUrl) console.log(plugins) for (let plugin of plugins) { diff --git a/scripts/clientDependencies/pullJre.js b/scripts/clientDependencies/pullJre.js index 34dc85217..2c99db8fe 100644 --- a/scripts/clientDependencies/pullJre.js +++ b/scripts/clientDependencies/pullJre.js @@ -31,7 +31,7 @@ exports.run = async function () { fs.rmSync(jrePath, { recursive: true, force: true }); } const isSuccess = await download( - baseUrl + `library/jre/${platform}/jre.zip`, + baseUrl + `library/jre/${platform}/jre17.zip`, 'libraries/jre', 'jre.zip', ); diff --git a/scripts/rename.js b/scripts/rename.js new file mode 100644 index 000000000..51e9f5e42 --- /dev/null +++ b/scripts/rename.js @@ -0,0 +1,41 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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. + */ + +/** + * 把假的文件先删除,然后创建一个link到hidden.yaml文件 + */ + + +const path = require('path'); +const fs = require('fs'); + +// 参数 preinstall 和 postinstall +// preinstall 代表install +// postinstall 代表install完成之后 + +const lockFilePath = path.join(process.cwd(), 'hidden.yaml'); + +const fakeLockFilePath = path.join(process.cwd(), 'pnpm-lock.yaml'); +console.log('init install lock file') + +if (fs.existsSync(fakeLockFilePath)) { + fs.unlinkSync(fakeLockFilePath); +} + +fs.symlinkSync(lockFilePath, fakeLockFilePath, 'file'); + + + diff --git a/src/common/datasource/fileSystem/index.tsx b/src/common/datasource/fileSystem/index.tsx index 76163a827..1426e078a 100644 --- a/src/common/datasource/fileSystem/index.tsx +++ b/src/common/datasource/fileSystem/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { ConnectType, TaskType } from '@/d.ts'; import { IDataSourceModeConfig } from '../interface'; import { haveOCP } from '@/util/env'; diff --git a/src/common/datasource/oceanbase/obmysql.ts b/src/common/datasource/oceanbase/obmysql.ts index ff9afc67d..8c3338386 100644 --- a/src/common/datasource/oceanbase/obmysql.ts +++ b/src/common/datasource/oceanbase/obmysql.ts @@ -121,6 +121,7 @@ const items: Record< sqlExplain: true, supportOBProxy: true, plRun: true, + plEdit: true, export: { fileLimit: true, snapshot: true, diff --git a/src/common/network/database.ts b/src/common/network/database.ts index 6c4ff9a70..c2b3f07da 100644 --- a/src/common/network/database.ts +++ b/src/common/network/database.ts @@ -22,42 +22,31 @@ import request from '@/util/request'; import { getDropSQL } from '@/util/sql'; import { executeSQL } from './sql'; +interface listDatabasesParams { + projectId?: number; + dataSourceId?: number; + page?: number; + size?: number; + name?: string; + environmentId?: number[]; + /** 是否包含未分配项目的数据库 */ + containsUnassigned?: boolean; + existed?: boolean; + includesPermittedAction?: boolean; + /** 是否查询数据库管理员owners列表,默认不查 */ + includesDbOwner?: boolean; + type?: DBType[]; + connectType?: ConnectType[]; + dataSourceName?: string; + clusterName?: string; + tenantName?: string; +} + export async function listDatabases( - projectId?: number, - dataSourceId?: number, - page?: number, - size?: number, - name?: string, - environmentId?: number[], - /** - * 是否包含未分配项目的数据库 - */ - containsUnassigned?: boolean, - existed?: boolean, - includesPermittedAction?: boolean, - type?: DBType[], - connectType?: ConnectType[], - dataSourceName?: string, - clusterName?: string, - tenantName?: string, + params: listDatabasesParams, ): Promise> { const res = await request.get(`/api/v2/database/databases`, { - params: { - projectId, - dataSourceId, - name, - page, - size, - environmentId, - containsUnassigned, - existed, - includesPermittedAction, - type: type, - connectType: connectType, - dataSourceName, - clusterName, - tenantName, - }, + params: params, }); return res?.data; diff --git a/src/common/network/databaseChange.ts b/src/common/network/databaseChange.ts index 62feb3576..fced6cc4b 100644 --- a/src/common/network/databaseChange.ts +++ b/src/common/network/databaseChange.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { IResponse, IResponseData } from '@/d.ts'; import request from '@/util/request'; diff --git a/src/common/network/logicalDatabase.ts b/src/common/network/logicalDatabase.ts index 8e87b7850..79376fdf9 100644 --- a/src/common/network/logicalDatabase.ts +++ b/src/common/network/logicalDatabase.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { IResponse, IResponseData } from '@/d.ts'; import { PreviewLogicalTableTopologiesErrorEnum } from '@/d.ts/database'; import { diff --git a/src/common/network/materializedView/helper.ts b/src/common/network/materializedView/helper.ts index 53b0a27b9..8d83ca92c 100644 --- a/src/common/network/materializedView/helper.ts +++ b/src/common/network/materializedView/helper.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TableIndexScope, TableIndexType } from '@/page/Workspace/components/CreateTable/interface'; import { ColumnStoreType } from '@/d.ts/table'; import { convertServerTablePartitionToTablePartition, PartitionLevelEnum } from '../table/helper'; diff --git a/src/common/network/materializedView/index.ts b/src/common/network/materializedView/index.ts index ae610aafb..659effc0e 100644 --- a/src/common/network/materializedView/index.ts +++ b/src/common/network/materializedView/index.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 request from '@/util/request'; import { encodeObjName } from '@/util/utils'; import { Base64 } from 'js-base64'; diff --git a/src/common/network/sessionParams.ts b/src/common/network/sessionParams.ts index d3771c49f..efe9983a5 100644 --- a/src/common/network/sessionParams.ts +++ b/src/common/network/sessionParams.ts @@ -69,7 +69,7 @@ export async function killSessions( killType: 'session' | 'query', ): Promise< { - sessionId: number; + sessionId: string; killed: boolean; errorMessage?: string; }[] diff --git a/src/common/network/sql/executePLForMysql.tsx b/src/common/network/sql/executePLForMysql.tsx index d8101ab77..20805ee0d 100644 --- a/src/common/network/sql/executePLForMysql.tsx +++ b/src/common/network/sql/executePLForMysql.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 type { IExecutingInfo } from '@/d.ts'; import request from '@/util/request'; import { generateDatabaseSid } from '../pathUtil'; diff --git a/src/common/network/sql/preHandle.tsx b/src/common/network/sql/preHandle.tsx index 1a023afa2..dc411eb06 100644 --- a/src/common/network/sql/preHandle.tsx +++ b/src/common/network/sql/preHandle.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { ISQLLintReuslt } from '@/component/SQLLintResult/type'; import modal from '@/store/modal'; import sessionManager from '@/store/sessionManager'; diff --git a/src/common/network/task.ts b/src/common/network/task.ts index 5101b2b9c..235063982 100644 --- a/src/common/network/task.ts +++ b/src/common/network/task.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { IShadowSyncAnalysisResult } from '@/component/Task/ShadowSyncTask/CreateModal/interface'; +import { IShadowSyncAnalysisResult } from '@/component/Task/modals/ShadowSyncTask/CreateModal/interface'; import { AgainTaskRecord, CommonTaskLogType, @@ -61,6 +61,7 @@ import { IImportTaskResult, IScheduleTaskImportRequest, IScheduleTerminateCmd, + ITaskTerminateCmd, IScheduleTerminateResult, } from '@/d.ts/importTask'; import odc from '@/plugins/odc'; @@ -921,9 +922,9 @@ export async function getScheduleImportLog(importTaskId: string): Promise { +export async function cancelFlowInstance(data: ITaskTerminateCmd): Promise { const res = await request.post(`/api/v2/flow/flowInstances/asyncCancel`, { - data: flowInstanceId, + data, }); return res?.data; } diff --git a/src/component/Action/Item.tsx b/src/component/Action/Item.tsx index ab076d4fe..76ad933f1 100644 --- a/src/component/Action/Item.tsx +++ b/src/component/Action/Item.tsx @@ -65,6 +65,7 @@ export class ActionButton extends React.PureComponent { danger={danger} disabled={disabled} onClick={(_) => { + if (disabled) return; if (enableLoading) { this.setState({ loading: true }); @@ -109,6 +110,7 @@ export class ActionLink extends React.PureComponent { style={{ padding: 0 }} disabled={loading || disabled || this.state.disabled} onClick={(_) => { + if (loading || disabled || this.state.disabled) return; _.stopPropagation(); _.preventDefault(); const handle = onClick?.(_); diff --git a/src/component/BatchSelectionPopover/index.tsx b/src/component/BatchSelectionPopover/index.tsx index 1bef211a5..3a592a24c 100644 --- a/src/component/BatchSelectionPopover/index.tsx +++ b/src/component/BatchSelectionPopover/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import React, { useEffect, useState, useMemo } from 'react'; import { Button, Checkbox, Popover, Spin, Empty, Input, Space } from 'antd'; diff --git a/src/component/Button/SyncMetadata/index.tsx b/src/component/Button/SyncMetadata/index.tsx index 19f850d48..7a0f32da5 100644 --- a/src/component/Button/SyncMetadata/index.tsx +++ b/src/component/Button/SyncMetadata/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { syncAll } from '@/common/network/database'; import { DBObjectSyncStatus, IDatabase } from '@/d.ts/database'; import { ReactComponent as SyncMetadataSvg } from '@/svgr/sync_metadata.svg'; diff --git a/src/component/CommonCopyIcon/index.tsx b/src/component/CommonCopyIcon/index.tsx index 2fca668a5..5cb286f16 100644 --- a/src/component/CommonCopyIcon/index.tsx +++ b/src/component/CommonCopyIcon/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 CopyToClipboard from 'react-copy-to-clipboard'; import { CopyOutlined } from '@ant-design/icons'; import { Tooltip } from 'antd'; diff --git a/src/component/CommonTable/component/EditTableRow.tsx b/src/component/CommonTable/component/EditTableRow.tsx index dbd3714be..e05cf9ca2 100644 --- a/src/component/CommonTable/component/EditTableRow.tsx +++ b/src/component/CommonTable/component/EditTableRow.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Form, GetRef, InputRef, Input, Tooltip } from 'antd'; import React, { useEffect, useRef, useState, useContext } from 'react'; diff --git a/src/component/CommonTable/index.tsx b/src/component/CommonTable/index.tsx index 56ed8f09e..6dd75fe2e 100644 --- a/src/component/CommonTable/index.tsx +++ b/src/component/CommonTable/index.tsx @@ -19,7 +19,7 @@ import { useControllableValue } from 'ahooks'; import { Alert, Spin, Table } from 'antd'; import classNames from 'classnames'; import { throttle } from 'lodash'; -import React, { useEffect, useImperativeHandle, useRef, useState } from 'react'; +import React, { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { ResizeTitle } from './component/ResizeTitle'; import { DEFAULT_BIG_ROW_HEIGHT, @@ -137,7 +137,6 @@ const CommonTable: ( const urlStatusValue = getParam('status'); const [pageSize, setPageSize] = useState(0); const [columnWidthMap, setColumnWidthMap] = useState(null); - const tableColumns = getFilteredColumns(); const showInfoBar = rowSelecter && !!selectedRowKeys?.length && showSelectedInfoBar; const TOOLBAR_HEIGHT = showToolbar ? TABLE_TOOLBAR_HEIGHT : 0; const INFO_BAR_HEIGHT = showInfoBar ? TABLE_INFO_BAR_HEIGHT : 0; @@ -357,15 +356,21 @@ const CommonTable: ( }); } - function getFilteredColumns() { - return columns.map((item) => { - const key = item?.key || (item as any)?.dataIndex; - const defaultFilteredValue = item?.defaultFilteredValue || null; - - item.filteredValue = filters?.[key] || defaultFilteredValue || null; - return item; - }); - } + const tableColumns = useMemo(() => { + return enableResize + ? columns?.map((oriColumn) => { + return { + ...oriColumn, + width: columnWidthMap?.[oriColumn?.key] || oriColumn.width || DEFAULT_COLUMN_WIDTH, + onHeaderCell: (column) => + ({ + width: columnWidthMap?.[column?.key] || oriColumn.width || DEFAULT_COLUMN_WIDTH, + onResize: handleResize(oriColumn), + } as React.HTMLAttributes), + }; + }) + : columns; + }, [enableResize, columns, columnWidthMap]); function handleCloseAlert() { setAlertInfoVisible(false); @@ -482,26 +487,7 @@ const CommonTable: ( `${tableProps?.rowClassName} ${i % 2 === 0 ? styles.even : styles.odd}` } dataSource={dataSource} - //@ts-ignore - columns={ - enableResize - ? columns?.map((oriColumn) => { - return { - ...oriColumn, - width: - columnWidthMap?.[oriColumn?.key] || oriColumn.width || DEFAULT_COLUMN_WIDTH, - onHeaderCell: (column) => - ({ - width: - columnWidthMap?.[column?.key] || - oriColumn.width || - DEFAULT_COLUMN_WIDTH, - onResize: handleResize(oriColumn), - } as React.HTMLAttributes), - }; - }) - : tableColumns - } + columns={tableColumns} components={ enableResize ? { diff --git a/src/component/CreateSynonymModal/index.tsx b/src/component/CreateSynonymModal/index.tsx index 8e3184a63..5b9af3752 100644 --- a/src/component/CreateSynonymModal/index.tsx +++ b/src/component/CreateSynonymModal/index.tsx @@ -96,16 +96,12 @@ class CreateSynonymModal extends Component { const { hour, dayOfWeek, dayOfMonth } = values; - const initInterval = parser.parseExpression(initCronString); + let baseCron = initCronString; + if (dayOfWeek?.length > 0) { + baseCron = '0 0 0 ? * *'; + } + const initInterval = parser.parseExpression(baseCron); const fields = JSON.parse(JSON.stringify(initInterval.fields)); if (hour.length) { fields.hour = hour; @@ -186,7 +191,7 @@ export const getCronString = (values: { fields.second = [0]; } if (dayOfWeek.length) { - fields.dayOfWeek = dayOfWeek; + fields.dayOfWeek = dayOfWeek.map((d) => (d === 7 ? 0 : d)); } if (dayOfMonth.length) { fields.dayOfMonth = dayOfMonth; @@ -478,7 +483,7 @@ class Translator { return nodes ?.map((node) => { let str = ''; - if (reg?.test(node.value)) { + if (reg?.test(node.value) && !intervalReg.test(node.value)) { if (everyReg?.test(node.value)) { return (str = getCronLabel(name as CronInputName, node.value)); } diff --git a/src/component/EditorToolBar/actions/pl.tsx b/src/component/EditorToolBar/actions/pl.tsx index 64302cefc..f887f8ae1 100644 --- a/src/component/EditorToolBar/actions/pl.tsx +++ b/src/component/EditorToolBar/actions/pl.tsx @@ -33,7 +33,7 @@ import { PLPage } from '@/page/Workspace/components/PLPage'; import { DebugStatus } from '@/store/debug/type'; import sqlStore from '@/store/sql'; import { ToolBarActions } from '..'; -import { ConnectionMode } from '@/d.ts'; +import { ConnectType } from '@/d.ts'; const { confirm } = Modal; @@ -58,9 +58,11 @@ const plActions: ToolBarActions = { if (!hasChangeEditorValue) return IConStatus.DISABLE; return getStatus(ctx); }, - action: debounce(async (ctx: any, databaseType?: String, editorValue?: String) => { + action: debounce(async (ctx: any, databaseType?: ConnectType, editorValue?: String) => { switch (databaseType) { - case (ConnectionMode.MYSQL, ConnectionMode.OB_MYSQL): + case ConnectType.MYSQL: + case ConnectType.OB_MYSQL: + case ConnectType.CLOUD_OB_MYSQL: return await ctx.savePL(null, true, editorValue); default: return await ctx.savePL(); diff --git a/src/component/EllipsisText/index.less b/src/component/EllipsisText/index.less new file mode 100644 index 000000000..2123af7d6 --- /dev/null +++ b/src/component/EllipsisText/index.less @@ -0,0 +1,7 @@ +.ellipsisContent { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 100%; + width: max-content; +} diff --git a/src/component/EllipsisText/index.tsx b/src/component/EllipsisText/index.tsx new file mode 100644 index 000000000..014dfd1fe --- /dev/null +++ b/src/component/EllipsisText/index.tsx @@ -0,0 +1,47 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 styles from './index.less'; +import { Tooltip } from 'antd'; +import { useMemo } from 'react'; + +interface IProps { + content: string | React.ReactNode; + customTooltipContent?: React.ReactNode; + needTooltip?: boolean; +} + +const EllipsisText = (props: IProps) => { + const { content, customTooltipContent, needTooltip = true } = props; + + const tooltipContent = useMemo(() => { + if (!content || !needTooltip) return null; + if (customTooltipContent) { + return customTooltipContent; + } + return content; + }, [content, customTooltipContent, needTooltip]); + + return content ? ( + +
{content}
+
+ ) : ( + <>- + ); +}; + +export default EllipsisText; diff --git a/src/component/Empty/ApplyDatabaseAuthEmpty/index.tsx b/src/component/Empty/ApplyDatabaseAuthEmpty/index.tsx index 84589a80d..0043a4ec5 100644 --- a/src/component/Empty/ApplyDatabaseAuthEmpty/index.tsx +++ b/src/component/Empty/ApplyDatabaseAuthEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Empty } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/DataSourceEmpty/index.tsx b/src/component/Empty/DataSourceEmpty/index.tsx index 1405def65..1ab8bb24e 100644 --- a/src/component/Empty/DataSourceEmpty/index.tsx +++ b/src/component/Empty/DataSourceEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Acess, createPermission } from '@/component/Acess'; import { actionTypes, IManagerResourceType } from '@/d.ts'; diff --git a/src/component/Empty/DatabaseSelectEmpty/index.tsx b/src/component/Empty/DatabaseSelectEmpty/index.tsx index 1d6f07b2a..15c167e3a 100644 --- a/src/component/Empty/DatabaseSelectEmpty/index.tsx +++ b/src/component/Empty/DatabaseSelectEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Empty } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/DatasourceSelectEmpty/index.tsx b/src/component/Empty/DatasourceSelectEmpty/index.tsx index 06bcf9037..15ead8a8c 100644 --- a/src/component/Empty/DatasourceSelectEmpty/index.tsx +++ b/src/component/Empty/DatasourceSelectEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Divider, Empty } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/ProjectEmpty/index.tsx b/src/component/Empty/ProjectEmpty/index.tsx index d43807637..d102188a1 100644 --- a/src/component/Empty/ProjectEmpty/index.tsx +++ b/src/component/Empty/ProjectEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Result } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/ProjectSelectEmpty/index.tsx b/src/component/Empty/ProjectSelectEmpty/index.tsx index c9264d325..00aeed23b 100644 --- a/src/component/Empty/ProjectSelectEmpty/index.tsx +++ b/src/component/Empty/ProjectSelectEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Divider, Empty } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/RecentlyDatabaseEmpty/index.tsx b/src/component/Empty/RecentlyDatabaseEmpty/index.tsx index 6bb1bae44..9e60f91c6 100644 --- a/src/component/Empty/RecentlyDatabaseEmpty/index.tsx +++ b/src/component/Empty/RecentlyDatabaseEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Empty } from 'antd'; import styles from './index.less'; diff --git a/src/component/Empty/SQLConsoleEmpty/index.tsx b/src/component/Empty/SQLConsoleEmpty/index.tsx index 73c1d208b..29f060681 100644 --- a/src/component/Empty/SQLConsoleEmpty/index.tsx +++ b/src/component/Empty/SQLConsoleEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { SQLConsoleResourceType } from '@/common/datasource/interface'; import NewDatasourceButton from '@/page/Datasource/Datasource/NewDatasourceDrawer/NewButton'; diff --git a/src/component/Empty/ScanRuleEmpty/index.tsx b/src/component/Empty/ScanRuleEmpty/index.tsx index 1d3be69ed..729fe64af 100644 --- a/src/component/Empty/ScanRuleEmpty/index.tsx +++ b/src/component/Empty/ScanRuleEmpty/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { Acess, createPermission } from '@/component/Acess'; import { actionTypes, IManagerResourceType } from '@/d.ts'; import { formatMessage } from '@/util/intl'; diff --git a/src/component/ExecuteSqlDetailModal/constant.tsx b/src/component/ExecuteSqlDetailModal/constant.tsx index 45cf1c482..98e4c1229 100644 --- a/src/component/ExecuteSqlDetailModal/constant.tsx +++ b/src/component/ExecuteSqlDetailModal/constant.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { ReactComponent as List } from '@/svgr/List.svg'; import { ReactComponent as Text } from '@/svgr/Text.svg'; import { ReactComponent as TraceSvg } from '@/svgr/Trace.svg'; diff --git a/src/component/ExecuteSqlDetailModal/index.tsx b/src/component/ExecuteSqlDetailModal/index.tsx index bbd3608a8..513182be4 100644 --- a/src/component/ExecuteSqlDetailModal/index.tsx +++ b/src/component/ExecuteSqlDetailModal/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { getFullLinkTraceDownloadUrl, getSQLExecuteProfile, diff --git a/src/component/Input/Case/index.tsx b/src/component/Input/Case/index.tsx index d10b9df04..07432fb2c 100644 --- a/src/component/Input/Case/index.tsx +++ b/src/component/Input/Case/index.tsx @@ -77,6 +77,7 @@ interface WrapProps { value?: string; caseSensitive?: boolean; escapes?: string; + valueFilter?: (value: string) => string; } export function CaseInput(props: InputProps & WrapProps) { @@ -139,7 +140,7 @@ const CaseTextArea = forwardRef(function CaseTe props: ICaseTextAreaProps, ref, ) { - const { value, caseSensitive, escapes, onChange, ...rest } = props; + const { value, caseSensitive, escapes, onChange, valueFilter, ...rest } = props; const [innerValue, setInnerValue] = useState(); const [onChangeValue, setOnChangeValue] = useState(); useEffect(() => { @@ -180,18 +181,26 @@ const CaseTextArea = forwardRef(function CaseTe onChange={(e) => { const start = e.target.selectionStart, end = e.target.selectionEnd; + + if (valueFilter) { + e.target.value = valueFilter(e.target.value); + } + const { displayValue, onChangeValue } = handleChange(e); setInnerValue(displayValue); + if (typeof onChangeValue === 'string') { setOnChangeValue(onChangeValue); } else { setOnChangeValue(onChangeValue?.target?.value); } + if (e.target.value !== displayValue) { Promise.resolve().then(() => { inputRef?.current?.resizableTextArea?.textArea?.setSelectionRange(start, end); }); } + if (typeof onChangeValue !== 'string') { onChange?.(onChangeValue as any); } diff --git a/src/component/Input/Keymap/helper.ts b/src/component/Input/Keymap/helper.ts index 0e73a7cc8..7f868af04 100644 --- a/src/component/Input/Keymap/helper.ts +++ b/src/component/Input/Keymap/helper.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { KeyCode } from 'monaco-editor'; diff --git a/src/component/Input/Keymap/keycodemap.ts b/src/component/Input/Keymap/keycodemap.ts index 6a7164677..6d0b17402 100644 --- a/src/component/Input/Keymap/keycodemap.ts +++ b/src/component/Input/Keymap/keycodemap.ts @@ -134,8 +134,8 @@ export const KEY_CODE_MAP: Record = { }; const convertMap = { - [KeyCode.Ctrl]: KeyMod.CtrlCmd, - [KeyCode.Meta]: KeyMod.CtrlCmd, + [KeyCode.Ctrl]: isMac() ? KeyMod.WinCtrl : KeyMod.CtrlCmd, + [KeyCode.Meta]: isMac() ? KeyMod.CtrlCmd : KeyMod.WinCtrl, [KeyCode.Shift]: KeyMod.Shift, [KeyCode.Alt]: KeyMod.Alt, }; @@ -146,7 +146,8 @@ export function getKeyCodeText(code: string) { if (acc.length) { acc.push('+'); } - if (parseInt(cur) === KeyCode.Meta) { + const keyCodeValue = parseInt(cur); + if (keyCodeValue === KeyCode.Meta) { if (isMac()) { acc.push('⌘'); } else { @@ -154,6 +155,10 @@ export function getKeyCodeText(code: string) { } return acc; } + if (keyCodeValue === KeyCode.Ctrl) { + acc.push('Ctrl'); // 在所有平台都显示为 Ctrl + return acc; + } acc.push(KeyCode[cur]); return acc; }, []); diff --git a/src/component/Log/index.tsx b/src/component/Log/index.tsx index 5c274309b..923e0569a 100644 --- a/src/component/Log/index.tsx +++ b/src/component/Log/index.tsx @@ -248,7 +248,7 @@ const Log: React.FC = ({ if (!lineWrapNode) { index = copyData.current.scrollDirection === 'up' ? 0 : logData.data.length; } else { - index = Number(lineWrapNode.firstChild.innerText); + index = Number((lineWrapNode.firstChild as HTMLElement)?.innerText); } return index; }; diff --git a/src/component/MonacoEditor/PlaceholderContentWidget.ts b/src/component/MonacoEditor/PlaceholderContentWidget.ts index b62d6b2db..83c6415e3 100644 --- a/src/component/MonacoEditor/PlaceholderContentWidget.ts +++ b/src/component/MonacoEditor/PlaceholderContentWidget.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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. + */ + /** * based on https://github.com/microsoft/monaco-editor/issues/568#issuecomment-1499966160 */ diff --git a/src/component/ODCSetting/Item/CheckboxItem.tsx b/src/component/ODCSetting/Item/CheckboxItem.tsx index dd53b5d35..5c1e3645c 100644 --- a/src/component/ODCSetting/Item/CheckboxItem.tsx +++ b/src/component/ODCSetting/Item/CheckboxItem.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 } from 'react'; import { Checkbox } from 'antd'; diff --git a/src/component/ODCSetting/Item/RadioItem/index.less b/src/component/ODCSetting/Item/RadioItem/index.less new file mode 100644 index 000000000..3e6bb2beb --- /dev/null +++ b/src/component/ODCSetting/Item/RadioItem/index.less @@ -0,0 +1,3 @@ +.label { + margin-right: 5px; +} diff --git a/src/component/ODCSetting/Item/RadioItem.tsx b/src/component/ODCSetting/Item/RadioItem/index.tsx similarity index 70% rename from src/component/ODCSetting/Item/RadioItem.tsx rename to src/component/ODCSetting/Item/RadioItem/index.tsx index 18f2e5121..85425842f 100644 --- a/src/component/ODCSetting/Item/RadioItem.tsx +++ b/src/component/ODCSetting/Item/RadioItem/index.tsx @@ -14,8 +14,10 @@ * limitations under the License. */ -import { Radio, RadioGroupProps } from 'antd'; +import { QuestionCircleOutlined } from '@@node_modules/@ant-design/icons/lib'; +import { Radio, RadioGroupProps, Tooltip } from 'antd'; import { useState } from 'react'; +import styles from './index.less'; export default function RadioItem(props: { options: RadioGroupProps['options']; @@ -25,9 +27,9 @@ export default function RadioItem(props: { const [loading, setLoading] = useState(false); return ( { setLoading(true); @@ -40,3 +42,14 @@ export default function RadioItem(props: { /> ); } + +export const RadioWithTooltip = ({ label, title }) => { + return ( + <> + {label} + + + + + ); +}; diff --git a/src/component/ODCSetting/Item/SecretKeyItem/CopyOpertaion.tsx b/src/component/ODCSetting/Item/SecretKeyItem/CopyOpertaion.tsx index 3ee87a1c4..8a974ff5e 100644 --- a/src/component/ODCSetting/Item/SecretKeyItem/CopyOpertaion.tsx +++ b/src/component/ODCSetting/Item/SecretKeyItem/CopyOpertaion.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { useCallback } from 'react'; import { Button, Tooltip } from 'antd'; diff --git a/src/component/ODCSetting/config/common.tsx b/src/component/ODCSetting/config/common.tsx index 36cf039cf..8ff489879 100644 --- a/src/component/ODCSetting/config/common.tsx +++ b/src/component/ODCSetting/config/common.tsx @@ -1,8 +1,25 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import CheckboxItem from '../Item/CheckboxItem'; import RadioItem from '../Item/RadioItem'; import { ODCSettingGroup } from '../config'; import { resultSetsGroup } from '../utils/configHelper'; +import { isClient } from '@/util/env'; export const getExecutionStrategyConfig = (taskGroup: ODCSettingGroup) => { return [ @@ -26,13 +43,15 @@ export const getExecutionStrategyConfig = (taskGroup: ODCSettingGroup) => { }), value: 'AUTO', }, - { - label: formatMessage({ - id: 'src.component.ODCSetting.config.11DE5799', - defaultMessage: '定时执行', - }), - value: 'TIMER', - }, + !isClient() + ? { + label: formatMessage({ + id: 'src.component.ODCSetting.config.11DE5799', + defaultMessage: '定时执行', + }), + value: 'TIMER', + } + : null, { label: formatMessage({ id: 'src.component.ODCSetting.config.7CE2AC8D', @@ -40,7 +59,7 @@ export const getExecutionStrategyConfig = (taskGroup: ODCSettingGroup) => { }), value: 'MANUAL', }, - ]} + ]?.filter(Boolean)} value={value} onChange={onChange} /> diff --git a/src/component/ODCSetting/config/user/database.tsx b/src/component/ODCSetting/config/user/database.tsx index da99f7660..6586e8a22 100644 --- a/src/component/ODCSetting/config/user/database.tsx +++ b/src/component/ODCSetting/config/user/database.tsx @@ -18,8 +18,15 @@ import { DragInsertTypeText } from '@/constant/label'; import { AutoCommitMode, DragInsertType } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { IODCSetting, ODCSettingGroup } from '../../config'; -import RadioItem from '../../Item/RadioItem'; +import RadioItem, { RadioWithTooltip } from '../../Item/RadioItem'; import SelectItem from '../../Item/SelectItem'; +import { Tooltip } from 'antd'; +import { QuestionCircleOutlined } from '@@node_modules/@ant-design/icons/lib'; + +export const EquerySqlResultDisplayMode = { + OVERWRITE: 'OVERWRITE', + APPEND: 'APPEND', +}; const databaseGroup: ODCSettingGroup = { label: formatMessage({ @@ -199,6 +206,60 @@ const databaseSettings: IODCSetting[] = [ ); }, }, + { + label: formatMessage({ + id: 'src.component.ODCSetting.config.user.20C5DFB4', + defaultMessage: '结果集展示', + }), + key: 'odc.sqlexecute.querySqlResultDisplayMode', + locationKey: 'querySqlResultDisplayMode', + group: databaseGroup, + secondGroup: databaseResultsetGroup, + storeType: 'server', + render: (value, onChange) => { + return ( + + ), + + value: EquerySqlResultDisplayMode.OVERWRITE, + }, + { + label: ( + + ), + + value: EquerySqlResultDisplayMode.APPEND, + }, + ]} + value={value} + onChange={onChange} + /> + ); + }, + }, { label: formatMessage({ id: 'src.component.ODCSetting.config.90CA6EA7', diff --git a/src/component/ODCSetting/index.less b/src/component/ODCSetting/index.less index 4d319faf0..0f7b446a2 100644 --- a/src/component/ODCSetting/index.less +++ b/src/component/ODCSetting/index.less @@ -46,9 +46,15 @@ .tabs { .user { width: 52px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .space { width: 73px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } } } diff --git a/src/component/ODCSetting/index.tsx b/src/component/ODCSetting/index.tsx index 6170b2ac5..1bfdd4e50 100644 --- a/src/component/ODCSetting/index.tsx +++ b/src/component/ODCSetting/index.tsx @@ -27,6 +27,7 @@ import { Row, Space, Tabs, + Tooltip, Typography, } from 'antd'; import React, { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'; @@ -91,6 +92,38 @@ const ODCSetting: React.FC = ({ modalStore }) => { const isAdmin = odc.appConfig.manage.user.isODCOrganizationConfig?.(login.user); const [searchValue, setSearchValue] = useState(''); + const spaceTypeOptions = useMemo(() => { + const options = [ + { + label: formatMessage({ id: 'src.component.ODCSetting.6BCFD6DD', defaultMessage: '用户' }), + value: ESpaceType.USER, + className: styles.user, + }, + ]; + + if (login.isPrivateSpace()) { + options.push({ + label: formatMessage({ + id: 'src.component.ODCSetting.47586FD4', + defaultMessage: '个人空间', + }), + value: ESpaceType.PERSONAL, + className: styles.space, + }); + } else if (isAdmin) { + options.push({ + label: formatMessage({ + id: 'src.component.ODCSetting.AC147B83', + defaultMessage: '团队空间', + }), + value: ESpaceType.GROUP, + className: styles.space, + }); + } + + return options; + }, [isAdmin]); + const getData = useCallback( (type: ESpaceType) => { const result = new Map< @@ -644,24 +677,13 @@ const ODCSetting: React.FC = ({ modalStore }) => { defaultValue={ESpaceType.USER} onChange={(e) => setSpaceType(e.target.value)} > - - {formatMessage({ id: 'src.component.ODCSetting.6BCFD6DD', defaultMessage: '用户' })} - - {login.isPrivateSpace() ? ( - - {formatMessage({ - id: 'src.component.ODCSetting.47586FD4', - defaultMessage: '个人空间', - })} - - ) : isAdmin ? ( - - {formatMessage({ - id: 'src.component.ODCSetting.AC147B83', - defaultMessage: '团队空间', - })} - - ) : null} + {spaceTypeOptions.map((option) => ( + + + {option.label} + + + ))} = function (props) { const [visible, setVisible] = useState(false); const [showMaxLimit, setShowMaxLimit] = useState(false); const queryLimit = session?.params?.queryLimit; - const maxQueryLimit = Number(setting.getSpaceConfigByKey('odc.sqlexecute.default.maxQueryLimit')); const tableColumnInfoVisible = session?.params.tableColumnInfoVisible; const fullLinkTraceEnabled = session?.params.fullLinkTraceEnabled; const continueExecutionOnError = session?.params.continueExecutionOnError; @@ -60,6 +59,7 @@ const SQLConfig: React.FC = function (props) { /** * 判断是否允许无限制,假如不允许,禁止删除 */ + const maxQueryLimit = session?.params?.maxQueryLimit; if (maxQueryLimit !== Number.MAX_SAFE_INTEGER && !queryLimitValue) { setQueryLimitValue(session?.params.queryLimit); return; @@ -165,7 +165,7 @@ const SQLConfig: React.FC = function (props) { defaultMessage: '不超过查询条数上限', })} - {maxQueryLimit} + {session?.params.maxQueryLimit || '-'} )} diff --git a/src/component/SortableContainer/index.tsx b/src/component/SortableContainer/index.tsx index 11309984f..fe837ec5f 100644 --- a/src/component/SortableContainer/index.tsx +++ b/src/component/SortableContainer/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 from 'react'; import { DndContext, closestCenter, useSensors, useSensor, PointerSensor } from '@dnd-kit/core'; import { diff --git a/src/component/TabSelect/index.tsx b/src/component/TabSelect/index.tsx index d24a27b29..1c067efbb 100644 --- a/src/component/TabSelect/index.tsx +++ b/src/component/TabSelect/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 Icon from '@ant-design/icons'; import { Select, Space, Tabs } from 'antd'; import styles from './index.less'; diff --git a/src/component/Task/ExportTask/CreateModal/index.tsx b/src/component/Task/ExportTask/CreateModal/index.tsx deleted file mode 100644 index 6ec4394ed..000000000 --- a/src/component/Task/ExportTask/CreateModal/index.tsx +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Copyright 2023 OceanBase - * - * Licensed 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 { createBatchExportTask } from '@/common/network'; -import HelpDoc from '@/component/helpDoc'; -import { - DbObjectType, - ExportFormData, - EXPORT_CONTENT, - EXPORT_TYPE, - IMPORT_ENCODING, - TaskExecStrategy, - TaskPageScope, - TaskPageType, - TaskDetail, -} from '@/d.ts'; -import { openTasksPage } from '@/store/helper/page'; -import login from '@/store/login'; -import { ModalStore } from '@/store/modal'; -import { selectFolder } from '@/util/client'; -import { isClient } from '@/util/env'; -import { formatMessage } from '@/util/intl'; -import { safeParseJson } from '@/util/utils'; -import { Alert, Button, Checkbox, Drawer, message, Modal, Space, Tooltip } from 'antd'; -import { inject, observer } from 'mobx-react'; -import React from 'react'; -import ExportForm, { FormType } from './ExportForm'; -import FormContext from './ExportForm/FormContext'; -import styles from './index.less'; -import { getTaskDetail } from '@/common/network/task'; -import { FormInstance, useForm } from 'antd/es/form/Form'; -export interface IProps { - modalStore?: ModalStore; - projectId?: number; -} -export interface IState { - stepIndex: number; - formData: ExportFormData; - submitting: boolean; - isFormChanged: boolean; - isSaveDefaultConfig: boolean; -} -@inject('modalStore') -@observer -class CreateModal extends React.Component { - private _formRef = React.createRef(); - private defaultConfig: IState['formData'] = null; - constructor(props: IProps) { - super(props); - const { modalStore } = props; - this.setDefaultConfig(); - this.state = { - stepIndex: 0, - submitting: false, - isFormChanged: false, - isSaveDefaultConfig: false, - formData: this.getDefaultFormData(), - }; - - if (modalStore.exportModalData) { - this.state.formData.exportDbObjects = [ - { - objectName: modalStore.exportModalData.name, - dbObjectType: modalStore.exportModalData.type, - }, - ]; - - if ( - modalStore.exportModalData?.type === DbObjectType.package && - modalStore.exportModalData?.exportPkgBody - ) { - this.state.formData.exportDbObjects.push({ - objectName: modalStore.exportModalData.name, - dbObjectType: DbObjectType.package_body, - }); - } - } - } - private steps: { - key: FormType; - label: string; - }[] = [ - { - label: formatMessage({ - id: 'odc.components.ExportDrawer.SelectObject', - defaultMessage: '选择对象', - }), - //选择对象 - key: FormType.ObjSelecter, - }, - { - label: formatMessage({ - id: 'odc.components.ExportDrawer.ExportSettings', - defaultMessage: '导出设置', - }), - //导出设置 - key: FormType.Config, - }, - ]; - - private handleClose = () => { - this.props.modalStore.changeExportModal(false); - this.resetFormData(); - this.setState({ - isSaveDefaultConfig: false, - }); - }; - private closeSelf = () => { - if (!this.state.isFormChanged) { - this.handleClose(); - return; - } - Modal.confirm({ - title: formatMessage({ - id: 'odc.components.ExportDrawer.AreYouSureYouWant', - defaultMessage: '是否确定取消导出?', - }), - centered: true, - onOk: () => { - this.handleClose(); - }, - }); - }; - private submit = () => { - const { projectId } = this.props; - this._formRef.current?.valid(async (haveError, values) => { - console.log(haveError); - if (!haveError) { - let exportFilePath; - if (isClient()) { - exportFilePath = await selectFolder(); - if (!exportFilePath) { - return; - } - } - try { - this.setState({ - submitting: true, - }); - const formData = { - ...this.state.formData, - ...values, - projectId, - exportFilePath, - }; - const { exportContent, exportFileMaxSize } = formData; - // 当用户选择"仅导出结构"后点击下一步,勾选结构文件设置中任一选项后再点击上一步,选择"导出结构和数据"或者"仅导出数据"后,点击下一步,再点击导出时,会携带"仅导出结构"时才可用的参数,导致导出文件和预期不符。 - // 当导出内容为"导出结构和数据"或者"仅导出数据"时,"导出结果合并为一个SQL文件"不可勾选。 - // 当导出内容为"仅导出数据"时,这两个都不可勾选。 - // 当导出内容为"仅导出结构"时,为了避免"单个文件上限(MB)"被其他导出内容时的操作影响,这里设置为无限制,即-1。 - switch (exportContent) { - case EXPORT_CONTENT.DATA_AND_STRUCT: { - formData.mergeSchemaFiles = false; - if (formData.exportFileMaxSize) { - formData.exportFileMaxSize = - exportFileMaxSize === - formatMessage({ - id: 'odc.components.ExportDrawer.Unlimited', - defaultMessage: '无限制', - }) //无限制 - ? -1 - : parseInt(exportFileMaxSize as string); - } - break; - } - case EXPORT_CONTENT.DATA: { - formData.withDropDDL = false; - formData.mergeSchemaFiles = false; - if (formData.exportFileMaxSize) { - formData.exportFileMaxSize = - exportFileMaxSize === - formatMessage({ - id: 'odc.components.ExportDrawer.Unlimited', - defaultMessage: '无限制', - }) //无限制 - ? -1 - : parseInt(exportFileMaxSize as string); - } - break; - } - case EXPORT_CONTENT.STRUCT: { - formData.exportFileMaxSize = -1; - break; - } - default: { - break; - } - } - const { executionStrategy, executionTime } = formData; - if (executionStrategy === TaskExecStrategy.TIMER) { - formData.executionTime = executionTime?.valueOf(); - } else { - formData.executionTime = undefined; - } - const data = await createBatchExportTask(formData); - if (data) { - message.success( - formatMessage({ - id: 'src.component.Task.ExportTask.CreateModal.133432E8' /*'工单创建成功'*/, - defaultMessage: '工单创建成功', - }), - ); - if (this.state.isSaveDefaultConfig) { - this.saveCurrentConfig(); - this.setDefaultConfig(); - } - this.handleClose(); - openTasksPage(TaskPageType.EXPORT, TaskPageScope.CREATED_BY_CURRENT_USER); - } - } finally { - this.setState({ - submitting: false, - }); - } - } - }); - }; - - private nextStep = async () => { - this._formRef.current.valid(async (haveError, values) => { - if (!haveError) { - this.setState({ - stepIndex: this.state.stepIndex + 1, - }); - } - }); - }; - private saveCurrentConfig = () => { - const userId = login.user?.id; - const key = `exportFormConfig-${userId}`; - localStorage.setItem(key, JSON.stringify(this.state.formData)); - }; - private setDefaultConfig = () => { - const userId = login.user?.id; - const key = `exportFormConfig-${userId}`; - const data = localStorage.getItem(key); - if (data) { - this.defaultConfig = safeParseJson(data); - } - }; - private getDefaultFormData = () => { - const formData = { - databaseId: this.props.modalStore.exportModalData?.databaseId, - taskId: this.props.modalStore.exportModalData?.taskId, - executionStrategy: this.defaultConfig?.executionStrategy ?? TaskExecStrategy.AUTO, - taskName: null, - dataTransferFormat: this.defaultConfig?.dataTransferFormat ?? EXPORT_TYPE.CSV, - exportContent: this.defaultConfig?.exportContent ?? EXPORT_CONTENT.DATA_AND_STRUCT, - batchCommit: this.defaultConfig?.batchCommit ?? false, - batchCommitNum: this.defaultConfig?.batchCommitNum ?? null, - skippedDataType: this.defaultConfig?.skippedDataType ?? [], - encoding: this.defaultConfig?.encoding ?? IMPORT_ENCODING.UTF8, - maskStrategy: '', - globalSnapshot: this.defaultConfig?.globalSnapshot ?? false, - withDropDDL: this.defaultConfig?.withDropDDL ?? false, - mergeSchemaFiles: this.defaultConfig?.mergeSchemaFiles ?? false, - withColumnTitle: this.defaultConfig?.withColumnTitle ?? true, - blankToNull: this.defaultConfig?.blankToNull ?? true, - columnSeparator: this.defaultConfig?.columnSeparator ?? ',', - exportFileMaxSize: - this.defaultConfig?.exportFileMaxSize ?? - formatMessage({ - id: 'odc.components.ExportDrawer.Unlimited', - defaultMessage: '无限制', - }), - //无限制 - columnDelimiter: this.defaultConfig?.columnDelimiter ?? '"', - lineSeparator: this.defaultConfig?.lineSeparator ?? '\r\n', - useSys: false, - exportAllObjects: this.defaultConfig?.exportAllObjects ?? false, - exportDbObjects: [], - }; - - return formData; - }; - private resetFormData = () => { - this.setState({ - stepIndex: 0, - formData: this.getDefaultFormData(), - }); - }; - static getDerivedStateFromProps(props, state) { - const nextModalData = props.modalStore?.exportModalData; - if (nextModalData && !state.formData.exportDbObjects?.length) { - const { databaseId, name, type, exportPkgBody, taskId } = nextModalData; - const formData = { - ...state.formData, - databaseId, - taskId, - }; - if (name) { - formData.exportDbObjects = [ - { - objectName: name, - dbObjectType: type, - }, - ]; - } - if (type === DbObjectType.package && exportPkgBody) { - formData.exportDbObjects.push({ - objectName: name, - dbObjectType: DbObjectType.package_body, - }); - } - return { - formData, - }; - } - return null; - } - - render() { - const { modalStore, projectId } = this.props; - const { formData, submitting, stepIndex, isSaveDefaultConfig } = this.state; - const currentStep = this.steps[stepIndex], - prevStep = this.steps[stepIndex - 1], - nextStep = this.steps[stepIndex + 1]; - - const isNextStepDisabled = - nextStep?.key === FormType.Config && - !formData.exportAllObjects && - !formData.exportDbObjects?.length; - - const nextTip = isNextStepDisabled - ? formatMessage({ - id: 'odc.components.ExportDrawer.SelectAtLeastOneExport', - defaultMessage: '至少选择一个导出对象', - }) - : //至少选择一个导出对象 - null; - - return ( - -
- {!isClient() && ( - - {formatMessage({ - id: 'odc.components.ExportDrawer.TheMaximumDataSizeCannot', - defaultMessage: - '数据最大不能超过 2GB,如需导出大量数据,请使用导数工具 OBDUMPER', - })} - - { - formatMessage({ - id: 'src.component.Task.ExportTask.CreateModal.5DF92911' /*详情*/, - defaultMessage: '详情', - }) /* 详情 */ - } - - - - //数据最大不能超过2GB,如需导出大量数据,请使用导数工具obdumper - } - /> - )} - - - { - this.setState({ - isFormChanged: true, - formData: { - ...this.state.formData, - ...values, - }, - }); - }} - formData={formData} - projectId={projectId} - ref={this._formRef} - formType={currentStep.key} - /> - -
-
- - this.setState({ - isSaveDefaultConfig: e.target.checked, - }) - } - > - { - formatMessage({ - id: 'odc.components.ExportDrawer.RetainTheCurrentConfiguration', - defaultMessage: '保留当前配置', - }) /*保留当前配置*/ - } - - - - - - {prevStep ? ( - - ) : null} - {nextStep ? ( - - - - ) : null} - {!nextStep ? ( - - ) : null} - -
-
- ); - } -} -export default CreateModal; diff --git a/src/component/Task/ImportTask/CreateModal/csvMapping/editable.tsx b/src/component/Task/ImportTask/CreateModal/csvMapping/editable.tsx deleted file mode 100644 index e83110752..000000000 --- a/src/component/Task/ImportTask/CreateModal/csvMapping/editable.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2023 OceanBase - * - * Licensed 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 { Popover, Table } from 'antd'; -import React from 'react'; - -import { ColumnType, TableProps } from 'antd/es/table'; -import classNames from 'classnames'; -import styles from './editable.less'; - -interface IEditableColumn extends ColumnType { - editor?: (text: any, record: any, index: number) => React.ReactElement; -} - -interface IEditableProps extends TableProps { - columns: IEditableColumn[]; -} - -class Editable extends React.Component { - state = { - selected: [], - }; - - initColumns = () => { - const { columns } = this.props; - function columnConvert(column) { - return { - ...column, - ellipsis: true, - children: column.children?.map((c) => { - return columnConvert(c); - }), - render: (text, record, i) => { - const originContent = column.render ? column.render(text, record, i) : text; - if (column.editor) { - return ( - { - return document.querySelector('.odc_csvmapping_archor'); - }} - content={column.editor(text, record, i)} - > -
- {originContent} -
-
- ); - } else { - return originContent; - } - }, - }; - } - return columns.map((column) => { - return columnConvert(column); - }); - }; - - render() { - const { columns, ...rest } = this.props; - return ( - (i % 2 === 0 ? styles.even : styles.odd)} - columns={this.initColumns()} - {...rest} - /> - ); - } -} -export default Editable; diff --git a/src/component/Task/ImportTask/CreateModal/index.tsx b/src/component/Task/ImportTask/CreateModal/index.tsx deleted file mode 100644 index c489b9401..000000000 --- a/src/component/Task/ImportTask/CreateModal/index.tsx +++ /dev/null @@ -1,636 +0,0 @@ -/* - * Copyright 2023 OceanBase - * - * Licensed 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 { createBatchImportTask, getCsvFileInfo } from '@/common/network'; -import { getTableColumnList } from '@/common/network/table'; -import HelpDoc from '@/component/helpDoc'; -import type { CsvColumnMapping, ImportFormData } from '@/d.ts'; -import { - FILE_DATA_TYPE, - IMPORT_CONTENT, - IMPORT_ENCODING, - IMPORT_TYPE, - TaskExecStrategy, - TaskPageScope, - TaskPageType, -} from '@/d.ts'; -import { openTasksPage } from '@/store/helper/page'; -import login from '@/store/login'; -import type { ModalStore } from '@/store/modal'; -import { formatMessage } from '@/util/intl'; -import { formatBytes, safeParseJson } from '@/util/utils'; -import { Alert, Button, Checkbox, Drawer, message, Modal, Space, Tooltip } from 'antd'; -import { inject, observer } from 'mobx-react'; -import React from 'react'; -import ImportForm from './ImportForm'; -import CsvProvider from './ImportForm/CsvProvider'; -import FormConfigContext from './ImportForm/FormConfigContext'; -import { MAX_FILE_SIZE } from './ImportForm/helper'; -import styles from './index.less'; -import setting from '@/store/setting'; -export interface IProps { - modalStore?: ModalStore; - projectId?: number; -} -export interface IState { - stepIndex: number; - csvColumnMappings: CsvColumnMapping[]; - formData: ImportFormData; - isFormChanged: boolean; - csvMappingErrors: { - errorMsg: string; - errorIndex: number; - }[]; - sessionData: { - sessionId: string; - databaseName: string; - }; - submitting: boolean; - isSaveDefaultConfig: boolean; -} -@inject('modalStore') -@observer -class CreateModal extends React.Component { - private _formRef = React.createRef(); - private defaultConfig: IState['formData'] = null; - constructor(props: IProps) { - super(props); - this.setDefaultConfig(); - this.state = { - stepIndex: 0, - isFormChanged: false, - csvColumnMappings: [], - csvMappingErrors: null, - submitting: false, - isSaveDefaultConfig: false, - sessionData: null, - formData: this.getDefaultFormData(), - }; - } - private steps: { - key: 'fileSelecter' | 'config'; - label: string; - }[] = [ - { - label: formatMessage({ - id: 'odc.components.ImportDrawer.UploadFiles', - defaultMessage: '上传文件', - }), - //上传文件 - key: 'fileSelecter', - }, - { - label: formatMessage({ - id: 'odc.components.ImportDrawer.ImportSettings', - defaultMessage: '导入设置', - }), - //导入设置 - key: 'config', - }, - ]; - - private closeSelf = () => { - if (!this.state.isFormChanged) { - this.props.modalStore.changeImportModal(false); - return; - } - Modal.confirm({ - title: formatMessage({ - id: 'odc.components.ImportDrawer.AreYouSureYouWant', - defaultMessage: '是否确定取消导入?', - }), - centered: true, - onOk: () => { - this.resetFormData(); - this.props.modalStore.changeImportModal(false); - }, - }); - }; - private checkCsv = () => { - const csvColumns = this.state.csvColumnMappings - ?.map((column, i) => { - return { - ...column, - index: i, - }; - }) - .filter((column) => { - return column.isSelected; - }); - let errors: { - errorIndex: number; - errorMsg: string; - }[] = []; - if (!csvColumns?.length) { - errors.push({ - errorIndex: -1, - errorMsg: formatMessage({ - id: 'odc.components.ImportDrawer.SelectTheFieldsToBe', - defaultMessage: '请选择需要映射的字段', - }), - }); - } else { - const destColumnMap = {}; - csvColumns.forEach((csvColumn) => { - if (!csvColumn.destColumnName) { - /** - * 校验非空 - */ - errors.push({ - errorIndex: csvColumn.index, - errorMsg: formatMessage({ - id: 'odc.components.ImportDrawer.NoMappingRelationshipSelected', - defaultMessage: '未选择映射关系', - }), - }); - } else { - destColumnMap[csvColumn.destColumnName] = destColumnMap[csvColumn.destColumnName] || []; - destColumnMap[csvColumn.destColumnName].push(csvColumn); - } - }); - /** - * 校验重复 - */ - - Object.entries(destColumnMap).forEach(([columnName, _csvColumns]: [string, any[]]) => { - if (_csvColumns.length > 1) { - errors = errors.concat( - _csvColumns.map((c) => { - return { - errorIndex: c.index, - errorMsg: formatMessage({ - id: 'odc.components.ImportDrawer.DuplicateMappingRelationships', - defaultMessage: '映射关系存在重复', - }), - }; - }), - ); - } - }); - } - if (errors.length) { - this.setState({ - csvMappingErrors: errors, - }); - return false; - } - return true; - }; - private nextStep = async () => { - this._formRef.current.valid(async (haveError, values) => { - if (!haveError) { - if ( - this.state.formData.fileType == IMPORT_TYPE.CSV && - !this.state.csvColumnMappings?.length && - this.steps[this.state.stepIndex]?.key === 'fileSelecter' - ) { - /** - * 处理csv - */ - const error = await this.resolveCsvFile(); - if (error) { - return; - } - } - this.setState({ - stepIndex: this.state.stepIndex + 1, - }); - } - }); - }; - private submit = async () => { - const { projectId } = this.props; - await this._formRef.current.valid(async (haveError, values) => { - if (!haveError) { - const data = { - ...this.state.formData, - ...values, - projectId, - }; - const { executionStrategy, executionTime } = data; - if (executionStrategy === TaskExecStrategy.TIMER) { - data.executionTime = executionTime?.valueOf(); - } else { - data.executionTime = undefined; - } - this.setState({ - submitting: true, - }); - try { - const result = await createBatchImportTask( - data, - data.tableName, - this.state.csvColumnMappings.filter((column) => { - return column.isSelected; - }), - ); - if (result) { - message.success( - formatMessage({ - id: 'src.component.Task.ImportTask.CreateModal.F0622C80' /*'工单创建成功'*/, - defaultMessage: '工单创建成功', - }), - ); - if (this.state.isSaveDefaultConfig) { - this.saveCurrentConfig(); - this.setDefaultConfig(); - } - this.props.modalStore.changeImportModal(false); - this.setState({ - isSaveDefaultConfig: false, - }); - openTasksPage(TaskPageType.IMPORT, TaskPageScope.CREATED_BY_CURRENT_USER); - } - } catch (e) { - console.error(e); - } finally { - this.resetFormData(); - this.setState({ - submitting: false, - }); - } - } - }); - }; - private resolveCsvFile = async () => { - const { - importFileName, - encoding, - skipHeader, - blankToNull, - lineSeparator, - columnDelimiter, - columnSeparator, - } = this.state.formData; - const { sessionId, databaseName } = this.state.sessionData ?? {}; - const fileInfo = await getCsvFileInfo({ - blankToNull, - columnSeparator, - encoding, - columnDelimiter, - lineSeparator, - skipHeader, - fileName: importFileName?.[0]?.response?.data?.fileName, - }); - if (!fileInfo) { - message.warning( - formatMessage({ - id: 'odc.components.ImportDrawer.AnErrorOccurredWhileParsing', - defaultMessage: '上传的 CSV 文件解析异常,请检查文件格式是否正确', - }), - ); - return formatMessage({ - id: 'odc.components.ImportDrawer.TheCsvFileTypeIs', - defaultMessage: 'CSV 文件类型有误', - }); - } - const tableName = this.state.formData.tableName; - if (tableName) { - const columns = - databaseName && sessionId - ? await getTableColumnList(this.state.formData.tableName, databaseName, sessionId) - : []; - this.setState({ - csvColumnMappings: fileInfo?.map((column, i) => { - return { - ...column, - isSelected: true, - destColumnName: columns?.[i]?.columnName, - destColumnType: columns?.[i]?.dataType, - destColumnPosition: columns?.[i]?.ordinalPosition, - }; - }), - }); - } else { - this.setState({ - csvColumnMappings: fileInfo?.map((column, i) => { - return { - ...column, - isSelected: true, - destColumnName: '', - destColumnType: null, - destColumnPosition: null, - }; - }), - }); - } - }; - private resolveTableColumnsToCsv = async (tableName: string) => { - const { sessionId, databaseName } = this.state.sessionData ?? {}; - if (!tableName) { - this.setState({ - csvColumnMappings: this.state.csvColumnMappings?.map((column, i) => { - return { - ...column, - isSelected: true, - destColumnName: null, - destColumnType: null, - destColumnPosition: null, - }; - }), - }); - return; - } - const columns = await getTableColumnList(tableName, databaseName, sessionId); - this.setState({ - csvColumnMappings: this.state.csvColumnMappings?.map((column, i) => { - return { - ...column, - isSelected: true, - destColumnName: columns?.[i]?.columnName, - destColumnType: columns?.[i]?.dataType, - destColumnPosition: columns?.[i]?.ordinalPosition, - }; - }), - }); - }; - private isSingleImport = () => { - const { modalStore } = this.props; - return !!modalStore.importModalData?.table; - }; - /** - * 改变csv的映射关系 - */ - - private onChangeCsvColumnMappings = (csvColumnMappings: CsvColumnMapping[]) => { - this.setState({ - csvColumnMappings, - csvMappingErrors: null, - }); - }; - private saveCurrentConfig = () => { - const userId = login.user?.id; - const key = `importFormConfig-${userId}`; - localStorage.setItem(key, JSON.stringify(this.state.formData)); - }; - private setDefaultConfig = () => { - const userId = login.user?.id; - const key = `importFormConfig-${userId}`; - const data = localStorage.getItem(key); - if (data) { - this.defaultConfig = safeParseJson(data); - } - }; - private getDefaultFormData = () => { - return { - useSys: false, - databaseId: this.props.modalStore.importModalData?.databaseId, - taskId: this.props.modalStore.exportModalData?.taskId, - executionStrategy: this.defaultConfig?.executionStrategy ?? TaskExecStrategy.AUTO, - fileType: this.defaultConfig?.fileType ?? IMPORT_TYPE.ZIP, - encoding: this.defaultConfig?.encoding ?? IMPORT_ENCODING.UTF8, - importFileName: null, - importContent: IMPORT_CONTENT.DATA_AND_STRUCT, - batchCommitNum: this.defaultConfig?.batchCommitNum ?? 100, - truncateTableBeforeImport: this.defaultConfig?.truncateTableBeforeImport ?? false, - skippedDataType: this.defaultConfig?.skippedDataType ?? [], - replaceSchemaWhenExists: this.defaultConfig?.replaceSchemaWhenExists ?? false, - skipHeader: this.defaultConfig?.skipHeader ?? false, - blankToNull: this.defaultConfig?.blankToNull ?? true, - columnSeparator: this.defaultConfig?.columnSeparator ?? ',', - columnDelimiter: this.defaultConfig?.columnDelimiter ?? '"', - lineSeparator: this.defaultConfig?.lineSeparator ?? '\r\n', - dataTransferFormat: FILE_DATA_TYPE.CSV, - stopWhenError: this.defaultConfig?.stopWhenError ?? false, - tableName: this.props.modalStore.importModalData?.table?.tableName, - }; - }; - private resetFormData = () => { - this.setState({ - stepIndex: 0, - formData: this.getDefaultFormData(), - }); - }; - static getDerivedStateFromProps(props, state) { - const nextDatabaseId = props.modalStore.importModalData?.databaseId; - const preDatabaseId = state.formData.databaseId; - const taskId = props.modalStore.importModalData?.taskId; - if ((nextDatabaseId && nextDatabaseId !== preDatabaseId) || taskId) { - return { - formData: { - ...state.formData, - databaseId: nextDatabaseId, - taskId, - }, - }; - } - return null; - } - private handleSessionChange = (sessionData: { sessionId: string; databaseName: string }) => { - this.setState({ - sessionData, - }); - }; - render() { - const { modalStore, projectId } = this.props; - const { - formData, - stepIndex, - csvColumnMappings, - csvMappingErrors, - submitting, - isSaveDefaultConfig, - } = this.state; - const isSingleImport = this.isSingleImport(); - const size = formatBytes(MAX_FILE_SIZE); - const currentStep = this.steps[stepIndex], - prevStep = this.steps[stepIndex - 1], - nextStep = this.steps[stepIndex + 1]; - const isNextStepDisabled = - nextStep?.key === 'config' && - (!this.state.formData.importFileName?.length || - !!this.state.formData?.importFileName?.find((item) => item.status !== 'done')); - const nextTip = isNextStepDisabled - ? formatMessage({ - id: 'odc.components.ImportDrawer.PleaseUploadTheImportFile', - defaultMessage: '请上传导入文件', - }) - : //请上传导入文件 - null; - return ( - -
- {MAX_FILE_SIZE > -1 ? ( - - {formatMessage( - { - id: 'odc.components.ImportDrawer.TheMaximumSizeOfData', - defaultMessage: - '数据最大不能超过 {size},如需导入大量数据,请使用导数工具 OBLOADER', - }, - { - size, - }, - )} - - { - formatMessage({ - id: 'src.component.Task.ImportTask.CreateModal.70AD4872' /*详情*/, - defaultMessage: '详情', - }) /* 详情 */ - } - - - - // `数据最大不能超过 ${size},如需导入大量数据,请使用导数工具 OBLOADER` - } - /> - ) : null} - - - { - this.setState((state) => { - return { - isFormChanged: true, - formData: { - ...state.formData, - ...values, - }, - }; - }); - }} - ref={this._formRef} - onChangeCsvColumnMappings={this.onChangeCsvColumnMappings} - resolveTableColumnsToCsv={this.resolveTableColumnsToCsv} - onSessionChange={this.handleSessionChange} - sessionData={this.state.sessionData} - /> - - -
-
- - this.setState({ - isSaveDefaultConfig: e.target.checked, - }) - } - > - { - formatMessage({ - id: 'odc.components.ImportDrawer.RetainTheCurrentConfiguration', - defaultMessage: '保留当前配置', - }) /*保留当前配置*/ - } - - - - - - {prevStep ? ( - - ) : null} - {nextStep ? ( - - - - ) : null} - {!nextStep ? ( - - ) : null} - -
-
- ); - } -} -export default CreateModal; diff --git a/src/component/Task/MutipleAsyncTask/CreateModal/MultipleAsyncContext.ts b/src/component/Task/MutipleAsyncTask/CreateModal/MultipleAsyncContext.ts deleted file mode 100644 index 18f0a3316..000000000 --- a/src/component/Task/MutipleAsyncTask/CreateModal/MultipleAsyncContext.ts +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -export const MultipleAsyncContext = React.createContext<{ - projectId: number; - projectMap: Record; -}>({ - projectId: null, - projectMap: {}, -}); diff --git a/src/component/Task/MutipleAsyncTask/components/Template/index.tsx b/src/component/Task/MutipleAsyncTask/components/Template/index.tsx deleted file mode 100644 index 1b8fd84a4..000000000 --- a/src/component/Task/MutipleAsyncTask/components/Template/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export { default as CreateTemplate } from './CreateTemplate'; -export { default as EditTemplate } from './EditTemplate'; -export { default as ManageTemplate } from './ManageTemplate'; -export { default as SelectTemplate } from './SelectTemplate'; -export { default as ShowTemplate } from './ShowTemplate'; diff --git a/src/component/Task/MutipleAsyncTask/index.tsx b/src/component/Task/MutipleAsyncTask/index.tsx deleted file mode 100644 index b797b47eb..000000000 --- a/src/component/Task/MutipleAsyncTask/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from './CreateModal'; -export { default as MutipleAsyncTaskContent } from './DetailContent'; diff --git a/src/component/Task/TaskDetailContext.tsx b/src/component/Task/TaskDetailContext.tsx deleted file mode 100644 index 4b1cc2e52..000000000 --- a/src/component/Task/TaskDetailContext.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { ICycleTaskRecord, TaskRecord, TaskRecordParameters } from '@/d.ts'; -import React from 'react'; -import { IState } from './Content'; - -interface ITaskDetailContext { - handleDetailVisible: ( - task: TaskRecord | ICycleTaskRecord, - visible?: boolean, - ) => void; - setState: (patch: Partial | ((prevState: IState) => Partial)) => void; -} - -export const TaskDetailContext = React.createContext(null); diff --git a/src/component/Task/component/ActionBar/helper.tsx b/src/component/Task/component/ActionBar/helper.tsx new file mode 100644 index 000000000..623b4a4cf --- /dev/null +++ b/src/component/Task/component/ActionBar/helper.tsx @@ -0,0 +1,194 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TaskStatus, TaskType } from '@/d.ts'; +import modalStore from '@/store/modal'; +import { formatMessage } from '@/util/intl'; + +export const actions = { + [TaskType.DATA_ARCHIVE]: (args) => modalStore.changeDataArchiveModal(true, args), + [TaskType.DATA_DELETE]: (args) => modalStore.changeDataClearModal(true, args), + [TaskType.SQL_PLAN]: (args) => modalStore.changeCreateSQLPlanTaskModal(true, args), + [TaskType.LOGICAL_DATABASE_CHANGE]: (args) => modalStore.changeLogicialDatabaseModal(true, args), + [TaskType.ASYNC]: (args) => modalStore.changeCreateAsyncTaskModal(true, args), + [TaskType.DATAMOCK]: (args) => modalStore.changeDataMockerModal(true, args), + [TaskType.APPLY_DATABASE_PERMISSION]: (args) => + modalStore.changeApplyDatabasePermissionModal(true, args), + [TaskType.APPLY_TABLE_PERMISSION]: (args) => + modalStore.changeApplyTablePermissionModal(true, args), + [TaskType.MULTIPLE_ASYNC]: (args) => modalStore.changeMultiDatabaseChangeModal(true, args), + [TaskType.SHADOW]: (args) => modalStore.changeShadowSyncVisible(true, args), + [TaskType.STRUCTURE_COMPARISON]: (args) => modalStore.changeStructureComparisonModal(true, args), + [TaskType.EXPORT]: (args) => modalStore.changeExportModal(true, args), + [TaskType.IMPORT]: (args) => modalStore.changeImportModal(true, args), + [TaskType.EXPORT_RESULT_SET]: (args) => + modalStore.changeCreateResultSetExportTaskModal(true, args), + [TaskType.ONLINE_SCHEMA_CHANGE]: (args) => modalStore.changeCreateDDLAlterTaskModal(true, args), + [TaskType.PARTITION_PLAN]: (args) => modalStore.changePartitionModal(true, args), +}; +/** 周期任务 */ + +export const SCHEDULE_TASKS = [TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE, TaskType.SQL_PLAN]; + +/** 作业调度任务 */ +export const JOB_SCHEDULE_TASKS = [TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE]; + +export const actionInfo = { + reTryBtn: { + key: 'reTry', + text: formatMessage({ + id: 'src.component.Task.component.ActionBar.C324AD20', + defaultMessage: '再次发起', + }), //'再次发起' + type: 'button', + }, + editBtn: { + key: 'edit', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Edit', + defaultMessage: '编辑', + }), //编辑 + type: 'button', + }, + stopBtn: { + key: 'stop', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Termination', + defaultMessage: '终止', + }), //终止 + type: 'button', + }, + disableBtn: { + key: 'disable', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Disable', + defaultMessage: '禁用', + }), //禁用 + type: 'button', + }, + stopScheduleTaskBtn: { + key: 'stopLogicalChangeTask', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Termination', + defaultMessage: '终止', + }), //终止 + type: 'button', + }, + enableBtn: { + key: 'enable', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Enable', + defaultMessage: '启用', + }), //启用 + type: 'button', + }, + deleteBtn: { + key: 'delete', + text: formatMessage({ + id: 'src.component.Task.component.ActionBar.E16B982C', + defaultMessage: '删除', + }), + type: 'button', + }, + closeBtn: { + key: 'close', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Close', + defaultMessage: '关闭', + }), + type: 'button', + }, + copyBtn: { + key: 'copy', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Copy', + defaultMessage: '复制', + }), + type: 'button', + }, + rollbackBtn: { + key: 'rollback', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.RollBack', + defaultMessage: '回滚', + }), + type: 'button', + }, + executeBtn: { + key: 'execute', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Run', + defaultMessage: '执行', + }), + type: 'button', + }, + approvalBtn: { + key: 'approval', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Pass', + defaultMessage: '通过', + }), + type: 'button', + }, + againBtn: { + key: 'again', + text: formatMessage({ + id: 'src.component.Task.component.ActionBar.57DBF8A7', + defaultMessage: '重试', + }), + type: 'button', + }, + downloadBtn: { + key: 'download', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Download', + defaultMessage: '下载', + }), + type: 'button', + }, + downloadSQLBtn: { + key: 'downloadSQL', + text: formatMessage({ + id: 'src.component.Task.component.ActionBar.DBA6CB6E', + defaultMessage: '下载 SQL', + }), //'下载 SQL' + type: 'button', + }, + structrueComparisonBySQL: { + key: 'structrueComparisonBySQL', + text: formatMessage({ + id: 'src.component.Task.component.ActionBar.46F2F0ED', + defaultMessage: '发起结构同步', + }), //'发起结构同步' + type: 'button', + }, + openLocalFolder: { + key: 'openLocalFolder', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.OpenFolder', + defaultMessage: '打开文件夹', + }), + type: 'button', + }, + downloadViewResultBtn: { + key: 'downloadViewResult', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.DownloadQueryResults', + defaultMessage: '下载查询结果', + }), + type: 'button', + }, +}; diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 95c46292c..56a6a816d 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -28,7 +28,7 @@ import { getAsyncResultSet, } from '@/common/network/task'; import Action from '@/component/Action'; -import { TaskTypeMap } from '@/component/Task/component/TaskTable'; +import { TaskTypeMap } from '@/component/Task/component/TaskTable/const'; import type { IApplyPermissionTaskParams, ICycleSubTaskRecord, @@ -61,17 +61,19 @@ import type { TaskStore } from '@/store/task'; import ipcInvoke from '@/util/client/service'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; -import { downloadFile, getLocalFormatDateTime } from '@/util/utils'; +import { downloadFile, getLocalFormatDateTime, uniqueTools } from '@/util/utils'; import { message, Modal, Popconfirm, Tooltip } from 'antd'; import { inject, observer } from 'mobx-react'; import React, { useEffect, useMemo, useState } from 'react'; -import { isCycleTask, isLogicalDbChangeTask } from '../../helper'; +import { isCycleTask, isLogicalDbChangeTask } from '@/component/Task/helper'; import RollBackModal from '../RollbackModal'; import { ProjectRole } from '@/d.ts/project'; import { useRequest } from 'ahooks'; +import { taskSuccessHintInfo } from '@/constant'; +import { actionInfo, actions, JOB_SCHEDULE_TASKS, SCHEDULE_TASKS } from './helper'; +import { IAddOperationsParams } from './type'; import { openSQLResultSetViewPage } from '@/store/helper/page'; import setting from '@/store/setting'; - interface IProps { userStore?: UserStore; taskStore?: TaskStore; @@ -98,7 +100,6 @@ const ActionBar: React.FC = inject( )( observer((props) => { const { - taskStore, modalStore, userStore: { user }, settingStore, @@ -107,6 +108,7 @@ const ActionBar: React.FC = inject( disabledSubmit = false, result, delTaskList = [], + taskStore, setDelTaskList, } = props; /** 是否创建者 */ @@ -129,11 +131,13 @@ const ActionBar: React.FC = inject( } return cancel(); }, [task?.id]); + const getScheduleTask = async () => { const taskList = await getDataArchiveSubTask(task?.id); setTaskList(taskList?.contents); return taskList?.contents; }; + const { run: loadtaskList, cancel } = useRequest(getScheduleTask, { pollingInterval: 3000, manual: true, @@ -148,7 +152,7 @@ const ActionBar: React.FC = inject( }, }); - const openTaskDetail = async () => { + const _openTaskDetail = async () => { props.onDetailVisible(task as TaskRecord, true); }; @@ -164,19 +168,24 @@ const ActionBar: React.FC = inject( setActiveBtnKey('stop'); const res = await stopTask(task.id); if (res) { - message.success( - formatMessage({ - id: 'odc.components.TaskManagePage.TerminatedSuccessfully', - defaultMessage: '终止成功', - }), - ); + message.success(taskSuccessHintInfo.terminate); props?.onReloadList?.(); props?.onReload?.(); } }; - const deleteTask = async () => { + const _executeTask = async () => { + setActiveBtnKey('execute'); + const res = await executeTask(task.id); + if (res) { + message.success(taskSuccessHintInfo.start); + closeTaskDetail(); + props?.onReloadList?.(); + } + }; + + const _deleteTask = async () => { const { id } = task; const res = await createTask({ taskType: TaskType.ALTER_SCHEDULE, @@ -187,12 +196,7 @@ const ActionBar: React.FC = inject( }); if (res) { setDelTaskList?.([...delTaskList, id]); - message.success( - formatMessage({ - id: 'src.component.Task.component.ActionBar.9EDD0936', - defaultMessage: '删除成功', - }), - ); + message.success(taskSuccessHintInfo.delete); props?.onReloadList?.(); } }; @@ -209,7 +213,7 @@ const ActionBar: React.FC = inject( const confirmRollback = async (type: RollbackType) => { closeTaskDetail(); - props.modalStore.changeCreateAsyncTaskModal(true, { + actions[TaskType.ASYNC]({ type, task: task as TaskDetail, databaseId: task?.database?.id, @@ -224,7 +228,7 @@ const ActionBar: React.FC = inject( } }, [task?.status]); - const handleRollback = async () => { + const _rollbackTask = async () => { setOpenRollback(true); }; @@ -232,45 +236,22 @@ const ActionBar: React.FC = inject( setOpenRollback(false); }; - const handleExecute = async () => { - setActiveBtnKey('execute'); - const res = await executeTask(task.id); - if (res) { - message.success( - formatMessage({ - id: 'src.component.Task.component.ActionBar.10A4FEFD', - defaultMessage: '开始执行', - }), - ); - closeTaskDetail(); - props?.onReloadList?.(); - } - }; - - const handleApproval = async (status: boolean) => { + const _approvalTask = async (status: boolean) => { props.onApprovalVisible(status, true); }; - const handleReTry = async () => { + const _retryTask = async () => { const { type } = task; switch (type) { - case TaskType.ASYNC: { - const detailRes = (await getTaskDetail(task?.id)) as TaskDetail; - props.modalStore.changeCreateAsyncTaskModal(true, { - task: detailRes, - }); - return; - } + case TaskType.ASYNC: case TaskType.DATAMOCK: { - const detailRes = (await getTaskDetail(task?.id)) as TaskDetail; - props.modalStore.changeDataMockerModal(true, { - task: detailRes, - }); + const detailRes = (await getTaskDetail(task?.id)) as TaskDetail; + actions[type]({ task: detailRes }); return; } case TaskType.APPLY_DATABASE_PERMISSION: { - modalStore.changeApplyDatabasePermissionModal(true, { + actions[type]({ task: task as TaskDetail, }); return; @@ -282,41 +263,25 @@ const ActionBar: React.FC = inject( return; } case TaskType.APPLY_TABLE_PERMISSION: { - modalStore.changeApplyTablePermissionModal(true, { + actions[type]({ task: task as TaskDetail, }); return; } case TaskType.MULTIPLE_ASYNC: { - modalStore.changeMultiDatabaseChangeModal(true, { + actions[type]({ projectId: (task as TaskDetail)?.parameters?.projectId, task: task as TaskDetail, }); return; } - case TaskType.SHADOW: { - modalStore.changeShadowSyncVisible(true, { - taskId: task?.id, - databaseId: task.database?.id, - }); - return; - } - case TaskType.STRUCTURE_COMPARISON: { - modalStore.changeStructureComparisonModal(true, { - databaseId: task.database?.id, - taskId: task?.id, - }); - return; - } - case TaskType.EXPORT: { - modalStore.changeExportModal(true, { - databaseId: task.database?.id, - taskId: task?.id, - }); - return; - } - case TaskType.IMPORT: { - modalStore.changeImportModal(true, { + case TaskType.SHADOW: + case TaskType.STRUCTURE_COMPARISON: + case TaskType.EXPORT: + case TaskType.IMPORT: + case TaskType.ONLINE_SCHEMA_CHANGE: + case TaskType.PARTITION_PLAN: { + actions[type]({ databaseId: task.database?.id, taskId: task?.id, }); @@ -326,7 +291,7 @@ const ActionBar: React.FC = inject( const detailRes = (await getTaskDetail( task?.id, )) as TaskDetail; - modalStore.changeCreateResultSetExportTaskModal(true, { + actions[type]({ databaseId: task.database?.id, taskId: task?.id, sql: detailRes.parameters.sql, @@ -334,20 +299,6 @@ const ActionBar: React.FC = inject( }); return; } - case TaskType.ONLINE_SCHEMA_CHANGE: { - modalStore.changeCreateDDLAlterTaskModal(true, { - databaseId: task.database?.id, - taskId: task?.id, - }); - return; - } - case TaskType.PARTITION_PLAN: { - modalStore.changePartitionModal(true, { - databaseId: task.database?.id, - taskId: task?.id, - }); - return; - } default: { const { database, executionStrategy, executionTime, parameters, description } = task; @@ -362,30 +313,18 @@ const ActionBar: React.FC = inject( const res = await createTask(data); if (res) { - message.success( - formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.InitiatedAgain', - defaultMessage: '再次发起成功', - }), - - //再次发起成功 - ); + message.success(taskSuccessHintInfo.retry); //再次发起成功 } } } }; - const handleAgain = async () => { + const _againTask = async () => { const { id } = task; const res = await againTask({ id: id }); if (res) { - message.success( - formatMessage({ - id: 'src.component.Task.component.ActionBar.15961986', - defaultMessage: '发起重试成功', - }), - ); + message.success(taskSuccessHintInfo.again); props?.onReloadList?.(); props?.onReload?.(); } @@ -436,56 +375,34 @@ const ActionBar: React.FC = inject( } }; - const editCycleTask = async () => { + const _editCycleTask = async () => { props?.onClose?.(); - switch (task?.type) { - case TaskType.DATA_ARCHIVE: { - props.modalStore.changeDataArchiveModal(true, { - id: task?.id, - type: 'EDIT', - }); - break; - } - case TaskType.DATA_DELETE: { - props.modalStore.changeDataClearModal(true, { - id: task?.id, - type: 'EDIT', - }); - break; - } - default: { - props.modalStore.changeCreateSQLPlanTaskModal(true, { - id: task?.id, - }); - } - } + const actionType = JOB_SCHEDULE_TASKS.includes(task?.type) ? task?.type : TaskType.SQL_PLAN; + actions?.[actionType]?.({ + id: task?.id, + type: JOB_SCHEDULE_TASKS.includes(task?.type) ? ('EDIT' as 'EDIT') : undefined, + }); }; - const handleReTryCycleTask = async () => { + const _retryCycleTask = async () => { props?.onClose?.(); switch (task?.type) { - case TaskType.DATA_ARCHIVE: { - props.modalStore.changeDataArchiveModal(true, { + case TaskType.DATA_ARCHIVE: + case TaskType.DATA_DELETE: { + actions?.[task?.type]?.({ id: task?.id, type: 'RETRY', }); break; } case TaskType.LOGICAL_DATABASE_CHANGE: { - modalStore.changeLogicialDatabaseModal(true, { + actions?.[task?.type]?.({ task: task, }); break; } - case TaskType.DATA_DELETE: { - props.modalStore.changeDataClearModal(true, { - id: task?.id, - type: 'RETRY', - }); - break; - } case TaskType.SQL_PLAN: { - modalStore.changeCreateSQLPlanTaskModal(true, { + actions?.[task?.type]?.({ databaseId: task.database?.id, taskId: task?.id, }); @@ -494,158 +411,121 @@ const ActionBar: React.FC = inject( } }; - const stopScheduleTask = async () => { + const _stopScheduleTask = async () => { await stopDataArchiveSubTask(task?.id, taskList?.[0]?.id); await getScheduleTask(); props?.onReload?.(); }; - const disableCycleTask = async () => { - let databaseId; - if (task.database) { - databaseId = task.database?.id; - } else { - databaseId = (task as ICycleTaskRecord).jobParameters - ?.databaseId; - } - Modal.confirm({ - title: formatMessage( - { - id: 'src.component.Task.component.ActionBar.5495D4C7', - defaultMessage: '确认要禁用此{TaskTypeMapTaskType}?', - }, - { TaskTypeMapTaskType: TaskTypeMap[task.type] }, - ), - content: ( - <> -
- {formatMessage( - { - id: 'src.component.Task.component.ActionBar.EC0C09D6', - defaultMessage: '禁用{TaskTypeMapTaskType}', - }, - { TaskTypeMapTaskType: TaskTypeMap[task.type] }, - )} -
-
- { - formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe', - defaultMessage: '任务需要重新审批,审批通过后此任务将禁用', - }) /*任务需要重新审批,审批通过后此任务将禁用*/ - } -
- - ), - - cancelText: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Cancel', - defaultMessage: '取消', - }), //取消 - okText: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Ok.2', - defaultMessage: '确定', - }), //确定 - centered: true, - onOk: async () => { - await createTask({ - databaseId, - taskType: TaskType.ALTER_SCHEDULE, - parameters: { - taskId: task.id, - operationType: 'PAUSE', - }, - }); - props?.onReload?.(); + const _alterScheduleTask = async ({ databaseId, operationType }) => { + await createTask({ + databaseId, + taskType: TaskType.ALTER_SCHEDULE, + parameters: { + taskId: task.id, + operationType, }, }); + props?.onReload?.(); }; - const enableCycleTask = async () => { + const handleTaskOperation = async ({ + operationType, + callback, + }: { + operationType: TaskOperationType; + callback?: () => void; + }) => { let databaseId; - if (task.database) { - databaseId = task.database?.id; + if (task?.database) { + databaseId = task?.database?.id; } else { - databaseId = (task as ICycleTaskRecord).jobParameters + databaseId = (task as ICycleTaskRecord)?.jobParameters ?.databaseId; } - Modal.confirm({ - title: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.AreYouSureYouWant.2', - defaultMessage: '是否确认启用此 SQL 计划?', - }), //确认要启用此 SQL 计划吗? - content: ( - <> -
- { - formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.EnableSqlScheduling', - defaultMessage: '启用 SQL 计划', - }) /*启用 SQL 计划*/ - } -
-
- { - formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe.1', - defaultMessage: '任务需要重新审批,审批通过后此任务将启用', - }) /*任务需要重新审批,审批通过后此任务将启用*/ - } -
- - ), - - cancelText: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Cancel', - defaultMessage: '取消', - }), //取消 - okText: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Ok.2', - defaultMessage: '确定', - }), //确定 - centered: true, - onOk: async () => { - await createTask({ - databaseId, - taskType: TaskType.ALTER_SCHEDULE, - parameters: { - taskId: task?.id, - operationType: 'RESUME', + const taskTypeName = TaskTypeMap[task?.type]; + const config = { + [TaskOperationType.RESUME]: { + title: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.AreYouSureYouWant.2', + defaultMessage: '是否确认启用此 SQL 计划?', + }), + content: ( + <> +
+ { + formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.EnableSqlScheduling', + defaultMessage: '启用 SQL 计划', + }) /*启用 SQL 计划*/ + } +
+
+ { + formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe.1', + defaultMessage: '任务需要重新审批,审批通过后此任务将启用', + }) /*任务需要重新审批,审批通过后此任务将启用*/ + } +
+ + ), + }, + [TaskOperationType.PAUSE]: { + title: formatMessage( + { + id: 'src.component.Task.component.ActionBar.5495D4C7', + defaultMessage: '确认要禁用此{TaskTypeMapTaskType}?', }, - }); - props?.onReload?.(); + { TaskTypeMapTaskType: taskTypeName }, + ), + content: ( + <> +
+ {formatMessage( + { + id: 'src.component.Task.component.ActionBar.EC0C09D6', + defaultMessage: '禁用{TaskTypeMapTaskType}', + }, + { TaskTypeMapTaskType: taskTypeName }, + )} +
+
+ { + formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe', + defaultMessage: '任务需要重新审批,审批通过后此任务将禁用', + }) /*任务需要重新审批,审批通过后此任务将禁用*/ + } +
+ + ), }, - }); - }; + [TaskOperationType.TERMINATE]: { + title: formatMessage( + { + id: 'src.component.Task.component.ActionBar.718054C5', + defaultMessage: '确认要终止此{taskTypeName}?', + }, + { taskTypeName }, + ), + content: ( + <> +
+ {formatMessage({ + id: 'src.component.Task.component.ActionBar.5E24502A', + defaultMessage: '任务终止后将不可恢复', + })} +
+ + ), + }, + }; + const { title, content } = config[operationType] || {}; - const stopCycleTask = async () => { - let databaseId; - if (task.database) { - databaseId = task.database?.id; - } else { - databaseId = (task as ICycleTaskRecord).jobParameters - ?.databaseId; - } - const taskTypeName = TaskTypeMap[task?.type]; Modal.confirm({ - title: formatMessage( - { - id: 'src.component.Task.component.ActionBar.718054C5', - defaultMessage: '确认要终止此{taskTypeName}?', - }, - { taskTypeName }, - ), - content: ( - <> -
- {formatMessage({ - id: 'src.component.Task.component.ActionBar.5E24502A', - defaultMessage: '任务终止后将不可恢复', - })} -
- - ), - + title, + content, cancelText: formatMessage({ id: 'odc.TaskManagePage.component.TaskTools.Cancel', defaultMessage: '取消', @@ -656,25 +536,12 @@ const ActionBar: React.FC = inject( }), //确定 centered: true, onOk: async () => { - setActiveBtnKey('stop'); - await createTask({ - databaseId, - taskType: TaskType.ALTER_SCHEDULE, - parameters: { - taskId: task?.id, - operationType: TaskOperationType.TERMINATE, - }, - }); - props?.onReload?.(); + callback?.(); + await _alterScheduleTask({ databaseId, operationType }); }, }); }; - /** 去重数组 */ - const uniqueTools = (tools) => { - return Array.from(new Map(tools.map((obj) => [obj.key, obj])).values()); - }; - /** * 判断是否是创建人、项目DBA、项目owner,以操作工单 */ @@ -692,9 +559,40 @@ const ActionBar: React.FC = inject( tools.push(reTryBtn); } }; + const commonButtonConfig = { + viewBtn: { + key: 'view', + text: formatMessage({ id: 'odc.TaskManagePage.AsyncTask.See', defaultMessage: '查看' }), // 查看 + action: _openTaskDetail, + type: 'button', + isOpenBtn: true, + }, + rejectBtn: { + key: 'reject', + text: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.Reject', + defaultMessage: '拒绝', + }), + + //拒绝 + type: 'button', + action: async () => { + _approvalTask(false); + }, + }, + }; const getTaskTools = (_task) => { let tools = []; + const addOperations = ({ auth, taskTypeLimit, operations }: IAddOperationsParams) => { + const hasOperaitons = Boolean(operations?.length); + const useableTaskType = !taskTypeLimit || taskTypeLimit?.includes(task?.type); + if (auth && useableTaskType && hasOperaitons) { + tools.push(...operations); + return true; + } + return false; + }; if (!_task) { return []; @@ -714,242 +612,222 @@ const ActionBar: React.FC = inject( SubTaskStatus.DONE === structureComparisonData?.status && ((structureComparisonData?.overSizeLimit && structureComparisonData?.storageObjectId) || (!structureComparisonData?.overSizeLimit && - !(structureComparisonData?.totalChangeScript?.length > 0))); - const viewBtn = { - key: 'view', - text: formatMessage({ id: 'odc.TaskManagePage.AsyncTask.See', defaultMessage: '查看' }), // 查看 - action: openTaskDetail, - type: 'button', - isOpenBtn: true, - }; - - const closeBtn = { - key: 'close', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Close', - defaultMessage: '关闭', - }), - - //关闭 - action: closeTaskDetail, - type: 'button', - }; - - const copyBtn = { - key: 'copy', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Copy', - defaultMessage: '复制', - }), - - //复制 - action: handleCopy, - type: 'button', - isOpenBtn: true, - }; - - const rollbackBtn = { - key: 'rollback', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.RollBack', - defaultMessage: '回滚', - }), - - //回滚 - action: handleRollback, - type: 'button', - }; - - const stopBtn = { - key: 'stop', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Terminate', - defaultMessage: '终止', - }), - - //终止 - action: _stopTask, - type: 'button', - }; - - const executeBtn = { - key: 'execute', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Run', - defaultMessage: '执行', - }), - - //执行 - type: 'button', - action: handleExecute, - isOpenBtn: true, - isPrimary: isDetailModal, - disabled: false, - tooltip: '', - }; - - const approvalBtn = { - key: 'approval', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Pass', - defaultMessage: '通过', - }), - - //通过 - type: 'button', - isPrimary: isDetailModal, - disabled: disabledApproval, - tooltip: disabledApproval - ? formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.SetPartitionPoliciesForAll', - defaultMessage: '请设置所有Range分区表的分区策略', - }) - : //请设置所有Range分区表的分区策略 - null, - action: async () => { - handleApproval(true); + !Boolean(structureComparisonData?.totalChangeScript?.length))); + const buttonConfig = { + ...commonButtonConfig, + closeBtn: { + ...actionInfo.closeBtn, + //关闭 + action: closeTaskDetail, }, - }; + copyBtn: { + ...actionInfo.copyBtn, + //复制 + action: handleCopy, - const rejectBtn = { - key: 'reject', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Reject', - defaultMessage: '拒绝', - }), - - //拒绝 - type: 'button', - action: async () => { - handleApproval(false); + isOpenBtn: true, + }, + rollbackBtn: { + ...actionInfo.rollbackBtn, + //回滚 + action: _rollbackTask, + }, + stopBtn: { + ...actionInfo.stopBtn, + //终止 + action: _stopTask, + }, + executeBtn: { + ...actionInfo.executeBtn, + //执行 + action: _executeTask, + isOpenBtn: true, + isPrimary: isDetailModal, + disabled: false, + tooltip: '', + }, + approvalBtn: { + ...actionInfo.approvalBtn, + //通过 + isPrimary: isDetailModal, + disabled: disabledApproval, + tooltip: disabledApproval + ? formatMessage({ + id: 'odc.TaskManagePage.component.TaskTools.SetPartitionPoliciesForAll', + defaultMessage: '请设置所有Range分区表的分区策略', + }) + : //请设置所有Range分区表的分区策略 + null, + action: async () => { + _approvalTask(true); + }, + }, + reTryBtn: { + ...actionInfo.reTryBtn, + //再次发起 + action: _retryTask, + }, + againBtn: { + ...actionInfo.againBtn, + // 重试 + action: _againTask, + }, + downloadBtn: { + ...actionInfo.downloadBtn, + disabled: isExpired, + isExpired, + tip: formatMessage({ + id: 'src.component.Task.component.ActionBar.F20AAC3F', + defaultMessage: '文件下载链接已超时,请重新发起工单。', + }), //'文件下载链接已超时,请重新发起工单。' + + action: download, + }, + downloadSQLBtn: { + ...actionInfo.downloadSQLBtn, + disabled: disableBtn || !structureComparisonData?.storageObjectId, + isExpired: disableBtn || !structureComparisonData?.storageObjectId, + tip: formatMessage({ + id: 'src.component.Task.component.ActionBar.A79907A3', + defaultMessage: '暂不可用', + }), //'暂不可用' + action: async () => { + if (structureComparisonData?.storageObjectId) { + const fileUrl = await getStructureComparisonTaskFile(_task?.id, [ + `${structureComparisonData?.storageObjectId}`, + ]); + fileUrl?.forEach((url) => { + url && downloadFile(url); + }); + } + }, + }, + structrueComparisonBySQL: { + ...actionInfo.structrueComparisonBySQL, + isExpired: disableBtn || noAction, + disabled: disableBtn || noAction, + tip: noAction + ? formatMessage({ + id: 'src.component.Task.component.ActionBar.D98B5B62', + defaultMessage: '结构一致,无需发起结构同步', + }) + : formatMessage({ + id: 'src.component.Task.component.ActionBar.4BF7D8BF', + defaultMessage: '暂不可用', + }), + isPrimary: true, + action: async () => { + structureComparisonData && + actions[TaskType.ASYNC]({ + sql: structureComparisonData?.totalChangeScript, + databaseId: structureComparisonData?.database?.id, + rules: null, + }); + }, + }, + openLocalFolder: { + ...actionInfo.openLocalFolder, + //打开文件夹 + action: async () => { + const info = await getTaskResult(task.id); + if (info?.exportZipFilePath) { + ipcInvoke('showItemInFolder', info?.exportZipFilePath); + } + }, + }, + downloadViewResultBtn: { + ...actionInfo.downloadViewResultBtn, + disabled: isExpired, + isExpired, + tip: formatMessage({ + id: 'src.component.Task.component.ActionBar.E9211B1A', + defaultMessage: '文件下载链接已超时,请重新发起工单。', + }), //'文件下载链接已超时,请重新发起工单。' + + action: downloadViewResult, }, }; - const reTryBtn = { - key: 'reTry', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.InitiateAgain', - defaultMessage: '再次发起', - }), - - //再次发起 - type: 'button', - action: handleReTry, + const addRetryButton = () => { + setBtnByCreater(tools, buttonConfig.reTryBtn); }; - const againBtn = { - key: 'again', - text: formatMessage({ - id: 'src.component.Task.component.ActionBar.57DBF8A7', - defaultMessage: '重试', - }), - // 重试 - type: 'button', - action: handleAgain, + const resetToolsForApprover = ( + target?: Array<{ + key: string; + text: any; + type: string; + action: () => Promise; + }>, + ) => { + if (isApprover) { + tools = target || []; + } }; - const downloadBtn = { - key: 'download', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Download', - defaultMessage: '下载', - }), - disabled: isExpired, - isExpired, - tip: formatMessage({ - id: 'src.component.Task.component.ActionBar.F20AAC3F', - defaultMessage: '文件下载链接已超时,请重新发起工单。', - }), //'文件下载链接已超时,请重新发起工单。' - - action: download, - type: 'button', - }; - const downloadSQLBtn = { - key: 'downloadSQL', - text: formatMessage({ - id: 'src.component.Task.component.ActionBar.DBA6CB6E', - defaultMessage: '下载 SQL', - }), //'下载 SQL' - disabled: disableBtn || !structureComparisonData?.storageObjectId, - isExpired: disableBtn || !structureComparisonData?.storageObjectId, - tip: formatMessage({ - id: 'src.component.Task.component.ActionBar.A79907A3', - defaultMessage: '暂不可用', - }), //'暂不可用' - type: 'button', - action: async () => { - if (structureComparisonData?.storageObjectId) { - const fileUrl = await getStructureComparisonTaskFile(_task?.id, [ - `${structureComparisonData?.storageObjectId}`, - ]); - fileUrl?.forEach((url) => { - url && downloadFile(url); - }); - } + const operationNeedPermission = { + [TaskStatus.EXECUTION_ABNORMAL]: { + operations: [buttonConfig.stopBtn, buttonConfig.againBtn], }, - }; - const structrueComparisonBySQL = { - key: 'structrueComparisonBySQL', - text: formatMessage({ - id: 'src.component.Task.component.ActionBar.46F2F0ED', - defaultMessage: '发起结构同步', - }), //'发起结构同步' - isExpired: disableBtn || noAction, - disabled: disableBtn || noAction, - tip: noAction - ? formatMessage({ - id: 'src.component.Task.component.ActionBar.D98B5B62', - defaultMessage: '结构一致,无需发起结构同步', - }) - : formatMessage({ - id: 'src.component.Task.component.ActionBar.4BF7D8BF', - defaultMessage: '暂不可用', - }), - type: 'button', - isPrimary: true, - action: async () => { - structureComparisonData && - modalStore?.changeCreateAsyncTaskModal(true, { - sql: structureComparisonData?.totalChangeScript, - databaseId: structureComparisonData?.database?.id, - rules: null, - }); + [TaskStatus.EXECUTING]: { + operations: [buttonConfig.stopBtn], + taskRules: [ + { + auth: true, + taskTypeLimit: [TaskType.STRUCTURE_COMPARISON], + operations: [buttonConfig.downloadSQLBtn, buttonConfig.structrueComparisonBySQL], + }, + ], }, - }; - const openLocalFolder = { - key: 'openLocalFolder', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.OpenFolder', - defaultMessage: '打开文件夹', - }), - - //打开文件夹 - action: async () => { - const info = await getTaskResult(task.id); - if (info?.exportZipFilePath) { - ipcInvoke('showItemInFolder', info?.exportZipFilePath); - } + [TaskStatus.APPROVING]: { + operations: [buttonConfig.stopBtn], + }, + [TaskStatus.EXECUTION_SUCCEEDED]: { + operations: [], + // taskRules 中的规则按顺序匹配,匹配上一个之后则应用该规则,不再继续匹配 + taskRules: [ + { + taskTypeLimit: [TaskType.EXPORT], + auth: settingStore.enableDataExport && isClient(), + operations: [buttonConfig.openLocalFolder], + }, + { + taskTypeLimit: [TaskType.EXPORT, TaskType.DATAMOCK, TaskType.EXPORT_RESULT_SET], + auth: settingStore.enableDataExport, + operations: [buttonConfig.downloadBtn], + }, + { + taskTypeLimit: [TaskType.ASYNC, TaskType.MULTIPLE_ASYNC], + auth: task?.rollbackable, + operations: [buttonConfig.rollbackBtn], + }, + { + taskTypeLimit: [TaskType.STRUCTURE_COMPARISON], + auth: true, + operations: [buttonConfig.downloadSQLBtn, buttonConfig.structrueComparisonBySQL], + }, + ], }, - type: 'button', }; + const getSpecialExecuteBtn = () => { + const _executeBtn = { ...buttonConfig.executeBtn }; + if (task?.executionStrategy === TaskExecStrategy.TIMER) { + _executeBtn.disabled = true; + const executionTime = getLocalFormatDateTime(task?.executionTime); + + _executeBtn.tooltip = formatMessage( + { + id: 'odc.TaskManagePage.component.TaskTools.ScheduledExecutionTimeExecutiontime', + defaultMessage: '定时执行时间:{executionTime}', + }, - const downloadViewResultBtn = { - key: 'downloadViewResult', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.DownloadQueryResults', - defaultMessage: '下载查询结果', - }), - disabled: isExpired, - isExpired, - tip: formatMessage({ - id: 'src.component.Task.component.ActionBar.E9211B1A', - defaultMessage: '文件下载链接已超时,请重新发起工单。', - }), //'文件下载链接已超时,请重新发起工单。' - - action: downloadViewResult, - type: 'button', - }; + { executionTime }, + ); + //`定时执行时间:${executionTime}` + } + return _executeBtn; + }; const viewResultBtn = { key: 'viewResult', text: formatMessage({ @@ -960,7 +838,6 @@ const ActionBar: React.FC = inject( action: viewResult, type: 'button', }; - if (isDetailModal) { switch (status) { case TaskStatus.REJECTED: @@ -974,107 +851,46 @@ const ActionBar: React.FC = inject( case TaskStatus.CANCELLED: case TaskStatus.PRE_CHECK_FAILED: case TaskStatus.COMPLETED: { - setBtnByCreater(tools, reTryBtn); - if (isApprover) { - tools = []; - } - break; - } - case TaskStatus.EXECUTING: { - setBtnByCreater(tools, reTryBtn); - - if (haveOperationPermission) { - if (task.type === TaskType.STRUCTURE_COMPARISON) { - tools.push(downloadSQLBtn, structrueComparisonBySQL); - } - tools.push(stopBtn); - } - if (isApprover) { - tools = []; - } + addRetryButton(); + resetToolsForApprover(); break; } + case TaskStatus.EXECUTING: + case TaskStatus.EXECUTION_ABNORMAL: case TaskStatus.EXECUTION_SUCCEEDED: { - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - if (task.type === TaskType.EXPORT && settingStore.enableDataExport) { - if (isClient()) { - tools.push(openLocalFolder); - } else { - tools.push(downloadBtn); - } - } else if (task.type === TaskType.DATAMOCK && settingStore.enableDataExport) { - tools.push(downloadBtn); - } else if ( - task.type === TaskType.EXPORT_RESULT_SET && - settingStore.enableDataExport - ) { - tools.push(downloadBtn); - } else if ( - [TaskType.ASYNC, TaskType.MULTIPLE_ASYNC]?.includes(task.type) && - task?.rollbackable - ) { - tools.push(rollbackBtn); - } else if (task.type === TaskType.STRUCTURE_COMPARISON) { - tools.push(downloadSQLBtn, structrueComparisonBySQL); - } - } + addRetryButton(); - if (isApprover) { - tools = []; + if (haveOperationPermission) { + const taskRules = operationNeedPermission?.[status]?.taskRules; + taskRules?.some((rule) => { + return addOperations(rule || {}); + }); + tools.push(...operationNeedPermission[status].operations); } + resetToolsForApprover(); break; } case TaskStatus.WAIT_FOR_CONFIRM: case TaskStatus.APPROVING: { - if (isApprover) { - tools = [rejectBtn, approvalBtn]; - } - setBtnByCreater(tools, reTryBtn); + resetToolsForApprover([buttonConfig.rejectBtn, buttonConfig.approvalBtn]); + addRetryButton(); if (haveOperationPermission) { - tools.push(stopBtn); + tools.push(...operationNeedPermission[status].operations); } break; } case TaskStatus.WAIT_FOR_EXECUTION: { - setBtnByCreater(tools, reTryBtn); + addRetryButton(); if (haveOperationPermission) { - const _executeBtn = { ...executeBtn }; - if (task?.executionStrategy === TaskExecStrategy.TIMER) { - _executeBtn.disabled = true; - const executionTime = getLocalFormatDateTime(task?.executionTime); - - _executeBtn.tooltip = formatMessage( - { - id: 'odc.TaskManagePage.component.TaskTools.ScheduledExecutionTimeExecutiontime', - defaultMessage: '定时执行时间:{executionTime}', - }, - - { executionTime }, - ); - - //`定时执行时间:${executionTime}` - } + const _executeBtn = getSpecialExecuteBtn(); const tempTools = task?.executionStrategy === TaskExecStrategy.AUTO - ? [stopBtn] - : [stopBtn, _executeBtn]; + ? [buttonConfig.stopBtn] + : [buttonConfig.stopBtn, _executeBtn]; tools.push(...tempTools); } - if (isApprover) { - tools = []; - } - break; - } - case TaskStatus.EXECUTION_ABNORMAL: { - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - tools.push(stopBtn, againBtn); - } - if (isApprover) { - tools = []; - } + resetToolsForApprover(); break; } default: @@ -1095,34 +911,22 @@ const ActionBar: React.FC = inject( const allowShowResultSets = setting.getSpaceConfigByKey('odc.task.databaseChange.allowShowResultSets') === 'true'; if (settingStore.enableDataExport && allowDownloadResultSets) { - tools.unshift(downloadViewResultBtn); + tools.unshift(buttonConfig.downloadViewResultBtn); } if (allowShowResultSets) { tools.unshift(viewResultBtn); } } } else { - tools = [viewBtn]; + tools = [buttonConfig.viewBtn]; if (status === TaskStatus.WAIT_FOR_EXECUTION) { if (haveOperationPermission) { - const _executeBtn = { ...executeBtn }; - if (task?.executionStrategy === TaskExecStrategy.TIMER) { - _executeBtn.disabled = true; - const executionTime = getLocalFormatDateTime(task?.executionTime); - _executeBtn.tooltip = formatMessage( - { - id: 'odc.TaskManagePage.component.TaskTools.ScheduledExecutionTimeExecutiontime', - defaultMessage: '定时执行时间:{executionTime}', - }, - - { executionTime }, - ); - } + const _executeBtn = getSpecialExecuteBtn(); task?.executionStrategy === TaskExecStrategy.AUTO - ? tools.push(stopBtn) - : tools.push(_executeBtn, stopBtn); + ? tools.push(buttonConfig.stopBtn) + : tools.push(_executeBtn, buttonConfig.stopBtn); } - setBtnByCreater(tools, reTryBtn); + addRetryButton(); } } tools = uniqueTools(tools); @@ -1135,197 +939,146 @@ const ActionBar: React.FC = inject( return []; } const { status } = _task; + const buttongConfig = { + ...commonButtonConfig, + stopBtn: { + ...actionInfo.stopBtn, + action: async () => { + await handleTaskOperation({ + operationType: TaskOperationType.TERMINATE, + callback: () => { + setActiveBtnKey('stop'); + }, + }); + }, + }, + editBtn: { + ...actionInfo.editBtn, + action: _editCycleTask, + }, + reTryBtn: { + ...actionInfo.reTryBtn, + action: _retryCycleTask, + }, + disableBtn: { + ...actionInfo.disableBtn, + action: async () => { + await handleTaskOperation({ operationType: TaskOperationType.PAUSE }); + }, + }, - const viewBtn = { - key: 'view', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.View', - defaultMessage: '查看', - }), //查看 - action: openTaskDetail, - type: 'button', - isOpenBtn: true, - }; - - const stopBtn = { - key: 'stop', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Termination', - defaultMessage: '终止', - }), //终止 - action: stopCycleTask, - type: 'button', - }; - - const editBtn = { - key: 'edit', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Edit', - defaultMessage: '编辑', - }), //编辑 - action: editCycleTask, - type: 'button', - }; - - const reTryBtn = { - key: 'reTry', - text: formatMessage({ - id: 'src.component.Task.component.ActionBar.C324AD20', - defaultMessage: '再次发起', - }), //'再次发起' - type: 'button', - action: handleReTryCycleTask, - }; - - const disableBtn = { - key: 'disable', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Disable', - defaultMessage: '禁用', - }), //禁用 - action: disableCycleTask, - type: 'button', - }; - - /* 禁用Schedule下的Task for logical database change task */ - /* 很脏的逻辑, ued少一层导致的 */ - const stopScheduleTaskBtn = { - key: 'stopLogicalChangeTask', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Termination', - defaultMessage: '终止', - }), //终止 - action: stopScheduleTask, - type: 'button', + /* 禁用Schedule下的Task for logical database change task */ + /* 很脏的逻辑, ued少一层导致的 */ + stopScheduleTaskBtn: { + ...actionInfo.stopScheduleTaskBtn, + action: _stopScheduleTask, + }, + enableBtn: { + ...actionInfo.enableBtn, + action: async () => { + await handleTaskOperation({ operationType: TaskOperationType.RESUME }); + }, + }, + approvalBtn: { + ...actionInfo.approvalBtn, + isPrimary: isDetailModal, + action: async () => { + _approvalTask(true); + }, + }, + deleteBtn: { + ...actionInfo.deleteBtn, + confirmText: formatMessage({ + id: 'src.component.Task.component.ActionBar.72AF1732', + defaultMessage: '你确定要删除这个任务吗?', + }), + action: _deleteTask, + }, }; - - const enableBtn = { - key: 'enable', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Enable', - defaultMessage: '启用', - }), //启用 - action: enableCycleTask, - type: 'button', + const initTools = ({ view, retry }: { view?: boolean; retry?: boolean }) => { + if (view) { + tools = [buttongConfig.viewBtn]; + } + if (retry) { + setBtnByCreater(tools, buttongConfig.reTryBtn); + } }; - const approvalBtn = { - key: 'approval', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Pass', - defaultMessage: '通过', - }), //通过 - type: 'button', - isPrimary: isDetailModal, - action: async () => { - handleApproval(true); + const operationNeedPermission = { + [TaskStatus.APPROVING]: { + auth: haveOperationPermission, + operations: [buttongConfig.stopBtn], + }, + [TaskStatus.PAUSE]: { + auth: haveOperationPermission, + operations: [buttongConfig.editBtn, buttongConfig.enableBtn, buttongConfig.stopBtn], + }, + [TaskStatus.CANCELLED]: { + auth: haveOperationPermission, + operations: [buttongConfig.stopBtn], + }, + [TaskStatus.REJECTED]: { auth: haveOperationPermission, operations: [] }, + [TaskStatus.APPROVAL_EXPIRED]: { + taskTypeLimit: SCHEDULE_TASKS, + auth: haveOperationPermission, + operations: [buttongConfig.deleteBtn], + }, + [TaskStatus.TERMINATED]: { + taskTypeLimit: SCHEDULE_TASKS, + auth: haveOperationPermission, + operations: [buttongConfig.deleteBtn], + }, + [TaskStatus.COMPLETED]: { + taskTypeLimit: SCHEDULE_TASKS, + auth: haveOperationPermission, + operations: [buttongConfig.deleteBtn], + }, + [TaskStatus.ENABLED]: { + auth: + haveOperationPermission && + !( + JOB_SCHEDULE_TASKS.includes(task?.type) && + (task as ICycleTaskRecord)?.triggerConfig?.triggerStrategy === + TaskExecStrategy.START_NOW + ), + operations: [buttongConfig.disableBtn, buttongConfig.stopBtn, buttongConfig.editBtn], }, }; - const rejectBtn = { - key: 'reject', - text: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTools.Reject', - defaultMessage: '拒绝', - }), //拒绝 - type: 'button', - action: async () => { - handleApproval(false); - }, + const operationNeedApprover = { + [TaskStatus.APPROVING]: [buttongConfig.approvalBtn, buttongConfig.rejectBtn], }; - const deleteBtn = { - key: 'delete', - text: formatMessage({ - id: 'src.component.Task.component.ActionBar.E16B982C', - defaultMessage: '删除', - }), - type: 'button', - confirmText: formatMessage({ - id: 'src.component.Task.component.ActionBar.72AF1732', - defaultMessage: '你确定要删除这个任务吗?', - }), - action: deleteTask, + const addOperations = ({ taskTypeLimit, auth, operations }: IAddOperationsParams) => { + const hasOperations = Boolean(operations?.length); + const useableTaskType = !taskTypeLimit || taskTypeLimit?.includes(task?.type); + if (auth && hasOperations && useableTaskType) { + tools.push(...operations); + } }; + const enableRetry = isOwner; + initTools({ view: true, retry: enableRetry }); + addOperations(operationNeedPermission?.[status] || {}); + switch (status) { case TaskStatus.APPROVING: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - tools.push(stopBtn); - } - if (isApprover) { - tools.push(approvalBtn, rejectBtn); - } + addOperations({ auth: isApprover, operations: operationNeedApprover[status] }); break; } case TaskStatus.REJECTED: { - setBtnByCreater(tools, reTryBtn); - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); + setBtnByCreater(tools, buttongConfig.reTryBtn); + tools = [buttongConfig.viewBtn]; + setBtnByCreater(tools, buttongConfig.reTryBtn); break; } case TaskStatus.ENABLED: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - if ( - !( - [TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(task?.type) && - (task as ICycleTaskRecord)?.triggerConfig?.triggerStrategy === - TaskExecStrategy.START_NOW - ) - ) { - tools.push(disableBtn, stopBtn, editBtn); - } - } - if (haveOperationPermission && isLogicalDbChangeTask(task?.type)) { - tools = [viewBtn, editBtn, reTryBtn]; - } - break; - } - case TaskStatus.APPROVAL_EXPIRED: - case TaskStatus.TERMINATED: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - if ( - [TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE, TaskType.SQL_PLAN].includes(task?.type) - ) { - tools.push(deleteBtn); - } - } - break; - } - case TaskStatus.PAUSE: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - tools.push(editBtn, enableBtn, stopBtn); - } - break; - } - case TaskStatus.COMPLETED: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if ( - [TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE, TaskType.SQL_PLAN].includes(task?.type) && - haveOperationPermission - ) { - tools.push(deleteBtn); - } - break; - } - case TaskStatus.CANCELLED: { - tools = [viewBtn]; - setBtnByCreater(tools, reTryBtn); - if (haveOperationPermission) { - tools.push(stopBtn); + tools = [buttongConfig.viewBtn, buttongConfig.editBtn, buttongConfig.reTryBtn]; } break; } default: + break; } if (isDetailModal) { @@ -1335,11 +1088,11 @@ const ActionBar: React.FC = inject( } // sql 计划 & 数据归档 & 数据清理 支持编辑 - if (![TaskType.SQL_PLAN, TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(task?.type)) { + if (!SCHEDULE_TASKS.includes(task?.type)) { tools = tools.filter((item) => item.key !== 'edit'); } if ((taskList?.[0]?.status as any) === SubTaskStatus.RUNNING) { - tools = [...tools, stopScheduleTaskBtn]; + tools = [...tools, buttongConfig.stopScheduleTaskBtn]; } tools = uniqueTools(tools); return tools; diff --git a/src/component/Task/component/ActionBar/type.ts b/src/component/Task/component/ActionBar/type.ts new file mode 100644 index 000000000..01463f443 --- /dev/null +++ b/src/component/Task/component/ActionBar/type.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TaskType } from '@/d.ts'; + +export interface IAddOperationsParams { + taskTypeLimit?: TaskType[]; + auth: boolean; + operations: { + key: string; + text: any; + action: () => Promise; + type: string; + }[]; +} diff --git a/src/component/Task/component/ApprovalModal/index.less b/src/component/Task/component/ApprovalModal/index.less new file mode 100644 index 000000000..4ff8d0d6e --- /dev/null +++ b/src/component/Task/component/ApprovalModal/index.less @@ -0,0 +1,10 @@ +.approvalModal { + .block:global(.ant-space) { + width: 100%; + } + :global { + .ant-modal-body { + padding: 20px; + } + } +} diff --git a/src/component/Task/component/ApprovalModal/index.tsx b/src/component/Task/component/ApprovalModal/index.tsx index ce0f8e799..5a2608a2e 100644 --- a/src/component/Task/component/ApprovalModal/index.tsx +++ b/src/component/Task/component/ApprovalModal/index.tsx @@ -20,7 +20,7 @@ import { formatMessage } from '@/util/intl'; import { Form, Input, message, Modal, Space } from 'antd'; import { inject, observer } from 'mobx-react'; import React, { useEffect, useRef, useState } from 'react'; -import styles from '../../index.less'; +import styles from './index.less'; const { TextArea } = Input; diff --git a/src/component/Task/component/AsyncTaskOperationButton/SubmitTripartiteTaskButton.tsx b/src/component/Task/component/AsyncTaskOperationButton/SubmitTripartiteTaskButton.tsx index 1ff6ce036..06c960151 100644 --- a/src/component/Task/component/AsyncTaskOperationButton/SubmitTripartiteTaskButton.tsx +++ b/src/component/Task/component/AsyncTaskOperationButton/SubmitTripartiteTaskButton.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import React, { useEffect, useState } from 'react'; import type { FileExportResponse, ScheduleExportListView } from '@/d.ts/migrateTask'; @@ -24,6 +40,7 @@ import { IBatchTerminateFlowResult, IScheduleTerminateCmd, IScheduleTerminateResult, + ITaskTerminateCmd, } from '@/d.ts/importTask'; const SubmitTripartiteTaskButton = (props: { @@ -211,11 +228,14 @@ const SubmitTripartiteTaskButton = (props: { api: (terminateId: number) => { return getBatchCancelResult(terminateId?.toString?.()); }, - submitApi: (flowInstanceId: number[]) => { - return cancelFlowInstance(flowInstanceId); + submitApi: (data: ITaskTerminateCmd) => { + return cancelFlowInstance(data); }, getSubmitParams: () => { - return props.tasks?.map((item) => item.id); + return { + flowInstanceIds: props.tasks?.map((item) => item.id), + taskType: props.tasks?.[0]?.type, + }; }, isTaskCompleted: (result: IBatchTerminateFlowResult[]) => { return result?.length > 0 && result?.every((i) => i?.terminateSucceed || i?.failReason); diff --git a/src/component/Task/component/AsyncTaskOperationButton/helper.tsx b/src/component/Task/component/AsyncTaskOperationButton/helper.tsx index 7e820f0f4..616912b0a 100644 --- a/src/component/Task/component/AsyncTaskOperationButton/helper.tsx +++ b/src/component/Task/component/AsyncTaskOperationButton/helper.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { AsyncTaskType, CloudProvider, @@ -6,8 +22,14 @@ import { } from '@/d.ts/migrateTask'; import { IAsyncTaskOperationConfig } from '.'; import { Popover, Space, Tooltip, Typography } from 'antd'; -import { IConnection, TaskDetail, TaskRecordParameters, TaskStatus, TaskType } from '@/d.ts'; -import { TaskTypeMap } from '../TaskTable'; +import { + IConnection, + TaskDetail, + TaskRecord, + TaskRecordParameters, + TaskStatus, + TaskType, +} from '@/d.ts'; import { getLocalFormatDateTime } from '@/util/utils'; import { status as TaskStatusMap, @@ -21,6 +43,7 @@ import Icon, { ExclamationCircleFilled } from '@ant-design/icons'; import { ConnectTypeText } from '@/constant/label'; import { formatMessage } from '@/util/intl'; import { statusThatCanBeExport, statusThatCanBeTerminate } from '../TaskTable/useTaskSelection'; +import { TaskTypeMap } from '../TaskTable/const'; export const DatabasePopover: React.FC<{ connection: Partial; @@ -467,14 +490,18 @@ export const isScheduleMigrateTask = (taskType: TaskType) => { ]?.includes(taskType); }; -// 是否是在正常调度状态的任务(已创建, 已启用, 已禁用) -export const checkIsScheduleTaskListCanBeExported = (taskStatus: TaskStatus) => { - return statusThatCanBeExport?.includes(taskStatus); +// 是否是能被导出的任务状态 +export const checkIsScheduleTaskListCanBeExported = (task: TaskRecord) => { + return statusThatCanBeExport?.includes(task?.status); }; // 是否是能终止的任务状态 -export const checkIsTaskListCanBeTerminated = (taskStatus: TaskStatus) => { - return statusThatCanBeTerminate?.includes(taskStatus); +export const checkIsTaskListCanBeTerminated = (task: TaskRecord) => { + // 分区计划执行成功能够被终止 + if (task?.type === TaskType.PARTITION_PLAN && task?.status === TaskStatus.EXECUTION_SUCCEEDED) { + return true; + } + return statusThatCanBeTerminate?.includes(task?.status); }; /** diff --git a/src/component/Task/component/AsyncTaskOperationButton/hooks/useTaskTable.ts b/src/component/Task/component/AsyncTaskOperationButton/hooks/useTaskTable.ts index 67de61f97..07bd62e2c 100644 --- a/src/component/Task/component/AsyncTaskOperationButton/hooks/useTaskTable.ts +++ b/src/component/Task/component/AsyncTaskOperationButton/hooks/useTaskTable.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { useState } from 'react'; import type { AsyncTaskType, ISwitchOdcTaskListResponse } from '@/d.ts/migrateTask'; import { UnfinishedScheduleListType } from '@/d.ts/migrateTask'; @@ -17,7 +33,7 @@ export interface AsyncTaskModalConfig { modalTitle: string; modalExtra: (count: number, ids?: number[]) => React.ReactNode; - checkStatus: (status: TaskStatus) => boolean; + checkStatus: (task: TaskRecord) => boolean; checkStatusFailed: string; onReload: () => void; diff --git a/src/component/Task/component/AsyncTaskOperationButton/index.tsx b/src/component/Task/component/AsyncTaskOperationButton/index.tsx index 81ff73427..409dc7dc7 100644 --- a/src/component/Task/component/AsyncTaskOperationButton/index.tsx +++ b/src/component/Task/component/AsyncTaskOperationButton/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Button, Modal, Table, Checkbox, Space, Tooltip, message } from 'antd'; import useAsyncTaskTable from './hooks/useTaskTable'; @@ -103,7 +119,7 @@ export function AsyncTaskOperationButton(props: IAsyncTaskOperationConfig) { ); return; } - if (props?.dataSource?.find((d) => !props?.checkStatus?.(d?.status))) { + if (props?.dataSource?.find((d) => !props?.checkStatus?.(d))) { message.info(props?.checkStatusFailed); return; } @@ -112,6 +128,12 @@ export function AsyncTaskOperationButton(props: IAsyncTaskOperationConfig) { showModal(); }; + const cancel = () => { + setVisible(false); + setRiskConfirmed(false); + setConfirmRiskUnFinished(false); + }; + return ( <> @@ -156,14 +178,14 @@ export function AsyncTaskOperationButton(props: IAsyncTaskOperationConfig) { )} - setVisible(false)} + closeModal={cancel} disabled={taskListThatCanBeAction?.length === 0} tasks={taskListThatCanBeAction} asyncTaskType={props.asyncTaskType} diff --git a/src/component/Task/component/CommonDetailModal/ChangeDetail.tsx b/src/component/Task/component/CommonDetailModal/ChangeDetail.tsx index 05ee00d18..dc287e4ca 100644 --- a/src/component/Task/component/CommonDetailModal/ChangeDetail.tsx +++ b/src/component/Task/component/CommonDetailModal/ChangeDetail.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import React, { useEffect, useState } from 'react'; import { Modal, Descriptions, Spin } from 'antd'; diff --git a/src/component/Task/component/CommonDetailModal/ExcecuteDetailModal.tsx b/src/component/Task/component/CommonDetailModal/ExcecuteDetailModal.tsx index 44c9ac8cd..b2934c82c 100644 --- a/src/component/Task/component/CommonDetailModal/ExcecuteDetailModal.tsx +++ b/src/component/Task/component/CommonDetailModal/ExcecuteDetailModal.tsx @@ -1,14 +1,29 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; -import { Drawer, Table, Descriptions, Spin } from 'antd'; +import { Drawer, Descriptions } from 'antd'; import { useRequest } from 'ahooks'; import React, { useEffect, useState } from 'react'; import type { ColumnsType } from 'antd/es/table'; import StatusLabel from '@/component/Task/component/Status'; import { getCycleSubTaskDetail } from '@/common/network/task'; import { SubTaskStatus, ISubTaskTaskUnit } from '@/d.ts'; -import styles from './index.less'; import { getLocalFormatDateTime } from '@/util/utils'; -import { SubTaskTypeMap } from '../../const'; +import { SubTaskTypeMap } from '@/component/Task/const'; import CommonTable from '@/component/CommonTable'; interface IProps { diff --git a/src/component/Task/component/CommonDetailModal/LogModal.tsx b/src/component/Task/component/CommonDetailModal/LogModal.tsx index a12040e00..25f07a85d 100644 --- a/src/component/Task/component/CommonDetailModal/LogModal.tsx +++ b/src/component/Task/component/CommonDetailModal/LogModal.tsx @@ -20,7 +20,6 @@ import TaskLog from '@/component/Task/component/Log'; import { CommonTaskLogType, SubTaskStatus } from '@/d.ts'; import { useRequest } from 'ahooks'; import { Drawer } from 'antd'; -import login from '@/store/login'; import React, { useEffect, useState } from 'react'; interface IProps { scheduleId: number; diff --git a/src/component/Task/component/CommonDetailModal/Nodes/MultipleSQLCheckNode.tsx b/src/component/Task/component/CommonDetailModal/Nodes/MultipleSQLCheckNode.tsx index ad2e871bb..043d89c3f 100644 --- a/src/component/Task/component/CommonDetailModal/Nodes/MultipleSQLCheckNode.tsx +++ b/src/component/Task/component/CommonDetailModal/Nodes/MultipleSQLCheckNode.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { getFlowSQLLintResult } from '@/common/network/task'; import { ISQLLintReuslt } from '@/component/SQLLintResult/type'; import { ITaskFlowNode } from '@/d.ts'; diff --git a/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx b/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx index 6967c7715..65cfe550d 100644 --- a/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx +++ b/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx @@ -20,7 +20,7 @@ import { formatMessage } from '@/util/intl'; import { Descriptions, Space } from 'antd'; import { isEmpty } from 'lodash'; import React from 'react'; -import { DownloadFileAction } from '../../DownloadFileAction'; +import { DownloadFileAction } from '@/component/Task/component/DownloadFileAction'; import styles from '../index.less'; interface IProps { diff --git a/src/component/Task/component/CommonDetailModal/TaskExecuteModal.tsx b/src/component/Task/component/CommonDetailModal/TaskExecuteModal.tsx index 776a5bcd4..ce225a4cb 100644 --- a/src/component/Task/component/CommonDetailModal/TaskExecuteModal.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskExecuteModal.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { getDataSourceStyleByConnectType } from '@/common/datasource'; import { getPhysicalExecuteDetails } from '@/common/network/logicalDatabase'; diff --git a/src/component/Task/component/CommonDetailModal/TaskExecuteRecord.tsx b/src/component/Task/component/CommonDetailModal/TaskExecuteRecord.tsx index 611ec0536..8a5cb60de 100644 --- a/src/component/Task/component/CommonDetailModal/TaskExecuteRecord.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskExecuteRecord.tsx @@ -24,7 +24,7 @@ import StatusLabel, { status, subTaskStatus, } from '@/component/Task/component/Status'; -import DetailModal from '@/component/Task/DetailModal'; +import DetailModal from '@/component/Task/modals/DetailModals'; import { IAsyncTaskParams, IResponseData, @@ -45,7 +45,7 @@ import { getFormatDateTime } from '@/util/utils'; import Icon, { FilterOutlined, SearchOutlined } from '@ant-design/icons'; import { Space, Typography, message } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; -import { isLogicalDbChangeTask } from '../../helper'; +import { isLogicalDbChangeTask } from '@/component/Task/helper'; import ExcecuteDetailModal from './ExcecuteDetailModal'; import styles from './index.less'; import LogModal from './LogModal'; diff --git a/src/component/Task/component/CommonDetailModal/TaskFlow.tsx b/src/component/Task/component/CommonDetailModal/TaskFlow.tsx index adb93671a..9f799182a 100644 --- a/src/component/Task/component/CommonDetailModal/TaskFlow.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskFlow.tsx @@ -38,7 +38,7 @@ import { getLocalFormatDateTime } from '@/util/utils'; import { Descriptions, Space, Steps } from 'antd'; import classNames from 'classnames'; import React, { useEffect, useMemo, useState } from 'react'; -import { isLogicalDbChangeTask } from '../../helper'; +import { isLogicalDbChangeTask } from '@/component/Task/helper'; import styles from './index.less'; import { getStatusDisplayInfo } from './Nodes/helper'; import MultipleSQLCheckNode from './Nodes/MultipleSQLCheckNode'; @@ -240,6 +240,12 @@ const TaskFlow: React.FC = (props) => { //执行 let statusContent = nodeStatusMap[TaskFlowNodeType.SERVICE_TASK][status]; + // 如果flow是EXECUTING_ABNORMAL,节点状态校正显示为执行异常 + // see dima issue 2025041700108316372 + if (task?.status === TaskStatus.EXECUTION_ABNORMAL) { + statusContent = + nodeStatusMap[TaskFlowNodeType.SERVICE_TASK][TaskNodeStatus.EXECUTING_ABNORMAL]; + } switch (status) { case TaskNodeStatus.CREATED: { _node = { diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress/ProgressDetailsModal.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress/ProgressDetailsModal.tsx index 6a4d2b0b7..328243567 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress/ProgressDetailsModal.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress/ProgressDetailsModal.tsx @@ -1,7 +1,23 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { ProgressOfLocklessStructureChangeTaskStatusMap } from '@/d.ts'; -import { Button, Modal, Steps } from 'antd'; -import React, { useEffect, useState } from 'react'; +import { Modal, Steps } from 'antd'; +import { useEffect, useState } from 'react'; export default ({ modalOpen, handleClose, parametersJson, resultJson }) => { const { state } = parametersJson || {}; diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressDrawer.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressDrawer.tsx index f44024aad..09a2866b4 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressDrawer.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressDrawer.tsx @@ -1,9 +1,25 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { SQLContent } from '@/component/SQLContent'; import { TaskDetail, TaskRecordParameters } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { Drawer, Space } from 'antd'; import React from 'react'; -import { SimpleTextItem } from '../../SimpleTextItem'; +import { SimpleTextItem } from '@/component/Task/component/SimpleTextItem'; import { getDataSourceModeConfigByConnectionMode } from '@/common/datasource'; const TaskProgressDrawer: React.FC<{ diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressHeader.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressHeader.tsx index 86c43ea16..48f990958 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressHeader.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress/TaskProgressHeader.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { SchemaChangeRecordStatus } from '@/d.ts/logicalDatabase'; import { formatMessage } from '@/util/intl'; import React from 'react'; diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress/colums.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress/colums.tsx index fc93c6e8e..0e58d4f5b 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress/colums.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress/colums.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { getDataSourceStyleByConnectType } from '@/common/datasource'; import Action from '@/component/Action'; import RiskLevelLabel from '@/component/RiskLevelLabel'; @@ -6,7 +22,7 @@ import { SubTaskStatus, TaskType, TaskStatus } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { getLocalFormatDateTime } from '@/util/utils'; import Icon, { QuestionCircleOutlined } from '@ant-design/icons'; -import { Popover, Space, Tooltip, Typography } from 'antd'; +import { Popover, Space, Tooltip } from 'antd'; const getColumns = (params: { handleDetailVisible: (id: number) => void; diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress/index.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress/index.tsx index 4c377fa03..111f0ab71 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress/index.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress/index.tsx @@ -31,8 +31,8 @@ import { useRequest } from 'ahooks'; import { message } from 'antd'; import { inject, observer } from 'mobx-react'; import React, { useContext, useEffect, useState, useMemo } from 'react'; -import { flatArray } from '../../../MutipleAsyncTask/CreateModal/helper'; -import { TaskDetailContext } from '../../../TaskDetailContext'; +import { flatArray } from '@/util/utils'; +import { TaskDetailContext } from '@/component/Task/container/TaskDetailContext'; import { getColumnsByTaskType } from './colums'; import styles from './index.less'; import TaskProgressDrawer from './TaskProgressDrawer'; diff --git a/src/component/Task/component/CommonDetailModal/TaskProgress1.tsx b/src/component/Task/component/CommonDetailModal/TaskProgress1.tsx index 433c3608b..5819ab056 100644 --- a/src/component/Task/component/CommonDetailModal/TaskProgress1.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskProgress1.tsx @@ -39,8 +39,8 @@ import Icon from '@ant-design/icons'; import { useRequest } from 'ahooks'; import { inject, observer } from 'mobx-react'; import React, { useContext, useEffect, useState } from 'react'; -import { flatArray } from '../../MutipleAsyncTask/CreateModal/helper'; -import { TaskDetailContext } from '../../TaskDetailContext'; +import { flatArray } from '@/util/utils'; +import { TaskDetailContext } from '@/component/Task/container/TaskDetailContext'; import { SimpleTextItem } from '../SimpleTextItem'; import styles from './index.less'; const getColumns = (params: { diff --git a/src/component/Task/component/CommonDetailModal/TaskRecord.tsx b/src/component/Task/component/CommonDetailModal/TaskRecord.tsx index 178e44825..1e0d0f469 100644 --- a/src/component/Task/component/CommonDetailModal/TaskRecord.tsx +++ b/src/component/Task/component/CommonDetailModal/TaskRecord.tsx @@ -18,7 +18,7 @@ import { getTaskList } from '@/common/network/task'; import Action from '@/component/Action'; import DisplayTable from '@/component/DisplayTable'; import StatusLabel, { status } from '@/component/Task/component/Status'; -import DetailModal from '@/component/Task/DetailModal'; +import DetailModal from '@/component/Task/modals/DetailModals'; import { TaskDetail, TaskRecord, TaskRecordParameters, TaskType } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { getFormatDateTime } from '@/util/utils'; diff --git a/src/component/Task/component/CommonDetailModal/status.tsx b/src/component/Task/component/CommonDetailModal/status.tsx index 8375b4023..445cb03cc 100644 --- a/src/component/Task/component/CommonDetailModal/status.tsx +++ b/src/component/Task/component/CommonDetailModal/status.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { ScheduleChangeStatus } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { CheckCircleFilled, LoadingOutlined, ExclamationCircleFilled } from '@ant-design/icons'; diff --git a/src/component/Task/component/DataTransferModal/csvTables.tsx b/src/component/Task/component/DataTransferModal/csvTables.tsx index 6a3178116..bf46da8a2 100644 --- a/src/component/Task/component/DataTransferModal/csvTables.tsx +++ b/src/component/Task/component/DataTransferModal/csvTables.tsx @@ -18,7 +18,7 @@ import { CsvColumnMapping } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { isNil } from 'lodash'; import React from 'react'; -import DisplayTable from '../../../DisplayTable'; +import DisplayTable from '@/component/DisplayTable'; interface ICsvTableProps { data: CsvColumnMapping[]; diff --git a/src/component/Task/component/DataTransferModal/index.tsx b/src/component/Task/component/DataTransferModal/index.tsx index e8505f959..14c352698 100644 --- a/src/component/Task/component/DataTransferModal/index.tsx +++ b/src/component/Task/component/DataTransferModal/index.tsx @@ -16,7 +16,6 @@ import { downloadTaskFlow } from '@/common/network/task'; import RiskLevelLabel from '@/component/RiskLevelLabel'; -import { getTaskExecStrategyMap } from '@/component/Task'; import { FILE_DATA_TYPE, IMPORT_TYPE, TaskExecStrategy } from '@/d.ts'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; @@ -26,7 +25,10 @@ import React from 'react'; import CsvTable from './csvTables'; import styles from './index.less'; import ObjTable from './ObjTables'; -import { getImportTypeLabel } from '../../ImportTask/CreateModal/ImportForm/helper'; +import { getImportTypeLabel } from '@/component/Task/modals/ImportTask/CreateModal/ImportForm/helper'; +import { getTaskExecStrategyMap } from '@/component/Task/const'; +import EllipsisText from '@/component/EllipsisText'; + const SimpleTextItem: React.FC<{ label: string; content: React.ReactNode; @@ -60,9 +62,10 @@ const SimpleTextItem: React.FC<{
{content} @@ -544,7 +547,7 @@ class TaskContent extends React.Component { id: 'odc.component.DataTransferModal.Database', defaultMessage: '所属数据库', })} - /*所属数据库*/ content={task?.database?.name || '-'} + /*所属数据库*/ content={} />
@@ -555,7 +558,7 @@ class TaskContent extends React.Component { defaultMessage: '所属数据源', }) /* 所属数据源 */ } - content={task?.database?.dataSource?.name || '-'} + content={} /> @@ -625,7 +628,7 @@ class TaskContent extends React.Component { <> @@ -663,6 +666,7 @@ class TaskContent extends React.Component { /> + = (props) => { const dbIcon = getDataSourceStyleByConnectType(database?.dataSource?.type)?.dbIcon; return ( - +
{!!database?.environment?.name && ( = (props) => { component={dbIcon?.component} style={{ fontSize: 16, marginRight: 4, verticalAlign: 'textBottom' }} /> - {database?.name || '-'} - +
+ +
+ {database?.name || '-'} +
+
+
+
); }; export default DatabaseLabel; diff --git a/src/component/Task/component/DatabaseSelect/index.tsx b/src/component/Task/component/DatabaseSelect/index.tsx index 433d47bb8..056529088 100644 --- a/src/component/Task/component/DatabaseSelect/index.tsx +++ b/src/component/Task/component/DatabaseSelect/index.tsx @@ -31,10 +31,16 @@ interface IProps { dataSourceId?: number; filters?: ISessionDropdownFiltersProps; extra?: string; - width?: string; + width?: number; placeholder?: string; isLogicalDatabase?: boolean; onChange?: (v: number, database?: IDatabase) => void; + showProject?: boolean; + validateStatus?: 'warning' | 'error' | 'success' | 'validating' | undefined; + help?: string; + style?: React.CSSProperties; + popoverWidth?: number; + manageLinkVisible?: boolean; } const DatabaseSelect: React.FC = (props) => { const { @@ -53,6 +59,12 @@ const DatabaseSelect: React.FC = (props) => { disabled = false, isLogicalDatabase = false, onChange, + showProject = true, + validateStatus, + help, + style, + popoverWidth, + manageLinkVisible = false, } = props; return ( @@ -69,6 +81,9 @@ const DatabaseSelect: React.FC = (props) => { }), //请选择数据库 }, ]} + validateStatus={validateStatus} + help={help} + style={style} > = (props) => { onChange={onChange} isLogicalDatabase={isLogicalDatabase} placeholder={placeholder} + showProject={showProject} + popoverWidth={popoverWidth} + manageLinkVisible={manageLinkVisible} /> ); diff --git a/src/component/Task/component/DatabaseSelecter/index.tsx b/src/component/Task/component/DatabaseSelecter/index.tsx index 6ebb2ab01..6bb34a2c9 100644 --- a/src/component/Task/component/DatabaseSelecter/index.tsx +++ b/src/component/Task/component/DatabaseSelecter/index.tsx @@ -65,7 +65,10 @@ const DatabaseSelecter: React.FC = function ({ const loadExportObjects = async () => { setIsLoading(true); try { - const res = await listDatabases(projectId, null, null, null, null, null, null, true, null); + const res = await listDatabases({ + projectId, + existed: true, + }); if (res?.contents) { setDatabaseList(databaseFilter ? databaseFilter(res?.contents) : res?.contents); datasourceStatus.asyncUpdateStatus([ diff --git a/src/component/Task/component/DirtyRowAction/index.tsx b/src/component/Task/component/DirtyRowAction/index.tsx index 480b82412..4bcd55ff1 100644 --- a/src/component/Task/component/DirtyRowAction/index.tsx +++ b/src/component/Task/component/DirtyRowAction/index.tsx @@ -1,6 +1,22 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Form, Radio } from 'antd'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { DirtyRowActionEnum, DirtyRowActionLabelMap, diff --git a/src/component/Task/component/ExecuteFailTip/index.tsx b/src/component/Task/component/ExecuteFailTip/index.tsx new file mode 100644 index 000000000..51579819e --- /dev/null +++ b/src/component/Task/component/ExecuteFailTip/index.tsx @@ -0,0 +1,33 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; +import { Alert } from 'antd'; + +export default function ExecuteFailTip() { + return ( + + ); +} diff --git a/src/component/Task/component/ImportModal/DatabaseChangeItem.tsx b/src/component/Task/component/ImportModal/DatabaseChangeItem.tsx new file mode 100644 index 000000000..5c780ecfc --- /dev/null +++ b/src/component/Task/component/ImportModal/DatabaseChangeItem.tsx @@ -0,0 +1,75 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; +import { Form } from 'antd'; +import DatabaseSelect from '../DatabaseSelect'; +import { TaskType } from '@/d.ts'; +import styles from './index.less'; +import { useState } from 'react'; + +const DatabaseChangeItem = ({ + defaultDatabaseId, + taskType, + projectId, + onChange, +}: { + defaultDatabaseId: number; + taskType: TaskType; + projectId: number; + onChange?: (databaseId: number) => void; +}) => { + const [form] = Form.useForm(); + const [isChanged, setIsChanged] = useState(false); + + return ( +
{ + onChange?.(values.databaseId); + setIsChanged(true); + }} + className={isChanged ? styles.changeDatabaseInput : ''} + > + + + ); +}; + +export default DatabaseChangeItem; diff --git a/src/component/Task/component/ImportModal/DatabaseInfoPopover.tsx b/src/component/Task/component/ImportModal/DatabaseInfoPopover.tsx new file mode 100644 index 000000000..eb6d1ac99 --- /dev/null +++ b/src/component/Task/component/ImportModal/DatabaseInfoPopover.tsx @@ -0,0 +1,153 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { IImportDatabaseView } from '@/d.ts/importTask'; +import { formatMessage } from '@/util/intl'; +import Icon, { InfoCircleOutlined } from '@ant-design/icons'; +import { getDataSourceStyleByConnectType } from '@/common/datasource'; +import { getCloudProviderName } from '../AsyncTaskOperationButton/helper'; +import { fromODCPRoviderToProvider } from '@/d.ts/migrateTask'; +import { ConnectTypeText } from '@/constant/label'; +import { + Tooltip, + Popover, + Table, + Descriptions, + Typography, + Empty, + Radio, + Space, + Checkbox, + Flex, + Tag, +} from 'antd'; +import { haveOCP } from '@/util/env'; + +const DatabaseInfoPopover = ({ + title, + value, + popoverWidth, + children, +}: { + title: string; + value: IImportDatabaseView; + popoverWidth: number; + children: React.JSX.Element; +}) => { + const items = [ + { + key: 'datasource', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.A8BC98CA', + defaultMessage: '数据源', + }), + children: value?.name, + }, + { + key: 'databaseName', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.0B1F9DCD', + defaultMessage: '数据库', + }), + children: value?.databaseName, + }, + { + key: 'type', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.263EFA83', + defaultMessage: '类型', + }), + children: ( +
+ + + {ConnectTypeText(value?.type)} +
+ ), + }, + ...(haveOCP() + ? [ + { + key: 'instanceId', + label: formatMessage({ + id: 'odc.component.ConnectionPopover.InstanceIdTenantId', + defaultMessage: '实例ID/租户ID:', + }), + children: `${value?.instanceId}/${value?.tenantId}`, + }, + ] + : [ + { + key: 'host', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.4559F373', + defaultMessage: '主机 IP/域名:', + }), + children: {value?.host}, + }, + { + key: 'port', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.FF8162DA', + defaultMessage: '端口', + }), + children: {value?.port}, + }, + ]), + + { + key: 'username', + label: formatMessage({ + id: 'src.component.Task.component.ImportModal.5928CAE8', + defaultMessage: '数据库账号', + }), + children: value?.username || '-', + }, + ]; + + return ( + +

{title}

+ + {items?.map((i) => { + return ( + + {i?.children} + + ); + })} + + + ) : null + } + arrow={false} + > +
{children}
+
+ ); +}; + +export default DatabaseInfoPopover; diff --git a/src/component/Task/component/ImportModal/ImportPreviewTable.tsx b/src/component/Task/component/ImportModal/ImportPreviewTable.tsx index 30865dc3f..d53b56113 100644 --- a/src/component/Task/component/ImportModal/ImportPreviewTable.tsx +++ b/src/component/Task/component/ImportModal/ImportPreviewTable.tsx @@ -1,362 +1,309 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; -import React, { useMemo, useState, useEffect } from 'react'; -import { IDatasourceInfo } from '.'; +import React, { useMemo, useState, useEffect, useCallback } from 'react'; +import { IDatasourceInfo, IMPORTABLE_TYPE } from '.'; import { IImportDatabaseView, IImportScheduleTaskView, ScheduleNonImportableType, ScheduleNonImportableTypeMap, } from '@/d.ts/importTask'; -import { Tooltip, Popover, Table, Descriptions, Typography, Empty, Radio } from 'antd'; -import type { ColumnsType } from 'antd/es/table'; -import { TaskType } from '@/d.ts'; -import { ConnectTypeText } from '@/constant/label'; -import Icon from '@ant-design/icons'; -import { getDataSourceStyleByConnectType } from '@/common/datasource'; -import { getCloudProviderName } from '../AsyncTaskOperationButton/helper'; -import { fromODCPRoviderToProvider } from '@/d.ts/migrateTask'; +import { Tooltip, Table, Typography, Empty, Radio, Checkbox, Flex } from 'antd'; +import { TaskType, ConnectType } from '@/d.ts'; +import { useColumns } from './useColumn'; interface ImportPreviewTableProps { data: IImportScheduleTaskView[]; loading?: boolean; datasourceInfo: IDatasourceInfo; taskType: TaskType; -} - -const ImportPreviewTable: React.FC = ({ data, loading, taskType }) => { - const [tableType, setTableType] = useState( - 'importable', - ); - - const DatabaseInfoPopover = ({ - title, - value, - width, - children, - }: { - title: string; - value: IImportDatabaseView; - width: number; - children: React.JSX.Element; - }) => { - const items = [ - { - key: 'datasource', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.A8BC98CA', - defaultMessage: '数据源', - }), - children: value?.name, - }, - { - key: 'databaseName', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.0B1F9DCD', - defaultMessage: '数据库', - }), - children: value?.databaseName, - }, - { - key: 'type', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.263EFA83', - defaultMessage: '类型', - }), - children: ( -
- - - {ConnectTypeText(value?.type)} -
- ), - }, - { - key: 'cloudProvider', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.40440087', - defaultMessage: '云厂商', - }), - children: ( -
- {getCloudProviderName(fromODCPRoviderToProvider[value?.cloudProvider]) || '-'} -
- ), - }, - { - key: 'region', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.F2C95E45', - defaultMessage: '地域', - }), - children:
{value?.region || '-'}
, - }, - { - key: 'host', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.EFE4E0D0', - defaultMessage: '连接信息', - }), - children: ( - - {value?.host}:{value?.port} - - ), - }, - { - key: 'instanceNickName', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.4A911A47', - defaultMessage: '实例名称', - }), - children: value?.instanceNickName || value?.instanceId || '-', - }, - { - key: 'tenantNickName', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.396EF2AD', - defaultMessage: '租户名称', - }), - children: value?.tenantNickName || value?.tenantId || '-', - }, - { - key: 'username', - label: formatMessage({ - id: 'src.component.Task.component.ImportModal.5928CAE8', - defaultMessage: '数据库账号', - }), - children: value?.username || '-', - }, - ]; + projectId: number; + selectedRowKeys: string[]; + setSelectedRowKeys: (selectedRowKeys: string[]) => void; + databaseSelections: Record< + string, + { databaseId: number | null; targetDatabaseId: number | null } + >; - return ( - -

{title}

- - {items?.map((i) => { - return ( - - {i?.children} - - ); - })} - - - ) : null - } - > -
-
{children}
-
-
- ); - }; - - const dlmColumns = [ - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.B4E8467F', - defaultMessage: '源端数据库', - }), - dataIndex: 'databaseView', - key: 'databaseView', - render: (_: IImportDatabaseView) => { - if (!_) return '-'; - return ( - - - {_ ? `${_?.name} / ${_?.databaseName}` : '-'} - - - ); - }, - width: 200, - ellipsis: true, - }, - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.76F572C8', - defaultMessage: '目标端数据库', - }), - dataIndex: 'targetDatabaseView', - key: 'targetDatabaseView', - render: (_: IImportDatabaseView) => { - if (!_) return '-'; - return ( - - - {_ ? `${_?.name} / ${_?.databaseName}` : '-'} - - - ); - }, - width: 200, - ellipsis: true, - }, - ]; - - const otherScheduleColumns = [ - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.B5C62BDC', - defaultMessage: '工单描述', - }), - dataIndex: 'description', - key: 'description', - width: 340, - render: (_, record) => { - return _ || '-'; - }, - }, - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.1EB75659', - defaultMessage: '数据库', - }), - dataIndex: 'databaseView', - key: 'databaseView', - render: (_: IImportDatabaseView) => { - console.log('databaseView', _); - if (!_) return '-'; - return ( - - - {_ ? `${_?.name} / ${_?.databaseName}` : '-'} - - - ); - }, - width: 200, - ellipsis: true, - }, - ]; - - const columns: ColumnsType = [ - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.5DE578E8', - defaultMessage: '原编号', - }), - dataIndex: 'originId', - key: 'originId', - width: 100, - }, - { - title: formatMessage({ - id: 'src.component.Task.component.ImportModal.2043ADA9', - defaultMessage: '原项目', - }), - dataIndex: 'originProjectName', - key: 'originProjectName', - width: 100, - render: (_) => { - return _ || '-'; - }, - }, - // 数据清理/归档有源端目标端, 分区计划和sql计划只有数据库 - ...([TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE]?.includes(taskType) ? dlmColumns : []), - ...([TaskType.SQL_PLAN, TaskType.PARTITION_PLAN]?.includes(taskType) - ? otherScheduleColumns - : []), - ]?.filter(Boolean); + setDatabaseSelections: React.Dispatch< + React.SetStateAction< + Record + > + >; +} +const ImportPreviewTable: React.FC = ({ + loading, + taskType, + projectId, + data, + selectedRowKeys, + setSelectedRowKeys, + databaseSelections, + setDatabaseSelections, +}) => { + const [showOnlyImportable, setShowOnlyImportable] = useState(false); const groupedData = useMemo(() => { return data.reduce( ( - acc: Record, - + acc: Record, item, ) => { - const groupKey = item.importable ? 'importable' : item.nonImportableType; + let groupKey: ScheduleNonImportableType | 'TO_BE_IMPORTED'; + + if (item.importable) { + groupKey = 'TO_BE_IMPORTED'; + } else { + groupKey = item.nonImportableType; + } + acc[groupKey] = acc[groupKey] || []; acc[groupKey].push(item); return acc; }, - {} as Record, + {} as Record, ); }, [data]); - // 当数据变化时,如果当前tableType不存在则重置为'importable' + const [tableType, setTableType] = useState( + groupedData?.['TO_BE_IMPORTED']?.length > 0 + ? 'TO_BE_IMPORTED' + : Object.values(ScheduleNonImportableType).find((key) => groupedData?.[key]?.length > 0) || + 'TO_BE_IMPORTED', + ); + // 检查一个工单是否已经选择了所需的数据库 + const hasSelectedAllDatabases = useCallback( + (item: IImportScheduleTaskView) => { + const hasSourceDatabase = + item.databaseView?.matchedDatabaseId || databaseSelections[item.originId]?.databaseId; + const hasTargetDatabase = + item.targetDatabaseView?.matchedDatabaseId || + databaseSelections[item.originId]?.targetDatabaseId || + !item?.targetDatabaseView; + + // 如果是数据清理/归档任务,需要检查源端和目标端 + if ([TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(taskType)) { + return hasSourceDatabase && hasTargetDatabase; + } + // 其他任务类型只需要检查源端 + return hasSourceDatabase; + }, + [databaseSelections, taskType], + ); + + // 判断工单是否应该被选中 + const shouldBeSelected = useCallback( + (item: IImportScheduleTaskView) => { + if (item.importable && hasSelectedAllDatabases(item)) return true; + return false; + }, + [hasSelectedAllDatabases], + ); + + // 更新选中状态 + const updateSelectedRowKeys = useCallback(() => { + if (!data?.length) return; + + const selectedIds = data.filter((item) => shouldBeSelected(item)).map((item) => item.originId); + + setSelectedRowKeys(selectedIds); + }, [data, shouldBeSelected, setSelectedRowKeys]); + + // 初始化和数据变化时更新选中状态 useEffect(() => { - if (data?.length > 0 && groupedData[tableType] === undefined) { - setTableType('importable'); - } - }, [data]); + updateSelectedRowKeys(); + }, [data, updateSelectedRowKeys]); + + // 数据库选择变化时更新选中状态 + useEffect(() => { + updateSelectedRowKeys(); + }, [databaseSelections, updateSelectedRowKeys]); + + const handleDatabaseChange = useCallback( + (originId: string, type: 'databaseId' | 'targetDatabaseId', databaseId: number) => { + setDatabaseSelections((prev) => ({ + ...prev, + [originId]: { + databaseId: type === 'databaseId' ? databaseId : prev[originId]?.databaseId ?? null, + targetDatabaseId: + type === 'targetDatabaseId' ? databaseId : prev[originId]?.targetDatabaseId ?? null, + }, + })); + }, + [], + ); + + const { importableColumns, typeNotMatchColumns, alreadyExistColumns } = useColumns( + taskType, + projectId, + handleDatabaseChange, + ); + + const handleShowOnlyImportableChange = useCallback( + (checked: boolean) => { + setShowOnlyImportable(checked); + if (checked) { + updateSelectedRowKeys(); + } + }, + [updateSelectedRowKeys], + ); + + const getFilteredData = useCallback( + (data: IImportScheduleTaskView[]) => { + if (!showOnlyImportable) { + return data; + } + return data.filter(shouldBeSelected); + }, + [showOnlyImportable, shouldBeSelected], + ); const tableRender = () => { - if (tableType === 'importable' && !groupedData['importable']) { - return ( - - ); - } return ( <> -
+
+ {!groupedData['TO_BE_IMPORTED'] ? ( + + ) : ( +
{ + setSelectedRowKeys(selectedRowKeys as string[]); + }, + getCheckboxProps: (record) => ({ + disabled: !hasSelectedAllDatabases(record), + }), + }} + /> + )} + +
+
+ +
+
+ ); }; + const tablePrefixRender = (type: ScheduleNonImportableType | 'TO_BE_IMPORTED') => { + const map = { + TO_BE_IMPORTED: ( + + {formatMessage({ + id: 'src.component.Task.component.ImportModal.C264F2F5', + defaultMessage: + '勾选需要导入的工单,导入后将重新启用。导入前请检查涉及的新旧数据库对象是否一致,否则导入或执行时可能出现失败。', + })} + + handleShowOnlyImportableChange(e.target.checked)} + > + {formatMessage({ + id: 'src.component.Task.component.ImportModal.3137AA28', + defaultMessage: '仅显示已选择数据库的工单', + })} + + + ), + + [ScheduleNonImportableType.IMPORTED]: ( +
+ {formatMessage({ + id: 'src.component.Task.component.ImportModal.F8B503DB', + defaultMessage: '以下工单已导入,无需重复操作。', + })} +
+ ), + + [ScheduleNonImportableType.TYPE_NOT_MATCH]: ( +
+ {formatMessage({ + id: 'src.component.Task.component.ImportModal.49FDDB00', + defaultMessage: '以下工单类型不匹配、无法导入,建议选择对应工单类型重新导入。', + })} +
+ ), + }; + return map[type]; + }; + return ( <> - {groupedData['importable']?.length !== data?.length ? ( - setTableType(e.target.value)} - style={{ marginBottom: 16 }} - > - + setTableType(e.target.value)} + style={{ marginBottom: 16 }} + > + {groupedData['TO_BE_IMPORTED']?.length > 0 && ( + {formatMessage({ - id: 'src.component.Task.component.ImportModal.E8DE787E', - defaultMessage: '可导入', + id: 'src.component.Task.component.ImportModal.F42820DF', + defaultMessage: '待导入', })} - {groupedData['importable']?.length || 0} + {groupedData['TO_BE_IMPORTED']?.length || 0} - {Object.keys(ScheduleNonImportableType)?.map((key) => { + )} + + {Object.keys(ScheduleNonImportableType) + ?.filter((key) => groupedData[key as ScheduleNonImportableType]?.length > 0) + ?.map((key) => { return ( {ScheduleNonImportableTypeMap[key as ScheduleNonImportableType]}{' '} @@ -370,8 +317,8 @@ const ImportPreviewTable: React.FC = ({ data, loading, ); })} - - ) : null} + + {tablePrefixRender(tableType)} {tableRender()} ); diff --git a/src/component/Task/component/ImportModal/index.less b/src/component/Task/component/ImportModal/index.less index 76b87d39a..1f1744501 100644 --- a/src/component/Task/component/ImportModal/index.less +++ b/src/component/Task/component/ImportModal/index.less @@ -9,3 +9,28 @@ } } } + +.checkboxError { + color: var(--text-color-error); + :global(.ant-checkbox-inner) { + border-color: var(--text-color-error); + color: var(--text-color-error); + } +} + +.changeDatabaseInput { + :global(.ant-form-item) { + :global(.ant-select) { + :global(.ant-select-selector) { + background-color: var(--table-edit-color); + } + } + } +} + +.databasePopoverName { + cursor: pointer; + &:hover { + color: var(--text-color-link); + } +} diff --git a/src/component/Task/component/ImportModal/index.tsx b/src/component/Task/component/ImportModal/index.tsx index 55e0c5bdf..a5a4f8e2d 100644 --- a/src/component/Task/component/ImportModal/index.tsx +++ b/src/component/Task/component/ImportModal/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { getSchedulePreviewResult, startSchedulePreviewTask } from '@/common/network/task'; // import user from '@/store/user'; @@ -6,7 +22,19 @@ import { IImportScheduleTaskView, IScheduleTaskImportRequest, } from '@/d.ts/importTask'; -import { Alert, Button, Form, Input, Modal, Select, Space, Spin, Typography } from 'antd'; +import { + Alert, + Button, + Checkbox, + Flex, + Form, + Input, + Modal, + Select, + Space, + Spin, + Typography, +} from 'antd'; import { CheckCircleFilled, CloseCircleFilled, @@ -24,13 +52,13 @@ import { UploadFileStatus } from 'antd/lib/upload/interface'; import { getODCServerHost } from '@/util/request'; import ODCDragger from '@/component/OSSDragger'; import login from '@/store/login'; -import NewDatasourceDrawer from '@/page/Datasource/Datasource/NewDatasourceDrawer'; -import { useProjects } from '../../hooks/useProjects'; import CreateProjectDrawer from '@/page/Project/Project/CreateProject/Drawer'; import NewDatasourceButton from '@/page/Datasource/Datasource/NewDatasourceDrawer/NewButton'; -import { TaskTypeMap } from '../TaskTable'; import { listProjects } from '@/common/network/project'; +import { TaskTypeMap } from '../TaskTable/const'; +import styles from './index.less'; +export const IMPORTABLE_TYPE = 'IMPORTABLE_TYPE'; interface IImportModalProps { open: boolean; onCancel: () => void; @@ -50,6 +78,7 @@ export interface IDatasourceInfo { } const ImportModal: React.FC = ({ open, onCancel, onOk, taskType }) => { const [form] = Form.useForm(); + const [isConfirm, setIsConfirm] = useState(false); const [scheduleTaskImportRequest, setScheduleTaskImportRequest] = useState(); const [previewData, setPreviewData] = useState([]); @@ -61,6 +90,11 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy matchedList: [], createdList: [], }); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [databaseSelections, setDatabaseSelections] = useState< + Record + >({}); + const [notConfirmButSubmit, setNotConfirmButSubmit] = useState(false); const [uploadStatus, setUploadStatus] = useState('default'); const [addProjectDropVisible, setAddProjectDropVisible] = useState(false); const { data: projects, run: loadProjects } = useRequest(listProjects, { @@ -95,9 +129,6 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy setLoading(false); setScheduleTaskImportRequest({ ...params, - importableExportRowId: (previewResult as IImportScheduleTaskView[]) - ?.map((i) => (i.importable ? i?.exportRowId : null)) - ?.filter(Boolean), }); setPreviewData((previewResult as IImportScheduleTaskView[]) || []); setDatasourceInfo( @@ -185,6 +216,9 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy e?.stopPropagation(); setUploadStatus('default'); form.setFieldValue('importFile', []); + setNotConfirmButSubmit(false); + setDatabaseSelections({}); + setSelectedRowKeys([]); }; const uploadInfoMap = useMemo(() => { @@ -258,6 +292,7 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy createdList: [], }); setPreviewData([]); + setIsConfirm(false); }; useEffect(() => { @@ -301,33 +336,76 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy ) : ( - - - - + + + + + + ) } width={step === 'upload' ? 520 : 960} @@ -337,11 +415,30 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy + {formatMessage({ + id: 'src.component.Task.component.ImportModal.A28A2A00', + defaultMessage: + '仅支持导入由 阿里云 OceanBase 数据研发 或 ODC\n 导出的配置文件;在导入之前,请先将添加相关数据源、 井指定对应的项目。', + })} + + {}}> + + + + } />
@@ -425,89 +522,72 @@ const ImportModal: React.FC = ({ open, onCancel, onOk, taskTy })} /> - - - {formatMessage({ - id: 'src.component.Task.component.ImportModal.B3686BE9', - defaultMessage: '请确认相关数据源已加至项目', - })} - - {}}> - - - - } - > - + (option?.label ?? '').toLowerCase().includes(input.toLowerCase()) + } + open={addProjectDropVisible} + onDropdownVisibleChange={setAddProjectDropVisible} + dropdownRender={(menu) => ( + <> + {menu} + { + setAddProjectDropVisible(false)}> + + {formatMessage({ + id: 'src.component.Task.component.ImportModal.68180A60', + defaultMessage: '新建项目', + })} + + } + buttonType="link" + onCreate={() => loadProjects(null, 1, 9999)} + /> + } + + )} + /> + + )} -
+ {step === 'preview' ? ( -
+ ) : null} ); diff --git a/src/component/Task/component/ImportModal/useColumn.tsx b/src/component/Task/component/ImportModal/useColumn.tsx new file mode 100644 index 000000000..4dba8d4bc --- /dev/null +++ b/src/component/Task/component/ImportModal/useColumn.tsx @@ -0,0 +1,311 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; +import { IImportDatabaseView, IImportScheduleTaskView } from '@/d.ts/importTask'; +import { Tooltip, Typography, Flex } from 'antd'; +import type { ColumnsType } from 'antd/es/table'; +import { TaskStatus, TaskType } from '@/d.ts'; +import Icon, { InfoCircleOutlined } from '@ant-design/icons'; +import StatusLabel from '../Status'; +import DatabaseChangeItem from './DatabaseChangeItem'; +import DatabaseInfoPopover from './DatabaseInfoPopover'; +import { ReactComponent as SourceDatabase } from '@/svgr/source_database.svg'; +import { ReactComponent as TargetDatabase } from '@/svgr/target_database.svg'; +import styles from './index.less'; +import { TaskTypeMap } from '../TaskTable/const'; + +export const useColumns = ( + taskType: TaskType, + projectId: number, + handleDatabaseChange: ( + originId: string, + type: 'databaseId' | 'targetDatabaseId', + databaseId: number, + ) => void, +) => { + const baseInfoColumns = [ + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.7C3EB72C', + defaultMessage: '工单', + }), + dataIndex: 'description', + key: 'description', + width: 300, + ellipsis: true, + render: (_, record) => { + return ( + + {_ || '-'} + + #{record?.originId} + · + + {record?.originProjectName} + + + + ); + }, + }, + ]; + + const originDatabaseColumns = [ + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.DCD1BA1A', + defaultMessage: '原数据库', + }), + dataIndex: 'databaseView', + key: 'databaseView', + width: 140, + render: (_: IImportDatabaseView) => { + if (!_) return '-'; + return ( + + + + {_ ? `${_?.databaseName}` : '-'} + + + {formatMessage({ + id: 'src.component.Task.component.ImportModal.A8B5EF34', + defaultMessage: '数据源:', + })} + {_?.name} + + + + ); + }, + }, + ]; + + const originDatabaseWithTargetColumns = [ + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.4C0466BB', + defaultMessage: '原数据库', + }), + dataIndex: 'databaseId', + key: 'databaseId', + width: 150, + render: (databaseId: number, record: IImportScheduleTaskView) => { + return ( + + + + + + {record.databaseView?.databaseName || '-'} + + + + + + + + {record.targetDatabaseView?.databaseName || '-'} + + + + + ); + }, + }, + ]; + + const originStatusColumns = [ + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.55E87B63', + defaultMessage: '原状态', + }), + dataIndex: 'originStatus', + key: 'originStatus', + width: 120, + render: (status, record) => ( + + + {status !== TaskStatus.ENABLED && ( + + + + )} + + ), + }, + ]; + + const originDatabaseTypeColumns = [ + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.37A63CCA', + defaultMessage: '类型', + }), + dataIndex: 'taskType', + key: 'taskType', + width: 120, + render: (status, record) => { + return TaskTypeMap[record.type]; + }, + }, + ]; + + const dlmColumns = [ + ...originDatabaseWithTargetColumns, + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.D22149A7', + defaultMessage: '新源端', + }), + dataIndex: 'databaseView', + key: 'databaseView', + width: 200, + render: (_: IImportDatabaseView, record: IImportScheduleTaskView) => { + if (!_) return '-'; + return ( + + handleDatabaseChange(record.originId, 'databaseId', databaseId) + } + /> + ); + }, + }, + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.6992AD58', + defaultMessage: '新目标端', + }), + dataIndex: 'targetDatabaseView', + key: 'targetDatabaseView', + width: 200, + render: (_: IImportDatabaseView, record: IImportScheduleTaskView) => { + if (!_) return '-'; + return ( + + handleDatabaseChange(record.originId, 'targetDatabaseId', databaseId) + } + /> + ); + }, + }, + ]; + + const otherScheduleColumns = [ + ...originDatabaseColumns, + { + title: formatMessage({ + id: 'src.component.Task.component.ImportModal.01BA659E', + defaultMessage: '新数据库', + }), + dataIndex: 'databaseView', + key: 'databaseView', + width: 200, + render: (_: IImportDatabaseView, record: IImportScheduleTaskView) => { + return ( + + handleDatabaseChange(record.originId, 'databaseId', databaseId) + } + /> + ); + }, + }, + ]; + + const typeNotMatchColumns = [ + ...baseInfoColumns, + ...originDatabaseColumns, + ...originDatabaseTypeColumns, + ]; + + const alreadyExistColumns = [ + ...baseInfoColumns, + ...([TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE]?.includes(taskType) + ? originDatabaseWithTargetColumns + : []), + ...([TaskType.SQL_PLAN, TaskType.PARTITION_PLAN]?.includes(taskType) + ? originDatabaseColumns + : []), + ]; + + const importableColumns: ColumnsType = [ + ...baseInfoColumns, + ...originStatusColumns, + // 数据清理/归档有源端目标端, 分区计划和sql计划只有数据库 + ...([TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE]?.includes(taskType) ? dlmColumns : []), + ...([TaskType.SQL_PLAN, TaskType.PARTITION_PLAN]?.includes(taskType) + ? otherScheduleColumns + : []), + ]?.filter(Boolean); + + return { + importableColumns, + typeNotMatchColumns, + alreadyExistColumns, + }; +}; diff --git a/src/component/Task/component/ImportModal/useImport.tsx b/src/component/Task/component/ImportModal/useImport.tsx index 8e8da0a66..8fd828149 100644 --- a/src/component/Task/component/ImportModal/useImport.tsx +++ b/src/component/Task/component/ImportModal/useImport.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { getScheduleImportLog, @@ -16,6 +32,7 @@ import { useDebounceFn } from 'ahooks'; import React, { useState } from 'react'; import { AsyncTaskType } from '@/d.ts/migrateTask'; import { history } from '@umijs/max'; +import login from '@/store/login'; const downloadLogFromString = (str: string) => { const blob = new Blob([str], { type: 'text/plain' }); @@ -62,20 +79,44 @@ export const useImport = ( downloadLogFromString(res); }; if (result?.every((i) => i.success)) { + const importedCount = result?.filter((i) => i?.remark === 'Have been imported.')?.length; + const importedDescription = importedCount + ? formatMessage( + { + id: 'src.component.Task.component.ImportModal.A6892359', + defaultMessage: '(包含 {importedCount} 个已导入的任务)', + }, + { importedCount }, + ) + : ''; + const privateSpaceDescription = formatMessage( + { + id: 'src.component.Task.component.ImportModal.AF106FF6', + defaultMessage: '{resultLength} 个作业导入成功{importedDescription}。', + }, + { resultLength: result?.length, importedDescription }, + ); notification.success({ message: formatMessage({ id: 'src.component.Task.component.ImportModal.997B6AC7', defaultMessage: '导入定时任务已完成', }), - description: ( + description: login.isPrivateSpace() ? ( + privateSpaceDescription + ) : ( {formatMessage( { - id: 'src.component.Task.component.ImportModal.E256F212', - defaultMessage: '{resultLength} 个作业导入成功。 建议手动为任务', + id: 'src.component.Task.component.ImportModal.97A1A7A3', + defaultMessage: '{resultLength} 个作业导入成功{importedDescription}。', }, - { resultLength: result?.length }, + { resultLength: result?.length, importedDescription }, )} + {formatMessage({ + id: 'src.component.Task.component.ImportModal.1B653B27', + defaultMessage: '建议手动为任务', + })} + goNotification(projectId)}> {formatMessage({ id: 'src.component.Task.component.ImportModal.8AD83BC8', @@ -94,19 +135,59 @@ export const useImport = ( } else { const successCount = result?.filter((i) => i?.success)?.length; const failedCount = result?.filter((i) => !i?.success)?.length; + const importedCount = result?.filter( + (i) => i?.success && i?.remark === 'Have been imported.', + )?.length; + const importedDescription = importedCount + ? formatMessage( + { + id: 'src.component.Task.component.ImportModal.92D087FB', + defaultMessage: '(包含 {importedCount} 个已导入的任务)', + }, + { importedCount }, + ) + : ''; + const privateSpaceDescription = ( + + {formatMessage( + { + id: 'src.component.Task.component.ImportModal.94BFD01C', + defaultMessage: + '{successCount} 个作业导入成功{importedDescription}, {failedCount} 个作业导入失败。可', + }, + { successCount, importedDescription, failedCount }, + )} + + {formatMessage({ + id: 'src.component.Task.component.ImportModal.A23B9738', + defaultMessage: '下载日志', + })} + + {formatMessage({ + id: 'src.component.Task.component.ImportModal.997B48CD', + defaultMessage: '查看。', + })} + + ); + notification.warning({ message: formatMessage({ - id: 'src.component.Task.component.ImportModal.E12ACFFB', - defaultMessage: '导出定时任务已完成', + id: 'src.component.Task.component.ImportModal.997B6AC7', + defaultMessage: '导入定时任务已完成', }), - description: ( + description: login.isPrivateSpace() ? ( + privateSpaceDescription + ) : ( {formatMessage( { - id: 'src.component.Task.component.ImportModal.47DA5967', - defaultMessage: '{successCount} 个作业导入成功,', + id: 'src.component.Task.component.ImportModal.AE88E265', + defaultMessage: '{successCount} 个作业导入成功{importedDescription}, ', }, - { successCount }, + { successCount, importedDescription }, )} {formatMessage( { @@ -128,7 +209,6 @@ export const useImport = ( id: 'src.component.Task.component.ImportModal.60663407', defaultMessage: ',保证任务异常能够被及时发现。如需了解导出详情,可', })} - { + return ( + + + + + + ); +}; + +export default CustomNamingRules; diff --git a/src/component/Task/component/PartitionPolicyFormTable/components/DropPartitionFormItems.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/DropPartitionFormItems.tsx new file mode 100644 index 000000000..86437e364 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/components/DropPartitionFormItems.tsx @@ -0,0 +1,96 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 FormItemPanel from '@/component/FormItemPanel'; +import HelpDoc from '@/component/helpDoc'; +import { formatMessage } from '@/util/intl'; +import { Form, InputNumber, Radio, Space } from 'antd'; +import { rules } from '../const'; + +const DropPatitionFormItems = () => { + return ( + + + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.7D6F23AE' /*分区保留数量*/, + defaultMessage: '分区保留数量', + }) /* 分区保留数量 */ + } + + } + rules={rules.keepLatestCount} + > + + + + + + + + ); +}; + +export default DropPatitionFormItems; diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less b/src/component/Task/component/PartitionPolicyFormTable/components/EditTable/index.less similarity index 100% rename from src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less rename to src/component/Task/component/PartitionPolicyFormTable/components/EditTable/index.less diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/EditTable/index.tsx similarity index 99% rename from src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx rename to src/component/Task/component/PartitionPolicyFormTable/components/EditTable/index.tsx index 54d10ca1c..e60ff0a4d 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/components/EditTable/index.tsx @@ -19,7 +19,7 @@ import { formatMessage } from '@/util/intl'; import type { FormInstance } from 'antd'; import { Form, Select, Typography } from 'antd'; import VirtualList from 'rc-virtual-list'; -import React, { useState } from 'react'; +import React from 'react'; import RuleFormItem from '../RuleFormItem'; import styles from './index.less'; diff --git a/src/component/Task/component/PartitionPolicyFormTable/components/IntervalGenerateExprFormItem.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/IntervalGenerateExprFormItem.tsx new file mode 100644 index 000000000..a454f8f06 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/components/IntervalGenerateExprFormItem.tsx @@ -0,0 +1,49 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; +import { Form, Input } from 'antd'; + +const IntervalGenerateExprFormItem = () => { + return ( + + + + ); +}; + +export default IntervalGenerateExprFormItem; diff --git a/src/component/Task/component/PartitionPolicyFormTable/components/PreSuffixNamingRules.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/PreSuffixNamingRules.tsx new file mode 100644 index 000000000..d5c0ba60f --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/components/PreSuffixNamingRules.tsx @@ -0,0 +1,148 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; +import { AutoComplete, Form, Input, Select, Space, Tag } from 'antd'; +import { rules, suffixOptions } from '../const'; +import styles from '../index.less'; +import HelpDoc from '@/component/helpDoc'; +import { PartitionBound } from '@/constant'; + +const PreSuffixNamingRules = ({ partitionKeyOptions }) => { + return ( + + + + + + + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.0F79EE9C' /*后缀*/, + defaultMessage: '后缀', + }) /* 后缀 */ + } + + + + + + + + ); +}; + +export default PreSuffixNamingRules; diff --git a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less b/src/component/Task/component/PartitionPolicyFormTable/components/PreviewSQLModal/index.less similarity index 100% rename from src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less rename to src/component/Task/component/PartitionPolicyFormTable/components/PreviewSQLModal/index.less diff --git a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/PreviewSQLModal/index.tsx similarity index 100% rename from src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx rename to src/component/Task/component/PartitionPolicyFormTable/components/PreviewSQLModal/index.tsx diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less b/src/component/Task/component/PartitionPolicyFormTable/components/RuleFormItem/index.less similarity index 100% rename from src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less rename to src/component/Task/component/PartitionPolicyFormTable/components/RuleFormItem/index.less diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/components/RuleFormItem/index.tsx similarity index 63% rename from src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx rename to src/component/Task/component/PartitionPolicyFormTable/components/RuleFormItem/index.tsx index bc51503fb..43742872a 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/components/RuleFormItem/index.tsx @@ -31,121 +31,26 @@ import { Typography, } from 'antd'; import React, { useState } from 'react'; -import { intervalPrecisionOptions } from '../configModal'; -import { NameRuleType } from '../configModal'; -import { START_DATE, INCREAMENT_FIELD_TYPE, increamentFieldTypeLabelMap } from '../const'; -import styles from '../index.less'; -import { getLocale } from '@umijs/max'; +import { + START_DATE, + INCREAMENT_FIELD_TYPE, + intervalPrecisionOptions, + NameRuleType, + startDateOptionValues, + incrementFieldTypeOptionsValues, + incrementByDateOptionsInNumber, + ruleFormRules, +} from '../../const'; +import styles from '../../index.less'; +import { + getDefaultPrecisionByIncrementDateTypeInDate, + getIncrementByDateOptionsInChar, + getIntervalPrecisionOptionsByIncrementDateType, + getPartitionKeyConfigsFormItemName, +} from '../../utils'; const { Text } = Typography; -const startDateOptionValues = [ - { - label: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.88D572DE', - defaultMessage: '当前时间', - }), //'当前时间' - value: START_DATE.CURRENT_DATE, - description: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.684CAF92', - defaultMessage: '从实际执行的时间开始创建', - }), //'从实际执行的时间开始创建' - }, - { - label: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9CDC5E14', - defaultMessage: '指定时间', - }), //'指定时间' - value: START_DATE.CUSTOM_DATE, - description: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.0E0ADD3E', - defaultMessage: '从指定的某个时间开始创建', - }), //'从指定的某个时间开始创建' - }, -]; - -const incrementFieldTypeOptionsValues = [ - { - label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.NUMBER], - value: INCREAMENT_FIELD_TYPE.NUMBER, - description: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.33B07A9E', - defaultMessage: '仅代表数值数据,如:001、002', - }), - }, - { - label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.TIME_STRING], - value: INCREAMENT_FIELD_TYPE.TIME_STRING, - description: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.38D2B418', - defaultMessage: '类型为数值但实际含义为日期时间,如: 20250207', - }), - }, - { - label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.TIMESTAMP], - value: INCREAMENT_FIELD_TYPE.TIMESTAMP, - description: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.EBF8762C', - defaultMessage: '类型为数值但实际含义为时间戳,如: 1609459200', - }), - }, -]; - -const incrementByDateOptionsInNumber = ['yyyy', 'yyyyMM', 'yyyyMMdd', 'yyyyMMddHHmmss'].map( - (item) => ({ - label: item, - value: item, - }), -); - -const getIncrementByDateOptionsInChar = () => { - const locale = getLocale(); - const options = [ - 'yyyy', - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.E205FB6F', - defaultMessage: 'yyyy年', - }), - - 'yyyyMM', - 'yyyy-MM', - 'yyyy/MM', - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.216E3527', - defaultMessage: 'yyyy年MM月', - }), - - 'yyyyMMdd', - 'yyyy-MM-dd', - 'yyyy/MM/dd', - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.EF0BF81D', - defaultMessage: 'yyyy年MM月dd日', - }), - 'yyyyMMdd HH:mm:ss', - 'yyyy-MM-dd HH:mm:ss', - 'yyyy/MM/dd HH:mm:ss', - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.13B22678', - defaultMessage: 'yyyy年MM月dd日 HH:mm:ss', - }), - ]; - - if (locale !== 'zh-CN') { - return options - .filter((item) => !/[\u4e00-\u9fa5]/.test(item)) - .map((item) => ({ - label: item, - value: item, - })); - } - - return options.map((item) => ({ - label: item, - value: item, - })); -}; - const getOptionsByValueList = (valueList) => { return valueList.map(({ label, value, description }) => { return { @@ -178,7 +83,7 @@ const getFieldProps: ( ? { status: 'error', [position]: ( - + ), @@ -193,123 +98,29 @@ interface TableFormProps { dataTypeName: string; } -const PRECISION_MAP = { - second: 63, - minute: 31, - hour: 15, - day: 7, - month: 3, - year: 1, -}; - -const getIntervalPrecisionOptionsByIncrementDateType = ( - incrementFieldTypeInDate: string, - incrementFieldType: INCREAMENT_FIELD_TYPE, -) => { - if (incrementFieldType !== INCREAMENT_FIELD_TYPE.TIME_STRING || !incrementFieldTypeInDate) { - return intervalPrecisionOptions; - } - - if (incrementFieldTypeInDate?.includes?.('s')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.second); - } - if (incrementFieldTypeInDate?.includes?.('m')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.minute); - } - if (incrementFieldTypeInDate?.includes?.('H')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.hour); - } - if (incrementFieldTypeInDate?.includes?.('d')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.day); - } - if (incrementFieldTypeInDate?.includes?.('M')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.month); - } - if (incrementFieldTypeInDate?.includes?.('y')) { - return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.year); - } - - return intervalPrecisionOptions; -}; - -const getDefaultPrecisionByIncrementDateTypeInDate = ( - incrementFieldTypeInDate: string, - incrementFieldType: INCREAMENT_FIELD_TYPE, -) => { - if (incrementFieldType !== INCREAMENT_FIELD_TYPE.TIME_STRING || !incrementFieldTypeInDate) { - return 3; - } - - if (incrementFieldTypeInDate?.includes?.('s')) { - return PRECISION_MAP.second; - } - if (incrementFieldTypeInDate?.includes?.('m')) { - return PRECISION_MAP.minute; - } - if (incrementFieldTypeInDate?.includes?.('H')) { - return PRECISION_MAP.hour; - } - if (incrementFieldTypeInDate?.includes?.('d')) { - return PRECISION_MAP.day; - } - if (incrementFieldTypeInDate?.includes?.('M')) { - return PRECISION_MAP.month; - } - if (incrementFieldTypeInDate?.includes?.('y')) { - return PRECISION_MAP.year; - } - - return 3; -}; - const RuleFormItem: React.FC = (props) => { const { field, precision, isDate, dataTypeName } = props; const [intervalErrorInBlur, setIntervalErrorInBlur] = useState(); return ( {({ getFieldValue, getFieldError, setFieldValue }) => { - const partitionKeyInvoker = getFieldValue([ - 'option', - 'partitionKeyConfigs', - field.name, - 'partitionKeyInvoker', - ]); - const fromCurrentTime = getFieldValue([ - 'option', - 'partitionKeyConfigs', - field.name, - 'fromCurrentTime', - ]); - const incrementFieldType = getFieldValue([ - 'option', - 'partitionKeyConfigs', - field.name, - 'incrementFieldType', - ]); - const incrementFieldTypeInDate = getFieldValue([ - 'option', - 'partitionKeyConfigs', - field.name, - 'incrementFieldTypeInDate', - ]); - const generateExprError = getFieldError([ - 'option', - 'partitionKeyConfigs', - field.name, - 'generateExpr', - ]); - const intervalGenerateExprError = getFieldError([ - 'option', - 'partitionKeyConfigs', - field.name, - 'intervalGenerateExpr', - ]); - const intervalError = getFieldError([ - 'option', - 'partitionKeyConfigs', - field.name, - 'interval', - ]); + const getFieldBySecondName = (key: string) => { + return getFieldValue(getPartitionKeyConfigsFormItemName({ name: field.name, key })); + }; + + const partitionKeyInvoker = getFieldBySecondName('partitionKeyInvoker'); + const fromCurrentTime = getFieldBySecondName('fromCurrentTime'); + const incrementFieldType = getFieldBySecondName('incrementFieldType'); + const incrementFieldTypeInDate = getFieldBySecondName('incrementFieldTypeInDate'); + const generateExprError = getFieldError( + getPartitionKeyConfigsFormItemName({ name: field.name, key: 'generateExpr' }), + ); + const intervalGenerateExprError = getFieldError( + getPartitionKeyConfigsFormItemName({ name: field.name, key: 'intervalGenerateExpr' }), + ); + const intervalError = getFieldError( + getPartitionKeyConfigsFormItemName({ name: field.name, key: 'interval' }), + ); const validateInput = (error) => { setIntervalErrorInBlur(error); @@ -347,15 +158,7 @@ const RuleFormItem: React.FC = (props) => { name={[field.name, 'intervalGenerateExpr']} className={styles.noMarginBottom} style={{ flexGrow: 2 }} - rules={[ - { - required: true, - message: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.8368A05F', - defaultMessage: '请输入', - }), //'请输入' - }, - ]} + rules={ruleFormRules.intervalGenerateExpr} > = (props) => { {...field} name={[field.name, 'interval']} className={styles.noMarginBottom} - rules={[ - { - required: true, - message: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.2F986FD8', - defaultMessage: '请输入', - }), //'请输入' - }, - ]} + rules={ruleFormRules.interval} help={EmptyHelp} > = (props) => { = (props) => { name={[field.name, 'intervalGenerateExpr']} className={styles.noMarginBottom} style={{ flexGrow: 2 }} - rules={[ - { - required: true, - message: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.8368A05F', - defaultMessage: '请输入', - }), //'请输入' - }, - ]} + rules={ruleFormRules.intervalGenerateExpr} help={EmptyHelp} > = (props) => { {...field} name={[field.name, 'interval']} className={styles.noMarginBottom} - rules={[ - { - required: true, - message: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.2F986FD8', - defaultMessage: '请输入', - }), //'请输入' - }, - ]} + rules={ruleFormRules.interval} help={EmptyHelp} > = (props) => { = (props) => { > {isCustomRuleType ? ( - - - - - + ) : ( - - - - - - - - { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.0F79EE9C' /*后缀*/, - defaultMessage: '后缀', - }) /* 后缀 */ - } - - - - - - {formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.602BD66C', - defaultMessage: '分区上界', - })} - - - {formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.2384A1C3', - defaultMessage: '分区下界', - })} - - - - - + )} @@ -1032,121 +689,11 @@ const ConfigDrawer: React.FC = (props) => { )} - {isCustomRuleType && ( - - - - )} + {isCustomRuleType && } )} - {isDropConfigVisible && ( - - - - { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.7D6F23AE' /*分区保留数量*/, - defaultMessage: '分区保留数量', - }) /* 分区保留数量 */ - } - - } - rules={[ - { - required: true, - message: formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.967356C8', - defaultMessage: '请输入', - }), //'请输入' - }, - ]} - > - - - - - - { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.77C8BE4D' /*是*/, - defaultMessage: '是', - }) /* 是 */ - } - - - { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.E374E7C8' /*否*/, - defaultMessage: '否', - }) /* 否 */ - } - - - - - - )} + {isDropConfigVisible && } ({ + label: TaskPartitionStrategyMap[key], + value: key, +})); + export const getPartitionKeyInvokerByIncrementFieldType = ( partitionKeyInvoker: PARTITION_KEY_INVOKER, incrementFieldType: INCREAMENT_FIELD_TYPE, @@ -72,3 +82,314 @@ export const revertPartitionKeyInvokerByIncrementFieldType = ( } return PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR; }; + +export const intervalPrecisionOptions = [ + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.436BC171', + defaultMessage: '秒', + }), //'秒' + value: 63, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.0E0CEBAC', + defaultMessage: '分', + }), //'分' + value: 31, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.9EC2D1FF', + defaultMessage: '时', + }), //'时' + value: 15, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.1E11DFEA', + defaultMessage: '日', + }), //'日' + value: 7, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.1FB1ABDC', + defaultMessage: '月', + }), //'月' + value: 3, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.069255DB', + defaultMessage: '年', + }), //'年' + value: 1, + }, +]; + +export const suffixOptions = [ + { + label: 'yyyy', + value: 'yyyy', + }, + + { + label: 'yyyyMMdd', + value: 'yyyyMMdd', + }, + + { + label: 'yyyyMM', + value: 'yyyyMM', + }, + + { + label: 'yyyy_MM_dd', + value: 'yyyy_MM_dd', + }, + + { + label: 'yyyy_MM', + value: 'yyyy_MM', + }, + { + label: 'yyyy/MM', + value: 'yyyy/MM', + }, + { + label: 'yyyy/MM/dd', + value: 'yyyy/MM/dd', + }, + { + label: 'yyyyMMddHHmmss', + value: 'yyyyMMddHHmmss', + }, + { + label: 'yyyy/MM/dd HH:mm:ss', + value: 'yyyy/MM/dd HH:mm:ss', + }, + { + label: 'yyyy_MM_dd HH:mm:ss', + value: 'yyyy_MM_dd HH:mm:ss', + }, +]; + +export const rules = { + generateCount: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.16355175', + defaultMessage: '请输入预创建分区数量', + }), //'请输入预创建分区数量' + }, + ], + nameRuleType: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.87D4D0BB', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + generateExpr: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.E5DA1FA4', + defaultMessage: '请输入表达式', + }), //'请输入表达式' + }, + ], + namingPrefix: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.4293BED4', + defaultMessage: '请输入前缀', + }), //'请输入前缀' + }, + { + pattern: /^[a-zA-Z][a-zA-Z0-9_]*$/, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.F70A7891', + defaultMessage: '仅支持英文/数字/下划线,且以英文开头', + }), //'仅支持英文/数字/下划线,且以英文开头' + }, + { + max: 32, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.D76C944C', + defaultMessage: '不超过32个字符', + }), //'不超过32个字符' + }, + ], + refPartitionKey: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.CC74D506', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + namingSuffixExpression: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.7183DAA0', + defaultMessage: '请选择后缀', + }), //'请选择后缀' + }, + ], + namingSuffixStrategy: [ + { + required: true, + }, + ], + keepLatestCount: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.967356C8', + defaultMessage: '请输入', + }), //'请输入' + }, + ], + reloadIndexes: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.393D1F82', + defaultMessage: '请选择', + }), //'请选择' + }, + ], +}; + +export const ruleFormRules = { + intervalPrecision: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.7FB4A416', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + intervalGenerateExpr: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.8368A05F', + defaultMessage: '请输入', + }), //'请输入' + }, + ], + interval: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.2F986FD8', + defaultMessage: '请输入', + }), //'请输入' + }, + ], + incrementFieldType: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.88F8B3BE', + defaultMessage: '请选择', + }), + }, + ], + incrementFieldTypeInDate: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.3174105E', + defaultMessage: '请输入格式', + }), + }, + ], + generateExpr: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.DE258551', + defaultMessage: '请输入', + }), //'请输入' + }, + ], +}; + +export const startDateOptionValues = [ + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.88D572DE', + defaultMessage: '当前时间', + }), //'当前时间' + value: START_DATE.CURRENT_DATE, + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.684CAF92', + defaultMessage: '从实际执行的时间开始创建', + }), //'从实际执行的时间开始创建' + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9CDC5E14', + defaultMessage: '指定时间', + }), //'指定时间' + value: START_DATE.CUSTOM_DATE, + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.0E0ADD3E', + defaultMessage: '从指定的某个时间开始创建', + }), //'从指定的某个时间开始创建' + }, +]; + +export const incrementFieldTypeOptionsValues = [ + { + label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.NUMBER], + value: INCREAMENT_FIELD_TYPE.NUMBER, + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.33B07A9E', + defaultMessage: '仅代表数值数据,如:001、002', + }), + }, + { + label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.TIME_STRING], + value: INCREAMENT_FIELD_TYPE.TIME_STRING, + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.38D2B418', + defaultMessage: '类型为数值但实际含义为日期时间,如: 20250207', + }), + }, + { + label: increamentFieldTypeLabelMap[INCREAMENT_FIELD_TYPE.TIMESTAMP], + value: INCREAMENT_FIELD_TYPE.TIMESTAMP, + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.EBF8762C', + defaultMessage: '类型为数值但实际含义为时间戳,如: 1609459200', + }), + }, +]; + +export const incrementByDateOptionsInNumber = ['yyyy', 'yyyyMM', 'yyyyMMdd', 'yyyyMMddHHmmss'].map( + (item) => ({ + label: item, + value: item, + }), +); + +export const PRECISION_MAP = { + second: 63, + minute: 31, + hour: 15, + day: 7, + month: 3, + year: 1, +}; diff --git a/src/component/Task/component/PartitionPolicyFormTable/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/index.tsx index 20c03b4bd..6a3c348d5 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/index.tsx @@ -18,7 +18,7 @@ import { getPartitionPlanKeyDataTypes } from '@/common/network/task'; import CommonTable from '@/component/CommonTable'; import { CommonTableMode, ITableLoadOptions } from '@/component/CommonTable/interface'; import SearchFilter from '@/component/SearchFilter'; -import { PARTITION_KEY_INVOKER, TaskPartitionStrategy } from '@/d.ts'; +import { PARTITION_KEY_INVOKER } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { EditOutlined, @@ -28,10 +28,10 @@ import { } from '@ant-design/icons'; import { Checkbox, Space, Tooltip } from 'antd'; import React, { useRef, useState } from 'react'; -import { ITableConfig } from '../../PartitionTask/CreateModal'; +import { ITableConfig } from '@/component/Task/modals/PartitionTask/CreateModal'; import { getStrategyLabel } from '../PartitionPolicyTable'; -import ConfigDrawer, { NameRuleType } from './configModal'; -import { revertPartitionKeyInvokerByIncrementFieldType, START_DATE } from './const'; +import ConfigDrawer from './configModal'; +import { NameRuleType, revertPartitionKeyInvokerByIncrementFieldType, START_DATE } from './const'; import styles from './index.less'; const defaultIntervalPrecision = 3; diff --git a/src/component/Task/component/PartitionPolicyFormTable/utils.ts b/src/component/Task/component/PartitionPolicyFormTable/utils.ts new file mode 100644 index 000000000..fe1836ad8 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/utils.ts @@ -0,0 +1,191 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TaskPartitionStrategy } from '@/d.ts'; +import { formatMessage } from '@/util/intl'; +import { + INCREAMENT_FIELD_TYPE, + intervalPrecisionOptions, + NameRuleType, + PRECISION_MAP, +} from './const'; +import { getLocale } from '@umijs/max'; + +const DropConfigMessage = formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.A9C95E9D', + defaultMessage: + '当前表如果包含全局索引,删除分区会导致全局索引失效,如果选择重建全局索引可能耗时很久,请谨慎操作', +}); /*"当前表如果包含全局索引,删除分区会导致全局索引失效,请谨慎操作,如果选择重建全局索引可能耗时很久,请谨慎操作"*/ + +const CreateConfigMessage = formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.8DC77765', + defaultMessage: + '当前表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略', +}); /*"当前表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略"*/ + +export const getAlertMessage = (strategies: TaskPartitionStrategy[]) => { + const messages = []; + if (strategies?.includes(TaskPartitionStrategy.DROP)) { + messages.push(DropConfigMessage); + } + if (strategies?.includes(TaskPartitionStrategy.CREATE)) { + messages.push(CreateConfigMessage); + } + return messages; +}; + +export const getUnitLabel = (value: number) => { + return intervalPrecisionOptions.find((item) => item.value === value)?.label; +}; + +const nameRuleOptions = [ + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EB655A6C', + defaultMessage: '前缀 + 后缀', + }), //'前缀 + 后缀' + value: NameRuleType.PRE_SUFFIX, + }, + { + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.AB4964B2', + defaultMessage: '自定义', + }), //'自定义' + value: NameRuleType.CUSTOM, + }, +]; + +export const filteredNameRuleOptions = ( + dateTypes: boolean, + incrementFieldType: INCREAMENT_FIELD_TYPE, +) => { + if (dateTypes || incrementFieldType === INCREAMENT_FIELD_TYPE.TIME_STRING) { + return nameRuleOptions; + } + return nameRuleOptions.filter((item) => item.value === NameRuleType.CUSTOM); +}; + +export const getIncrementByDateOptionsInChar = () => { + const locale = getLocale(); + const options = [ + 'yyyy', + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.E205FB6F', + defaultMessage: 'yyyy年', + }), + + 'yyyyMM', + 'yyyy-MM', + 'yyyy/MM', + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.216E3527', + defaultMessage: 'yyyy年MM月', + }), + + 'yyyyMMdd', + 'yyyy-MM-dd', + 'yyyy/MM/dd', + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.EF0BF81D', + defaultMessage: 'yyyy年MM月dd日', + }), + 'yyyyMMdd HH:mm:ss', + 'yyyy-MM-dd HH:mm:ss', + 'yyyy/MM/dd HH:mm:ss', + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.13B22678', + defaultMessage: 'yyyy年MM月dd日 HH:mm:ss', + }), + ]; + + if (locale !== 'zh-CN') { + return options + .filter((item) => !/[\u4e00-\u9fa5]/.test(item)) + .map((item) => ({ + label: item, + value: item, + })); + } + + return options.map((item) => ({ + label: item, + value: item, + })); +}; + +export const getIntervalPrecisionOptionsByIncrementDateType = ( + incrementFieldTypeInDate: string, + incrementFieldType: INCREAMENT_FIELD_TYPE, +) => { + if (incrementFieldType !== INCREAMENT_FIELD_TYPE.TIME_STRING || !incrementFieldTypeInDate) { + return intervalPrecisionOptions; + } + + if (incrementFieldTypeInDate?.includes?.('s')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.second); + } + if (incrementFieldTypeInDate?.includes?.('m')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.minute); + } + if (incrementFieldTypeInDate?.includes?.('H')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.hour); + } + if (incrementFieldTypeInDate?.includes?.('d')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.day); + } + if (incrementFieldTypeInDate?.includes?.('M')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.month); + } + if (incrementFieldTypeInDate?.includes?.('y')) { + return intervalPrecisionOptions?.filter((item) => item.value <= PRECISION_MAP.year); + } + + return intervalPrecisionOptions; +}; + +export const getDefaultPrecisionByIncrementDateTypeInDate = ( + incrementFieldTypeInDate: string, + incrementFieldType: INCREAMENT_FIELD_TYPE, +) => { + if (incrementFieldType !== INCREAMENT_FIELD_TYPE.TIME_STRING || !incrementFieldTypeInDate) { + return 3; + } + + if (incrementFieldTypeInDate?.includes?.('s')) { + return PRECISION_MAP.second; + } + if (incrementFieldTypeInDate?.includes?.('m')) { + return PRECISION_MAP.minute; + } + if (incrementFieldTypeInDate?.includes?.('H')) { + return PRECISION_MAP.hour; + } + if (incrementFieldTypeInDate?.includes?.('d')) { + return PRECISION_MAP.day; + } + if (incrementFieldTypeInDate?.includes?.('M')) { + return PRECISION_MAP.month; + } + if (incrementFieldTypeInDate?.includes?.('y')) { + return PRECISION_MAP.year; + } + + return 3; +}; + +export const getPartitionKeyConfigsFormItemName = ({ name, key }) => { + return ['option', 'partitionKeyConfigs', name, key]; +}; diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx index cd7d743e4..1604d5f03 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx @@ -20,7 +20,7 @@ import type { IPartitionTableConfig } from '@/d.ts'; import { PARTITION_KEY_INVOKER, TaskPartitionStrategy } from '@/d.ts'; import { Button, Descriptions, Drawer, Space } from 'antd'; import React from 'react'; -import { SimpleTextItem } from '../../component/SimpleTextItem'; +import { SimpleTextItem } from '@/component/Task/component/SimpleTextItem'; import ConfigTable from './ConfigTable'; import { getStrategyLabelByConfig } from './index'; import styles from './index.less'; diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx index ad3700537..95ef74fc9 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx @@ -15,7 +15,6 @@ import { formatMessage } from '@/util/intl'; * limitations under the License. */ import DisplayTable from '@/component/DisplayTable'; -import { intervalPrecisionOptions } from '@/component/Task/component/PartitionPolicyFormTable/configModal'; import { IPartitionKeyConfig, PARTITION_KEY_INVOKER } from '@/d.ts'; import { getFormatDateTime } from '@/util/utils'; import { Descriptions, Tooltip } from 'antd'; @@ -24,6 +23,7 @@ import styles from './index.less'; import { INCREAMENT_FIELD_TYPE, increamentFieldTypeLabelMap, + intervalPrecisionOptions, } from '../PartitionPolicyFormTable/const'; const getFromCurrentTimeLabel = (fromCurrentTime: boolean, baseTimestampMillis: number) => { diff --git a/src/component/Task/component/PartitionPolicyTable/index.tsx b/src/component/Task/component/PartitionPolicyTable/index.tsx index 3f0825bfc..0a3bca2c5 100644 --- a/src/component/Task/component/PartitionPolicyTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyTable/index.tsx @@ -24,7 +24,7 @@ import { formatMessage } from '@/util/intl'; import { CheckCircleFilled, SearchOutlined, StopFilled } from '@ant-design/icons'; import { Space } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; -import { TaskPartitionStrategyMap } from '../../const'; +import { TaskPartitionStrategyMap } from '@/component/Task/const'; import ConfigDrawer from './ConfigDrawer'; import styles from './index.less'; diff --git a/src/component/Task/component/PartitionTextArea/index.tsx b/src/component/Task/component/PartitionTextArea/index.tsx index d231d1bbd..a411d0e95 100644 --- a/src/component/Task/component/PartitionTextArea/index.tsx +++ b/src/component/Task/component/PartitionTextArea/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Button, Form, Select, Space, Input } from 'antd'; import styles from './index.less'; diff --git a/src/component/Task/component/ShardingStrategyItem/index.tsx b/src/component/Task/component/ShardingStrategyItem/index.tsx index 5f766e51c..89b8779e1 100644 --- a/src/component/Task/component/ShardingStrategyItem/index.tsx +++ b/src/component/Task/component/ShardingStrategyItem/index.tsx @@ -1,30 +1,44 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; -import { Form, Radio } from 'antd'; +import { Checkbox, CheckboxChangeEvent, Form, FormInstance, Radio, Space } from 'antd'; import { ShardingStrategy } from '@/d.ts'; +import { useState, useEffect, useMemo } from 'react'; + +interface IProps { + form: FormInstance; +} -export const shardingStrategyOptions = [ - { - label: formatMessage({ - id: 'src.component.Task.component.ShardingStrategyItem.E5A6B481', - defaultMessage: '全表扫描', - }), - value: ShardingStrategy.FIXED_LENGTH, - }, - { - label: formatMessage({ - id: 'src.component.Task.component.ShardingStrategyItem.F91EEC6C', - defaultMessage: '条件匹配', - }), - value: ShardingStrategy.MATCH, - }, -]; +const ShardingStrategyItem: React.FC = ({ form }) => { + const [fullTableSearch, setFullTableSearch] = useState( + form.getFieldValue('shardingStrategy') === ShardingStrategy.FIXED_LENGTH, + ); + const handleChange = (e: CheckboxChangeEvent) => { + form.setFieldsValue({ + shardingStrategy: e.target.checked ? ShardingStrategy.FIXED_LENGTH : ShardingStrategy.MATCH, + }); + setFullTableSearch(e.target.checked); + }; -const ShardingStrategyItem = () => { return ( { }, ]} > - + + {formatMessage({ + id: 'src.component.Task.component.ShardingStrategyItem.61BD0252', + defaultMessage: '通过全表扫描进行数据搜索', + })} + ); }; diff --git a/src/component/Task/component/Status/index.tsx b/src/component/Task/component/Status/index.tsx index d6cb25c0a..3649dcb27 100644 --- a/src/component/Task/component/Status/index.tsx +++ b/src/component/Task/component/Status/index.tsx @@ -35,7 +35,7 @@ import { import { Space, Tooltip } from 'antd'; import { isNil } from 'lodash'; import React from 'react'; -import { isCycleTask } from '../../helper'; +import { isCycleTask } from '@/component/Task/helper'; export const nodeStatus = { [TaskFlowNodeType.APPROVAL_TASK]: { [TaskNodeStatus.PENDING]: { @@ -135,6 +135,13 @@ export const nodeStatus = { //已终止 status: 'error', }, + [TaskNodeStatus.EXECUTING_ABNORMAL]: { + text: formatMessage({ + id: 'src.component.Task.component.Status.F318D350', + defaultMessage: '执行异常', + }), + status: 'error', + }, [TaskNodeStatus.FAILED]: { text: formatMessage({ id: 'odc.component.TaskStatus.Failed.2', diff --git a/src/component/Task/component/SynchronizationItem/index.tsx b/src/component/Task/component/SynchronizationItem/index.tsx index a8ec25ce8..88779a18e 100644 --- a/src/component/Task/component/SynchronizationItem/index.tsx +++ b/src/component/Task/component/SynchronizationItem/index.tsx @@ -1,8 +1,24 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Form, Space, Checkbox, FormInstance, Tooltip } from 'antd'; import React, { useEffect, useState } from 'react'; import { SyncTableStructureEnum } from '@/d.ts'; -import { SyncTableStructureOptions } from '../../const'; +import { SyncTableStructureOptions } from '@/component/Task/const'; import { IDatabase } from '@/d.ts/database'; import { isConnectTypeBeFileSystemGroup } from '@/util/connection'; diff --git a/src/component/Task/component/TableSelecter/index.tsx b/src/component/Task/component/TableSelecter/index.tsx index 9acf7a191..16298582d 100644 --- a/src/component/Task/component/TableSelecter/index.tsx +++ b/src/component/Task/component/TableSelecter/index.tsx @@ -21,7 +21,7 @@ import ExportCard from '@/component/ExportCard'; import { EnvColorMap } from '@/constant'; import { ReactComponent as TableSvg } from '@/svgr/menuTable.svg'; import Icon, { DeleteOutlined } from '@ant-design/icons'; -import { Badge, Empty, Popconfirm, Space, Spin, Tree, Typography } from 'antd'; +import { Badge, Popconfirm, Space, Spin, Tree, Typography } from 'antd'; import { DataNode, EventDataNode, TreeProps } from 'antd/lib/tree'; import classnames from 'classnames'; import { isConnectTypeBeFileSystemGroup } from '@/util/connection'; @@ -232,7 +232,11 @@ const TableSelecter: React.ForwardRefRenderFunction = if (!projectId) return; setIsLoading(true); try { - const res = await listDatabases(projectId, null, null, null, null, null, null, true, true); + const res = await listDatabases({ + projectId, + existed: true, + includesPermittedAction: true, + }); if (res?.contents) { datasourceStatus.asyncUpdateStatus( res?.contents @@ -702,8 +706,14 @@ const TableSelecter: React.ForwardRefRenderFunction = return Array.from(new Set([...prevExpandKeys, databaseId])); }); }, + getAllLoadedTables: () => { + return databaseWithTableList.reduce( + (pre, cur) => pre.concat(cur.tableList, cur.viewList, cur.materializedViewList), + [], + ); + }, }), - [handleLoadTables], + [handleLoadTables, databaseWithTableList], ); useEffect(() => { diff --git a/src/component/Task/component/TableSelecter/interface.ts b/src/component/Task/component/TableSelecter/interface.ts index e5e82abdd..a06cb46b8 100644 --- a/src/component/Task/component/TableSelecter/interface.ts +++ b/src/component/Task/component/TableSelecter/interface.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { IDatabase } from '@/d.ts/database'; import { DataNode, EventDataNode } from 'antd/lib/tree'; @@ -13,8 +29,10 @@ export interface TableSelecterRef { tables: LoadTableItems[]; externalTables: LoadTableItems[]; views: LoadTableItems[]; + materializedViews: LoadTableItems[]; }>; expandTable: (dbId: number) => void; + getAllLoadedTables: () => TableItemInDB[]; } export type LoadTableItems = { diff --git a/src/component/Task/component/TableSelecter/util.tsx b/src/component/Task/component/TableSelecter/util.tsx index 4e9a09210..f1dd0ab09 100644 --- a/src/component/Task/component/TableSelecter/util.tsx +++ b/src/component/Task/component/TableSelecter/util.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TableItem, TableItemInDB } from './interface'; /** diff --git a/src/component/Task/component/TaskTable/const.ts b/src/component/Task/component/TaskTable/const.ts new file mode 100644 index 000000000..da837fa95 --- /dev/null +++ b/src/component/Task/component/TaskTable/const.ts @@ -0,0 +1,112 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { TaskType } from '@/d.ts'; +import { formatMessage } from '@/util/intl'; + +// dev_ing 工单类型对应工单名称 +export const TaskTypeMap = { + [TaskType.IMPORT]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.Import', + defaultMessage: '导入', + }), + //导入 + [TaskType.EXPORT]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.Export', + defaultMessage: '导出', + }), + //导出 + [TaskType.DATAMOCK]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.AnalogData', + defaultMessage: '模拟数据', + }), + //模拟数据 + [TaskType.ASYNC]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.DatabaseChanges', + defaultMessage: '数据库变更', + }), + // 数据库变更 + + [TaskType.PARTITION_PLAN]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.PartitionPlan', + defaultMessage: '分区计划', + }), + //分区计划 + + [TaskType.SHADOW]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.ShadowTableSynchronization', + defaultMessage: '影子表同步', + }), + //影子表同步 + + [TaskType.ALTER_SCHEDULE]: formatMessage({ + id: 'odc.TaskManagePage.component.TaskTable.PlannedChange', + defaultMessage: '计划变更', + }), + //计划变更 + [TaskType.EXPORT_RESULT_SET]: formatMessage({ + id: 'odc.src.component.Task.component.TaskTable.ExportResultSet', + defaultMessage: '导出结果集', + }), + //'导出结果集' + [TaskType.SQL_PLAN]: formatMessage({ + id: 'odc.component.TaskTable.SqlPlan', + defaultMessage: 'SQL 计划', + }), + //SQL 计划 + [TaskType.DATA_ARCHIVE]: formatMessage({ + id: 'odc.component.TaskTable.DataArchiving', + defaultMessage: '数据归档', + }), + //数据归档 + [TaskType.ONLINE_SCHEMA_CHANGE]: formatMessage({ + id: 'odc.component.TaskTable.LockFreeStructureChange', + defaultMessage: '无锁结构变更', + }), + //无锁结构变更 + [TaskType.DATA_DELETE]: formatMessage({ + id: 'odc.component.TaskTable.DataCleansing', + defaultMessage: '数据清理', + }), + //数据清理 + [TaskType.APPLY_PROJECT_PERMISSION]: formatMessage({ + id: 'odc.src.component.Task.component.TaskTable.ApplicationProjectPermissions', + defaultMessage: '申请项目权限', + }), //'申请项目权限' + [TaskType.APPLY_DATABASE_PERMISSION]: formatMessage({ + id: 'src.component.Task.component.TaskTable.E1E161BA', + defaultMessage: '申请库权限', + }), //'申请库权限' + [TaskType.APPLY_TABLE_PERMISSION]: formatMessage({ + id: 'src.component.Task.component.TaskTable.573E2A28', + defaultMessage: '申请表/视图权限', + }), + [TaskType.STRUCTURE_COMPARISON]: formatMessage({ + id: 'src.component.Task.component.TaskTable.80E1D16A', + defaultMessage: '结构比对', + }), //'结构比对' + [TaskType.MULTIPLE_ASYNC]: formatMessage({ + id: 'src.component.Task.component.TaskTable.A3CA13D5', + defaultMessage: '多库变更', + }), + [TaskType.LOGICAL_DATABASE_CHANGE]: formatMessage({ + id: 'src.component.Task.component.TaskTable.4203E912', + defaultMessage: '逻辑库变更', + }), +}; + +export const TASK_EXECUTE_TIME_KEY = 'task:executeTime'; +export const TASK_EXECUTE_DATE_KEY = 'task:executeDate'; diff --git a/src/component/Task/component/TaskTable/index.tsx b/src/component/Task/component/TaskTable/index.tsx index cd8aaba62..069ba336e 100644 --- a/src/component/Task/component/TaskTable/index.tsx +++ b/src/component/Task/component/TaskTable/index.tsx @@ -22,21 +22,19 @@ import type { ITableSorter, } from '@/component/CommonTable/interface'; import { CommonTableMode, IOperationOptionType } from '@/component/CommonTable/interface'; -import { getCronExecuteCycleByObject, translator } from '@/component/Crontab'; import SearchFilter from '@/component/SearchFilter'; import StatusLabel, { cycleStatus, status } from '@/component/Task/component/Status'; import { TIME_OPTION_ALL_TASK, TimeOptions } from '@/component/TimeSelect'; import UserPopover from '@/component/UserPopover'; import type { ICycleTaskRecord, - ICycleTaskTriggerConfig, IDataArchiveJobParameters, IResponseData, ISqlPlayJobParameters, TaskRecord, TaskRecordParameters, } from '@/d.ts'; -import { TaskExecStrategy, TaskPageType, TaskStatus, TaskType } from '@/d.ts'; +import { TaskPageType, TaskType } from '@/d.ts'; import type { PageStore } from '@/store/page'; import type { TaskStore } from '@/store/task'; import { haveOCP, isClient } from '@/util/env'; @@ -44,14 +42,14 @@ import { useLoop } from '@/util/hooks/useLoop'; import { formatMessage } from '@/util/intl'; import { getLocalFormatDateTime } from '@/util/utils'; import { DownOutlined, SearchOutlined } from '@ant-design/icons'; -import { Button, DatePicker, Tooltip, Popover, Space, Typography } from 'antd'; +import { Button, DatePicker, Tooltip, Popover, Space, Typography, Alert } from 'antd'; import { flatten } from 'lodash'; import { inject, observer } from 'mobx-react'; import type { Dayjs } from 'dayjs'; import dayjs from 'dayjs'; import React, { useEffect, useRef, useState, useContext } from 'react'; -import { getTaskGroupLabels, getTaskLabelByType, isCycleTaskPage } from '../../helper'; -import styles from '../../index.less'; +import { getTaskGroupLabels, getTaskLabelByType, isCycleTaskPage } from '@/component/Task/helper'; +import styles from '@/component/Task/index.less'; import TaskTools from '../ActionBar'; import { listProjects } from '@/common/network/project'; import ProjectContext from '@/page/Project/ProjectContext'; @@ -59,6 +57,8 @@ import { isProjectArchived } from '@/page/Project/helper'; import { useRequest } from 'ahooks'; import useUrlAction, { URL_ACTION } from '@/util/hooks/useUrlAction'; import useURLParams from '@/util/hooks/useUrlParams'; +import { TASK_EXECUTE_DATE_KEY, TASK_EXECUTE_TIME_KEY, TaskTypeMap } from './const'; +import { getStatusFilters } from './utils'; import { AsyncTaskOperationButton } from '../AsyncTaskOperationButton'; import { getExportConfig, @@ -69,131 +69,10 @@ const { RangePicker } = DatePicker; const { Text, Link } = Typography; import ImportModal from '../ImportModal'; import { useImport } from '../ImportModal/useImport'; -import clusterStore from '@/store/cluster'; import { useTaskSelection, taskTypeThatCanBeExport } from './useTaskSelection'; import login from '@/store/login'; import odc from '@/plugins/odc'; -export const getCronCycle = (triggerConfig: ICycleTaskTriggerConfig) => { - const { triggerStrategy, days, hours, cronExpression } = triggerConfig; - return triggerStrategy !== TaskExecStrategy.CRON - ? getCronExecuteCycleByObject(triggerStrategy as any, { - hour: hours, - dayOfWeek: days, - dayOfMonth: days, - }) - : translator.parse(cronExpression).toLocaleString(); -}; -export const TaskTypeMap = { - [TaskType.IMPORT]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.Import', - defaultMessage: '导入', - }), - //导入 - [TaskType.EXPORT]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.Export', - defaultMessage: '导出', - }), - //导出 - [TaskType.DATAMOCK]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.AnalogData', - defaultMessage: '模拟数据', - }), - //模拟数据 - [TaskType.ASYNC]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.DatabaseChanges', - defaultMessage: '数据库变更', - }), - // 数据库变更 - - [TaskType.PARTITION_PLAN]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.PartitionPlan', - defaultMessage: '分区计划', - }), - //分区计划 - - [TaskType.SHADOW]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.ShadowTableSynchronization', - defaultMessage: '影子表同步', - }), - //影子表同步 - - [TaskType.ALTER_SCHEDULE]: formatMessage({ - id: 'odc.TaskManagePage.component.TaskTable.PlannedChange', - defaultMessage: '计划变更', - }), - //计划变更 - [TaskType.EXPORT_RESULT_SET]: formatMessage({ - id: 'odc.src.component.Task.component.TaskTable.ExportResultSet', - defaultMessage: '导出结果集', - }), - //'导出结果集' - [TaskType.SQL_PLAN]: formatMessage({ - id: 'odc.component.TaskTable.SqlPlan', - defaultMessage: 'SQL 计划', - }), - //SQL 计划 - [TaskType.DATA_ARCHIVE]: formatMessage({ - id: 'odc.component.TaskTable.DataArchiving', - defaultMessage: '数据归档', - }), - //数据归档 - [TaskType.ONLINE_SCHEMA_CHANGE]: formatMessage({ - id: 'odc.component.TaskTable.LockFreeStructureChange', - defaultMessage: '无锁结构变更', - }), - //无锁结构变更 - [TaskType.DATA_DELETE]: formatMessage({ - id: 'odc.component.TaskTable.DataCleansing', - defaultMessage: '数据清理', - }), - //数据清理 - [TaskType.APPLY_PROJECT_PERMISSION]: formatMessage({ - id: 'odc.src.component.Task.component.TaskTable.ApplicationProjectPermissions', - defaultMessage: '申请项目权限', - }), //'申请项目权限' - [TaskType.APPLY_DATABASE_PERMISSION]: formatMessage({ - id: 'src.component.Task.component.TaskTable.E1E161BA', - defaultMessage: '申请库权限', - }), //'申请库权限' - [TaskType.APPLY_TABLE_PERMISSION]: formatMessage({ - id: 'src.component.Task.component.TaskTable.573E2A28', - defaultMessage: '申请表/视图权限', - }), - [TaskType.STRUCTURE_COMPARISON]: formatMessage({ - id: 'src.component.Task.component.TaskTable.80E1D16A', - defaultMessage: '结构比对', - }), //'结构比对' - [TaskType.MULTIPLE_ASYNC]: formatMessage({ - id: 'src.component.Task.component.TaskTable.A3CA13D5', - defaultMessage: '多库变更', - }), - [TaskType.LOGICAL_DATABASE_CHANGE]: formatMessage({ - id: 'src.component.Task.component.TaskTable.4203E912', - defaultMessage: '逻辑库变更', - }), -}; -export const getStatusFilters = (status: { - [key: string]: { - text: string; - }; -}) => { - return Object.keys(status) - ?.filter((key) => key !== TaskStatus.WAIT_FOR_CONFIRM) - .map((key) => { - return { - text: status?.[key].text, - value: key, - }; - }); -}; -export const TASK_EXECUTE_TIME_KEY = 'task:executeTime'; -export const TASK_EXECUTE_DATE_KEY = 'task:executeDate'; - -const isSupportTaksImport = odc?.appConfig?.task?.isSupportTaksImport; -const isSupportTaksExport = odc?.appConfig?.task?.isSupportTaksExport; -const isSupportTaksTerminate = odc?.appConfig?.task?.isSupportTaksTerminate; - interface IProps { tableRef: React.RefObject; taskStore?: TaskStore; @@ -282,7 +161,9 @@ const TaskTable: React.FC = inject( setExecuteTime(_executeTime); const filters = { ...args?.filters, - status: (args?.filters?.status || []).concat(urlStatusValue ? [urlStatusValue] : []), + status: Array.from( + new Set((args?.filters?.status || []).concat(urlStatusValue ? [urlStatusValue] : [])), + ), executeTime: urlStatusValue ? TIME_OPTION_ALL_TASK : _executeTime, }; @@ -330,7 +211,7 @@ const TaskTable: React.FC = inject( }, }); } - }, [taskPageScope, taskTabType, activePageKey, urlStatusValue]); + }, [taskPageScope, taskTabType, activePageKey]); useEffect(() => { if (executeTime) { @@ -460,7 +341,8 @@ const TaskTable: React.FC = inject( /> ); }, - + onFilter: (value, record) => + record?.creator?.name?.toLowerCase()?.includes(value?.toLowerCase()), filterIcon: (filtered) => ( = inject( }, ]; } + const isSupportTaksImport = odc?.appConfig?.task?.isSupportTaksImport; + const isSupportTaksExport = odc?.appConfig?.task?.isSupportTaksExport; + const isSupportTaksTerminate = odc?.appConfig?.task?.isSupportTaksTerminate; return [ - !taskTypeThatCanBeExport.includes(taskTabType) || - login.isPrivateSpace() || - !isSupportTaksImport + !taskTypeThatCanBeExport.includes(taskTabType) || !isSupportTaksImport ? { type: IOperationOptionType.button, content: [ @@ -760,6 +643,19 @@ const TaskTable: React.FC = inject( return ( <> + {login.isPrivateSpace() && isScheduleMigrateTask(taskTabType as any) && ( + + )} + = inject( }} /> ); + return content; }, }, diff --git a/src/component/Task/component/TaskTable/useTaskSelection.ts b/src/component/Task/component/TaskTable/useTaskSelection.ts index 356e2b26b..d77e2bce8 100644 --- a/src/component/Task/component/TaskTable/useTaskSelection.ts +++ b/src/component/Task/component/TaskTable/useTaskSelection.ts @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { useEffect, useState, useMemo } from 'react'; import type { TaskRecord, diff --git a/src/component/Task/component/TaskTable/utils.ts b/src/component/Task/component/TaskTable/utils.ts new file mode 100644 index 000000000..e4f988341 --- /dev/null +++ b/src/component/Task/component/TaskTable/utils.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { getCronExecuteCycleByObject, translator } from '@/component/Crontab'; +import { ICycleTaskTriggerConfig, TaskExecStrategy, TaskStatus } from '@/d.ts'; + +export const getCronCycle = (triggerConfig: ICycleTaskTriggerConfig) => { + const { triggerStrategy, days, hours, cronExpression } = triggerConfig; + return triggerStrategy !== TaskExecStrategy.CRON + ? getCronExecuteCycleByObject(triggerStrategy as any, { + hour: hours, + dayOfWeek: days, + dayOfMonth: days, + }) + : translator.parse(cronExpression).toLocaleString(); +}; + +export const getStatusFilters = (status: { + [key: string]: { + text: string; + }; +}) => { + return Object.keys(status) + ?.filter((key) => key !== TaskStatus.WAIT_FOR_CONFIRM) + .map((key) => { + return { + text: status?.[key].text, + value: key, + }; + }); +}; diff --git a/src/component/Task/component/TaskdurationItem/index.tsx b/src/component/Task/component/TaskdurationItem/index.tsx index 6e5794873..0758fcbd1 100644 --- a/src/component/Task/component/TaskdurationItem/index.tsx +++ b/src/component/Task/component/TaskdurationItem/index.tsx @@ -1,3 +1,19 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; import { Checkbox, Form, FormInstance, InputNumber, Space } from 'antd'; import React, { useEffect, useState } from 'react'; diff --git a/src/component/Task/component/ThrottleFormItem/index.tsx b/src/component/Task/component/ThrottleFormItem/index.tsx index bec6505c9..9237b9bc5 100644 --- a/src/component/Task/component/ThrottleFormItem/index.tsx +++ b/src/component/Task/component/ThrottleFormItem/index.tsx @@ -19,7 +19,6 @@ import HelpDoc from '@/component/helpDoc'; import setting from '@/store/setting'; import { Form, InputNumber, Space } from 'antd'; import React from 'react'; -import { TaskType } from '@/d.ts'; interface IProps { initialValue?: { rowLimit?: number; diff --git a/src/component/Task/component/VariableConfigTable/index.tsx b/src/component/Task/component/VariableConfigTable/index.tsx index 50d093046..bda5b9ddc 100644 --- a/src/component/Task/component/VariableConfigTable/index.tsx +++ b/src/component/Task/component/VariableConfigTable/index.tsx @@ -15,7 +15,7 @@ */ import DisplayTable from '@/component/DisplayTable'; -import { timeUnitOptions } from '@/component/Task/DataArchiveTask/CreateModal/VariableConfig'; +import { timeUnitOptions } from '@/component/Task/modals/DataArchiveTask/CreateModal/VariableConfig'; import { formatMessage } from '@/util/intl'; import React from 'react'; const oprationReg = /^[-+]\d+[shdwmMy]$/; diff --git a/src/component/Task/const.ts b/src/component/Task/const.ts index 730dc82ea..6c722177c 100644 --- a/src/component/Task/const.ts +++ b/src/component/Task/const.ts @@ -18,7 +18,9 @@ import { SubTaskType, SyncTableStructureEnum, TaskErrorStrategy, + TaskExecStrategy, TaskPartitionStrategy, + TaskType, } from '@/d.ts'; import { formatMessage } from '@/util/intl'; @@ -103,3 +105,109 @@ export const SubTaskTypeMap = { export const OscMinRowLimit = 1; export const OscMaxRowLimit = 10000; export const OscMaxDataSizeLimit = 1000; + +export const getTaskExecStrategyMap = (type: TaskType) => { + switch (type) { + case TaskType.DATA_ARCHIVE: + case TaskType.DATA_DELETE: + case TaskType.LOGICAL_DATABASE_CHANGE: + case TaskType.PARTITION_PLAN: + return { + [TaskExecStrategy.TIMER]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.CRON]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.1', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.DAY]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.2', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.MONTH]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.3', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.WEEK]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.4', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.START_NOW]: formatMessage({ + id: 'odc.src.component.Task.ExecuteImmediately', + defaultMessage: '立即执行', + }), //'立即执行' + [TaskExecStrategy.START_AT]: formatMessage({ + id: 'odc.src.component.Task.TimedExecution', + defaultMessage: '定时执行', + }), //'定时执行' + }; + case TaskType.STRUCTURE_COMPARISON: { + return { + [TaskExecStrategy.AUTO]: formatMessage({ + id: 'src.component.Task.9B79BD20', + defaultMessage: '自动执行', + }), //'自动执行' + [TaskExecStrategy.MANUAL]: formatMessage({ + id: 'src.component.Task.0B2B1D60', + defaultMessage: '手动执行', + }), //'手动执行' + }; + } + default: + return { + [TaskExecStrategy.AUTO]: formatMessage({ + id: 'odc.components.TaskManagePage.ExecuteNow', + defaultMessage: '立即执行', + }), + //立即执行 + [TaskExecStrategy.MANUAL]: formatMessage({ + id: 'odc.components.TaskManagePage.ManualExecution', + defaultMessage: '手动执行', + }), + //手动执行 + [TaskExecStrategy.TIMER]: formatMessage({ + id: 'odc.components.TaskManagePage.ScheduledExecution', + defaultMessage: '定时执行', + }), //定时执行 + }; + } +}; +export const getTaskExecStrategyTextMap = { + [TaskExecStrategy.TIMER]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.CRON]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.1', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.DAY]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.2', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.MONTH]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.3', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.WEEK]: formatMessage({ + id: 'odc.src.component.Task.CycleExecution.4', + defaultMessage: '周期执行', + }), //'周期执行' + [TaskExecStrategy.START_NOW]: formatMessage({ + id: 'odc.src.component.Task.ExecuteImmediately', + defaultMessage: '立即执行', + }), //'立即执行' + [TaskExecStrategy.START_AT]: formatMessage({ + id: 'odc.src.component.Task.TimedExecution', + defaultMessage: '定时执行', + }), //'定时执行' + [TaskExecStrategy.AUTO]: formatMessage({ + id: 'src.component.Task.9B79BD20', + defaultMessage: '自动执行', + }), //'自动执行' + [TaskExecStrategy.MANUAL]: formatMessage({ + id: 'src.component.Task.0B2B1D60', + defaultMessage: '手动执行', + }), //'手动执行' +}; diff --git a/src/component/Task/Content.tsx b/src/component/Task/container/Content.tsx similarity index 80% rename from src/component/Task/Content.tsx rename to src/component/Task/container/Content.tsx index b5948de55..4a2ba2fb9 100644 --- a/src/component/Task/Content.tsx +++ b/src/component/Task/container/Content.tsx @@ -1,4 +1,3 @@ -import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -14,17 +13,9 @@ import { formatMessage } from '@/util/intl'; * See the License for the specific language governing permissions and * limitations under the License. */ - import { getCycleTaskDetail, getTaskDetail } from '@/common/network/task'; import type { ITableInstance, ITableLoadOptions } from '@/component/CommonTable/interface'; -import type { - IAlterScheduleTaskParams, - IDataArchiveJobParameters, - IResponseData, - ISqlPlayJobParameters, - TaskRecordParameters, - TaskStatus, -} from '@/d.ts'; +import type { IAlterScheduleTaskParams, TaskRecordParameters } from '@/d.ts'; import { IConnectionType, ICycleTaskRecord, @@ -36,20 +27,23 @@ import { import { ModalStore } from '@/store/modal'; import type { TaskStore } from '@/store/task'; import tracert from '@/util/tracert'; -import { getPreTime } from '@/util/utils'; import { useLocation } from '@umijs/max'; import { useSetState } from 'ahooks'; import { message } from 'antd'; import { inject, observer } from 'mobx-react'; import type { Dayjs } from 'dayjs'; import React, { useEffect, useRef, useMemo } from 'react'; -import TaskTable from './component/TaskTable'; -import DetailModal from './DetailModal'; -import { isCycleTask, isCycleTaskPage } from './helper'; -import styles from './index.less'; +import TaskTable from '../component/TaskTable'; +import { isCycleTask, isCycleTaskPage } from '../helper'; +import styles from '../index.less'; import { UserStore } from '@/store/login'; import { TaskDetailContext } from './TaskDetailContext'; import useURLParams from '@/util/hooks/useUrlParams'; +import { IState } from '../interface'; +import CreateModals from '../modals/CreateModals'; +import DetailModals from '../modals/DetailModals'; +import { formatMessage } from '@/util/intl'; +import { getPreTime } from '@/util/utils'; interface IProps { taskStore?: TaskStore; @@ -63,14 +57,7 @@ interface IProps { defaultTaskId?: number; defaultTaskType?: TaskType; } -export interface IState { - detailId: number; - detailType: TaskType; - detailVisible: boolean; - status: TaskStatus; - tasks: IResponseData>; - cycleTasks: IResponseData>; -} + const TaskManaerContent: React.FC = (props) => { const { pageKey, @@ -100,7 +87,7 @@ const TaskManaerContent: React.FC = (props) => { const { getParam } = useURLParams(); const urlTriggerValue = getParam('filtered'); - const TaskEventMap = { + const taskModalActions = { [TaskPageType.IMPORT]: () => modalStore.changeImportModal(true), [TaskPageType.EXPORT]: () => modalStore.changeExportModal(), [TaskPageType.DATAMOCK]: () => modalStore.changeDataMockerModal(true), @@ -128,6 +115,7 @@ const TaskManaerContent: React.FC = (props) => { ), [TaskPageType.LOGICAL_DATABASE_CHANGE]: () => modalStore.changeLogicialDatabaseModal(true), }; + const loadList = async (args: ITableLoadOptions, executeDate: [Dayjs, Dayjs]) => { const { pageKey, taskStore } = props; const taskTabType = pageKey || taskStore?.taskPageType; @@ -137,39 +125,59 @@ const TaskManaerContent: React.FC = (props) => { await loadTaskList(taskTabType, args, executeDate); } }; + + const getListParams = (taskTabType, args: ITableLoadOptions, executeDate: [Dayjs, Dayjs]) => { + const { projectId } = props; + const { filters, sorter } = args ?? {}; + const { status, candidateApprovers, creator, projectIdList, executeTime } = filters ?? {}; + const { column, order } = sorter ?? {}; + + const isAllScope = ![ + TaskPageType.CREATED_BY_CURRENT_USER, + TaskPageType.APPROVE_BY_CURRENT_USER, + ].includes(taskTabType); + const isAll = taskTabType === TaskPageType.ALL; + + const commonParams = { + projectId: projectId || projectIdList || undefined, + status, + startTime: executeDate?.length > 0 ? executeDate?.[0]?.valueOf() ?? getPreTime(7) : undefined, + endTime: executeDate?.length > 0 ? executeDate?.[1]?.valueOf() ?? getPreTime(0) : undefined, + candidateApprovers, + creator, + sort: column?.dataIndex, + containsAll: isAll || isAllScope, + }; + if (executeTime !== 'custom' && typeof executeTime === 'number') { + commonParams.startTime = getPreTime(executeTime); + commonParams.endTime = getPreTime(0); + } + const sort = column ? `${column.dataIndex},${order === 'ascend' ? 'asc' : 'desc'}` : undefined; + return { commonParams, sort, isAllScope, isAll }; + }; + const loadTaskList = async ( taskTabType, args: ITableLoadOptions, executeDate: [Dayjs, Dayjs], ) => { - const { projectId } = props; - const { filters, sorter, pagination, pageSize } = args ?? {}; - const { status, executeTime, candidateApprovers, creator, connection, id, projectIdList } = - filters ?? {}; - const { column, order } = sorter ?? {}; - const { current = 1 } = pagination ?? {}; + const { filters, pageSize, pagination } = args ?? {}; + const { connection, id } = filters ?? {}; const connectionId = connection?.filter( (key) => ![IConnectionType.PRIVATE, IConnectionType.ORGANIZATION].includes(key), ); - const isAllScope = ![ - TaskPageType.CREATED_BY_CURRENT_USER, - TaskPageType.APPROVE_BY_CURRENT_USER, - ].includes(taskTabType); - const isAll = taskTabType === TaskPageType.ALL; + const { current = 1 } = pagination ?? {}; + + const { commonParams, sort, isAll, isAllScope } = getListParams(taskTabType, args, executeDate); + if (!pageSize) { return; } const params = { + ...commonParams, fuzzySearchKeyword: id ? id : undefined, taskType: isAllScope ? (isAll ? undefined : taskTabType) : undefined, - projectId: projectId || projectIdList || undefined, - status, - startTime: executeDate?.length > 0 ? executeDate?.[0]?.valueOf() ?? getPreTime(7) : undefined, - endTime: executeDate?.length > 0 ? executeDate?.[1]?.valueOf() ?? getPreTime(0) : undefined, connectionId, - candidateApprovers, - creator, - sort: column?.dataIndex, page: current, size: pageSize, createdByCurrentUser: isAllScope @@ -178,14 +186,10 @@ const TaskManaerContent: React.FC = (props) => { approveByCurrentUser: isAllScope ? true : taskTabType === TaskPageType.APPROVE_BY_CURRENT_USER, - containsAll: isAll || isAllScope, }; - if (executeTime !== 'custom' && typeof executeTime === 'number') { - params.startTime = getPreTime(executeTime); - params.endTime = getPreTime(0); - } // sorter - params.sort = column ? `${column.dataIndex},${order === 'ascend' ? 'asc' : 'desc'}` : undefined; + params.sort = sort; + const tasks = await props.taskStore.getTaskList(params); setState({ tasks, @@ -196,41 +200,27 @@ const TaskManaerContent: React.FC = (props) => { args: ITableLoadOptions, executeDate: [Dayjs, Dayjs], ) => { - const { projectId } = props; - const { filters, sorter, pagination, pageSize } = args ?? {}; - const { status, executeTime, candidateApprovers, creator, id, projectIdList } = filters ?? {}; - const { column, order } = sorter ?? {}; + const { filters, pageSize, pagination } = args ?? {}; + const { id } = filters ?? {}; const { current = 1 } = pagination ?? {}; - const isAllScope = ![ - TaskPageType.CREATED_BY_CURRENT_USER, - TaskPageType.APPROVE_BY_CURRENT_USER, - ].includes(taskTabType); - const isAll = taskTabType === TaskPageType.ALL; + + const { commonParams, sort, isAll, isAllScope } = getListParams(taskTabType, args, executeDate); + if (!pageSize) { return; } const params = { + ...commonParams, id: id ? id : undefined, type: isAllScope ? (isAll ? undefined : taskTabType) : undefined, - projectId: projectId || projectIdList, - status, - candidateApprovers, - creator, - startTime: executeDate?.length > 0 ? executeDate?.[0]?.valueOf() ?? getPreTime(7) : undefined, - endTime: executeDate?.length > 0 ? executeDate?.[1]?.valueOf() ?? getPreTime(0) : undefined, - createdByCurrentUser: taskTabType === TaskPageType.CREATED_BY_CURRENT_USER, - approveByCurrentUser: taskTabType === TaskPageType.APPROVE_BY_CURRENT_USER, - sort: column?.dataIndex, page: urlTriggerValue ? undefined : current, size: urlTriggerValue ? undefined : pageSize, - containsAll: isAll || isAllScope, + createdByCurrentUser: taskTabType === TaskPageType.CREATED_BY_CURRENT_USER, + approveByCurrentUser: taskTabType === TaskPageType.APPROVE_BY_CURRENT_USER, }; - if (executeTime !== 'custom' && typeof executeTime === 'number') { - params.startTime = getPreTime(executeTime); - params.endTime = getPreTime(0); - } // sorter - params.sort = column ? `${column.dataIndex},${order === 'ascend' ? 'asc' : 'desc'}` : undefined; + params.sort = sort; + const cycleTasks = await props.taskStore.getCycleTaskList(params); const filteredContents = cycleTasks?.contents?.filter( (item) => @@ -246,6 +236,7 @@ const TaskManaerContent: React.FC = (props) => { const reloadList = () => { tableRef.current.reload(); }; + const handleDetailVisible = ( task: TaskRecord | ICycleTaskRecord, visible: boolean = false, @@ -265,12 +256,14 @@ const TaskManaerContent: React.FC = (props) => { }); taskOpenRef.current = visible; }; - const handleMenuClick = (type: TaskPageType) => { + + const handleMenuItemClick = (type: TaskPageType) => { tracert.click('a3112.b64006.c330917.d367464', { type, }); - TaskEventMap?.[type]?.(); + taskModalActions?.[type]?.(); }; + const openDefaultTask = async () => { const { defaultTaskId, defaultTaskType } = props; if (defaultTaskId) { @@ -306,15 +299,11 @@ const TaskManaerContent: React.FC = (props) => { * 显示:sql控制台 */ const disableProjectCol = useMemo(() => { - if (inProject) { - return true; - } else if (userStore.isPrivateSpace()) { + if (inProject || userStore.isPrivateSpace()) { return true; - } else if (pageKey === TaskPageType.ALL && !userStore.isPrivateSpace()) { - return false; } return false; - }, [inProject, pageKey, userStore.organizationId]); + }, [inProject, userStore.organizationId]); return ( = (props) => { getTaskList={loadList} onDetailVisible={handleDetailVisible} onReloadList={reloadList} - onMenuClick={handleMenuClick} + onMenuClick={handleMenuItemClick} /> - } + = function ({ taskStore, pageStore, className, isPage, inProject }) { +const { Text } = Typography; + +const Sider: React.FC = function ({ taskStore, pageStore, className, isPage }) { const firstEnabledTask = getFirstEnabledTask(); const pageKey = isPage ? pageStore?.activePageKey : taskStore?.taskPageType; - const { Text } = Typography; const { getParam, deleteParam } = useURLParams(); const urlTriggerValue = getParam('filtered'); const urlStatusValue = getParam('status'); diff --git a/src/component/Task/container/TaskDetailContext.tsx b/src/component/Task/container/TaskDetailContext.tsx new file mode 100644 index 000000000..5937520bb --- /dev/null +++ b/src/component/Task/container/TaskDetailContext.tsx @@ -0,0 +1,29 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 type { ICycleTaskRecord, TaskRecord, TaskRecordParameters } from '@/d.ts'; +import React from 'react'; +import { IState } from '../interface'; + +interface ITaskDetailContext { + handleDetailVisible: ( + task: TaskRecord | ICycleTaskRecord, + visible?: boolean, + ) => void; + setState: (patch: Partial | ((prevState: IState) => Partial)) => void; +} + +export const TaskDetailContext = React.createContext(null); diff --git a/src/component/Task/helper.tsx b/src/component/Task/helper.tsx index 2f4e693af..65b850e11 100644 --- a/src/component/Task/helper.tsx +++ b/src/component/Task/helper.tsx @@ -20,8 +20,12 @@ import login from '@/store/login'; import settingStore from '@/store/setting'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; +import { getPreTime } from '@/util/utils'; import { flatten } from 'lodash'; -export { TaskTypeMap } from '@/component/Task/component/TaskTable'; +import type { Dayjs } from 'dayjs'; +import { ITableLoadOptions } from '../CommonTable/interface'; +export { TaskTypeMap } from '@/component/Task/component/TaskTable/const'; +import dayjs from 'dayjs'; // 423 屏蔽 SysFormItem 配置 export const ENABLED_SYS_FROM_ITEM = false; @@ -318,3 +322,45 @@ export const conditionExpressionColumns = [ }, }, ]; + +type TimeUnit = 'years' | 'months' | 'days'; + +const MAX_DATE = '9999-12-31 23:59:59'; +const MAX_DATE_LABEL = '9999-12-31'; + +/** + * 处理时间单位转换的兼容函数 + * @param value 时间值 + * @param unit 单位 + * @returns [转换后的值, 转换后的单位] + */ +const normalizeTimeUnit = (value: number, unit: TimeUnit): [number, TimeUnit] => { + if (unit === 'years' && value % 1 !== 0) { + // 处理年的小数情况,转换为月 + return [value * 12, 'months']; + } + return [value, unit]; +}; + +export const getExpireTime = (expireTime, customExpireTime, isCustomExpireTime) => { + if (isCustomExpireTime) { + return customExpireTime?.valueOf(); + } else { + const [offset, unit] = expireTime.split(',') ?? []; + if (offset === 'never') { + return dayjs(MAX_DATE)?.valueOf(); + } + const [normalizedValue, normalizedUnit] = normalizeTimeUnit(Number(offset), unit as TimeUnit); + return dayjs().add(normalizedValue, normalizedUnit)?.valueOf(); + } +}; + +export const getExpireTimeLabel = (expireTime) => { + const label = dayjs(expireTime).format('YYYY-MM-DD'); + return label === MAX_DATE_LABEL + ? formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B5C7760D', + defaultMessage: '永不过期', + }) + : label; +}; diff --git a/src/component/Task/hooks/useProjects.tsx b/src/component/Task/hooks/useLoadProjects.tsx similarity index 97% rename from src/component/Task/hooks/useProjects.tsx rename to src/component/Task/hooks/useLoadProjects.tsx index 23e0e4182..6858edadc 100644 --- a/src/component/Task/hooks/useProjects.tsx +++ b/src/component/Task/hooks/useLoadProjects.tsx @@ -18,7 +18,7 @@ import { useState } from 'react'; import { getProjectList } from '@/common/network/task'; import { IProject } from '@/d.ts/project'; -export const useProjects = () => { +export const useLoadProjects = () => { const [projects, setProjects] = useState([]); const [projectMap, setProjectMap] = useState>({}); const projectOptions = projects?.map(({ name, id }) => ({ diff --git a/src/component/Task/index.less b/src/component/Task/index.less index 0a64f9d4d..45c02c289 100644 --- a/src/component/Task/index.less +++ b/src/component/Task/index.less @@ -36,17 +36,6 @@ } } -.approvalModal { - .block:global(.ant-space) { - width: 100%; - } - :global { - .ant-modal-body { - padding: 20px; - } - } -} - .tools { :global { .ant-dropdown-menu-item { diff --git a/src/component/Task/index.tsx b/src/component/Task/index.tsx index 28c27a4ad..a619ee75f 100644 --- a/src/component/Task/index.tsx +++ b/src/component/Task/index.tsx @@ -14,127 +14,19 @@ * limitations under the License. */ -import { TaskExecStrategy, TaskType } from '@/d.ts'; +import { TaskType } from '@/d.ts'; import login from '@/store/login'; -import { formatMessage } from '@/util/intl'; import { useSearchParams } from '@umijs/max'; import { toInteger } from 'lodash'; -import Content from './Content'; -import CreateModals from './CreateModals'; +import Content from './container/Content'; import styles from './index.less'; -import Sider from './Sider'; - -export const getTaskExecStrategyMap = (type: TaskType) => { - switch (type) { - case TaskType.DATA_ARCHIVE: - case TaskType.DATA_DELETE: - case TaskType.LOGICAL_DATABASE_CHANGE: - case TaskType.PARTITION_PLAN: - return { - [TaskExecStrategy.TIMER]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.CRON]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.1', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.DAY]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.2', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.MONTH]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.3', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.WEEK]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.4', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.START_NOW]: formatMessage({ - id: 'odc.src.component.Task.ExecuteImmediately', - defaultMessage: '立即执行', - }), //'立即执行' - [TaskExecStrategy.START_AT]: formatMessage({ - id: 'odc.src.component.Task.TimedExecution', - defaultMessage: '定时执行', - }), //'定时执行' - }; - case TaskType.STRUCTURE_COMPARISON: { - return { - [TaskExecStrategy.AUTO]: formatMessage({ - id: 'src.component.Task.9B79BD20', - defaultMessage: '自动执行', - }), //'自动执行' - [TaskExecStrategy.MANUAL]: formatMessage({ - id: 'src.component.Task.0B2B1D60', - defaultMessage: '手动执行', - }), //'手动执行' - }; - } - default: - return { - [TaskExecStrategy.AUTO]: formatMessage({ - id: 'odc.components.TaskManagePage.ExecuteNow', - defaultMessage: '立即执行', - }), - //立即执行 - [TaskExecStrategy.MANUAL]: formatMessage({ - id: 'odc.components.TaskManagePage.ManualExecution', - defaultMessage: '手动执行', - }), - //手动执行 - [TaskExecStrategy.TIMER]: formatMessage({ - id: 'odc.components.TaskManagePage.ScheduledExecution', - defaultMessage: '定时执行', - }), //定时执行 - }; - } -}; -export const getTaskExecStrategyTextMap = { - [TaskExecStrategy.TIMER]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.CRON]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.1', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.DAY]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.2', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.MONTH]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.3', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.WEEK]: formatMessage({ - id: 'odc.src.component.Task.CycleExecution.4', - defaultMessage: '周期执行', - }), //'周期执行' - [TaskExecStrategy.START_NOW]: formatMessage({ - id: 'odc.src.component.Task.ExecuteImmediately', - defaultMessage: '立即执行', - }), //'立即执行' - [TaskExecStrategy.START_AT]: formatMessage({ - id: 'odc.src.component.Task.TimedExecution', - defaultMessage: '定时执行', - }), //'定时执行' - [TaskExecStrategy.AUTO]: formatMessage({ - id: 'src.component.Task.9B79BD20', - defaultMessage: '自动执行', - }), //'自动执行' - [TaskExecStrategy.MANUAL]: formatMessage({ - id: 'src.component.Task.0B2B1D60', - defaultMessage: '手动执行', - }), //'手动执行' -}; +import Sider from './container/Sider'; interface IProps { projectId?: number; inProject?: boolean; } -const TaskManaerPage: React.FC = (props) => { +const TaskManagerPage: React.FC = (props) => { const { projectId, inProject } = props; const [search] = useSearchParams(); const defaultTaskId = search.get('taskId'); @@ -154,9 +46,8 @@ const TaskManaerPage: React.FC = (props) => { defaultTaskType={defaultTaskType} defaultTaskId={isOrganizationMatch ? toInteger(defaultTaskId) : null} /> - ); }; -export default TaskManaerPage; +export default TaskManagerPage; diff --git a/src/component/Task/interface.ts b/src/component/Task/interface.ts index 9a4f3cda5..6cafb48d5 100644 --- a/src/component/Task/interface.ts +++ b/src/component/Task/interface.ts @@ -24,7 +24,21 @@ import type { TaskRecordParameters, IResponseData, Operation, + TaskStatus, + ICycleTaskRecord, + ISqlPlayJobParameters, + IDataArchiveJobParameters, + TaskType, } from '@/d.ts'; + +export interface IState { + detailId: number; + detailType: TaskType; + detailVisible: boolean; + status: TaskStatus; + tasks: IResponseData>; + cycleTasks: IResponseData>; +} export interface ITaskDetailModalProps { visible: boolean; taskTools: React.ReactNode; diff --git a/src/component/Task/modals/AlterDdlTask/CreateModal/const.ts b/src/component/Task/modals/AlterDdlTask/CreateModal/const.ts new file mode 100644 index 000000000..4bfb05830 --- /dev/null +++ b/src/component/Task/modals/AlterDdlTask/CreateModal/const.ts @@ -0,0 +1,96 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { formatMessage } from '@/util/intl'; + +export const rules = { + sqlType: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.SelectAChangeDefinition', + defaultMessage: '请选择变更定义', + }), //请选择变更定义 + }, + ], + sqlContent: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.EnterTheSqlContent', + defaultMessage: '请填写 SQL 内容', + }), //请填写 SQL 内容 + }, + ], + lockTableTimeOutSeconds: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.EnterATimeoutPeriod', + defaultMessage: '请输入超时时间', + }), //请输入超时时间 + }, + { + type: 'number', + max: 3600, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.UpToSeconds', + defaultMessage: '最大不超过 3600 秒', + }), //最大不超过 3600 秒 + }, + ], + swapTableNameRetryTimes: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.PleaseEnterTheNumberOf', + defaultMessage: '请输入失败重试次数', + }), //请输入失败重试次数 + }, + ], + originTableCleanStrategy: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.SelectACleanupPolicy', + defaultMessage: '请选择清理策略', + }), //请选择清理策略 + }, + ], + errorStrategy: [ + { + required: true, + message: formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.SelectTaskErrorHandling', + defaultMessage: '请选择任务错误处理', + }), //请选择任务错误处理 + }, + ], + swapTableType: [ + { + required: true, + message: formatMessage({ + id: 'odc.src.component.Task.AlterDdlTask.CreateModal.PleaseSelectTheTableName', + defaultMessage: '请选择表名切换方式', + }), //'请选择表名切换方式' + }, + ], +}; + +export enum SwapTableType { + AUTO = 'AUTO', + MANUAL = 'MANUAL', +} diff --git a/src/component/Task/AlterDdlTask/CreateModal/index.less b/src/component/Task/modals/AlterDdlTask/CreateModal/index.less similarity index 100% rename from src/component/Task/AlterDdlTask/CreateModal/index.less rename to src/component/Task/modals/AlterDdlTask/CreateModal/index.less diff --git a/src/component/Task/AlterDdlTask/CreateModal/index.tsx b/src/component/Task/modals/AlterDdlTask/CreateModal/index.tsx similarity index 85% rename from src/component/Task/AlterDdlTask/CreateModal/index.tsx rename to src/component/Task/modals/AlterDdlTask/CreateModal/index.tsx index e0f0119b2..2ed3f9367 100644 --- a/src/component/Task/AlterDdlTask/CreateModal/index.tsx +++ b/src/component/Task/modals/AlterDdlTask/CreateModal/index.tsx @@ -61,12 +61,14 @@ import { import { useRequest } from 'ahooks'; import { inject, observer } from 'mobx-react'; import React, { useEffect, useRef, useState } from 'react'; -import DatabaseSelect from '../../component/DatabaseSelect'; -import ThrottleFormItem from '../../component/ThrottleFormItem'; -import { OscMaxDataSizeLimit, OscMaxRowLimit, OscMinRowLimit } from '../../const'; +import DatabaseSelect from '@/component/Task/component/DatabaseSelect'; +import ThrottleFormItem from '@/component/Task/component/ThrottleFormItem'; +import { OscMaxDataSizeLimit, OscMaxRowLimit, OscMinRowLimit } from '@/component/Task/const'; import { haveOCP } from '@/util/env'; import styles from './index.less'; import { isBoolean } from 'lodash'; +import { rules, SwapTableType } from './const'; +import { Rule } from 'antd/es/form'; import dayjs from 'dayjs'; interface IProps { @@ -83,10 +85,7 @@ enum SqlType { CREATE = 'CREATE', ALTER = 'ALTER', } -export enum SwapTableType { - AUTO = 'AUTO', - MANUAL = 'MANUAL', -} + export enum ClearStrategy { ORIGIN_TABLE_RENAME_AND_RESERVED = 'ORIGIN_TABLE_RENAME_AND_RESERVED', ORIGIN_TABLE_DROP = 'ORIGIN_TABLE_DROP', @@ -554,20 +553,17 @@ const CreateDDLTaskModal: React.FC = (props) => { })} /*变更定义*/ name="sqlType" initialValue={SqlType.CREATE} - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.AlterDdlTask.CreateModal.SelectAChangeDefinition', - defaultMessage: '请选择变更定义', - }), //请选择变更定义 - }, - ]} + rules={rules.sqlType} > - - CREATE TABLE - ALTER TABLE - + = (props) => { })} /*SQL 内容*/ className={styles.sqlContent} - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.AlterDdlTask.CreateModal.EnterTheSqlContent', - defaultMessage: '请填写 SQL 内容', - }), //请填写 SQL 内容 - }, - ]} + rules={rules.sqlContent} style={{ height: '280px', }} @@ -643,42 +631,38 @@ const CreateDDLTaskModal: React.FC = (props) => { })} /*完成后源表清理策略*/ name="originTableCleanStrategy" initialValue={ClearStrategy.ORIGIN_TABLE_RENAME_AND_RESERVED} - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.AlterDdlTask.CreateModal.SelectACleanupPolicy', - defaultMessage: '请选择清理策略', - }), //请选择清理策略 - }, - ]} + rules={rules.originTableCleanStrategy} > - - - - { - formatMessage({ - id: 'odc.AlterDdlTask.CreateModal.RenameNotProcessed', - defaultMessage: '重命名不处理', - }) /*重命名不处理*/ - } - - {formatMessage({ - id: 'src.component.Task.AlterDdlTask.CreateModal.125DF508', - defaultMessage: '推荐', - })} - - - - + + { + formatMessage({ + id: 'odc.AlterDdlTask.CreateModal.RenameNotProcessed', + defaultMessage: '重命名不处理', + }) /*重命名不处理*/ + } + + {formatMessage({ + id: 'src.component.Task.AlterDdlTask.CreateModal.125DF508', + defaultMessage: '推荐', + })} + + + ), + value: ClearStrategy.ORIGIN_TABLE_RENAME_AND_RESERVED, + }, + { + label: formatMessage({ id: 'odc.AlterDdlTask.CreateModal.DeleteNow', defaultMessage: '立即删除', - }) /*立即删除*/ - } - - + }) /*立即删除*/, + value: ClearStrategy.ORIGIN_TABLE_DROP, + }, + ]} + /> = (props) => { })} /*任务错误处理*/ name="errorStrategy" initialValue={ErrorStrategy.ABORT} - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.AlterDdlTask.CreateModal.SelectTaskErrorHandling', - defaultMessage: '请选择任务错误处理', - }), //请选择任务错误处理 - }, - ]} + rules={rules.errorStrategy} > - - + - + }) /*停止任务*/, + }, { - formatMessage({ + value: ErrorStrategy.CONTINUE, + label: formatMessage({ id: 'odc.AlterDdlTask.CreateModal.IgnoreErrorsToContinueThe', defaultMessage: '忽略错误继续任务', - }) /*忽略错误继续任务*/ - } - - + }) /*忽略错误继续任务*/, + }, + ]} + /> = (props) => { } name="swapTableType" initialValue={SwapTableType.AUTO} - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.src.component.Task.AlterDdlTask.CreateModal.PleaseSelectTheTableName', - defaultMessage: '请选择表名切换方式', - }), //'请选择表名切换方式' - }, - ]} + rules={rules.swapTableType} > - - + - + }) /* 自动切换 */, + }, { - formatMessage({ + value: SwapTableType.MANUAL, + label: formatMessage({ id: 'odc.src.component.Task.AlterDdlTask.CreateModal.ManualSwitch', defaultMessage: '手动切换', - }) /* 手工切换 */ - } - - + }) /* 手工切换 */, + }, + ]} + /> {settingStore.enableOSCLimiting && ( , ], [ @@ -237,7 +238,7 @@ export function getItems( defaultMessage: '所属数据源', }), //'所属数据源' - task?.database?.dataSource?.name || '-', + , ], [ formatMessage({ diff --git a/src/component/Task/AlterDdlTask/index.tsx b/src/component/Task/modals/AlterDdlTask/index.tsx similarity index 100% rename from src/component/Task/AlterDdlTask/index.tsx rename to src/component/Task/modals/AlterDdlTask/index.tsx diff --git a/src/component/Task/ApplyDatabasePermission/CreateButton.tsx b/src/component/Task/modals/ApplyDatabasePermission/CreateButton.tsx similarity index 100% rename from src/component/Task/ApplyDatabasePermission/CreateButton.tsx rename to src/component/Task/modals/ApplyDatabasePermission/CreateButton.tsx diff --git a/src/component/Task/modals/ApplyDatabasePermission/CreateModal/const.ts b/src/component/Task/modals/ApplyDatabasePermission/CreateModal/const.ts new file mode 100644 index 000000000..2b8f254a0 --- /dev/null +++ b/src/component/Task/modals/ApplyDatabasePermission/CreateModal/const.ts @@ -0,0 +1,168 @@ +/* + * Copyright 2023 OceanBase + * + * Licensed 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 { DatabasePermissionType } from '@/d.ts/database'; +import { formatMessage } from '@/util/intl'; + +export const permissionOptionsMap = { + [DatabasePermissionType.QUERY]: { + text: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.8890FE39', + defaultMessage: '查询', + }), //'查询' + docKey: 'ApplyDatabasePermissionQueryTip', + value: DatabasePermissionType.QUERY, + }, + [DatabasePermissionType.EXPORT]: { + text: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.3B7A9E11', + defaultMessage: '导出', + }), //'导出' + docKey: 'ApplyDatabasePermissionExportTip', + value: DatabasePermissionType.EXPORT, + }, + [DatabasePermissionType.CHANGE]: { + text: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.985A0E7F', + defaultMessage: '变更', + }), //'变更' + docKey: 'ApplyDatabasePermissionChangeTip', + value: DatabasePermissionType.CHANGE, + }, +}; + +export const expireTimeOptions = [ + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.A3DBC09F', + defaultMessage: '7 天', + }), //'7 天' + value: '7,days', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B4654D83', + defaultMessage: '30 天', + }), //'30 天' + value: '30,days', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.44988077', + defaultMessage: '90 天', + }), //'90 天' + value: '90,days', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.A383B626', + defaultMessage: '半年', + }), //'半年' + value: '0.5,years', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.87E335B0', + defaultMessage: '1 年', + }), //'1 年' + value: '1,years', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.1758E31F', + defaultMessage: '3 年', + }), //'3 年' + value: '3,years', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.35CFABDC', + defaultMessage: '永不过期', + }), //'永不过期' + value: 'never', + }, + { + label: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.1AAFDFFB', + defaultMessage: '自定义', + }), //'自定义' + value: 'custom', + }, +]; + +export const rules = { + projectId: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.564E6CF8', + defaultMessage: '请选择项目', + }), //'请选择项目' + }, + ], + databases: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.6921F0B1', + defaultMessage: '请选择数据库', + }), + }, + ], + types: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.75126DC3', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + expireTime: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.3A596C86', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + customExpireTime: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.5FDEC16A', + defaultMessage: '请选择', + }), //'请选择' + }, + ], + applyReason: [ + { + required: true, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B0247EF7', + defaultMessage: '请输入原因描述', + }), //'请输入原因描述' + }, + { + max: 200, + message: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.7BD59E12', + defaultMessage: '申请原因不超过 200 个字符', + }), //'申请原因不超过 200 个字符' + }, + ], +}; diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.less b/src/component/Task/modals/ApplyDatabasePermission/CreateModal/index.less similarity index 100% rename from src/component/Task/ApplyDatabasePermission/CreateModal/index.less rename to src/component/Task/modals/ApplyDatabasePermission/CreateModal/index.less diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx b/src/component/Task/modals/ApplyDatabasePermission/CreateModal/index.tsx similarity index 68% rename from src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx rename to src/component/Task/modals/ApplyDatabasePermission/CreateModal/index.tsx index 803bd628e..64c9cce1f 100644 --- a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx +++ b/src/component/Task/modals/ApplyDatabasePermission/CreateModal/index.tsx @@ -17,10 +17,8 @@ import { formatMessage } from '@/util/intl'; import { listProjects } from '@/common/network/project'; import { createTask } from '@/common/network/task'; -import HelpDoc from '@/component/helpDoc'; import DatabaseSelecter from '@/component/Task/component/DatabaseSelecter'; import { TaskPageScope, TaskPageType, TaskType } from '@/d.ts'; -import { DatabasePermissionType } from '@/d.ts/database'; import { openTasksPage } from '@/store/helper/page'; import type { ModalStore } from '@/store/modal'; import { useRequest } from 'ahooks'; @@ -42,138 +40,20 @@ import dayjs from 'dayjs'; import React, { useEffect, useState } from 'react'; import styles from './index.less'; import ProjectSelectEmpty from '@/component/Empty/ProjectSelectEmpty'; +import { permissionOptions } from './utils'; +import { expireTimeOptions, rules } from './const'; +import { getExpireTime } from '@/component/Task/helper'; -const CheckboxGroup = Checkbox.Group; +export * from './const'; +export * from './utils'; -const MAX_DATE = '9999-12-31 23:59:59'; -const MAX_DATE_LABEL = '9999-12-31'; +const CheckboxGroup = Checkbox.Group; const defaultValue = { databases: [], expireTime: '7,days', }; -export const getExpireTime = (expireTime, customExpireTime, isCustomExpireTime) => { - if (isCustomExpireTime) { - return customExpireTime?.valueOf(); - } else { - const [offset, unit] = expireTime.split(',') ?? []; - return offset === 'never' ? dayjs(MAX_DATE)?.valueOf() : dayjs().add(offset, unit)?.valueOf(); - } -}; - -export const getExpireTimeLabel = (expireTime) => { - const label = dayjs(expireTime).format('YYYY-MM-DD'); - return label === MAX_DATE_LABEL - ? formatMessage({ - id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B5C7760D', - defaultMessage: '永不过期', - }) - : label; -}; - -const Label: React.FC<{ - text: string; - docKey: string; -}> = ({ text, docKey }) => ( - - {text} - -); - -export const permissionOptionsMap = { - [DatabasePermissionType.QUERY]: { - text: formatMessage({ - id: 'src.component.Task.ApplyDatabasePermission.CreateModal.8890FE39', - defaultMessage: '查询', - }), //'查询' - docKey: 'ApplyDatabasePermissionQueryTip', - value: DatabasePermissionType.QUERY, - }, - [DatabasePermissionType.EXPORT]: { - text: formatMessage({ - id: 'src.component.Task.ApplyDatabasePermission.CreateModal.3B7A9E11', - defaultMessage: '导出', - }), //'导出' - docKey: 'ApplyDatabasePermissionExportTip', - value: DatabasePermissionType.EXPORT, - }, - [DatabasePermissionType.CHANGE]: { - text: formatMessage({ - id: 'src.component.Task.ApplyDatabasePermission.CreateModal.985A0E7F', - defaultMessage: '变更', - }), //'变更' - docKey: 'ApplyDatabasePermissionChangeTip', - value: DatabasePermissionType.CHANGE, - }, -}; - -export const permissionOptions = Object.values(permissionOptionsMap)?.map( - ({ text, docKey, ...rest }) => ({ - ...rest, - label:
= inject('settingStore')( = inject('settingStore')( = inject('settingStore')( /* 插入模拟数据清空表 */ > - - + - + }), + value: false, + }, { - formatMessage({ + label: formatMessage({ id: 'odc.component.DataMockerDrawer.form.Is', defaultMessage: '是', - }) - - /* 是 */ - } - - + }), + value: true, + }, + ]} + /> diff --git a/src/component/Task/DataMockerTask/CreateModal/index.less b/src/component/Task/modals/DataMockerTask/CreateModal/index.less similarity index 100% rename from src/component/Task/DataMockerTask/CreateModal/index.less rename to src/component/Task/modals/DataMockerTask/CreateModal/index.less diff --git a/src/component/Task/DataMockerTask/CreateModal/index.tsx b/src/component/Task/modals/DataMockerTask/CreateModal/index.tsx similarity index 99% rename from src/component/Task/DataMockerTask/CreateModal/index.tsx rename to src/component/Task/modals/DataMockerTask/CreateModal/index.tsx index fd4d273f3..b200fbf38 100644 --- a/src/component/Task/DataMockerTask/CreateModal/index.tsx +++ b/src/component/Task/modals/DataMockerTask/CreateModal/index.tsx @@ -134,7 +134,7 @@ const CreateModal: React.FC = inject('modalStore')( , result: ITaskResult, hasFlow: boolean) { if (!task) { return []; @@ -216,7 +217,7 @@ export function getItems(task: TaskDetail, result: ITaskResult, id: 'odc.src.component.Task.DataMockerTask.DetailContent.DataSource', defaultMessage: '所属数据源', }), //'所属数据源' - task?.database?.dataSource?.name || '-', + , ], [ diff --git a/src/component/Task/DataMockerTask/index.tsx b/src/component/Task/modals/DataMockerTask/index.tsx similarity index 100% rename from src/component/Task/DataMockerTask/index.tsx rename to src/component/Task/modals/DataMockerTask/index.tsx diff --git a/src/component/Task/DetailModal.tsx b/src/component/Task/modals/DetailModals.tsx similarity index 97% rename from src/component/Task/DetailModal.tsx rename to src/component/Task/modals/DetailModals.tsx index 50c4fdd83..150ab82d2 100644 --- a/src/component/Task/DetailModal.tsx +++ b/src/component/Task/modals/DetailModals.tsx @@ -13,8 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { getProjectWithErrorCatch } from '@/common/network/project'; import { getCycleTaskDetail, getCycleTaskLog, @@ -42,7 +40,6 @@ import type { ITaskResult, TaskDetail, Operation, - TaskRecord, } from '@/d.ts'; import { CommonTaskLogType, @@ -58,13 +55,13 @@ import { ApplyDatabasePermissionTaskContent } from './ApplyDatabasePermission'; import { ApplyPermissionTaskContent } from './ApplyPermission'; import { ApplyTablePermissionTaskContent } from './ApplyTablePermission'; import { AsyncTaskContent } from './AsyncTask'; -import TaskTools from './component/ActionBar'; -import ApprovalModal from './component/ApprovalModal'; +import TaskTools from '../component/ActionBar'; +import ApprovalModal from '../component/ApprovalModal'; import { DataArchiveTaskContent } from './DataArchiveTask'; import { DataClearTaskContent } from './DataClearTask'; import { getItems as getDataMockerItems } from './DataMockerTask'; -import { isCycleTask, isLogicalDbChangeTask } from './helper'; -import { TaskDetailType } from './interface'; +import { isCycleTask, isLogicalDbChangeTask } from '../helper'; +import { TaskDetailType } from '../interface'; import { LogicDatabaseAsyncTaskContent } from './LogicDatabaseAsyncTask'; import { MutipleAsyncTaskContent } from './MutipleAsyncTask'; import { PartitionTaskContent } from './PartitionTask'; diff --git a/src/component/Task/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx b/src/component/Task/modals/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx similarity index 77% rename from src/component/Task/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx rename to src/component/Task/modals/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx index dfdb7c95f..2df89287b 100644 --- a/src/component/Task/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx +++ b/src/component/Task/modals/ExportTask/CreateModal/ExportForm/ConfigPanel/index.tsx @@ -28,6 +28,7 @@ import { AutoComplete, Checkbox, Col, Form, FormInstance, InputNumber, Row, Sele import React, { useContext } from 'react'; import FormContext from '../FormContext'; import { CRLFToSeparatorString } from '@/util/utils'; +import { rules } from '../../const'; const FormItem = Form.Item; const Option = Select.Option; @@ -60,40 +61,6 @@ const ConfigPanel: React.FC = function ({ form, connection }) { }, ]; - const validator = (_, value) => { - if ( - value === - formatMessage({ id: 'odc.ExportForm.ConfigPanel.Unlimited', defaultMessage: '无限制' }) //无限制 - ) { - return Promise.resolve(); - } else { - // 当value不为'无限制'时,它的类型可能为string或者number。 - const size = parseInt(value); - // 当value为011时,它可以转换为整数,但不是我们想要的参数形式,所以使用转换前后的长度来进行比较。 - if (Number.isNaN(size) || size.toString().length !== value.toString().length) { - return Promise.reject( - new Error( - formatMessage({ - id: 'odc.ExportForm.ConfigPanel.SelectUnlimitedOrEnterA', - defaultMessage: '请选择"无限制"或者输入 0 < size <= 2048 范围内的正整数', - }), - ), //请选择"无限制"或者输入0 < size <= 2048范围内的正整数 - ); - } - if (size > 0 && size <= 2048) { - return Promise.resolve(); - } else { - return Promise.reject( - new Error( - formatMessage({ - id: 'odc.ExportForm.ConfigPanel.SetTheUpperLimitOf', - defaultMessage: '请将单个文件上限设定为 0 < size <= 2048 范围内的正整数', - }), - ), //请将单个文件上限设定为0 < size <= 2048范围内的正整数 - ); - } - } - }; return ( <> @@ -135,15 +102,7 @@ const ConfigPanel: React.FC = function ({ form, connection }) { // 数据格式 } - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ExportDrawer.ExportForm.SelectExportFormat', - defaultMessage: '请选择导出格式', - }), - }, - ]} + rules={rules.dataTransferFormat} > {Object.entries(IMPORT_ENCODING).map(([text, value]) => { @@ -221,18 +172,7 @@ const ConfigPanel: React.FC = function ({ form, connection }) { } name="exportFileMaxSize" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ExportForm.ConfigPanel.PleaseFillInOrSelect', - defaultMessage: '请填写或者选择单个文件上限(MB)', - }), //请填写或者选择单个文件上限(MB) - }, - () => ({ - validator, - }), - ]} + rules={rules.exportFileMaxSize} > @@ -281,15 +221,9 @@ const ConfigPanel: React.FC = function ({ form, connection }) { = function ({ form, connection }) { } name="columnSeparator" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ImportDrawer.ImportForm.EnterAFieldDelimiter', - defaultMessage: '请填写字段分隔符', - }), - }, - - { - max: 1, - message: formatMessage({ - id: 'odc.ExportDrawer.ExportForm.YouCanEnterOnlyOne', - defaultMessage: '只能输入一个字符', - }), - - // 只能输入一个字符 - }, - ]} + rules={rules.columnSeparator} > { @@ -399,15 +315,7 @@ const ConfigPanel: React.FC = function ({ form, connection }) { } name="columnDelimiter" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ImportDrawer.ImportForm.EnterATextIdentifier', - defaultMessage: '请填写文本识别符', - }), - }, - ]} + rules={rules.columnDelimiter} > = function ({ })} /* 任务错误处理 */ name="stopWhenError" > - - + - + }), + value: true, + }, { - formatMessage({ + label: formatMessage({ id: 'odc.ImportDrawer.ImportForm.IgnoreErrorsContinueTasks', defaultMessage: '忽略错误继续任务', - }) - - /* 忽略错误继续任务 */ - } - - + }), + value: false, + }, + ]} + /> )} diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/CsvProvider.ts b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/CsvProvider.ts similarity index 100% rename from src/component/Task/ImportTask/CreateModal/ImportForm/CsvProvider.ts rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/CsvProvider.ts diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.less b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.less similarity index 100% rename from src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.less rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.less diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx similarity index 94% rename from src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx index c9cc072b6..092a4ec5d 100644 --- a/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx +++ b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx @@ -40,6 +40,7 @@ import FormContext from '../FormContext'; import styles from './index.less'; import { selectFolder } from '@/util/client'; import { getImportFileMeta } from '@/common/network/exportAndImport'; +import { rules } from '../../const'; const FormItem = Form.Item; const Option = Select.Option; @@ -211,15 +212,7 @@ const FileSelecterPanel: React.FC = function ({ isSingleImport, form }) defaultMessage: '导入文件格式', })} name="fileType" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ImportDrawer.ImportForm.SelectAnImportFormat', - defaultMessage: '请选择导入格式', - }), - }, - ]} + rules={rules.fileType} > {Object.entries(IMPORT_ENCODING).map(([text, value]) => { diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/FormConfigContext.tsx b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/FormConfigContext.tsx similarity index 100% rename from src/component/Task/ImportTask/CreateModal/ImportForm/FormConfigContext.tsx rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/FormConfigContext.tsx diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/FormContext.ts b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/FormContext.ts similarity index 100% rename from src/component/Task/ImportTask/CreateModal/ImportForm/FormContext.ts rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/FormContext.ts diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx similarity index 78% rename from src/component/Task/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx rename to src/component/Task/modals/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx index 3c427eee4..4473d3e55 100644 --- a/src/component/Task/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx +++ b/src/component/Task/modals/ImportTask/CreateModal/ImportForm/formitem/CsvFormItem.tsx @@ -20,6 +20,7 @@ import { formatMessage } from '@/util/intl'; import { CRLFToSeparatorString } from '@/util/utils'; import { AutoComplete, Checkbox, Col, Form, Row, Select } from 'antd'; import React from 'react'; +import { rules } from '../../const'; const { Option } = Select; const FormItem = Form.Item; @@ -81,23 +82,7 @@ const CsvFormItem: React.FC = function (props) { } name="columnSeparator" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ImportDrawer.ImportForm.EnterAFieldDelimiter', - defaultMessage: '请填写字段分隔符', - }), - }, - - { - max: 1, - message: formatMessage({ - id: 'odc.ImportForm.formitem.CsvFormItem.YouCanEnterOnlyOne', - defaultMessage: '只能输入一个字符', - }), // 只能输入一个字符 - }, - ]} + rules={rules.columnSeparator} > { @@ -118,15 +103,7 @@ const CsvFormItem: React.FC = function (props) { } name="columnDelimiter" - rules={[ - { - required: true, - message: formatMessage({ - id: 'odc.ImportDrawer.ImportForm.EnterATextIdentifier', - defaultMessage: '请填写文本识别符', - }), - }, - ]} + rules={rules.columnDelimiter} >
(i % 2 === 0 ? styles.even : styles.odd)} + columns={initColumns()} + {...rest} + /> + ); +}; + +export default Editable; diff --git a/src/component/Task/ImportTask/CreateModal/csvMapping/index.tsx b/src/component/Task/modals/ImportTask/CreateModal/csvMapping/index.tsx similarity index 63% rename from src/component/Task/ImportTask/CreateModal/csvMapping/index.tsx rename to src/component/Task/modals/ImportTask/CreateModal/csvMapping/index.tsx index bc955647f..f768d967f 100644 --- a/src/component/Task/ImportTask/CreateModal/csvMapping/index.tsx +++ b/src/component/Task/modals/ImportTask/CreateModal/csvMapping/index.tsx @@ -19,70 +19,53 @@ import type { CsvColumnMapping, ITableColumn } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { Row, Select, Tooltip } from 'antd'; import { cloneDeep, isNil } from 'lodash'; -import React from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import Editable from './editable'; const { Option } = Select; +interface IProps { + csvColumnMappings: CsvColumnMapping[]; + tableName: string; + databaseName: string; + sessionId: string; + onChangeCsvColumnMappings: (csvColumnMappings: CsvColumnMapping[]) => void; + csvMappingErrors: { + errorMsg: string; + errorIndex: number; + }[]; +} -class CsvMapping extends React.Component< - { - csvColumnMappings: CsvColumnMapping[]; - tableName: string; - databaseName: string; - sessionId: string; - onChangeCsvColumnMappings: (csvColumnMappings: CsvColumnMapping[]) => void; - csvMappingErrors: { - errorMsg: string; - errorIndex: number; - }[]; - }, - { - columns: ITableColumn[]; - } -> { - constructor(props) { - super(props); - this.state = { - columns: [], - }; - } - componentDidMount() { - this.getTableColumns(); - } - getTableColumns = async () => { - const { databaseName, sessionId } = this.props; +const CsvMapping: React.FC = (props) => { + const { + databaseName, + sessionId, + tableName, + csvColumnMappings, + onChangeCsvColumnMappings, + csvMappingErrors, + } = props; + const [columns, setColumns] = useState([]); + + const getTableColumns = async () => { if (!sessionId) { return; } - const columns = await getTableColumnList(this.props.tableName, databaseName, sessionId); - this.setState({ - columns, - }); + const columns = await getTableColumnList(tableName, databaseName, sessionId); + setColumns(columns); }; - componentDidUpdate( - prevProps: Readonly<{ - csvColumnMappings: CsvColumnMapping[]; - tableName: string; - sessionId: string; - onChangeCsvColumnMappings: (csvColumnMappings: CsvColumnMapping[]) => void; - csvMappingErrors: { - errorMsg: string; - errorIndex: number; - }[]; - }>, - prevState: Readonly<{ columns: ITableColumn[] }>, - snapshot?: any, - ): void { - const { tableName, sessionId } = this.props; - if (prevProps.tableName !== tableName || prevProps.sessionId !== sessionId) { - this.getTableColumns(); - } - } - changeDestColumnName = (index, value) => { - const newMapping = cloneDeep(this.props.csvColumnMappings); - const targetColumn = this.state.columns.find((column) => { - return column.columnName == value; + useEffect(() => { + getTableColumns(); + }, []); + + useEffect(() => { + getTableColumns(); + }, [tableName, sessionId]); + + const changeDestColumnName = (index: number, value: string) => { + const newMapping = cloneDeep(csvColumnMappings); + const targetColumn = columns.find((column) => { + return column.columnName === value; }); newMapping[index] = { ...newMapping[index], @@ -91,22 +74,39 @@ class CsvMapping extends React.Component< destColumnPosition: targetColumn?.ordinalPosition, }; - this.props.onChangeCsvColumnMappings(newMapping); + onChangeCsvColumnMappings?.(newMapping); }; - updateSelectedKeys = (selectedKeys: string[]) => { + const updateSelectedKeys = (selectedKeys: string[]) => { const indexs = selectedKeys.map((key) => { return parseInt(key.split('-')[0]); }); - this.props.onChangeCsvColumnMappings( - this.props.csvColumnMappings.map((column, i) => { + onChangeCsvColumnMappings?.( + csvColumnMappings?.map((column, i) => { return { ...column, isSelected: indexs.includes(i) }; }), ); }; - initColumns = () => { - const { csvMappingErrors } = this.props; + const errorMsg = useMemo(() => { + let errorMsg; + if (csvMappingErrors?.length) { + const globalError = csvMappingErrors.find((error) => { + return error.errorIndex === -1; + }); + if (globalError) { + errorMsg = globalError.errorMsg; + } else { + errorMsg = formatMessage({ + id: 'odc.ImportDrawer.csvMapping.IncorrectFormSettings', + defaultMessage: '表单设置有误', + }); + } + } + return errorMsg; + }, [JSON.stringify(csvMappingErrors)]); + + const initColumns = () => { const errorMap = {}; csvMappingErrors?.forEach((error) => { errorMap[error.errorIndex] = error.errorMsg; @@ -185,7 +185,7 @@ class CsvMapping extends React.Component< value={t} showSearch allowClear - onChange={this.changeDestColumnName.bind(this, i)} + onChange={(value) => changeDestColumnName(i, value)} style={{ width: 100 }} getPopupContainer={(trigger) => trigger?.parentNode} dropdownStyle={{ @@ -193,7 +193,7 @@ class CsvMapping extends React.Component< minWidth: 170, }} > - {this.state.columns.map((column) => { + {columns.map((column) => { return (