From c781b32ad3775f68d827935278a551aa6ff1ca66 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 16:38:43 +0800 Subject: [PATCH 001/231] add oracle mode --- src/common/datasource/index.tsx | 13 +++ src/common/datasource/interface.ts | 4 +- src/common/datasource/mysql/index.tsx | 1 + src/common/datasource/oceanbase/obmysql.ts | 3 + src/common/datasource/oceanbase/oboracle.ts | 2 + src/common/datasource/oracle/index.tsx | 100 ++++++++++++++++++ src/common/network/connection.ts | 3 + src/constant/label.ts | 1 + src/d.ts/datasource.ts | 1 + src/d.ts/index.ts | 4 + .../Form/Account/PrivateAccount.tsx | 23 +++- .../NewDatasourceDrawer/Form/AddressItems.tsx | 52 +++++++-- .../NewDatasourceDrawer/Form/index.tsx | 5 + .../NewDatasourceDrawer/NewButton.tsx | 61 +++++++---- src/page/Datasource/index.tsx | 3 + src/store/helper/page/openPage.ts | 2 +- src/svgr/oracle.svg | 2 +- 17 files changed, 252 insertions(+), 28 deletions(-) create mode 100644 src/common/datasource/oracle/index.tsx diff --git a/src/common/datasource/index.tsx b/src/common/datasource/index.tsx index b4dd3b5ee..c321b2798 100644 --- a/src/common/datasource/index.tsx +++ b/src/common/datasource/index.tsx @@ -19,11 +19,14 @@ import { IDataSourceModeConfig } from './interface'; import { IDataSourceType } from '@/d.ts/datasource'; import obOracle from './oceanbase/oboracle'; import obMySQL from './oceanbase/obmysql'; +import oracle from './oracle'; import MySQL from './mysql'; import OBSvg from '@/svgr/source_ob.svg'; import DBOBSvg from '@/svgr/database_oceanbase.svg'; import MySQLSvg from '@/svgr/mysql.svg'; import DBMySQLSvg from '@/svgr/database_mysql.svg'; +import OracleSvg from '@/svgr/oracle.svg'; +import DBOracleSvg from '@/svgr/database_oracle.svg'; const _types: Map< IDataSourceType, @@ -54,6 +57,15 @@ const _styles = { component: DBMySQLSvg, }, }, + [IDataSourceType.Oracle]: { + icon: { + component: OracleSvg, + color: "#ed1d25" + }, + dbIcon: { + component: DBOracleSvg + } + } }; const connectType2Ds: Map = new Map(); @@ -92,6 +104,7 @@ function register( register(IDataSourceType.OceanBase, obOracle); register(IDataSourceType.OceanBase, obMySQL); register(IDataSourceType.MySQL, MySQL); +register(IDataSourceType.Oracle, oracle) function getAllConnectTypes(ds?: IDataSourceType): ConnectType[] { if (!ds) { diff --git a/src/common/datasource/interface.ts b/src/common/datasource/interface.ts index e90d182b1..e695d38cd 100644 --- a/src/common/datasource/interface.ts +++ b/src/common/datasource/interface.ts @@ -111,9 +111,10 @@ export interface IDataSourceModeConfig { priority?: number; connection: { address: { - items: ('ip' | 'port' | 'cluster' | 'tenant')[]; + items: ('ip' | 'port' | 'cluster' | 'tenant' | 'sid')[]; }; account: boolean; + role?: boolean; sys: boolean; ssl: boolean; defaultSchema?: boolean; @@ -125,6 +126,7 @@ export interface IDataSourceModeConfig { obclient?: boolean; recycleBin?: boolean; sqlExplain?: boolean; + sessionManage: boolean; compile?: boolean; plEdit?: boolean; anonymousBlock?: boolean; diff --git a/src/common/datasource/mysql/index.tsx b/src/common/datasource/mysql/index.tsx index fdfa10f07..4fb152601 100644 --- a/src/common/datasource/mysql/index.tsx +++ b/src/common/datasource/mysql/index.tsx @@ -78,6 +78,7 @@ const items: Record = { ], obclient: true, recycleBin: false, + sessionManage: true, sqlExplain: true, export: { fileLimit: false, diff --git a/src/common/datasource/oceanbase/obmysql.ts b/src/common/datasource/oceanbase/obmysql.ts index 0ecc98d73..30c129f14 100644 --- a/src/common/datasource/oceanbase/obmysql.ts +++ b/src/common/datasource/oceanbase/obmysql.ts @@ -74,6 +74,7 @@ const items: Record< obclient: true, recycleBin: true, sqlExplain: true, + sessionManage: true, supportOBProxy: true, export: { fileLimit: true, @@ -103,6 +104,7 @@ const items: Record< task: Object.values(TaskType), obclient: true, recycleBin: true, + sessionManage: true, sqlExplain: true, supportOBProxy: true, export: { @@ -134,6 +136,7 @@ const items: Record< task: [TaskType.ASYNC, TaskType.SQL_PLAN, TaskType.EXPORT_RESULT_SET], obclient: false, recycleBin: false, + sessionManage: true, sqlExplain: false, supportOBProxy: true, export: { diff --git a/src/common/datasource/oceanbase/oboracle.ts b/src/common/datasource/oceanbase/oboracle.ts index d1665a9a1..26361636e 100644 --- a/src/common/datasource/oceanbase/oboracle.ts +++ b/src/common/datasource/oceanbase/oboracle.ts @@ -71,6 +71,7 @@ const items: Record = { + [ConnectType.ORACLE]: { + priority: 2, + connection: { + address: { + items: ['ip', 'port', 'sid'], + }, + account: true, + role: true, + sys: false, + ssl: false, + }, + features: { + task: Object.values(TaskType).filter( + (type) => + ![ + TaskType.ASYNC, + TaskType.SQL_PLAN, + ].includes(type), + ), + obclient: false, + recycleBin: false, + sqlExplain: false, + sessionManage: true, + compile: true, + plEdit: true, + anonymousBlock: true, + supportOBProxy: false, + export: { + fileLimit: true, + snapshot: true, + }, + }, + schema: { + table: oracleTableConfig, + func: functionConfig, + proc: functionConfig, + }, + sql: { + language: 'oboracle', + escapeChar: '"', + plParamMode: 'text', + }, + } +}; +if (haveOCP()) { + delete items[ConnectType.ORACLE]; +} + +export default items; diff --git a/src/common/network/connection.ts b/src/common/network/connection.ts index c9effe20d..357510154 100644 --- a/src/common/network/connection.ts +++ b/src/common/network/connection.ts @@ -43,6 +43,9 @@ function generateConnectionParams(formData: Partial, isHide creatorId: userId, type: formData.type, defaultSchema: formData?.defaultSchema, + sid: formData?.sid, + serverName: formData?.serverName, + userRole: formData?.userRole, name: formData.name, username: formData.username, password: encrypt(formData.password), diff --git a/src/constant/label.ts b/src/constant/label.ts index 93b836f06..f1639df70 100644 --- a/src/constant/label.ts +++ b/src/constant/label.ts @@ -81,6 +81,7 @@ export const ConnectTypeText = { [ConnectType.CLOUD_OB_ORACLE]: 'OB Cloud Oracle', [ConnectType.ODP_SHARDING_OB_MYSQL]: 'OB Sharding MySQL', [ConnectType.MYSQL]: 'MySQL', + [ConnectType.ORACLE]: 'Oracle', }; export const DragInsertTypeText = { diff --git a/src/d.ts/datasource.ts b/src/d.ts/datasource.ts index bff8e6c95..fd8bc8fc9 100644 --- a/src/d.ts/datasource.ts +++ b/src/d.ts/datasource.ts @@ -47,4 +47,5 @@ export enum ConnectionPropertyType { export enum IDataSourceType { OceanBase = 'ob', MySQL = 'mysql', + Oracle = 'oracle' } diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index 4f7ba6c54..0bdeeeb13 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -714,6 +714,9 @@ export interface IConnection { sessionInitScript?: string; defaultSchema?: string; projectId?: number; + sid?: string; + serverName?: string; + userRole?: string; readonly projectName?: string; } @@ -2916,6 +2919,7 @@ export enum ConnectType { CLOUD_OB_ORACLE = 'CLOUD_OB_ORACLE', ODP_SHARDING_OB_MYSQL = 'ODP_SHARDING_OB_MYSQL', MYSQL = 'MYSQL', + ORACLE = 'ORACLE' } export enum DragInsertType { diff --git a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/Account/PrivateAccount.tsx b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/Account/PrivateAccount.tsx index ab7b8e6c6..4254e000d 100644 --- a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/Account/PrivateAccount.tsx +++ b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/Account/PrivateAccount.tsx @@ -18,7 +18,7 @@ import Action from '@/component/Action'; import { IConnectionTestErrorType } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { validTrimEmptyWithWarn } from '@/util/valid'; -import { Col, Form, Input, Row, Space, Typography } from 'antd'; +import { Col, Form, Input, Row, Select, Space, Typography } from 'antd'; import React, { useContext, useMemo, useState } from 'react'; import DatasourceFormContext from '../context'; import FormItemGroup from '../FormItemGroup'; @@ -82,6 +82,27 @@ const PrivateAccount: React.FC = function (props) { /*数据库账号*/ > + {formContext?.dataSourceConfig?.role ? ( + + { + setFieldsValue({ + sid: value === "sid" ? "" : null, + serviceName: value === "serviceName" ? "" : null + }) + }} + /> + + + + + + + }} + + + } default: { return null; } diff --git a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx index 1aaa18826..1c3bc8597 100644 --- a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx +++ b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx @@ -86,6 +86,9 @@ export default forwardRef(function DatasourceForm( 'sessionInitScript', 'jdbcUrlParameters', 'defaultSchema', + "sid", + "serverName", + "userRole" ]); } catch (e) {} if (!values) { @@ -164,6 +167,8 @@ export default forwardRef(function DatasourceForm(
(null); const obConnectTypes = getAllConnectTypes(IDataSourceType.OceanBase); const mysqlConnectTypes = getAllConnectTypes(IDataSourceType.MySQL); + const oracleConnectTypes = getAllConnectTypes(IDataSourceType.Oracle); const batchImportRef = useRef<{ closeModal: () => void; @@ -96,27 +97,51 @@ const NewDatasourceButton: React.FC<{ ), }; }); - if (mysqlConnectTypes?.length) { + if (mysqlConnectTypes?.length || oracleConnectTypes?.length) { results.push({ type: 'divider', }); - results = results.concat( - mysqlConnectTypes.map((item) => { - return { - label: ConnectTypeText[item], - key: item, - icon: ( - - ), - }; - }), - ); + if (mysqlConnectTypes?.length) { + results = results.concat( + mysqlConnectTypes.map((item) => { + return { + label: ConnectTypeText[item], + key: item, + icon: ( + + ), + }; + }), + ); + } + if (oracleConnectTypes?.length) { + results = results.concat( + oracleConnectTypes.map((item) => { + return { + label: ConnectTypeText[item], + key: item, + icon: ( + + ), + }; + }), + ); + } + } + if (oracleConnectTypes?.length) { + } if (!haveOCP()) { results.push({ diff --git a/src/page/Datasource/index.tsx b/src/page/Datasource/index.tsx index 23d483974..0af1ce749 100644 --- a/src/page/Datasource/index.tsx +++ b/src/page/Datasource/index.tsx @@ -124,6 +124,9 @@ const tabs = [ }), //会话 key: IPageType.Datasource_session, + isHide(datasource: IDatasource) { + return !getDataSourceModeConfig(datasource?.type)?.features?.sessionManage; + }, }, { tab: formatMessage({ diff --git a/src/store/helper/page/openPage.ts b/src/store/helper/page/openPage.ts index 88b6f8b80..905a312fc 100644 --- a/src/store/helper/page/openPage.ts +++ b/src/store/helper/page/openPage.ts @@ -175,7 +175,7 @@ export function openTasksPage(taskType?: TaskPageType, taskPageScope?: TaskPageS export async function openSessionManagePage(datasourceId?: number) { if (!datasourceId) { - [datasourceId] = await SelectDatabase(); + [datasourceId] = await SelectDatabase((type) => getDataSourceModeConfig(type)?.features?.sessionManage); } if (!datasourceId) { return; diff --git a/src/svgr/oracle.svg b/src/svgr/oracle.svg index a2c24e5f3..26b8bc24c 100644 --- a/src/svgr/oracle.svg +++ b/src/svgr/oracle.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 2a863c919234083ed1fcd7308a815a191c62ac29 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 17:14:23 +0800 Subject: [PATCH 002/231] add url --- src/common/datasource/oracle/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/datasource/oracle/index.tsx b/src/common/datasource/oracle/index.tsx index b69e91efa..189838605 100644 --- a/src/common/datasource/oracle/index.tsx +++ b/src/common/datasource/oracle/index.tsx @@ -59,6 +59,7 @@ const items: Record = { role: true, sys: false, ssl: false, + jdbcDoc: "https://docs.oracle.com/en/database/oracle/oracle-database/21/jajdb/oracle/jdbc/OracleConnection.html" }, features: { task: Object.values(TaskType).filter( From 7ccf2c4eaa47ac72a2e37aaf7f432d2d6061cb89 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 17:22:19 +0800 Subject: [PATCH 003/231] update hook --- package.json | 2 +- pnpm-lock.yaml | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 35b54a644..9c849fb12 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "webpack-node-externals": "^2.5.0", "xterm": "^4.9.0", "xterm-addon-fit": "^0.4.0", - "yorkie": "^2.0.0" + "@umijs/yorkie": "^2.0.0" }, "appName": "OceanBase Developer Center", "build": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13ef80b59..31ad459a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,6 +100,9 @@ devDependencies: '@umijs/max': specifier: ^4.0.66 version: 4.0.66(@babel/core@7.23.3)(@types/node@9.6.61)(@types/react-dom@16.9.18)(@types/react@16.14.35)(dva@2.5.0-beta.2)(postcss@8.4.31)(prettier@2.2.1)(prop-types@15.8.1)(rc-field-form@1.40.0)(react-dom@17.0.2)(react@17.0.2)(styled-components@6.1.1)(typescript@4.9.5)(webpack@4.46.0) + '@umijs/yorkie': + specifier: ^2.0.0 + version: 2.0.5 adm-zip: specifier: ^0.5.5 version: 0.5.10 @@ -328,9 +331,6 @@ devDependencies: xterm-addon-fit: specifier: ^0.4.0 version: 0.4.0(xterm@4.19.0) - yorkie: - specifier: ^2.0.0 - version: 2.0.0 packages: @@ -4373,7 +4373,7 @@ packages: resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. dependencies: - history: 4.10.1 + history: 5.3.0 dev: true /@types/hoist-non-react-statics@3.3.1: @@ -5374,7 +5374,7 @@ packages: axios: 0.27.2 babel-plugin-import: 1.13.6 dayjs: 1.11.7 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dva-immer: 1.0.0(dva@2.5.0-beta.2) dva-loading: 3.0.23(dva-core@2.0.4) event-emitter: 0.3.5 @@ -5553,6 +5553,17 @@ packages: - react dev: true + /@umijs/yorkie@2.0.5: + resolution: {integrity: sha512-vgu4U7/pvG73vY0GGQftXht2t6YAecS8P1cUHIj9VfUHzXIKuRXiaewxxasYgr3gBNrY3GpGiVnmJsHDG6Q3+g==} + engines: {node: '>=4'} + requiresBuild: true + dependencies: + execa: 0.8.0 + is-ci: 1.2.1 + normalize-path: 1.0.0 + strip-indent: 2.0.0 + dev: true + /@umijs/zod2ts@4.0.66: resolution: {integrity: sha512-L06igsowmBRF0K05KsBOHJQ6BZKmZ2VTThA8CUAktypPwOTwBgdhHz2jzAPCVOL8tdZco6ux3UrMEXp/OFrl9A==} dev: true @@ -8323,7 +8334,7 @@ packages: warning: 3.0.0 dev: true - /dva-core@2.0.4(redux@3.7.2): + /dva-core@2.0.4(redux@4.2.1): resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} peerDependencies: redux: 4.x @@ -8333,7 +8344,7 @@ packages: global: 4.4.0 invariant: 2.2.4 is-plain-object: 2.0.4 - redux: 3.7.2 + redux: 4.2.1 redux-saga: 0.16.2 warning: 3.0.0 dev: true @@ -8354,7 +8365,7 @@ packages: dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0 dependencies: '@babel/runtime': 7.23.2 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dev: true /dva@2.5.0-beta.2(react-dom@17.0.2)(react@17.0.2): @@ -15416,7 +15427,7 @@ packages: /react-redux@8.0.5(@types/react-dom@16.9.18)(@types/react@16.14.35)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1): resolution: {integrity: sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==} peerDependencies: - '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react': ^16.0.0 '@types/react-dom': ^16.8 || ^17.0 || ^18.0 react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 @@ -18613,17 +18624,6 @@ packages: engines: {node: '>=10'} dev: true - /yorkie@2.0.0: - resolution: {integrity: sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.8.0 - is-ci: 1.2.1 - normalize-path: 1.0.0 - strip-indent: 2.0.0 - dev: true - /zip-stream@4.1.0: resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} engines: {node: '>= 10'} From 7f4a7bdef130af540e5db6737d1cbd88b0c6d3d3 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 17:32:52 +0800 Subject: [PATCH 004/231] add husky --- package.json | 12 +++--- pnpm-lock.yaml | 102 +++++-------------------------------------------- 2 files changed, 14 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index 9c849fb12..c64918e42 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "pack-client:linux_aarch64": "node ./scripts/client/build.js linux_aarch64", "pack-client:windows": "node ./scripts/client/build.js win", "updateDoc": "node ./scripts/pulldoc.js", - "postinstall": "node scripts/plugin/initPlugins.js && max setup" + "postinstall": "node scripts/plugin/initPlugins.js && max setup", + "prepare": "husky install && husky add .husky/pre-commit \"npm run precommit\"" }, "lint-staged": { "*.{js,jsx,less,md,json}": [ @@ -113,6 +114,7 @@ "electron-builder-notarize": "^1.5.1", "eventbusjs": "^0.2.0", "highlight.js": "^11.6.0", + "husky": "^8.0.3", "immutability-helper": "^3.0.1", "jest-canvas-mock": "^2.3.0", "js-base64": "^3.7.2", @@ -164,8 +166,7 @@ "webpack-merge": "^4.2.1", "webpack-node-externals": "^2.5.0", "xterm": "^4.9.0", - "xterm-addon-fit": "^0.4.0", - "@umijs/yorkie": "^2.0.0" + "xterm-addon-fit": "^0.4.0" }, "appName": "OceanBase Developer Center", "build": { @@ -174,8 +175,5 @@ "customDir": "v20.3.12" } }, - "copyright": "© 2021 ANT GROUP", - "gitHooks": { - "pre-commit": "npm run precommit" - } + "copyright": "© 2021 ANT GROUP" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31ad459a2..82de4f23d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,9 +100,6 @@ devDependencies: '@umijs/max': specifier: ^4.0.66 version: 4.0.66(@babel/core@7.23.3)(@types/node@9.6.61)(@types/react-dom@16.9.18)(@types/react@16.14.35)(dva@2.5.0-beta.2)(postcss@8.4.31)(prettier@2.2.1)(prop-types@15.8.1)(rc-field-form@1.40.0)(react-dom@17.0.2)(react@17.0.2)(styled-components@6.1.1)(typescript@4.9.5)(webpack@4.46.0) - '@umijs/yorkie': - specifier: ^2.0.0 - version: 2.0.5 adm-zip: specifier: ^0.5.5 version: 0.5.10 @@ -175,6 +172,9 @@ devDependencies: highlight.js: specifier: ^11.6.0 version: 11.7.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 immutability-helper: specifier: ^3.0.1 version: 3.1.1 @@ -5553,17 +5553,6 @@ packages: - react dev: true - /@umijs/yorkie@2.0.5: - resolution: {integrity: sha512-vgu4U7/pvG73vY0GGQftXht2t6YAecS8P1cUHIj9VfUHzXIKuRXiaewxxasYgr3gBNrY3GpGiVnmJsHDG6Q3+g==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.8.0 - is-ci: 1.2.1 - normalize-path: 1.0.0 - strip-indent: 2.0.0 - dev: true - /@umijs/zod2ts@4.0.66: resolution: {integrity: sha512-L06igsowmBRF0K05KsBOHJQ6BZKmZ2VTThA8CUAktypPwOTwBgdhHz2jzAPCVOL8tdZco6ux3UrMEXp/OFrl9A==} dev: true @@ -7123,10 +7112,6 @@ packages: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} dev: true - /ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true @@ -7606,14 +7591,6 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -9323,19 +9300,6 @@ packages: safe-buffer: 5.2.1 dev: true - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - /execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} @@ -9936,11 +9900,6 @@ packages: engines: {node: '>=10'} dev: true - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -10575,6 +10534,12 @@ packages: ms: 2.1.3 dev: true + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + /iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} engines: {node: ^8.11.2 || >=10} @@ -10896,13 +10861,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -12006,13 +11964,6 @@ packages: engines: {node: '>=8'} dev: true - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -12755,11 +12706,6 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path@1.0.0: - resolution: {integrity: sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==} - engines: {node: '>=0.10.0'} - dev: true - /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -12801,13 +12747,6 @@ packages: string.prototype.padend: 3.1.4 dev: true - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -13030,11 +12969,6 @@ packages: engines: {node: '>=4'} dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - /p-is-promise@2.1.0: resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} engines: {node: '>=6'} @@ -14498,10 +14432,6 @@ packages: requiresBuild: true dev: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: false @@ -16917,21 +16847,11 @@ packages: engines: {node: '>=4'} dev: true - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} - dev: true - /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -18550,10 +18470,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true From ce7b756e78f6efecdc2e251bd1b8f3e7e2a91977 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 17:33:43 +0800 Subject: [PATCH 005/231] set husky --- .husky/pre-commit | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..3e1cef884 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npm run precommit diff --git a/package.json b/package.json index c64918e42..8ee9435a1 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "pack-client:windows": "node ./scripts/client/build.js win", "updateDoc": "node ./scripts/pulldoc.js", "postinstall": "node scripts/plugin/initPlugins.js && max setup", - "prepare": "husky install && husky add .husky/pre-commit \"npm run precommit\"" + "prepare": "husky install" }, "lint-staged": { "*.{js,jsx,less,md,json}": [ From 2773fac5fee95cfbc194428cfe2bcdd033dd98ca Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 28 Nov 2023 17:45:07 +0800 Subject: [PATCH 006/231] fix the crash when switch database in sql page --- src/page/Workspace/components/DDLResultSet/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/Workspace/components/DDLResultSet/index.tsx b/src/page/Workspace/components/DDLResultSet/index.tsx index c1ae6890f..6d91bf80d 100644 --- a/src/page/Workspace/components/DDLResultSet/index.tsx +++ b/src/page/Workspace/components/DDLResultSet/index.tsx @@ -917,7 +917,7 @@ const DDLResultSet: React.FC = function (props) { /> ))} - {obVersion.startsWith('4.') && parseInt(obVersion?.[2]) >= 1 ? ( + {obVersion?.startsWith('4.') && parseInt(obVersion?.[2]) >= 1 ? ( Date: Wed, 29 Nov 2023 18:03:40 +0800 Subject: [PATCH 007/231] serverNamew => serviceName --- src/common/network/connection.ts | 2 +- src/d.ts/index.ts | 4 ++-- .../Datasource/NewDatasourceDrawer/Form/index.tsx | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/network/connection.ts b/src/common/network/connection.ts index 357510154..22d065024 100644 --- a/src/common/network/connection.ts +++ b/src/common/network/connection.ts @@ -44,7 +44,7 @@ function generateConnectionParams(formData: Partial, isHide type: formData.type, defaultSchema: formData?.defaultSchema, sid: formData?.sid, - serverName: formData?.serverName, + serviceName: formData?.serviceName, userRole: formData?.userRole, name: formData.name, username: formData.username, diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index 0bdeeeb13..3e08c9e0f 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -715,7 +715,7 @@ export interface IConnection { defaultSchema?: string; projectId?: number; sid?: string; - serverName?: string; + serviceName?: string; userRole?: string; readonly projectName?: string; } @@ -2919,7 +2919,7 @@ export enum ConnectType { CLOUD_OB_ORACLE = 'CLOUD_OB_ORACLE', ODP_SHARDING_OB_MYSQL = 'ODP_SHARDING_OB_MYSQL', MYSQL = 'MYSQL', - ORACLE = 'ORACLE' + ORACLE = 'ORACLE', } export enum DragInsertType { diff --git a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx index 1c3bc8597..c23ce6051 100644 --- a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx +++ b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx @@ -86,9 +86,9 @@ export default forwardRef(function DatasourceForm( 'sessionInitScript', 'jdbcUrlParameters', 'defaultSchema', - "sid", - "serverName", - "userRole" + 'sid', + 'serviceName', + 'userRole', ]); } catch (e) {} if (!values) { @@ -167,8 +167,8 @@ export default forwardRef(function DatasourceForm( Date: Mon, 25 Dec 2023 17:54:48 +0800 Subject: [PATCH 008/231] add database selectable --- src/component/WindowManager/index.tsx | 412 +++++++++--------- .../Workspace/SideBar/ResourceTree/index.less | 20 +- .../Workspace/SideBar/ResourceTree/index.tsx | 7 +- .../SideBar/ResourceTree/useTreeState.tsx | 16 +- .../Workspace/context/ResourceTreeContext.tsx | 2 + src/page/Workspace/context/WorkspaceStore.tsx | 3 + src/page/Workspace/index.tsx | 3 +- 7 files changed, 244 insertions(+), 219 deletions(-) diff --git a/src/component/WindowManager/index.tsx b/src/component/WindowManager/index.tsx index 8c26467cc..02468f31a 100644 --- a/src/component/WindowManager/index.tsx +++ b/src/component/WindowManager/index.tsx @@ -15,7 +15,7 @@ */ import { formatMessage } from '@/util/intl'; -import { PureComponent, ReactNode } from 'react'; +import { PureComponent, ReactNode, useContext, useState } from 'react'; import { CloseOutlined, DownOutlined, EllipsisOutlined, PlusOutlined } from '@ant-design/icons'; import { IPage, PageType } from '@/d.ts'; import { Badge, Dropdown, Menu, Space, Tabs, Tooltip } from 'antd'; @@ -29,250 +29,109 @@ import DraggableTabs from './DraggableTabs'; import { getPageTitleText } from './helper'; import styles from './index.less'; import tracert from '@/util/tracert'; +import ResourceTreeContext from '@/page/Workspace/context/ResourceTreeContext'; const { TabPane } = Tabs; -class WindowManager extends PureComponent< - { - pages: IPage[]; - activeKey: string; - sqlStore?: SQLStore; - onActivatePage: (activePageKey: string) => void; - onOpenPage: () => void; - onOpenPageAfterTarget: (targetPage: IPage) => void; - onClosePage: (targetPageKey: string) => void; - onCloseOtherPage: (targetPageKey: string) => void; - onCopySQLPage: (targetPage: IPage) => void; - onCloseAllPage: () => void; - onSavePage: (targetPageKey: string) => void; - onStartSavingPage: (targetPageKey: string) => void; - onUnsavedChangePage: (pageKey: string) => void; - }, - { - closePageKey: string; - } -> { - public readonly state = { - closePageKey: '', - }; - // 处理未保存的修改 - public handleUnsavedChange = (targetKey: string) => { - const { onUnsavedChangePage } = this.props; - onUnsavedChangePage(targetKey); - }; - public handleChangeSaved = (targetKey: string) => { - const { onSavePage } = this.props; - onSavePage(targetKey); - }; +interface IProps { + pages: IPage[]; + activeKey: string; + sqlStore?: SQLStore; + onActivatePage: (activePageKey: string) => void; + onOpenPage: () => void; + onOpenPageAfterTarget: (targetPage: IPage) => void; + onClosePage: (targetPageKey: string) => void; + onCloseOtherPage: (targetPageKey: string) => void; + onCopySQLPage: (targetPage: IPage) => void; + onCloseAllPage: () => void; + onSavePage: (targetPageKey: string) => void; + onStartSavingPage: (targetPageKey: string) => void; + onUnsavedChangePage: (pageKey: string) => void; +} - /** 未保存弹框点击保存触发的事件 */ - public handleSaveAndClosePage = (targetKey: string, closeImmediately?: boolean) => { - const { onStartSavingPage } = this.props; - onStartSavingPage(targetKey); - this.setState({ - closePageKey: '', - }); - if (closeImmediately) { - this.handleClosePage(targetKey); - } - }; - public handleClosePage = (targetKey: string) => { - const { onClosePage } = this.props; - onClosePage(targetKey); - this.setState({ - closePageKey: '', - }); +const WindowManager: React.FC = function (props) { + const [closePageKey, setClosePageKey] = useState(null); + const treeContext = useContext(ResourceTreeContext); + + const { pages, activeKey, onActivatePage } = props; + + const handleSwitchTab = (clickParam: MenuInfo) => { + const { onActivatePage } = props; + onActivatePage(clickParam.key?.toString()); }; - public handleEditPage = (targetKey: any, action: string) => { - const { onOpenPage } = this.props; + + const handleEditPage = (targetKey: any, action: string) => { + const { onOpenPage } = props; if (action === 'add') { tracert.click('a3112.b41896.c330993.d367629'); onOpenPage(); } }; - /** 处理 Tab 切换事件 */ - public handleSwitchTab = (clickParam: MenuInfo) => { - const { onActivatePage } = this.props; - onActivatePage(clickParam.key?.toString()); - }; - /** 处理 Tab 关闭事件 */ - public handleCloseTab = (pageKey: string) => { - const { pages } = this.props; + const handleCloseTab = (pageKey: string) => { + const { pages } = props; const targetPage = pages.find((p) => p.key === pageKey); if (targetPage && targetPage.isSaved) { - this.handleClosePage(pageKey); + handleClosePage(pageKey); } else { - this.setState({ - closePageKey: pageKey, - }); - this.props.onActivatePage(pageKey); + setClosePageKey(pageKey); + props.onActivatePage(pageKey); } }; - public render() { - const { pages, activeKey, onActivatePage } = this.props; - const { closePageKey } = this.state; - const menu = ( - - {pages.map((page) => ( - - - - {pageMap[page.type].icon} - - {getPageTitleText(page)} - - - ))} - - ); - return ( - <> - { - movePagePostion(d, h); - }} - tabBarGutter={0} - addIcon={ -
- - { - e.domEvent.stopPropagation(); - this.handleEditPage(null, 'add'); - }, - }, - { - label: formatMessage({ - id: 'odc.src.component.WindowManager.CreateAnonymousBlockWindow', - }), //'新建匿名块窗口' - key: 'newPL', - onClick(e) { - e.domEvent.stopPropagation(); - openNewDefaultPLPage(); - }, - }, - ], - }} - > -
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - -
-
-
- } - tabBarExtraContent={ - - - - } - > - {pages.map((page) => { - const Page = pageMap[page.type].component; - const pageParams = Object.assign({}, pageMap[page.type].params || {}, page.params); - return ( - - - this.setState({ - closePageKey: '', - }) - } - onSaveAndCloseUnsavedModal={this.handleSaveAndClosePage} - closeSelf={this.handleCloseTab.bind(this, page.key)} - /> - - ); - })} -
- - - ); - } - private doTabAction(page: IPage, params: MenuInfo) { + const handleClosePage = (targetKey: string) => { + const { onClosePage } = props; + onClosePage(targetKey); + setClosePageKey(''); + }; + function doTabAction(page: IPage, params: MenuInfo) { params.domEvent.stopPropagation(); const { key } = params; switch (key) { case 'closePage': { - return this.handleCloseTab(page.key); + return handleCloseTab(page.key); } case 'closeOtherPage': { - return this.props.onCloseOtherPage(page.key); + return props.onCloseOtherPage(page.key); } case 'closeAllPage': { - return this.props.onCloseAllPage(); + return props.onCloseAllPage(); } case 'openNewPage': { - return this.props.onOpenPageAfterTarget(page); + return props.onOpenPageAfterTarget(page); } case 'copyPage': { - return this.props.onCopySQLPage(page); + return props.onCopySQLPage(page); } default: { } } } - private getPageTitle(page: IPage): ReactNode { + + // 处理未保存的修改 + const handleUnsavedChange = (targetKey: string) => { + const { onUnsavedChangePage } = props; + onUnsavedChangePage(targetKey); + }; + const handleChangeSaved = (targetKey: string) => { + const { onSavePage } = props; + onSavePage(targetKey); + }; + + /** 未保存弹框点击保存触发的事件 */ + const handleSaveAndClosePage = (targetKey: string, closeImmediately?: boolean) => { + const { onStartSavingPage } = props; + onStartSavingPage(targetKey); + setClosePageKey(''); + if (closeImmediately) { + handleClosePage(targetKey); + } + }; + + function getPageTitle(page: IPage): ReactNode { const iconColor = page?.params?.isDisabled ? '#bfbfbf' : pageMap[page.type].color; const isDocked = page.params.isDocked; const pageTitle = getPageTitleText(page); - const isPageProcessing = this.props.sqlStore.runningPageKey.has(page.key); + const isPageProcessing = props.sqlStore.runningPageKey.has(page.key); const isCompiler = [ PageType.BATCH_COMPILE_FUNCTION, PageType.BATCH_COMPILE_PACKAGE, @@ -284,7 +143,7 @@ class WindowManager extends PureComponent< + {!isDocked && ( {formatMessage({ @@ -388,7 +247,7 @@ class WindowManager extends PureComponent< className={styles.closeBtn} onClick={(e) => { e.stopPropagation(); - this.handleCloseTab(page.key); + handleCloseTab(page.key); }} style={{ fontSize: '8px', @@ -407,5 +266,134 @@ class WindowManager extends PureComponent< ); } -} + + const menu = ( + + {pages.map((page) => ( + + + + {pageMap[page.type].icon} + + {getPageTitleText(page)} + + + ))} + + ); + return ( + <> + { + movePagePostion(d, h); + }} + tabBarGutter={0} + addIcon={ +
+ + { + e.domEvent.stopPropagation(); + handleEditPage(null, 'add'); + }, + }, + { + label: formatMessage({ + id: 'odc.src.component.WindowManager.CreateAnonymousBlockWindow', + }), //'新建匿名块窗口' + key: 'newPL', + onClick(e) { + e.domEvent.stopPropagation(); + openNewDefaultPLPage(undefined, treeContext?.currentDatabaseId); + }, + }, + ], + }} + > +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + +
+
+
+ } + tabBarExtraContent={ + + + + } + > + {pages.map((page) => { + const Page = pageMap[page.type].component; + const pageParams = Object.assign({}, pageMap[page.type].params || {}, page.params); + return ( + + setClosePageKey('')} + onSaveAndCloseUnsavedModal={handleSaveAndClosePage} + closeSelf={handleCloseTab.bind(null, page.key)} + /> + + ); + })} +
+ + + ); +}; export default inject('sqlStore')(observer(WindowManager)); diff --git a/src/page/Workspace/SideBar/ResourceTree/index.less b/src/page/Workspace/SideBar/ResourceTree/index.less index 649f2a8d7..b99c76468 100644 --- a/src/page/Workspace/SideBar/ResourceTree/index.less +++ b/src/page/Workspace/SideBar/ResourceTree/index.less @@ -69,7 +69,7 @@ bottom: 0px; display: none; align-items: center; - background-color: var(--hover-color2); + background-color: transparent; } .env { position: absolute; @@ -84,8 +84,15 @@ } } } + &.ant-tree-treenode-selected { + background-color: var(--code-background-selected-color); + } + &:not(.ant-tree-treenode-selected) { + &:hover { + background-color: var(--hover-color2); + } + } &:hover { - background-color: var(--hover-color2); :local { .menuActions { display: flex; @@ -118,6 +125,15 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + &.ant-tree-node-selected { + background-color: transparent; + } + &.ant-tree-node-selected:hover { + background-color: transparent; + } + &:hover { + background-color: unset; + } } } } diff --git a/src/page/Workspace/SideBar/ResourceTree/index.tsx b/src/page/Workspace/SideBar/ResourceTree/index.tsx index 05d35094f..c724d45aa 100644 --- a/src/page/Workspace/SideBar/ResourceTree/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/index.tsx @@ -20,7 +20,7 @@ import { Input, Space, Tree } from 'antd'; import { EventDataNode } from 'antd/lib/tree'; import { throttle } from 'lodash'; import { inject, observer } from 'mobx-react'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import { loadNode } from './helper'; import styles from './index.less'; import { DataBaseTreeData } from './Nodes/database'; @@ -35,6 +35,7 @@ import { ConnectType, DbObjectType } from '@/d.ts'; import useTreeState from './useTreeState'; import DatabaseSearch from './DatabaseSearch'; import { useParams } from '@umijs/max'; +import ResourceTreeContext from '../../context/ResourceTreeContext'; interface IProps { sessionManagerStore?: SessionManagerStore; @@ -62,6 +63,7 @@ const ResourceTree: React.FC = function ({ const { expandedKeys, loadedKeys, sessionIds, setSessionId, onExpand, onLoad } = useTreeState( stateId, ); + const treeContext = useContext(ResourceTreeContext); const { tabKey } = useParams<{ tabKey: string }>(); const update = useUpdate(); const [wrapperHeight, setWrapperHeight] = useState(0); @@ -230,7 +232,8 @@ const ResourceTree: React.FC = function ({ loadedKeys={loadedKeys} onLoad={onLoad} height={wrapperHeight} - selectable={false} + selectable={true} + selectedKeys={[treeContext.currentDatabaseId].filter(Boolean)} /> diff --git a/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx b/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx index 6f169a8fd..fa8abfc7a 100644 --- a/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx @@ -17,9 +17,14 @@ import { TreeProps } from 'antd'; import { useContext, useState } from 'react'; import TreeStateStore from './TreeStateStore'; +import { TreeDataNode } from './type'; +import { EventDataNode } from 'antd/lib/tree'; +import sessionManager from '@/store/sessionManager'; +import ResourceTreeContext from '../../context/ResourceTreeContext'; export default function useTreeState(id: string) { const { cache } = useContext(TreeStateStore); + const treeContext = useContext(ResourceTreeContext); let state: { sessionIds: Record; expandedKeys: (string | number)[]; @@ -35,7 +40,15 @@ export default function useTreeState(id: string) { const [expandedKeys, setExpandedKeys] = useState<(string | number)[]>(state.expandedKeys); const [loadedKeys, setLoadedKeys] = useState<(string | number)[]>(state.loadedKeys); const onExpand: TreeProps['onExpand'] = function (expandedKeys, { expanded, node }) { - console.log('expand', node.key); + const { sessionId, cid } = node as TreeDataNode & EventDataNode; + if (sessionId) { + const session = sessionManager.sessionMap.get(sessionId); + if (session) { + treeContext.setCurrentDatabaseId(session?.odcDatabase?.id); + } + } else if (cid) { + treeContext.setCurrentDatabaseId(cid); + } if (expanded && !loadedKeys?.includes(node.key)) { return; } @@ -43,7 +56,6 @@ export default function useTreeState(id: string) { setExpandedKeys(expandedKeys); }; const onLoad: TreeProps['onLoad'] = function (loadedKeys, { event, node }) { - console.log('onload', node.key); const newExpandedKeys = [...expandedKeys, node.key]; cache[id] = Object.assign({}, cache[id], { loadedKeys: [...loadedKeys], diff --git a/src/page/Workspace/context/ResourceTreeContext.tsx b/src/page/Workspace/context/ResourceTreeContext.tsx index 9c74a4792..98fb5a313 100644 --- a/src/page/Workspace/context/ResourceTreeContext.tsx +++ b/src/page/Workspace/context/ResourceTreeContext.tsx @@ -33,6 +33,8 @@ interface IResourceTreeContext { reloadDatasourceList?: () => void; projectList: IProject[]; reloadProjectList?: () => void; + currentDatabaseId?: number; + setCurrentDatabaseId?: (v: number) => void; } const ResourceTreeContext = React.createContext({ diff --git a/src/page/Workspace/context/WorkspaceStore.tsx b/src/page/Workspace/context/WorkspaceStore.tsx index 065c9ae81..728398fe7 100644 --- a/src/page/Workspace/context/WorkspaceStore.tsx +++ b/src/page/Workspace/context/WorkspaceStore.tsx @@ -32,6 +32,7 @@ export default function WorkspaceStore({ children }) { const [activityBarKey, setActivityBarKey] = useState(ActivityBarItemType.Database); const { datasourceId } = useParams<{ datasourceId: string }>(); const [selectTabKey, _setSelectTabKey] = useState(ResourceTreeTab.datasource); + const [currentDatabaseId, setCurrentDatabaseId] = useState(null); function setSelectTabKey(v: ResourceTreeTab) { tracert.click( v === ResourceTreeTab.datasource @@ -90,6 +91,8 @@ export default function WorkspaceStore({ children }) { reloadDatasourceList, projectList, reloadProjectList, + currentDatabaseId, + setCurrentDatabaseId, }} > = (props: WorkspaceProps) => { }; const handleOpenPage = async () => { - openNewSQLPage(null); + const db = resourceTreeContext.currentDatabaseId; + openNewSQLPage(db); }; const openPageAfterTargetPage = async (targetPage: IPage) => { From f1d2fbd05e80071bfb8498c759144fd2e3c60395 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 27 Dec 2023 17:48:39 +0800 Subject: [PATCH 009/231] add more search node --- .../SessionSelect/SessionDropdown/index.tsx | 306 ++++++++---------- 1 file changed, 136 insertions(+), 170 deletions(-) diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index f569d5950..0e50bee2e 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -35,10 +35,14 @@ import { toInteger } from 'lodash'; import { useParams } from '@umijs/max'; import { EnvColorMap } from '@/constant'; import ConnectionPopover from '@/component/ConnectionPopover'; +import { IProject } from '@/d.ts/project'; +import { IDatasource } from '@/d.ts/datasource'; +import logger from '@/util/logger'; interface IProps { dialectTypes?: ConnectionMode[]; + containsUnassigned?: boolean; } -const SessionDropdown: React.FC = function ({ children }) { +const SessionDropdown: React.FC = function ({ children, containsUnassigned = false }) { const context = useContext(SessionContext); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -48,35 +52,51 @@ const SessionDropdown: React.FC = function ({ children }) { const [searchValue, setSearchValue] = useState(''); const [from, setFrom] = useState<'project' | 'datasource'>('project'); const [expandedKeys, setExpandedKeys] = useState([]); - const [loadedKeys, setLoadedKeys] = useState([]); - const databaseRef = useRef>({}); - const treeRef = useRef<{ - scrollTo: (node: { - key: string | number; - align?: 'top' | 'bottom' | 'auto'; - offset?: number; - }) => void; - }>(); + const update = useUpdate(); - const { data: project, loading: projectLoading, run: fetchProjects } = useRequest(listProjects, { - manual: true, - }); - const { data: datasourceList, loading: datasourceLoading, run: fetchDatasource } = useRequest( - getDataSourceGroupByProject, - { - manual: true, - }, - ); - const { - data: allDatasourceList, - loading: allDatasourceLoading, - run: fetchAllDatasource, - } = useRequest(getConnectionList, { - manual: true, - }); - const { run: fetchDatabase } = useRequest(listDatabases, { - manual: true, + const { run: fetchDatabase, refresh, data } = useRequest(listDatabases, { + manual: false, + defaultParams: [null, null, 1, 99999, null, null, containsUnassigned, true, null], }); + const dataGroup = useMemo(() => { + const datasources: Map = new Map(); + const projects: Map = new Map(); + const allProjects: IProject[] = [], + allDatasources: IDatasource[] = []; + data?.contents?.forEach((db) => { + const { project, dataSource } = db; + if (project) { + const projectDatabases = projects.get(project?.id) || { + project: project, + databases: [], + }; + projectDatabases.databases.push(db); + if (!projects.has(project?.id)) { + allProjects.push(project); + } + projects.set(project?.id, projectDatabases); + } + if (dataSource) { + const datasourceDatabases = datasources.get(dataSource?.id) || { + datasource: dataSource, + databases: [], + }; + datasourceDatabases.databases.push(db); + if (!datasources.has(dataSource?.id)) { + allDatasources.push(dataSource); + } + datasources.set(dataSource?.id, datasourceDatabases); + } + }); + + return { + datasources, + projects, + allDatasources, + allProjects, + }; + }, [data?.contents]); + function onOpen(open: boolean) { if (!open) { setIsOpen(open); @@ -88,50 +108,14 @@ const SessionDropdown: React.FC = function ({ children }) { } async function reloadTree() { setExpandedKeys([]); - setLoadedKeys([]); - if (context.datasourceMode) { - /** - * datasourceMode - */ - fetchAllDatasource({ - size: 9999, - page: 1, - minPrivilege: 'update', - }); - return; - } - - const session = context?.session; - const projectId = session?.odcDatabase?.project?.id; - const datasourceId = session?.odcDatabase?.dataSource?.id; - switch (from) { - case 'datasource': { - await fetchDatasource(login.isPrivateSpace()); - if (session) { - setExpandedKeys([datasourceId]); - treeRef.current?.scrollTo({ - key: datasourceId, - align: 'top', - }); - } - return; - } - case 'project': { - fetchProjects(null, 1, 9999, false); - if (session) { - setExpandedKeys([projectId]); - treeRef.current?.scrollTo({ - key: projectId, - align: 'top', - }); - } - return; - } - } } + useEffect(() => { + reloadTree(); + }, [from]); function treeData(): DataNode[] { + const { allDatasources, allProjects, projects, datasources } = dataGroup; if (context?.datasourceMode) { - return allDatasourceList?.contents + return allDatasources ?.map((item) => { if ( (datasourceId && toInteger(datasourceId) !== item.id) || @@ -162,7 +146,7 @@ const SessionDropdown: React.FC = function ({ children }) { } switch (from) { case 'datasource': { - return datasourceList?.contents + return allDatasources ?.map((item) => { if ( (datasourceId && toInteger(datasourceId) !== item.id) || @@ -170,7 +154,49 @@ const SessionDropdown: React.FC = function ({ children }) { ) { return null; } - const dbList = databaseRef.current[`ds:${item.id}`]; + const isNameMatched = + !searchValue || item.name?.toLowerCase().includes(searchValue?.toLowerCase()); + const dbList = datasources + .get(item.id) + ?.databases?.map((db) => { + /** + * 父节点没匹配到,变更为搜索数据库 + */ + if ( + !isNameMatched && + searchValue && + !db.name?.toLowerCase().includes(searchValue?.toLowerCase()) + ) { + return null; + } + return { + title: ( + <> + {db.name} + + + ), + key: `db:${db.id}`, + selectable: true, + isLeaf: true, + icon: ( + + ), + }; + }) + .filter(Boolean); + if (!isNameMatched && !dbList?.length) { + /** + * 父节点没匹配到,并且也不存在子节点,则不展示 + */ + return null; + } return { title: item.name, icon: ( @@ -185,58 +211,24 @@ const SessionDropdown: React.FC = function ({ children }) { key: item.id, selectable: false, isLeaf: false, - children: dbList - ?.map((db) => { - if (searchValue && !db.name?.toLowerCase().includes(searchValue?.toLowerCase())) { - return null; - } - return { - title: ( - <> - {db.name} - - - ), - key: `db:${db.id}`, - selectable: true, - isLeaf: true, - icon: ( - - ), - }; - }) - .filter(Boolean), + children: dbList, }; }) .filter(Boolean); } case 'project': { - return project?.contents?.map((item) => { - const dbList = databaseRef.current[`p:${item.id}`]; - return { - title: item.name, - icon: ( - - ), - key: item.id, - selectable: false, - isLeaf: false, - children: dbList - ?.map((db) => { - if (searchValue && !db.name?.toLowerCase().includes(searchValue?.toLowerCase())) { + return allProjects + ?.map((item) => { + const isNameMatched = + !searchValue || item.name?.toLowerCase().includes(searchValue?.toLowerCase()); + const dbList = projects + .get(item.id) + ?.databases?.map((db) => { + if ( + !isNameMatched && + searchValue && + !db.name?.toLowerCase().includes(searchValue?.toLowerCase()) + ) { return null; } return { @@ -268,45 +260,34 @@ const SessionDropdown: React.FC = function ({ children }) { ), }; }) - .filter(Boolean), - }; - }); + .filter(Boolean); + if (!isNameMatched && !dbList?.length) { + /** + * 父节点没匹配到,并且也不存在子节点,则不展示 + */ + return null; + } + return { + title: item.name, + icon: ( + + ), + key: item.id, + selectable: false, + isLeaf: false, + children: dbList, + }; + }) + .filter(Boolean); } } } - async function loadDataBase(key: Key) { - switch (from) { - case 'datasource': { - const data = await fetchDatabase(null, toInteger(key), 1, 9999, null, null, null, true); - if (data) { - databaseRef.current = { - ...databaseRef.current, - [`ds:${key}`]: data?.contents, - }; - } - return; - } - case 'project': { - const data = await fetchDatabase(toInteger(key), null, 1, 9999, null, null, null, true); - if (data) { - databaseRef.current = { - ...databaseRef.current, - [`p:${key}`]: data?.contents, - }; - } - return; - } - } - } - async function loadData(node: EventDataNode) { - const key = node.key; - await loadDataBase(key); - update(); - } - useEffect(() => { - reloadTree(); - }, [from]); return ( = function ({ children }) { }} > = function ({ children }) { const key = info.node?.key?.toString(); let dbId, dsId; if (context.datasourceMode) { - dsId = key; + dsId = toInteger(key); } else { - dbId = key?.replace('db:', ''); + dbId = toInteger(key?.replace('db:', '')); } setLoading(true); try { @@ -395,22 +374,9 @@ const SessionDropdown: React.FC = function ({ children }) { selectedKeys={[ context?.datasourceMode ? context?.datasourceId : `db:${context?.databaseId}`, ].filter(Boolean)} - loadData={loadData} height={215} showIcon treeData={treeData()} - expandedKeys={expandedKeys} - loadedKeys={loadedKeys} - onExpand={(expandedKeys, { expanded, node }) => { - if (!expanded || loadedKeys.includes(node.key)) { - setExpandedKeys(expandedKeys); - return; - } - }} - onLoad={(loadedKeys, { node }) => { - setLoadedKeys(loadedKeys); - setExpandedKeys([...expandedKeys, node.key]); - }} /> From c7348f83cf8c2680c8f433d2f41496323b594a36 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 4 Jan 2024 14:22:18 +0800 Subject: [PATCH 010/231] remove tabPane --- src/component/CommonIDE/index.tsx | 105 +++--- src/component/PageContainer/index.tsx | 22 +- src/component/Task/component/Log/index.tsx | 88 +++-- .../components/CreateTable/index.tsx | 73 ++--- .../components/CreateTable/interface.ts | 10 +- .../components/PLDebugResultSet/index.tsx | 12 +- .../components/SQLResultSet/index.tsx | 301 +++++++++--------- .../Workspace/components/TablePage/index.tsx | 177 +++++----- .../Workspace/components/ViewPage/index.tsx | 262 ++++++++------- 9 files changed, 535 insertions(+), 515 deletions(-) diff --git a/src/component/CommonIDE/index.tsx b/src/component/CommonIDE/index.tsx index f165116ec..7b0668cbb 100644 --- a/src/component/CommonIDE/index.tsx +++ b/src/component/CommonIDE/index.tsx @@ -35,12 +35,12 @@ export enum ITabType { /** * 运行结果 */ - LOG, + LOG = 'log', /** * 结果(预留) */ - RESULT, + RESULT = 'result', } interface ICommonIDEProps { /** @@ -186,58 +186,57 @@ class CommonIDE extends React.PureComponent { />
- - {log ? ( - - {log} - - ) : null} - {resultSets?.map((set, i) => { - return ( - - {!!set.columns?.length && set.status === ISqlExecuteResultStatus.SUCCESS ? ( - - ) : ( - - )} - - ); - })} - + }), + children: log, + }, + ] + .concat( + resultSets?.map((set, i) => { + return { + key: `resultset-${set.uniqKey}`, + label: this.getResultSetTitle( + set.executeSql, + `${formatMessage({ + id: 'workspace.window.sql.result', + })}${i + 1}`, + ), + children: + !!set.columns?.length && + set.status === ISqlExecuteResultStatus.SUCCESS ? ( + + ) : ( + + ), + }; + }), + ) + .filter(Boolean)} + />
) : ( diff --git a/src/component/PageContainer/index.tsx b/src/component/PageContainer/index.tsx index 718670778..338a7f82e 100644 --- a/src/component/PageContainer/index.tsx +++ b/src/component/PageContainer/index.tsx @@ -81,14 +81,16 @@ const PageContainer: React.FC = (props) => { {type === TitleType.TAB && ( - {options?.map(({ label, value }) => { - return ; + items={options?.map(({ label, value }) => { + return { + key: value?.toString(), + label: label, + }; })} - + /> )} {type === TitleType.TEXT &&
{title}
} {type === TitleType.SELECT && ( @@ -108,11 +110,13 @@ const PageContainer: React.FC = (props) => { activeKey={tabActiveKey} tabBarExtraContent={tabBarExtraContent} onChange={onTabChange} - > - {tabList?.map(({ tab, key }) => { - return ; + items={tabList?.map(({ tab, key }) => { + return { + key, + label: tab, + }; })} - + /> )}
{props?.children} diff --git a/src/component/Task/component/Log/index.tsx b/src/component/Task/component/Log/index.tsx index c72ab0491..7bf8b8532 100644 --- a/src/component/Task/component/Log/index.tsx +++ b/src/component/Task/component/Log/index.tsx @@ -49,53 +49,51 @@ const TaskLog: React.FC<{ onChange={(key) => { props.onLogTypeChange(key as CommonTaskLogType); }} - > - - - - - - + + + ), + }, + { + label: formatMessage({ id: 'odc.component.CommonTaskDetailModal.TaskLog.AlertLogs', - }) - // 告警日志 - } - key={CommonTaskLogType.WARN} - > - - - - - + }), + key: CommonTaskLogType.WARN, + children: ( + + + + ), + }, + ]} + /> ); }; export default inject('settingStore')(observer(TaskLog)); diff --git a/src/page/Workspace/components/CreateTable/index.tsx b/src/page/Workspace/components/CreateTable/index.tsx index 2291f53d2..3e4006f95 100644 --- a/src/page/Workspace/components/CreateTable/index.tsx +++ b/src/page/Workspace/components/CreateTable/index.tsx @@ -53,8 +53,6 @@ import Partition from './Partition'; import TableConstraint from './TableConstraint'; import TableIndex from './TableIndex'; -const TabPane = Tabs.TabPane; - interface IProps { pageKey: string; sessionManagerStore?: SessionManagerStore; @@ -181,42 +179,41 @@ const CreateTable: React.FC = function ({ pageKey, params, sessionManage session, }} > - - - - - - - - - - - - - - - - - + , + }, + { + key: TableTabType.COLUMN, + label: formatMessage({ id: 'odc.components.CreateTable.Column' }), + children: , + }, + { + key: TableTabType.INDEX, + label: formatMessage({ id: 'odc.components.CreateTable.Index' }), + children: , + }, + { + key: TableTabType.CONSTRAINT, + label: formatMessage({ + id: 'odc.components.CreateTable.Constraints', + }), + children: , + }, + { + key: TableTabType.PARTITION, + label: formatMessage({ id: 'odc.components.CreateTable.Partition' }), + children: , + }, + ]} + /> = (props) => { {tabs.map((cfg) => { const { name, key, renderTabContent } = cfg; - return ( - - {renderTabContent()} - - ); + return { + key, + label: name, + children: renderTabContent(), + }; })} ); diff --git a/src/page/Workspace/components/SQLResultSet/index.tsx b/src/page/Workspace/components/SQLResultSet/index.tsx index e8d1bc1ac..4674cfaa2 100644 --- a/src/page/Workspace/components/SQLResultSet/index.tsx +++ b/src/page/Workspace/components/SQLResultSet/index.tsx @@ -36,8 +36,6 @@ import styles from './index.less'; import LintResultTable from './LintResultTable'; import SQLResultLog from './SQLResultLog'; -const { TabPane } = Tabs; - export const recordsTabKey = 'records'; export const sqlLintTabKey = 'sqlLint'; export const enum MenuKey { @@ -231,67 +229,73 @@ const SQLResultSet: React.FC = function (props) { tabBarGutter={0} onChange={onChangeResultSetTab} animated={false} - > - - - - {lintResultSet?.length ? ( - - { - formatMessage({ - id: 'odc.components.SQLResultSet.Problem', - }) /*问题*/ - } + items={[ + { + label: formatMessage({ id: 'workspace.window.sql.record.title' }), + key: recordsTabKey, + children: ( + + ), + }, + lintResultSet?.length + ? { + label: ( + + { + formatMessage({ + id: 'odc.components.SQLResultSet.Problem', + }) /*问题*/ + } - - { - e.stopPropagation(); - hanldeCloseLintPage(); - }} - style={{ fontSize: '8px' }} + + { + e.stopPropagation(); + hanldeCloseLintPage(); + }} + style={{ fontSize: '8px' }} + /> + + + ), + key: sqlLintTabKey, + children: ( + - - - } - key={sqlLintTabKey} - > - - - ) : null} - {resultSets - ?.map((set: IResultSet, i: number) => { - const isResultTab = - set.columns?.length && set.status === ISqlExecuteResultStatus.SUCCESS; - const isLogTab = set.type === 'LOG'; - const tableName = set.resultSetMetaData?.table?.tableName; - if (isResultTab && resultTabCount < 30) { - const executeStage = set.timer?.stages?.find( - (stage) => stage.stageName === 'Execute', - ); + ), + } + : null, + ] + .concat( + resultSets?.map((set: IResultSet, i: number) => { + const isResultTab = + set.columns?.length && set.status === ISqlExecuteResultStatus.SUCCESS; + const isLogTab = set.type === 'LOG'; + const tableName = set.resultSetMetaData?.table?.tableName; + if (isResultTab && resultTabCount < 30) { + const executeStage = set.timer?.stages?.find( + (stage) => stage.stageName === 'Execute', + ); - const executeSQLStage = executeStage?.subStages?.find( - (stage) => stage.stageName === 'OBServer Execute SQL', - ); + const executeSQLStage = executeStage?.subStages?.find( + (stage) => stage.stageName === 'OBServer Execute SQL', + ); - resultTabCount += 1; - return ( - = function (props) { })}${resultTabCount}`, set.locked, set.uniqKey, - )} - key={set.uniqKey} - > - !c)?.length - } - rows={set.rows} - enableRowId={true} - originSql={set.originSql} - resultHeight={resultHeight - TAB_HEADER_HEIGHT} - generalSqlType={set.generalSqlType} - traceId={set.traceId} - onExport={ - set.allowExport ? (limit) => onExportResultSet(i, limit, tableName) : null - } - onShowExecuteDetail={() => onShowExecuteDetail(set.initialSql, set.traceId)} - onShowTrace={() => onShowTrace(set.initialSql, set.traceId)} - onSubmitRows={(newRows, limit, autoCommit, columns) => - onSubmitRows( - i, - newRows, - limit, - autoCommit, - columns, - set?.resultSetMetaData?.table?.databaseName, - ) - } - onUpdateEditing={(editing) => onUpdateEditing(i, editing)} - isEditing={editingMap[set.uniqKey]} - withFullLinkTrace={set?.withFullLinkTrace} - traceEmptyReason={set?.traceEmptyReason} - /> - - ); - } - if (isLogTab) { - let count = { - [ISqlExecuteResultStatus.SUCCESS]: { - lable: formatMessage({ - id: 'odc.components.SQLResultSet.SuccessfulExecution', - }), - //执行成功 - count: 0, - }, + ), + children: ( + !c)?.length + } + rows={set.rows} + enableRowId={true} + originSql={set.originSql} + resultHeight={resultHeight - TAB_HEADER_HEIGHT} + generalSqlType={set.generalSqlType} + traceId={set.traceId} + onExport={ + set.allowExport ? (limit) => onExportResultSet(i, limit, tableName) : null + } + onShowExecuteDetail={() => onShowExecuteDetail(set.initialSql, set.traceId)} + onShowTrace={() => onShowTrace(set.initialSql, set.traceId)} + onSubmitRows={(newRows, limit, autoCommit, columns) => + onSubmitRows( + i, + newRows, + limit, + autoCommit, + columns, + set?.resultSetMetaData?.table?.databaseName, + ) + } + onUpdateEditing={(editing) => onUpdateEditing(i, editing)} + isEditing={editingMap[set.uniqKey]} + withFullLinkTrace={set?.withFullLinkTrace} + traceEmptyReason={set?.traceEmptyReason} + /> + ), + }; + } + if (isLogTab) { + let count = { + [ISqlExecuteResultStatus.SUCCESS]: { + lable: formatMessage({ + id: 'odc.components.SQLResultSet.SuccessfulExecution', + }), + //执行成功 + count: 0, + }, - [ISqlExecuteResultStatus.FAILED]: { - lable: formatMessage({ - id: 'odc.components.SQLResultSet.ExecutionFailed', - }), - //执行失败 - count: 0, - }, + [ISqlExecuteResultStatus.FAILED]: { + lable: formatMessage({ + id: 'odc.components.SQLResultSet.ExecutionFailed', + }), + //执行失败 + count: 0, + }, - [ISqlExecuteResultStatus.CANCELED]: { - lable: formatMessage({ - id: 'odc.components.SQLResultSet.CancelExecution', - }), - //执行取消 - count: 0, - }, - }; + [ISqlExecuteResultStatus.CANCELED]: { + lable: formatMessage({ + id: 'odc.components.SQLResultSet.CancelExecution', + }), + //执行取消 + count: 0, + }, + }; - set?.logTypeData?.forEach((item) => { - count[item.status].count += 1; - }); - const hasError = - count[ISqlExecuteResultStatus.SUCCESS].count !== set?.logTypeData?.length; - return ( - { + count[item.status].count += 1; + }); + const hasError = + count[ISqlExecuteResultStatus.SUCCESS].count !== set?.logTypeData?.length; + return { + label: ( @@ -427,16 +429,15 @@ const SQLResultSet: React.FC = function (props) { - } - key={set.uniqKey} - > - - - ); - } - }) + ), + key: set.uniqKey, + children: , + }; + } + }), + ) .filter(Boolean)} - + /> ); }; diff --git a/src/page/Workspace/components/TablePage/index.tsx b/src/page/Workspace/components/TablePage/index.tsx index 54ae7fd39..797fd97e3 100644 --- a/src/page/Workspace/components/TablePage/index.tsx +++ b/src/page/Workspace/components/TablePage/index.tsx @@ -45,9 +45,6 @@ import SessionContext from '../SessionContextWrap/context'; import WrapSessionPage from '../SessionContextWrap/SessionPageWrap'; import styles from './index.less'; -const Content = Layout.Content; -const TabPane = Tabs.TabPane; - interface IProps { pageKey: string; pageStore?: PageStore; @@ -225,89 +222,97 @@ const TablePage: React.FC = function ({ params, pageStore, pageKey, sett activeKey={topTab} className={styles.topbarTab} animated={false} - > - - - - - - - - - - - - - - - - {enableConstraint && ( - - - - - - )} - - {showPartition ? ( - - - - - - ) : null} - - - - - - - {version.current > 0 ? ( - - ) : null} - - + items={[ + { + key: TopTab.PROPS, + label: '', + children: ( + , + }, + { + label: formatMessage({ + id: 'workspace.window.table.propstab.column', + }), + key: PropsTab.COLUMN, + children: ( + + + + ), + }, + { + key: PropsTab.INDEX, + label: formatMessage({ + id: 'workspace.window.table.propstab.index', + }), + children: ( + + + + ), + }, + enableConstraint && { + children: ( + + + + ), + key: PropsTab.CONSTRAINT, + label: formatMessage({ + id: 'workspace.window.table.propstab.constraint', + }), + }, + showPartition + ? { + key: PropsTab.PARTITION, + label: formatMessage({ + id: 'workspace.window.table.propstab.partition', + }), + childen: ( + + + + ), + } + : null, + { + key: PropsTab.DDL, + label: formatMessage({ + id: 'workspace.window.table.propstab.ddl', + }), + children: , + }, + ].filter(Boolean)} + /> + ), + }, + { + key: TopTab.DATA, + label: '', + children: + version.current > 0 ? ( + + ) : null, + }, + ]} + />
diff --git a/src/page/Workspace/components/ViewPage/index.tsx b/src/page/Workspace/components/ViewPage/index.tsx index a04fbf5b7..8452b37c0 100644 --- a/src/page/Workspace/components/ViewPage/index.tsx +++ b/src/page/Workspace/components/ViewPage/index.tsx @@ -45,7 +45,6 @@ import { getDataSourceModeConfig } from '@/common/datasource'; import { formatMessage } from '@/util/intl'; const { Content } = Layout; -const { TabPane } = Tabs; const ToolbarButton = Toolbar.Button; const GLOBAL_HEADER_HEIGHT = 40; @@ -396,128 +395,147 @@ class ViewPage extends Component - - void} - > - - - - - this.reloadViewColumns(viewName)} - /> - - - - } - onClick={() => { - downloadPLDDL( - view?.viewName, - 'VIEW', - view?.ddl, - this.props.session?.odcDatabase?.name, - ); - }} - /> - - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - -
- { - this.editor = editor; - }} - /> -
-
-
-
- - - {resultSet && ( - this.reloadViewData(viewName, false, limit)} - onExport={(limitToExport) => { - this.setState({ - limitToExport, - }); - this.showExportResuleSetModal(); - }} + items={[ + { + key: TopTab.PROPS, + label: '', + children: ( + void} + items={[ + { + key: PropsTab.INFO, + label: formatMessage({ + id: 'workspace.window.table.propstab.info', + }), + children: , + }, + { + label: formatMessage({ + id: 'workspace.window.table.propstab.column', + }), + key: PropsTab.COLUMN, + children: ( + this.reloadViewColumns(viewName)} + /> + ), + }, + { + key: PropsTab.DDL, + label: 'DDL', + children: ( + <> + + } + onClick={() => { + downloadPLDDL( + view?.viewName, + 'VIEW', + view?.ddl, + this.props.session?.odcDatabase?.name, + ); + }} + /> + + } + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + +
+ { + this.editor = editor; + }} + /> +
+ + ), + }, + ]} /> - )} -
-
- + ), + }, + { + key: TopTab.DATA, + label: '', + children: ( + + {resultSet && ( + this.reloadViewData(viewName, false, limit)} + onExport={(limitToExport) => { + this.setState({ + limitToExport, + }); + this.showExportResuleSetModal(); + }} + /> + )} + + ), + }, + ]} + /> ) From 64abead421d39f0a18e6f0fb91852e9e2b7673f9 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 4 Jan 2024 16:24:44 +0800 Subject: [PATCH 011/231] remove antdv4 tabPane --- .../StructConfigPanel/RecordSQLView/index.tsx | 21 +- .../StructAnalysisResult/index.tsx | 178 ++--- src/component/WindowManager/index.tsx | 17 +- .../Role/component/ResourceSelector/index.tsx | 233 +++---- .../Env/components/InnerEnvironment.tsx | 29 +- .../CreateTable/TableConstraint/index.tsx | 78 ++- .../components/CreateViewPage/index.tsx | 35 +- .../components/FunctionPage/index.tsx | 211 +++--- .../components/CompileResult/index.tsx | 77 +-- .../components/PackagePage/index.tsx | 591 +++++++++-------- .../components/ProcedurePage/index.tsx | 214 +++--- .../components/SequencePage/index.tsx | 303 ++++----- .../components/SynonymPage/index.tsx | 249 +++---- .../components/ToolPageTabs/index.tsx | 15 +- .../components/TriggerPage/index.tsx | 617 ++++++++---------- .../Workspace/components/TypePage/index.tsx | 330 +++++----- 16 files changed, 1621 insertions(+), 1577 deletions(-) diff --git a/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/RecordSQLView/index.tsx b/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/RecordSQLView/index.tsx index 806a870d5..7d31ea57c 100644 --- a/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/RecordSQLView/index.tsx +++ b/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/RecordSQLView/index.tsx @@ -23,6 +23,7 @@ import { useRequest } from 'ahooks'; import { Drawer, Row, Space, Spin } from 'antd'; import { forwardRef, useImperativeHandle, useState } from 'react'; import { IShadowSyncAnalysisResult } from '../../interface'; +import { getDataSourceModeConfigByConnectionMode } from '@/common/datasource'; export interface IViewRef { open: (record: IShadowSyncAnalysisResult['tables'][number]) => void; @@ -63,7 +64,7 @@ const RecordSQLView = forwardRef - +
@@ -113,7 +118,11 @@ const RecordSQLView = forwardRef - +
@@ -131,7 +140,11 @@ const RecordSQLView = forwardRef - +
diff --git a/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/StructAnalysisResult/index.tsx b/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/StructAnalysisResult/index.tsx index cdf88c2fe..a6ce8d1b0 100644 --- a/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/StructAnalysisResult/index.tsx +++ b/src/component/Task/ShadowSyncTask/CreateModal/StructConfigPanel/StructAnalysisResult/index.tsx @@ -24,6 +24,7 @@ import { useMemo, useRef, useState } from 'react'; import { IShadowSyncAnalysisResult, ShadowTableSyncTaskResult } from '../../interface'; import RecordSQLView, { IViewRef } from '../RecordSQLView'; import { useColumns } from './column'; +import { getDataSourceModeConfigByConnectionMode } from '@/common/datasource'; enum TabKeys { SYNC = 'sync', @@ -90,6 +91,7 @@ export default function ({ data, resultData, connectionMode, skip, cancelSkip }: }); return [_syncTable, _unSyncTable]; }, [data?.tables]); + const config = getDataSourceModeConfigByConnectionMode(connectionMode); return ( <> { setActiveKey(v); }} - > - - { - return await skip(keys); - }, - }, - ], - } - } - tableProps={{ - rowKey: 'id', - pagination: { - pageSize: 15, - }, - scroll: { - x: 650, - }, - dataSource: syncTable, - columns: syncColumns, - }} - onLoad={async () => {}} - /> - - - {}} - /> - - -
- -
-
-
+ items={[ + { + key: TabKeys.SYNC, + label: formatMessage({ + id: 'odc.StructConfigPanel.StructAnalysisResult.SynchronizedTables', + }), + style: { paddingBottom: 50 }, + children: ( + { + return await skip(keys); + }, + }, + ], + } + } + tableProps={{ + rowKey: 'id', + pagination: { + pageSize: 15, + }, + scroll: { + x: 650, + }, + dataSource: syncTable, + columns: syncColumns, + }} + onLoad={async () => {}} + /> + ), + }, + { + key: TabKeys.UNSYNC, + label: formatMessage({ + id: 'odc.StructConfigPanel.StructAnalysisResult.UnsynchronizedTables', + }), + style: { paddingBottom: 50 }, + children: ( + {}} + /> + ), + }, + { + key: TabKeys.SQL, + label: formatMessage({ + id: 'odc.StructConfigPanel.StructAnalysisResult.SqlPreview', + }), + children: ( +
+ +
+ ), + }, + ]} + /> ); diff --git a/src/component/WindowManager/index.tsx b/src/component/WindowManager/index.tsx index 02468f31a..bc9fa0611 100644 --- a/src/component/WindowManager/index.tsx +++ b/src/component/WindowManager/index.tsx @@ -30,7 +30,6 @@ import { getPageTitleText } from './helper'; import styles from './index.less'; import tracert from '@/util/tracert'; import ResourceTreeContext from '@/page/Workspace/context/ResourceTreeContext'; -const { TabPane } = Tabs; interface IProps { pages: IPage[]; @@ -367,12 +366,14 @@ const WindowManager: React.FC = function (props) { } - > - {pages.map((page) => { + items={pages.map((page) => { const Page = pageMap[page.type].component; const pageParams = Object.assign({}, pageMap[page.type].params || {}, page.params); - return ( - + return { + key: page.key, + label: getPageTitle(page), + closable: true, + children: ( = function (props) { onSaveAndCloseUnsavedModal={handleSaveAndClosePage} closeSelf={handleCloseTab.bind(null, page.key)} /> - - ); + ), + }; })} - + /> ); diff --git a/src/page/Auth/Role/component/ResourceSelector/index.tsx b/src/page/Auth/Role/component/ResourceSelector/index.tsx index f39e24aeb..bab152e3f 100644 --- a/src/page/Auth/Role/component/ResourceSelector/index.tsx +++ b/src/page/Auth/Role/component/ResourceSelector/index.tsx @@ -35,8 +35,6 @@ import { } from './const'; import styles from './index.less'; -const { TabPane } = Tabs; - const getOptions = ( type: IManagerResourceType, data: { @@ -172,124 +170,129 @@ const FormResourceSelector: React.FC<{ /* 权限设置 */ className={styles.noOptional} > {permissionType.length ? ( - - {EnableRoleSystemPermission && - permissionType.includes('resourceManagementPermissions') && ( - - - - odc.appConfig.manage.user.create - ? true - : item.value !== IManagerResourceType.user, - )} - /> - -
-
- { - formatMessage({ - id: 'odc.components.FormResourceSelector.ManageableObjects', - }) /*可管理的对象*/ - } -
-
- + }), + children: ( + <> + + + odc.appConfig.manage.user.create + ? true + : item.value !== IManagerResourceType.user, + )} + /> + +
+
+ { + formatMessage({ + id: 'odc.components.FormResourceSelector.ManageableObjects', + }) /*可管理的对象*/ + } +
+
+ + { + formatMessage({ + id: 'odc.components.FormResourceSelector.ManagePermissions', + }) /*管理权限*/ + } + +
+
+ + item.value !== IManagerResourceType.project, + )} + actionOptions={resourceManagementActionOptions} + initialValue={initialValue} + isEdit={isEdit} + isCopy={isCopy} + formRef={formRef} + required={false} + onFieldChange={handleFieldChange} + onOptionsChange={handleResourceManagementOptionsChange} + /> + + + ), + }, + permissionType.includes('systemOperationPermissions') && { + key: 'systemOperationPermissions', + label: formatMessage({ + id: 'odc.components.FormResourceSelector.SystemOperatingPermissions', + }), + forceRender: true, + children: ( + <> +
+
{ formatMessage({ - id: 'odc.components.FormResourceSelector.ManagePermissions', - }) /*管理权限*/ + id: 'odc.components.FormResourceSelector.OperationalType', + }) /*可操作的类型*/ } - +
+
+ + { + formatMessage({ + id: 'odc.components.FormResourceSelector.OperationPermission', + }) /*操作权限*/ + } + +
-
- - item.value !== IManagerResourceType.project, - )} - actionOptions={resourceManagementActionOptions} - initialValue={initialValue} - isEdit={isEdit} - isCopy={isCopy} - formRef={formRef} - required={false} - onFieldChange={handleFieldChange} - onOptionsChange={handleResourceManagementOptionsChange} - /> - - - )} - - {permissionType.includes('systemOperationPermissions') && ( - -
-
- { - formatMessage({ - id: 'odc.components.FormResourceSelector.OperationalType', - }) /*可操作的类型*/ - } -
-
- - { - formatMessage({ - id: 'odc.components.FormResourceSelector.OperationPermission', - }) /*操作权限*/ - } - -
-
- - - !isUndefined(item.visible) ? item.visible : true, - )} - actionOptions={systemActionOptions} - initialValue={initialValue} - isEdit={isEdit} - isCopy={isCopy} - formRef={formRef} - onFieldChange={handleFieldChange} - /> - -
- )} - + + + !isUndefined(item.visible) ? item.visible : true, + )} + actionOptions={systemActionOptions} + initialValue={initialValue} + isEdit={isEdit} + isCopy={isCopy} + formRef={formRef} + onFieldChange={handleFieldChange} + /> + + + ), + }, + ].filter(Boolean)} + /> ) : ( { diff --git a/src/page/Secure/Env/components/InnerEnvironment.tsx b/src/page/Secure/Env/components/InnerEnvironment.tsx index 5906c9dcd..029faf93d 100644 --- a/src/page/Secure/Env/components/InnerEnvironment.tsx +++ b/src/page/Secure/Env/components/InnerEnvironment.tsx @@ -75,24 +75,21 @@ const InnerEnvironment = memo(({ ruleType, setRuleType }: InnerEnvironmentProps) className={styles.tabs} activeKey={ruleType} onTabClick={handleTabClick} - > - - - + }), + }, + ]} + />
= function ({ modified }) { const tableContext = useContext(TableContext); const config = useTableConfig(tableContext?.session?.connection.dialectType); return ( - - - - - - - - - - - {config.enableCheckConstraint && ( - , + }, + { + key: ConstraintType.Unique, + label: formatMessage({ + id: 'odc.CreateTable.TableConstraint.UniqueConstraint', + }), + children: , + }, + { + key: ConstraintType.Foreign, + label: formatMessage({ + id: 'odc.CreateTable.TableConstraint.ForeignKeyConstraint', + }), + children: , + }, + config.enableCheckConstraint && { + key: ConstraintType.Check, + label: formatMessage({ id: 'odc.CreateTable.TableConstraint.CheckConstraints', - })} - /*检查约束*/ key={ConstraintType.Check} - > - - - )} - + }), + children: , + }, + ].filter(Boolean)} + /> ); }; diff --git a/src/page/Workspace/components/CreateViewPage/index.tsx b/src/page/Workspace/components/CreateViewPage/index.tsx index aa842655a..63d53a703 100644 --- a/src/page/Workspace/components/CreateViewPage/index.tsx +++ b/src/page/Workspace/components/CreateViewPage/index.tsx @@ -40,7 +40,6 @@ import ColumnSelector from './component/ColumnSelector'; import TableSelector from './component/TableSelector'; import styles from './index.less'; -const { TabPane } = Tabs; const { Content } = Layout; const { Panel } = Collapse; const RESULT_HEIGHT = 230; @@ -453,22 +452,24 @@ class CreateViewPage extends Component< tabBarGutter={0} className={styles.tabs} animated={false} - > - -
- - {formatMessage({ id: 'workspace.window.sql.result.failure' })} -
{executeSql}
-
- {formatMessage({ id: 'workspace.window.sql.result.failureReason' })} -
-
{errStack}
-
-
- + items={[ + { + key: 'SQL_EXEC_RESULT', + label: formatMessage({ id: 'odc.components.CreateViewPage.Result' }), + children: ( +
+ + {formatMessage({ id: 'workspace.window.sql.result.failure' })} +
{executeSql}
+
+ {formatMessage({ id: 'workspace.window.sql.result.failureReason' })} +
+
{errStack}
+
+ ), + }, + ]} + /> ); }; diff --git a/src/page/Workspace/components/FunctionPage/index.tsx b/src/page/Workspace/components/FunctionPage/index.tsx index 98171429b..a1e686661 100644 --- a/src/page/Workspace/components/FunctionPage/index.tsx +++ b/src/page/Workspace/components/FunctionPage/index.tsx @@ -54,7 +54,6 @@ import { formatMessage } from '@/util/intl'; const ToolbarButton = Toolbar.Button; const { Content } = Layout; -const { TabPane } = Tabs; // 顶层 Tab key 枚举 export enum TopTab { @@ -258,102 +257,120 @@ class FunctionPage extends Component< tabPosition="left" className={styles.propsTab} onChange={this.handlePropsTabChanged as any} - > - - - - - - } - onClick={this.reloadFunction.bind(this, func.funName)} - /> - - - - - - {getDataSourceModeConfig(session?.connection?.type)?.features?.plEdit && ( - } - onClick={this.editFunction.bind(this, func.funName)} - /> - )} - - } - onClick={() => { - downloadPLDDL(funName, PLType.FUNCTION, func?.ddl, session?.database?.dbName); - }} - /> - - } - onClick={this.showSearchWidget.bind(this)} - /> - - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - } - onClick={this.reloadFunction.bind(this, func.funName)} - /> - -
- { - this.editor = editor; - }} - /> -
-
- + items={[ + { + key: PropsTab.INFO, + label: formatMessage({ + id: 'workspace.window.table.propstab.info', + }), + children: , + }, + { + key: PropsTab.PARAMS, + label: formatMessage({ + id: 'workspace.window.function.propstab.params', + }), + children: ( + <> + + } + onClick={this.reloadFunction.bind(this, func.funName)} + /> + + + + ), + }, + { + key: PropsTab.DDL, + label: 'DDL', + children: ( + <> + + {getDataSourceModeConfig(session?.connection?.type)?.features?.plEdit && ( + } + onClick={this.editFunction.bind(this, func.funName)} + /> + )} + + } + onClick={() => { + downloadPLDDL( + funName, + PLType.FUNCTION, + func?.ddl, + session?.database?.dbName, + ); + }} + /> + + } + onClick={this.showSearchWidget.bind(this)} + /> + + } + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + } + onClick={this.reloadFunction.bind(this, func.funName)} + /> + +
+ { + this.editor = editor; + }} + /> +
+ + ), + }, + ]} + /> ) diff --git a/src/page/Workspace/components/PLBatchCompilePage/components/CompileResult/index.tsx b/src/page/Workspace/components/PLBatchCompilePage/components/CompileResult/index.tsx index c55effba5..15c42c833 100644 --- a/src/page/Workspace/components/PLBatchCompilePage/components/CompileResult/index.tsx +++ b/src/page/Workspace/components/PLBatchCompilePage/components/CompileResult/index.tsx @@ -25,8 +25,6 @@ import { CompileStatus } from '../../index'; import { Status } from '../Status'; import styles from './index.less'; -const TabPane = Tabs.TabPane; - const getPageColumns = (openEditPage: (title: string, type?: string) => void) => { return [ { @@ -142,43 +140,46 @@ const CompileResult: React.FC = (props) => { }) ?? []; return ( - - - {status === CompileStatus.RUNNING ? ( - - - - { - formatMessage( + + + { - id: 'odc.components.CompileResult.CompilingCompletedcountTotalcount', - }, - - { completedCount: completedCount, totalCount: totalCount }, - ) - //`编译中 (${completedCount}/${totalCount})...` - } - - - ) : ( - - )} - - + formatMessage( + { + id: 'odc.components.CompileResult.CompilingCompletedcountTotalcount', + }, + + { completedCount: completedCount, totalCount: totalCount }, + ) + //`编译中 (${completedCount}/${totalCount})...` + } + + + ) : ( + + ), + }, + ]} + /> ); }; diff --git a/src/page/Workspace/components/PackagePage/index.tsx b/src/page/Workspace/components/PackagePage/index.tsx index 1a1d44b33..4d1fefd3a 100644 --- a/src/page/Workspace/components/PackagePage/index.tsx +++ b/src/page/Workspace/components/PackagePage/index.tsx @@ -53,7 +53,6 @@ import styles from './index.less'; const ToolbarButton = Toolbar.Button; const { Content } = Layout; -const { TabPane } = Tabs; // 顶层 Tab key 枚举 export enum TopTab { @@ -295,295 +294,319 @@ class PackagePage extends Component { activeKey={topTab} className={styles.topbarTab} animated={false} - > - {pkg.packageHead ? ( - - - - -

- {formatMessage( + items={[ + pkg.packageHead + ? { + key: TopTab.HEAD, + label: '', + children: ( + +

+ {formatMessage( + { + id: 'odc.components.PackagePage.PackageNamePkgpackagename', + }, + + { pkgPackageName: pkg.packageName }, + )} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.Created', + })} + + {pkg.packageHead.basicInfo.definer} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.Created.2', + })} + + {moment(pkg.packageHead.basicInfo.createTime).format( + 'YYYY-MM-DD HH:mm', + )} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.LastModifiedTime', + })} + {moment(pkg.packageHead.basicInfo.modifyTime).format( + 'YYYY-MM-DD HH:mm', + )}{' '} +

+
+ ), }, - - { pkgPackageName: pkg.packageName }, - )} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.Created', - })} - - {pkg.packageHead.basicInfo.definer} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.Created.2', - })} - - {moment(pkg.packageHead.basicInfo.createTime).format('YYYY-MM-DD HH:mm')} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.LastModifiedTime', - })} - {moment(pkg.packageHead.basicInfo.modifyTime).format('YYYY-MM-DD HH:mm')}{' '} -

- -
- - - } - onClick={this.handleEditPackage.bind( - this, - pkg.packageName, - PropsTab.PACKAGE_HEAD_CODE, - )} - /> - } - onClick={() => { - downloadPLDDL( - packageName + '.head', - PLType.PKG_HEAD, - pkg?.packageHead?.basicInfo?.ddl, - dbName, - ); - }} - /> - - } - onClick={this.showSearchWidget.bind(this)} - /> - - } - onClick={() => { - this.handleFormat( - this.editor_header, - 'headerFormated', - pkg?.packageHead?.basicInfo?.ddl, - ); - }} - status={headerFormated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - } - onClick={this.reloadPackage} - status={reloading ? IConStatus.ACTIVE : IConStatus.INIT} - /> - -
- { - this.editor_header = editor; - }} - /> -
-
-
-
- ) : null} - - {pkg.packageBody ? ( - - - - -

- {formatMessage( { - id: 'odc.components.PackagePage.PackageNamePkgpackagename', + key: PropsTab.PACKAGE_HEAD_CODE, + label: 'DDL', + children: ( + <> + + } + onClick={this.handleEditPackage.bind( + this, + pkg.packageName, + PropsTab.PACKAGE_HEAD_CODE, + )} + /> + } + onClick={() => { + downloadPLDDL( + packageName + '.head', + PLType.PKG_HEAD, + pkg?.packageHead?.basicInfo?.ddl, + dbName, + ); + }} + /> + + } + onClick={this.showSearchWidget.bind(this)} + /> + + } + onClick={() => { + this.handleFormat( + this.editor_header, + 'headerFormated', + pkg?.packageHead?.basicInfo?.ddl, + ); + }} + status={headerFormated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + } + onClick={this.reloadPackage} + status={reloading ? IConStatus.ACTIVE : IConStatus.INIT} + /> + +

+ { + this.editor_header = editor; + }} + /> +
+ + ), }, - - { pkgPackageName: pkg.packageName }, - )} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.Created', - })} - - {pkg.packageBody.basicInfo.definer} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.Created.2', - })} - - {moment(pkg.packageBody.basicInfo.createTime).format('YYYY-MM-DD HH:mm')} -

-

- {formatMessage({ - id: 'odc.components.PackagePage.LastModifiedTime', - })} - {moment(pkg.packageBody.basicInfo.modifyTime).format('YYYY-MM-DD HH:mm')}{' '} -

-
-
- - - } - onClick={this.handleEditPackage.bind( - this, - pkg.packageName, - PropsTab.PACKAGE_BODY_CODE, - )} - /> - } - onClick={() => { - downloadPLDDL( - packageName + '.body', - PLType.PKG_BODY, - pkg.packageBody.basicInfo.ddl, - dbName, - ); - }} - /> - - } - onClick={this.showSearchWidget.bind(this)} + ]} /> - - } - onClick={() => { - this.handleFormat( - this.editor_body, - 'bodyFormated', - pkg.packageBody.basicInfo.ddl, - ); - }} - status={bodyFormated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - } - onClick={this.reloadPackage} - status={reloading ? IConStatus.ACTIVE : IConStatus.INIT} - /> - -
- { - this.editor_body = editor; - }} + ), + } + : null, + pkg.packageBody + ? { + key: TopTab.BODY, + label: '', + children: ( + +

+ {formatMessage( + { + id: 'odc.components.PackagePage.PackageNamePkgpackagename', + }, + + { pkgPackageName: pkg.packageName }, + )} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.Created', + })} + + {pkg.packageBody.basicInfo.definer} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.Created.2', + })} + + {moment(pkg.packageBody.basicInfo.createTime).format( + 'YYYY-MM-DD HH:mm', + )} +

+

+ {formatMessage({ + id: 'odc.components.PackagePage.LastModifiedTime', + })} + {moment(pkg.packageBody.basicInfo.modifyTime).format( + 'YYYY-MM-DD HH:mm', + )}{' '} +

+ + ), + }, + { + key: PropsTab.PACKAGE_BODY_CODE, + label: 'DDL', + children: ( + <> + + } + onClick={this.handleEditPackage.bind( + this, + pkg.packageName, + PropsTab.PACKAGE_BODY_CODE, + )} + /> + } + onClick={() => { + downloadPLDDL( + packageName + '.body', + PLType.PKG_BODY, + pkg.packageBody.basicInfo.ddl, + dbName, + ); + }} + /> + + } + onClick={this.showSearchWidget.bind(this)} + /> + + } + onClick={() => { + this.handleFormat( + this.editor_body, + 'bodyFormated', + pkg.packageBody.basicInfo.ddl, + ); + }} + status={bodyFormated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + } + onClick={this.reloadPackage} + status={reloading ? IConStatus.ACTIVE : IConStatus.INIT} + /> + +
+ { + this.editor_body = editor; + }} + /> +
+ + ), + }, + ]} /> -
-
- {/* - {pkg.packageBody.basicInfo.refer} - - - {pkg.packageBody.basicInfo.referd} - */} -
-
- ) : null} - + ), + } + : null, + ].filter(Boolean)} + /> ); diff --git a/src/page/Workspace/components/ProcedurePage/index.tsx b/src/page/Workspace/components/ProcedurePage/index.tsx index 593e8e5a7..777aa34b3 100644 --- a/src/page/Workspace/components/ProcedurePage/index.tsx +++ b/src/page/Workspace/components/ProcedurePage/index.tsx @@ -55,7 +55,6 @@ import { formatMessage } from '@/util/intl'; const ToolbarButton = Toolbar.Button; const { Content } = Layout; -const { TabPane } = Tabs; // 顶层 Tab key 枚举 export enum TopTab { @@ -257,105 +256,120 @@ class ProcedurePage extends Component< tabPosition="left" className={styles.propsTab} onChange={this.handlePropsTabChanged as any} - > - - - - - - } - onClick={this.reloadProcedure.bind(this, procedure.proName)} - /> - - - - - - } - onClick={this.editProcedure.bind(this, procedure.proName)} - /> - } - onClick={() => { - downloadPLDDL( - proName, - PLType.PROCEDURE, - procedure?.ddl, - session?.odcDatabase.name, - ); - }} - /> - - } - onClick={this.showSearchWidget.bind(this)} - /> - - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - } - onClick={this.reloadProcedure.bind(this, procedure.proName)} - /> - -
- { - this.editor = editor; - }} - /> -
-
- + items={[ + { + key: PropsTab.INFO, + label: formatMessage({ + id: 'workspace.window.table.propstab.info', + }), + children: , + }, + { + key: PropsTab.PARAMS, + label: formatMessage({ + id: 'workspace.window.function.propstab.params', + }), + children: ( + <> + + } + onClick={this.reloadProcedure.bind(this, procedure.proName)} + /> + + + + ), + }, + { + key: PropsTab.DDL, + label: 'DDL', + children: ( + <> + + } + onClick={this.editProcedure.bind(this, procedure.proName)} + /> + } + onClick={() => { + downloadPLDDL( + proName, + PLType.PROCEDURE, + procedure?.ddl, + session?.odcDatabase.name, + ); + }} + /> + + } + onClick={this.showSearchWidget.bind(this)} + /> + + } + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + } + onClick={this.reloadProcedure.bind(this, procedure.proName)} + /> + +
+ { + this.editor = editor; + }} + /> +
+ + ), + }, + ]} + /> ) diff --git a/src/page/Workspace/components/SequencePage/index.tsx b/src/page/Workspace/components/SequencePage/index.tsx index f9a75d0c8..58196ee41 100644 --- a/src/page/Workspace/components/SequencePage/index.tsx +++ b/src/page/Workspace/components/SequencePage/index.tsx @@ -44,7 +44,6 @@ import styles from './index.less'; import { getDataSourceModeConfig } from '@/common/datasource'; const { Content } = Layout; -const { TabPane } = Tabs; const ToolbarButton = Toolbar.Button; // 属性 Tab key 枚举 @@ -165,159 +164,171 @@ class SequencePage extends Component tabPosition="left" className={styles.propsTab} onChange={this.handlePropsTabChanged as any} - > - - - } - onClick={this.showSequenceEditModal} - /> + items={[ + { + key: PropsTab.INFO, + label: formatMessage({ + id: 'workspace.window.sequence.propstab.info', + }), + children: ( + <> + + } + onClick={this.showSequenceEditModal} + /> - } - onClick={this.reloadSequence.bind(this, params.sequenceName)} - /> - - } + onClick={this.reloadSequence.bind(this, params.sequenceName)} + /> + + - - - - } - onClick={() => { - downloadPLDDL( - sequence?.name, - 'SEQUENCE', - sequence?.ddl, - this.props.session?.odcDatabase?.name, - ); - }} - /> + { + label: formatMessage({ + id: 'odc.components.SequencePage.CacheSettings', + }), + // 缓存设置 + content: sequence.cached + ? formatMessage({ + id: 'odc.components.SequencePage.Cache', + }) + + // `缓存 ` + sequence.cacheSize + : formatMessage({ + id: 'odc.components.SequencePage.NoCache', + }), + // 不缓存 + }, + { + label: formatMessage({ + id: 'odc.components.SequencePage.Sort', + }), + // 是否排序 + content: sequence.orderd + ? formatMessage({ id: 'odc.components.SequencePage.Is' }) // 是 + : formatMessage({ id: 'odc.components.SequencePage.No' }), // 否 + }, + { + label: formatMessage({ + id: 'odc.components.SequencePage.LoopOrNot', + }), + // 是否循环 + content: sequence.cycled + ? formatMessage({ id: 'odc.components.SequencePage.Is' }) // 是 + : formatMessage({ id: 'odc.components.SequencePage.No' }), // 否 + }, + { + label: formatMessage({ + id: 'odc.components.SequencePage.Owner', + }), + // 所有者 + content: sequence.user, + }, + ]} + /> + + ), + }, + { + key: PropsTab.DDL, + label: 'DDL', + children: ( + <> + + } + onClick={() => { + downloadPLDDL( + sequence?.name, + 'SEQUENCE', + sequence?.ddl, + this.props.session?.odcDatabase?.name, + ); + }} + /> - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> + // 格式化 + } + icon={} + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> - } - onClick={this.reloadSequence.bind(this, params.sequenceName)} - /> - -
- { - this.editor = editor; - }} - /> -
-
- + } + onClick={this.reloadSequence.bind(this, params.sequenceName)} + /> + +
+ { + this.editor = editor; + }} + /> +
+ + ), + }, + ]} + /> ) : ( diff --git a/src/page/Workspace/components/SynonymPage/index.tsx b/src/page/Workspace/components/SynonymPage/index.tsx index b25414b36..e2d08a354 100644 --- a/src/page/Workspace/components/SynonymPage/index.tsx +++ b/src/page/Workspace/components/SynonymPage/index.tsx @@ -40,7 +40,6 @@ import styles from './index.less'; import { getDataSourceModeConfig } from '@/common/datasource'; const { Content } = Layout; -const { TabPane } = Tabs; const ToolbarButton = Toolbar.Button; interface IProps { pageStore: PageStore; @@ -152,129 +151,143 @@ class SynonymPage extends Component< synonym && ( <> - - - -
- - { - formatMessage({ - id: 'odc.components.SynonymPage.Name', - }) + +
+ + { + formatMessage({ + id: 'odc.components.SynonymPage.Name', + }) - /* 名称: */ - } - - {synonym.synonymName} -
-
- - { - formatMessage({ - id: 'odc.components.SynonymPage.ObjectOwner', - }) + /* 名称: */ + } + + {synonym.synonymName} +
+
+ + { + formatMessage({ + id: 'odc.components.SynonymPage.ObjectOwner', + }) - /* 对象所有者: */ - } - - {synonym.tableOwner} -
-
- - { - formatMessage({ - id: 'odc.components.SynonymPage.ObjectName', - }) + /* 对象所有者: */ + } + + {synonym.tableOwner} +
+
+ + { + formatMessage({ + id: 'odc.components.SynonymPage.ObjectName', + }) - /* 对象名称: */ - } - - {synonym.tableName} -
-
- - { - formatMessage({ - id: 'odc.components.SynonymPage.Created', - }) + /* 对象名称: */ + } + + {synonym.tableName} +
+
+ + { + formatMessage({ + id: 'odc.components.SynonymPage.Created', + }) - /* 创建时间: */ - } - - - {moment(synonym.created).format('YYYY-MM-DD HH:mm:ss')} - -
-
- - { - formatMessage({ - id: 'odc.components.SynonymPage.ModificationTime', - }) + /* 创建时间: */ + } + + + {moment(synonym.created).format('YYYY-MM-DD HH:mm:ss')} + +
+
+ + { + formatMessage({ + id: 'odc.components.SynonymPage.ModificationTime', + }) - /* 修改时间: */ - } - - - {moment(synonym.lastDdlTime).format('YYYY-MM-DD HH:mm:ss')} - -
- - - - - } - onClick={() => { - downloadPLDDL( - synonym?.synonymName, - PLType.SYNONYM, - synonym?.ddl, - session?.odcDatabase?.name, - ); - }} - /> + /* 修改时间: */ + } +
+ + {moment(synonym.lastDdlTime).format('YYYY-MM-DD HH:mm:ss')} + +
+
+ ), + }, + { + key: SynonymPropsTab.DDL, + label: 'DDL', + children: ( + <> + + } + onClick={() => { + downloadPLDDL( + synonym?.synonymName, + PLType.SYNONYM, + synonym?.ddl, + session?.odcDatabase?.name, + ); + }} + /> - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - -
- { - this.editor = editor; - }} - /> -
-
-
+ } + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + +
+ { + this.editor = editor; + }} + /> +
+ + ), + }, + ]} + />
) diff --git a/src/page/Workspace/components/ToolPageTabs/index.tsx b/src/page/Workspace/components/ToolPageTabs/index.tsx index a93df0032..9f9fcde7d 100644 --- a/src/page/Workspace/components/ToolPageTabs/index.tsx +++ b/src/page/Workspace/components/ToolPageTabs/index.tsx @@ -17,21 +17,26 @@ /** * 任意对象详情页的tabs组件,主要包含了ODC的统一定制样式 */ -import { Tabs } from 'antd'; +import { Tabs, TabsProps } from 'antd'; import React from 'react'; import styles from './index.less'; interface IProps { + items: TabsProps['items']; activeKey: string; onChange: () => void; } const ToolPageTabs: React.FC = (props) => { - const { activeKey, onChange } = props; + const { activeKey, items, onChange } = props; return ( - - {props.children} - + ); }; diff --git a/src/page/Workspace/components/TriggerPage/index.tsx b/src/page/Workspace/components/TriggerPage/index.tsx index 09c8c76b8..06bf5c502 100644 --- a/src/page/Workspace/components/TriggerPage/index.tsx +++ b/src/page/Workspace/components/TriggerPage/index.tsx @@ -50,37 +50,7 @@ import styles from './index.less'; import { getDataSourceModeConfig } from '@/common/datasource'; const { Content } = Layout; -const { TabPane } = Tabs; const ToolbarButton = Toolbar.Button; -const tableColumns = [ - { - key: 'name', - name: formatMessage({ id: 'odc.components.TriggerPage.Name' }), // 名称 - resizable: true, - sortable: false, - }, - - { - key: 'owner', - name: formatMessage({ id: 'odc.components.TriggerPage.Owner' }), // 所有者 - resizable: true, - sortable: false, - }, - - { - key: 'type', - name: formatMessage({ id: 'odc.components.TriggerPage.Type' }), // 类型 - resizable: true, - sortable: false, - }, - - { - key: 'status', - name: formatMessage({ id: 'odc.components.TriggerPage.State' }), // 状态 - resizable: true, - sortable: false, - }, -]; // 属性 Tab key 枚举 @@ -300,63 +270,274 @@ class TriggerPage extends Component< trigger && ( <> - - - {session?.supportFeature?.enableTriggerAlterStatus && ( - - {isEditStatus ? ( -
-
- { - formatMessage({ - id: 'odc.components.TriggerPage.Editing', - }) + + {session?.supportFeature?.enableTriggerAlterStatus && ( + + {isEditStatus ? ( +
+
+ { + formatMessage({ + id: 'odc.components.TriggerPage.Editing', + }) + + /* 编辑 */ + } +
+
+ + +
+
+ ) : ( + <> + } + onClick={this.handleEditBaseInfo} + /> + + } + onClick={this.reloadTrigger} + /> + + )} +
+ )} + + + +
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Name.2', + }) - /* 编辑 */ - } -
-
- - -
-
- ) : ( - <> + /* 名称: */ + } + + {trigger.triggerName} +
+
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Owner.2', + }) + + /* 所有者: */ + } + + {trigger.owner} +
+ {isEditStatus ? ( + + + { + formatMessage({ + id: 'odc.components.TriggerPage.Enable', + }) + + /* 启用 */ + } + + + { + formatMessage({ + id: 'odc.components.TriggerPage.Disable', + }) + + /* 禁用 */ + } + + + ) : ( +
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.WhetherToEnable', + }) + + /* 是否启用: */ + } + + + { + trigger.enableState === TriggerState.enabled + ? formatMessage({ + id: 'odc.components.TriggerPage.Enable', + }) + : // 启用 + formatMessage({ + id: 'odc.components.TriggerPage.Disable', + }) + + // 禁用 + } + +
+ )} + + + + ), + }, + { + key: PropsTab.BASE_OBJECT, + label: formatMessage({ + id: 'odc.components.TriggerPage.ReferenceObject', + }), + children: ( + <> + + } + onClick={this.reloadTrigger} + /> + + + +
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Name.2', + }) + + /* 名称: */ + } + + {trigger.tableName} +
+
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Owner.2', + }) + + /* 所有者: */ + } + + {trigger.tableOwner} +
+
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Type.1', + }) + + /* 类型: */ + } + + + {trigger.baseObjectType} + +
+ {trigger.status && ( +
+ + { + formatMessage({ + id: 'odc.components.TriggerPage.Status', + }) + + /* 状态: */ + } + + {trigger.status} +
+ )} +
+
+ + ), + }, + { + key: PropsTab.DDL, + label: 'DDL', + children: ( + <> + } - onClick={this.handleEditBaseInfo} + onClick={this.editTrigger} + /> + + } + onClick={() => { + downloadPLDDL( + trigger?.triggerName, + PLType.TRIGGER, + trigger?.ddl, + session?.odcDatabase?.name, + ); + }} + /> + + } + onClick={this.showSearchWidget} /> } onClick={this.reloadTrigger} /> - - )} - - )} - - - -
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Name.2', - }) - - /* 名称: */ - } - - {trigger.triggerName} -
-
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Owner.2', - }) - - /* 所有者: */ - } - - {trigger.owner} -
- {isEditStatus ? ( - - - { - formatMessage({ - id: 'odc.components.TriggerPage.Enable', - }) - - /* 启用 */ - } - - - { - formatMessage({ - id: 'odc.components.TriggerPage.Disable', - }) - - /* 禁用 */ - } - - - ) : ( -
- - { - formatMessage({ - id: 'odc.components.TriggerPage.WhetherToEnable', - }) - /* 是否启用: */ - } - - - { - trigger.enableState === TriggerState.enabled + -
- )} -
-
-
- - - } - onClick={this.reloadTrigger} - /> - - - -
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Name.2', - }) - - /* 名称: */ - } - - {trigger.tableName} -
-
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Owner.2', - }) - - /* 所有者: */ - } - - {trigger.tableOwner} -
-
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Type.1', - }) - - /* 类型: */ - } - - {trigger.baseObjectType} -
- {trigger.status && ( -
- - { - formatMessage({ - id: 'odc.components.TriggerPage.Status', - }) - - /* 状态: */ + icon={} + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + + - {trigger.status} -
- )} -
-
-
- {/** - * 本期(2.4.0)不支持该功能 - - - } - onClick={ - () =>{ - console.log('刷新!'); - } - } - /> - - - - */} - - - } - onClick={this.editTrigger} - /> - - } - onClick={() => { - downloadPLDDL( - trigger?.triggerName, - PLType.TRIGGER, - trigger?.ddl, - session?.odcDatabase?.name, - ); - }} - /> - - } - onClick={this.showSearchWidget} - /> - - } - onClick={this.reloadTrigger} - /> - - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - - { - this.editor = editor; - }} - /> - - -
+ onEditorCreated={(editor: IEditor) => { + this.editor = editor; + }} + /> + + + ), + }, + ]} + />
) diff --git a/src/page/Workspace/components/TypePage/index.tsx b/src/page/Workspace/components/TypePage/index.tsx index f25cda04c..41edc3bfb 100644 --- a/src/page/Workspace/components/TypePage/index.tsx +++ b/src/page/Workspace/components/TypePage/index.tsx @@ -51,37 +51,8 @@ import styles from './index.less'; import { getDataSourceModeConfig } from '@/common/datasource'; const { Content } = Layout; -const { TabPane } = Tabs; -const ToolbarButton = Toolbar.Button; -const tableColumns = [ - { - key: 'name', - name: formatMessage({ id: 'odc.components.TypePage.Name' }), // 名称 - resizable: true, - sortable: false, - }, - - { - key: 'owner', - name: formatMessage({ id: 'odc.components.TypePage.Owner' }), // 所有者 - resizable: true, - sortable: false, - }, - { - key: 'type', - name: formatMessage({ id: 'odc.components.TypePage.Type' }), // 类型 - resizable: true, - sortable: false, - }, - - { - key: 'status', - name: formatMessage({ id: 'odc.components.TypePage.State' }), // 状态 - resizable: true, - sortable: false, - }, -]; +const ToolbarButton = Toolbar.Button; const TypeCodeMap = { OBJECT: formatMessage({ id: 'odc.components.TypePage.Object' }), // 对象 @@ -208,158 +179,163 @@ class TypePage extends Component< type && ( <> - - - - -
- - { - formatMessage({ - id: 'odc.components.TypePage.Name.1', - }) - /* 名称: */ - } - - {type.typeName} -
-
- - { - formatMessage({ - id: 'odc.components.TypePage.Owner.1', - }) - /* 所有者: */ - } - - {type.owner} -
-
- - { - formatMessage({ - id: 'odc.components.TypePage.Type.1', - }) - /* 类型: */ - } - - {TypeCodeMap[type.type]} -
-
- - { - formatMessage({ - id: 'odc.components.TypePage.Created', - }) - /* 创建时间: */ - } - - - {getLocalFormatDateTime(type.createTime)} - -
-
- - { - formatMessage({ - id: 'odc.components.TypePage.ModificationTime', - }) + + +
+ + { + formatMessage({ + id: 'odc.components.TypePage.Name.1', + }) + /* 名称: */ + } + + {type.typeName} +
+
+ + { + formatMessage({ + id: 'odc.components.TypePage.Owner.1', + }) + /* 所有者: */ + } + + {type.owner} +
+
+ + { + formatMessage({ + id: 'odc.components.TypePage.Type.1', + }) + /* 类型: */ + } + + {TypeCodeMap[type.type]} +
+
+ + { + formatMessage({ + id: 'odc.components.TypePage.Created', + }) + /* 创建时间: */ + } + + + {getLocalFormatDateTime(type.createTime)} + +
+
+ + { + formatMessage({ + id: 'odc.components.TypePage.ModificationTime', + }) - /* 修改时间: */ - } - - - {getLocalFormatDateTime(type.lastDdlTime)} - -
-
- - - {/** - * 本期(2.4.0)不支持该功能 - * } onClick={ - * () =>{ console.log('刷新!'); } } /> - */} - - - {enableTypeEdit && ( - } - onClick={this.handleEditType} - /> - )} + /* 修改时间: */ + } +
+ + {getLocalFormatDateTime(type.lastDdlTime)} + +
+
+
+ ), + }, + { + key: TypePropsTab.DDL, + label: 'DDL', + children: ( + <> + + {enableTypeEdit && ( + } + onClick={this.handleEditType} + /> + )} - } - onClick={() => { - downloadPLDDL( - type?.typeName, - PLType.TYPE, - type?.ddl, - session?.odcDatabase?.name, - ); - }} - /> + } + onClick={() => { + downloadPLDDL( + type?.typeName, + PLType.TYPE, + type?.ddl, + session?.odcDatabase?.name, + ); + }} + /> - } - onClick={this.showSearchWidget} - /> + } + onClick={this.showSearchWidget} + /> - } - onClick={this.reloadType} - /> + } + onClick={this.reloadType} + /> - } - onClick={this.handleFormat} - status={formated ? IConStatus.ACTIVE : IConStatus.INIT} - /> - - - { - this.editor = editor; - }} - /> - -
-
+ } + onClick={this.handleFormat} + status={formated ? IConStatus.ACTIVE : IConStatus.INIT} + /> + + + { + this.editor = editor; + }} + /> + + + ), + }, + ]} + />
) From 0d176b93eda169fdead00d0c619a4e43629eba4d Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 4 Jan 2024 16:46:16 +0800 Subject: [PATCH 012/231] visible => open --- .../PartitionRange/PartitionValueInput.tsx | 2 +- .../Autoauth/component/FormModal/index.tsx | 2 +- .../Auth/Role/component/FormModal/index.tsx | 2 +- .../Auth/User/component/FormModal/index.tsx | 4 ++-- .../Datasource/NewDatasourceDrawer/index.tsx | 2 +- .../SSO/NewSSODrawerButton/Edit.tsx | 2 +- .../component/FormModal/index.tsx | 2 +- .../Login/components/RegisterModal/index.tsx | 2 +- src/page/Project/User/AddUserModal/index.tsx | 2 +- src/page/Project/index.tsx | 22 ------------------- .../Approval/component/FormModal/index.tsx | 2 +- .../FormRecordExportModal/index.tsx | 2 +- src/page/SpaceIndex/index.tsx | 2 +- .../components/CreateSequenceModal/index.tsx | 2 +- .../DDLResultSet/ColumnModeModal.tsx | 2 +- .../BlobFormatter/BlobViewModal.tsx | 2 +- .../hooks/components/TextFormatter/index.tsx | 2 +- .../EditableTable/Editors/TextEditor.tsx | 2 +- .../PartitionPolicyTable/configModal.tsx | 2 +- .../components/RecycleBinPage/index.tsx | 4 ++-- .../ScriptEditorModal/index.tsx | 2 +- .../Partitions/AddPartitionModal/index.tsx | 2 +- 22 files changed, 23 insertions(+), 45 deletions(-) diff --git a/src/component/PartitionRange/PartitionValueInput.tsx b/src/component/PartitionRange/PartitionValueInput.tsx index 8b4983e14..10e4737b3 100644 --- a/src/component/PartitionRange/PartitionValueInput.tsx +++ b/src/component/PartitionRange/PartitionValueInput.tsx @@ -111,7 +111,7 @@ class ToolTipInput extends React.PureComponent { return ( = (props) => { } destroyOnClose - visible={visible} + open={visible} onClose={handleCancel} > = (props) => { } destroyOnClose - visible={visible} + open={visible} onClose={handleCancel} > {isEdit && ( diff --git a/src/page/Auth/User/component/FormModal/index.tsx b/src/page/Auth/User/component/FormModal/index.tsx index bb41c5364..061ff817e 100644 --- a/src/page/Auth/User/component/FormModal/index.tsx +++ b/src/page/Auth/User/component/FormModal/index.tsx @@ -407,7 +407,7 @@ class FormModal extends React.PureComponent { } destroyOnClose - visible={visible} + open={visible} onClose={() => { this.handleCancel(isEdit); }} @@ -791,7 +791,7 @@ class FormModal extends React.PureComponent { diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/Edit.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/Edit.tsx index f721b57fc..be26fc566 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/Edit.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/Edit.tsx @@ -92,7 +92,7 @@ export default function EditSSODrawer({ visible, id, close, onSave }: IProps) { return ( = (props) => { } destroyOnClose - visible={visible} + open={visible} onClose={handleCancel} >
{ width={560} destroyOnClose={true} title={formatMessage({ id: 'login.button.register' })} - visible={visible} + open={visible} onOk={this.handleSubmit} onCancel={onCancel} confirmLoading={confirmLoading} diff --git a/src/page/Project/User/AddUserModal/index.tsx b/src/page/Project/User/AddUserModal/index.tsx index 039ca24a3..bf7c10e31 100644 --- a/src/page/Project/User/AddUserModal/index.tsx +++ b/src/page/Project/User/AddUserModal/index.tsx @@ -90,7 +90,7 @@ export default function AddUserModal({ close, onSuccess, visible, project }: IPr title={formatMessage({ id: 'odc.User.AddUserModal.AddMembers' })} /*添加成员*/ onCancel={() => close()} onOk={submit} - visible={visible} + open={visible} width={760} > diff --git a/src/page/Project/index.tsx b/src/page/Project/index.tsx index 17368d23f..f6043f392 100644 --- a/src/page/Project/index.tsx +++ b/src/page/Project/index.tsx @@ -33,24 +33,6 @@ import { isNumber } from 'lodash'; import ProjectContext from './ProjectContext'; import Sensitive from './Sensitive'; import tracert from '@/util/tracert'; -const menu = ( - - - { - formatMessage({ - id: 'odc.page.Project.MenuItem', - }) /*菜单项一*/ - } - - - { - formatMessage({ - id: 'odc.page.Project.MenuItem.1', - }) /*菜单项二*/ - } - - -); const ExtraContent = ({ projectId, currentRoles }) => { const disabled = currentRoles?.filter((roles) => @@ -72,10 +54,6 @@ const ExtraContent = ({ projectId, currentRoles }) => { }) /*登录数据库*/ } - {/* [null,
{isShowTextModal ? ( = (props) => { title={formatMessage({ id: 'odc.components.PartitionPolicyTable.configModal.SetPartitionPolicies', })} /*设置分区策略*/ - visible={visible} + open={visible} width={600} onCancel={handleClose} footer={ diff --git a/src/page/Workspace/components/RecycleBinPage/index.tsx b/src/page/Workspace/components/RecycleBinPage/index.tsx index 47e9fd493..5548b3c16 100644 --- a/src/page/Workspace/components/RecycleBinPage/index.tsx +++ b/src/page/Workspace/components/RecycleBinPage/index.tsx @@ -489,7 +489,7 @@ class RecycleBin extends Component< placement="right" closable onClose={() => this.setState({ showDeleteDrawer: false })} - visible={showDeleteDrawer} + open={showDeleteDrawer} width={500} > = function ({ (function ({}, ref) { } return ( Date: Thu, 4 Jan 2024 18:03:29 +0800 Subject: [PATCH 013/231] fix tabs --- src/component/Action/Group.tsx | 61 +++---- src/component/WindowManager/DraggableTabs.tsx | 8 +- src/component/WindowManager/index.tsx | 166 +++++++++--------- .../components/PLDebugResultSet/index.tsx | 21 +-- 4 files changed, 125 insertions(+), 131 deletions(-) diff --git a/src/component/Action/Group.tsx b/src/component/Action/Group.tsx index 11f3bbe16..d49d8891b 100644 --- a/src/component/Action/Group.tsx +++ b/src/component/Action/Group.tsx @@ -141,38 +141,35 @@ export default ({ {ellipsisActions.length > 0 && ( - {ellipsisActions.map((action, index) => { - const actionKey = action.key; - let disabled = false; - if (isBoolean(action.props.disabled)) disabled = action.props.disabled; - else if (shouldDisabled) disabled = shouldDisabled(action.key as string); - // 当用户传入loading 或者 传入 disabled 的情况都要禁用按钮 - const actionDisabled = - action.props.loading || - (isBoolean(action.props.disabled) - ? action.props.disabled - : getDefaultDisabled(action.key as string)); - return ( - { - info.domEvent.stopPropagation(); - action.props.onClick?.(); - }} - > - - {action.props.loading && } {action.props.children} - - - ); - })} -
- } + menu={{ + items: ellipsisActions.map((action, index) => { + const actionKey = action.key; + let disabled = false; + if (isBoolean(action.props.disabled)) disabled = action.props.disabled; + else if (shouldDisabled) disabled = shouldDisabled(action.key as string); + // 当用户传入loading 或者 传入 disabled 的情况都要禁用按钮 + const actionDisabled = + action.props.loading || + (isBoolean(action.props.disabled) + ? action.props.disabled + : getDefaultDisabled(action.key as string)); + return { + key: (actionKey as string) ?? index.toString(), + style: { minWidth: 120 }, + ...omit(action.props, 'disabled'), + disabled: actionDisabled, + onClick: (info) => { + info.domEvent.stopPropagation(); + action.props.onClick?.(); + }, + children: ( + + {action.props.loading && } {action.props.children} + + ), + }; + }), + }} > {moreDom}
diff --git a/src/component/WindowManager/DraggableTabs.tsx b/src/component/WindowManager/DraggableTabs.tsx index 0c09c1dc2..b9f1bd01c 100644 --- a/src/component/WindowManager/DraggableTabs.tsx +++ b/src/component/WindowManager/DraggableTabs.tsx @@ -88,7 +88,7 @@ export default class DraggableTabs extends React.PureComponent { - const { moveTabNode, ...restProps } = props; + const { moveTabNode, items, ...restProps } = props; return ( {(node) => ( @@ -104,10 +104,6 @@ export default class DraggableTabs extends React.PureComponent - {children} - - ); + return ; } } diff --git a/src/component/WindowManager/index.tsx b/src/component/WindowManager/index.tsx index bc9fa0611..90efebacc 100644 --- a/src/component/WindowManager/index.tsx +++ b/src/component/WindowManager/index.tsx @@ -18,7 +18,7 @@ import { formatMessage } from '@/util/intl'; import { PureComponent, ReactNode, useContext, useState } from 'react'; import { CloseOutlined, DownOutlined, EllipsisOutlined, PlusOutlined } from '@ant-design/icons'; import { IPage, PageType } from '@/d.ts'; -import { Badge, Dropdown, Menu, Space, Tabs, Tooltip } from 'antd'; +import { Badge, Dropdown, Menu, MenuProps, Space, Tabs, Tooltip } from 'antd'; import { MenuInfo } from 'rc-menu/lib/interface'; import { movePagePostion, openNewDefaultPLPage } from '@/store/helper/page'; import { SQLStore } from '@/store/sql'; @@ -141,47 +141,45 @@ const WindowManager: React.FC = function (props) { return ( - {!isDocked && ( - - {formatMessage({ - id: 'odc.component.WindowManager.CloseThisWindow', - })} - - )} - - - {formatMessage({ + menu={{ + className: styles.tabsContextMenu, + onClick: doTabAction.bind(null, page), + items: [ + !isDocked && { + key: 'closePage', + label: formatMessage({ + id: 'odc.component.WindowManager.CloseThisWindow', + }), + }, + { + key: 'closeOtherPage', + label: formatMessage({ id: 'odc.component.WindowManager.CloseOtherWindows', - })} - - {!isDocked && ( - - {formatMessage({ - id: 'odc.component.WindowManager.CloseAllWindows', - })} - - )} - - - {page.type === PageType.SQL ? ( - - { - formatMessage({ - id: 'odc.src.component.WindowManager.CopyTheSQLWindow', - }) /* 复制 SQL 窗口 */ - } - - ) : null} - - - {formatMessage({ + }), + }, + !isDocked && { + key: 'closeAllPage', + label: formatMessage({ + id: 'odc.component.WindowManager.CloseAllWindows', + }), + }, + { + type: 'divider', + }, + page.type === PageType.SQL && { + key: 'copyPage', + label: formatMessage({ + id: 'odc.src.component.WindowManager.CopyTheSQLWindow', + }), + }, + { + key: 'openNewPage', + label: formatMessage({ id: 'odc.component.WindowManager.OpenANewSqlWindow', - })} - - - } + }), + }, + ].filter(Boolean) as MenuProps['items'], + }} > = function (props) { ); } - const menu = ( - - {pages.map((page) => ( - + const menu: MenuProps = { + style: { + width: '320px', + }, + selectedKeys: [activeKey], + onClick: handleSwitchTab, + items: pages.map((page) => { + return { + key: page.key, + label: ( = function (props) { {getPageTitleText(page)} - - ))} - - ); + ), + }; + }), + }; return ( <> = function (props) { tabBarExtraContent={ } - items={pages.map((page) => { - const Page = pageMap[page.type].component; - const pageParams = Object.assign({}, pageMap[page.type].params || {}, page.params); - return { - key: page.key, - label: getPageTitle(page), - closable: true, - children: ( - setClosePageKey('')} - onSaveAndCloseUnsavedModal={handleSaveAndClosePage} - closeSelf={handleCloseTab.bind(null, page.key)} - /> - ), - }; - })} + items={pages + .map((page) => { + const Page = pageMap[page.type].component; + const pageParams = Object.assign({}, pageMap[page.type].params || {}, page.params); + if (!Page) { + return null; + } + console.log('page', page.type, Page); + return { + key: page.key, + label: getPageTitle(page), + closable: false, // hide close btn + children: ( + setClosePageKey('')} + onSaveAndCloseUnsavedModal={handleSaveAndClosePage} + closeSelf={handleCloseTab.bind(null, page.key)} + /> + ), + }; + }) + .filter(Boolean)} /> diff --git a/src/page/Workspace/components/PLDebugResultSet/index.tsx b/src/page/Workspace/components/PLDebugResultSet/index.tsx index c5c8299c1..eb2e9ea1c 100644 --- a/src/page/Workspace/components/PLDebugResultSet/index.tsx +++ b/src/page/Workspace/components/PLDebugResultSet/index.tsx @@ -466,6 +466,14 @@ const PLDebugResultSet: React.FC = (props) => { activeKey: '', tabBarGutter: 0, onChange: null, + items: tabs.map((cfg) => { + const { name, key, renderTabContent } = cfg; + return { + key, + label: name, + children: renderTabContent(), + }; + }), }; if (isLeft) { @@ -475,18 +483,7 @@ const PLDebugResultSet: React.FC = (props) => { tabCfg.activeKey = activeRightTabKey || tabs[0].key; tabCfg.onChange = handleChangeRightTab; } - return ( - - {tabs.map((cfg) => { - const { name, key, renderTabContent } = cfg; - return { - key, - label: name, - children: renderTabContent(), - }; - })} - - ); + return ; } function handleChangeTab(activeTabKey: string) { From b93df94fd48caf020a39d5411d9c2fcef592f1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Thu, 4 Jan 2024 19:31:14 +0800 Subject: [PATCH 014/231] PullRequest: 297 deps: modify oic version and must.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'deps/dev-4.2.4-oicV2Config of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/297 Signed-off-by: 晓康 * deps: upgrade oic's version and modify must.js * fix: delete unused script * fix: revert package.json * fix: clear deprecated copywritings * fix: modify injectContent.headComment.hasHeadComment value * fix: pnpm install & revert @oceanbase-odc/monaco-plugin-ob version --- package.json | 5 +- pnpm-lock.yaml | 2088 ++++++++++++++++++------- scripts/must.js | 166 +- src/locales/must/strings/zh-CN.json | 2221 +-------------------------- 4 files changed, 1536 insertions(+), 2944 deletions(-) diff --git a/package.json b/package.json index f7c36f10a..72b9b6c41 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ }, "scripts": { "start": "max dev", + "oic:extract": "oic --configPath /Users/ccj/work/oceanbase-developer-center/scripts/must.js --extract all", + "oic:clear": "oic --configPath /Users/ccj/work/oceanbase-developer-center/scripts/must.js --clear", "dev:client": "concurrently \"UMI_ENV=client npm run dev\" \"npm run build-main-dev\"", "start-electron": "electron --inspect=5858 -w ./dist/main/main.js", "analyze": "ANALYZE=1 cross-env NODE_OPTIONS=--max_old_space_size=6096 max build", @@ -24,7 +26,6 @@ "buildNoDoc": "node scripts/plugin/initPlugins.js && cross-env NODE_OPTIONS=--max_old_space_size=6096 max build", "prettier": "prettier --write 'src/**/*.{js,jsx,tsx,ts,less,md,json}'", "type-check": "tsc --noEmit", - "must": "node --max-old-space-size=8192 ./scripts/must.js", "build-main-prod": "cross-env NODE_OPTIONS=--max_old_space_size=6096 NODE_ENV=production webpack --config ./build/webpack.main.prod.config.js", "build-main-dev": "cross-env NODE_OPTIONS=--max_old_space_size=6096 NODE_ENV=development webpack -w --config ./build/webpack.main.config.js", "prepack": "node ./scripts/clientDependencies/index.js", @@ -71,7 +72,7 @@ "devDependencies": { "@ant-design/icons": "^4.0.0", "@oceanbase-odc/monaco-plugin-ob": "^0.1.2", - "@oceanbase-odc/ob-intl-cli": "^1.1.5", + "@oceanbase-odc/ob-intl-cli": "^2.0.1", "@oceanbase-odc/ob-parser-js": "^3.0.1", "@oceanbase-odc/ob-react-data-grid": "^3.0.6", "@sentry/react": "^7.88.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44844f2b9..c444d922b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,8 +44,8 @@ devDependencies: specifier: ^0.1.2 version: 0.1.2(monaco-editor@0.36.1) '@oceanbase-odc/ob-intl-cli': - specifier: ^1.1.5 - version: 1.1.5 + specifier: ^2.0.1 + version: 2.0.1(prettier@2.2.1)(typescript@4.9.5) '@oceanbase-odc/ob-parser-js': specifier: ^3.0.1 version: 3.0.1 @@ -353,7 +353,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@ampproject/remapping@2.2.1: @@ -725,15 +725,15 @@ packages: resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} dev: true - /@babel/cli@7.21.0(@babel/core@7.21.3): + /@babel/cli@7.21.0(@babel/core@7.23.6): resolution: {integrity: sha512-xi7CxyS8XjSyiwUGCfwf+brtJxjW1/ZTcBUkP10xawIEXLX5HzLn+3aXkgxozcP2UhRhtKTmQurw9Uaes7jZrA==} engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@jridgewell/trace-mapping': 0.3.17 + '@babel/core': 7.23.6 + '@jridgewell/trace-mapping': 0.3.20 commander: 4.1.1 convert-source-map: 1.9.0 fs-readdir-recursive: 1.1.0 @@ -748,14 +748,14 @@ packages: /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.22.10 + '@babel/highlight': 7.23.4 dev: true /@babel/code-frame@7.22.10: resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.10 + '@babel/highlight': 7.23.4 chalk: 2.4.2 dev: true @@ -781,16 +781,16 @@ packages: resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.21.0) + '@babel/helpers': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -874,13 +874,27 @@ packages: semver: 6.3.1 dev: true + /@babel/eslint-parser@7.21.3(@babel/core@7.23.6)(eslint@7.32.0): + resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.23.6 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + dev: true + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 dev: true @@ -894,11 +908,11 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: @@ -906,33 +920,33 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.0 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.23.6): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -955,16 +969,14 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.21.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - transitivePeerDependencies: - - supports-color dev: true /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.23.6): @@ -974,16 +986,50 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.6 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.21.3): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.21.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.6): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 dev: true /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.21.3): @@ -993,7 +1039,18 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 dev: true @@ -1003,7 +1060,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -1013,13 +1070,24 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.23.6): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: true @@ -1027,15 +1095,7 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/helper-function-name@7.23.0: @@ -1050,21 +1110,14 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - dev: true - - /@babel/helper-member-expression-to-functions@7.21.0: - resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/helper-module-imports@7.22.15: @@ -1078,18 +1131,46 @@ packages: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/helper-validator-identifier': 7.22.20 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.21.0): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.21.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} @@ -1104,11 +1185,11 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -1123,10 +1204,25 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true @@ -1135,21 +1231,38 @@ packages: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.21.3): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.22.10 + '@babel/core': 7.21.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 dev: true /@babel/helper-simple-access@7.22.5: @@ -1159,23 +1272,18 @@ packages: '@babel/types': 7.23.6 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.6 dev: true /@babel/helper-string-parser@7.23.4: @@ -1188,11 +1296,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} @@ -1207,10 +1310,10 @@ packages: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true @@ -1219,9 +1322,9 @@ packages: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true @@ -1237,15 +1340,6 @@ packages: - supports-color dev: true - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} @@ -1260,7 +1354,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@babel/parser@7.23.6: @@ -1281,6 +1375,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} @@ -1289,17 +1393,29 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.3) dev: true - /@babel/plugin-external-helpers@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.6) + dev: true + + /@babel/plugin-external-helpers@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1310,7 +1426,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.3) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.3) @@ -1318,6 +1434,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -1327,8 +1458,17 @@ packages: '@babel/core': 7.21.3 '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.3): @@ -1338,11 +1478,21 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.3) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) dev: true /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.21.3): @@ -1372,6 +1522,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.3): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -1383,6 +1544,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -1394,6 +1566,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} @@ -1405,6 +1588,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -1416,6 +1610,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -1427,20 +1632,45 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.23.5 '@babel/core': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.3) '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -1452,6 +1682,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.3) dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} @@ -1460,7 +1701,7 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.3) dev: true @@ -1472,7 +1713,7 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) dev: true @@ -1483,10 +1724,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.3): @@ -1496,12 +1746,23 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.3) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) dev: true /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.3): @@ -1515,6 +1776,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.3): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1570,6 +1842,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.21.3): resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} @@ -1580,8 +1862,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.6): - resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1590,8 +1872,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-do-expressions@7.22.5(@babel/core@7.23.6): - resolution: {integrity: sha512-60pOTgQGY00/Kiozrtu286Aqg50IxDy/jIHhlMzXjYTs1Q8lbeOgqC9NLidtqfBNwdX6bZCT6FJ2i5xzt+JKzw==} + /@babel/plugin-syntax-do-expressions@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-GBmwXqthSDjlXzwF19qZjFBeHtigX9/0g670FSv8gKEjbD4k+BuRBPlpDQdr/+ts0UlimhJUd/oPilMFqyHq+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1635,8 +1917,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-function-bind@7.22.5(@babel/core@7.23.6): - resolution: {integrity: sha512-Sjy7XIhHF9L++0Mk/3Y4H4439cjI//wc/jE8Ly3+qGPkTUYYEhe4rzMv/JnyZpekfOBL22X6DAq42I7GM/3KzA==} + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-function-bind@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-BVBglNxpv45awQYCln57SX2EJge4YK0liwH1Clzk/Nnx/bdLmZRhP0vt1koJqDLAEG8MngIPbIMNNNOXPcnXYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1655,6 +1946,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.23.6): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1682,8 +1983,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.21.3): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1692,8 +1993,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.23.6): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1820,6 +2121,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.3): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -1840,8 +2151,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.21.3): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1850,8 +2161,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.23.6): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1870,6 +2181,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} @@ -1877,25 +2198,29 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.3) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.23.6) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.3): - resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1904,55 +2229,133 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.3): - resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.3): - resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 dev: true - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.3): - resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.21.3) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.3): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.23.6): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1966,6 +2369,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -1977,6 +2390,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} @@ -1987,6 +2411,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.3): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -1994,8 +2428,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2009,6 +2455,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -2019,6 +2475,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.3): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} @@ -2026,10 +2492,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.23.6): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.3): @@ -2039,11 +2514,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color + '@babel/helper-simple-access': 7.22.5 dev: true /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.23.6): @@ -2053,11 +2526,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 dev: true /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.3): @@ -2068,11 +2551,22 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.23.6): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: true /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.3): @@ -2082,10 +2576,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.3): @@ -2099,6 +2602,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.23.6): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -2109,6 +2623,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -2117,9 +2641,30 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.21.3) + dev: true + + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) dev: true /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.3): @@ -2132,6 +2677,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.23.6): + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -2142,6 +2697,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.21.3): resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} engines: {node: '>=6.9.0'} @@ -2162,6 +2727,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} @@ -2172,23 +2747,33 @@ packages: '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.3) dev: true - /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.21.3): + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.23.6) + dev: true + + /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.23.6): resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.21.3): + /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.23.6): resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2199,11 +2784,25 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) - '@babel/types': 7.22.10 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.21.3) + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.23.6): + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/types': 7.23.6 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.3): @@ -2213,7 +2812,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2228,6 +2838,17 @@ packages: regenerator-transform: 0.15.1 dev: true + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.23.6): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.1 + dev: true + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -2238,6 +2859,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -2248,6 +2879,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.3): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} @@ -2256,7 +2897,18 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.23.6): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.3): @@ -2269,6 +2921,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.3): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -2279,6 +2941,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.3): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -2289,6 +2961,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.23.6): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3): resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} @@ -2296,47 +2978,64 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.21.3) + dev: true + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.3): + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.23.6): - resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.23.6): + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.6 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.23.6) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.3): - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.3): + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.23.6): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2426,6 +3125,92 @@ packages: - supports-color dev: true + /@babel/preset-env@7.20.2(@babel/core@7.23.6): + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.23.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.23.6) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.23.6) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.23.6) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.23.6) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.23.6) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.23.6) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.23.6) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.23.6) + '@babel/preset-modules': 0.1.5(@babel/core@7.23.6) + '@babel/types': 7.22.10 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.23.6) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.23.6) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.23.6) + core-js-compat: 3.29.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-modules@0.1.5(@babel/core@7.21.3): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: @@ -2435,7 +3220,20 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.3) '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.3) - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.5(@babel/core@7.23.6): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.23.6) + '@babel/types': 7.23.6 esutils: 2.0.3 dev: true @@ -2454,6 +3252,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.21.3) dev: true + /@babel/preset-react@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.23.6) + dev: true + /@babel/preset-typescript@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} engines: {node: '>=6.9.0'} @@ -2464,22 +3277,20 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.21.0 '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3) - transitivePeerDependencies: - - supports-color dev: true - /@babel/preset-typescript@7.21.0(@babel/core@7.23.6): - resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} + /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.23.6) - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) dev: true /@babel/regjsgen@0.8.0: @@ -2528,23 +3339,23 @@ packages: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 dev: true /@babel/traverse@7.22.10: resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -2573,8 +3384,8 @@ packages: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -3360,7 +4171,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 7.32.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 dev: true /@eslint-community/eslint-utils@4.3.0(eslint@8.35.0): @@ -3370,7 +4181,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.35.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 dev: true /@eslint-community/eslint-utils@4.3.0(eslint@8.36.0): @@ -3380,7 +4191,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.36.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 dev: true /@eslint-community/regexpp@4.4.0: @@ -3616,6 +4427,18 @@ packages: - supports-color dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3639,13 +4462,20 @@ packages: '@sinclair/typebox': 0.25.24 dev: true + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@jest/transform@29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.20 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -3701,16 +4531,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@jridgewell/gen-mapping@0.3.3: @@ -3722,11 +4543,6 @@ packages: '@jridgewell/trace-mapping': 0.3.20 dev: true - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -3740,25 +4556,14 @@ packages: /@jridgewell/source-map@0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/trace-mapping@0.3.20: resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: @@ -3871,42 +4676,47 @@ packages: monaco-editor: 0.36.1 dev: true - /@oceanbase-odc/ob-intl-cli@1.1.5: - resolution: {integrity: sha512-pjONzwOoVijIYC5PblTaEwHag7slxo0yj+9Y8CoeLirTNnnVIaC65k8SIva3duUfMi0o4982IrNJSLUpEEPW+g==} - engines: {install-node: v14.19.1} + /@oceanbase-odc/ob-intl-cli@2.0.1(prettier@2.2.1)(typescript@4.9.5): + resolution: {integrity: sha512-x3uT+Tuab4slk/MQIy4TYEU3PzlizsUIzL2Epm3wkspYlP8dok8CB9S2pEVvo+c2IQO7Jm9ikzyvG3llpaR4CQ==} + hasBin: true + requiresBuild: true dependencies: '@babel/core': 7.23.6 '@babel/generator': 7.23.6 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.6) + '@babel/parser': 7.23.6 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) - '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.6) - '@babel/plugin-syntax-do-expressions': 7.22.5(@babel/core@7.23.6) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-do-expressions': 7.23.3(@babel/core@7.23.6) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) '@babel/plugin-syntax-export-extensions': 7.0.0-beta.32(@babel/core@7.23.6) - '@babel/plugin-syntax-function-bind': 7.22.5(@babel/core@7.23.6) - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-syntax-function-bind': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/preset-typescript': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 '@swc/cli': 0.1.63(@swc/core@1.3.100) '@swc/core': 1.3.100 - '@vitalets/google-translate-api': 9.2.0 - axios: 1.4.0 - cheerio: 1.0.0-rc.12 - glob: 8.1.0 + colors: 1.4.0 + commander: 11.1.0 + glob: 10.3.10 google-translate-api-x: 10.6.7 - http-proxy-agent: 5.0.0 lodash: 4.17.21 node-fetch: 2.6.7 - prettier-eslint: 15.0.1 - slash: 5.1.0 + prettier-eslint: 16.2.0 + prettier-plugin-organize-imports: 3.2.4(prettier@2.2.1)(typescript@4.9.5) + prettier-plugin-packagejson: 2.4.8(prettier@2.2.1) transitivePeerDependencies: - '@swc/helpers' + - '@volar/vue-language-plugin-pug' + - '@volar/vue-typescript' - chokidar - - debug - encoding + - prettier - supports-color + - typescript dev: true /@oceanbase-odc/ob-parser-js@3.0.1: @@ -3937,6 +4747,18 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pkgr/core@0.1.0: + resolution: {integrity: sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@pkgr/utils@2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -4173,6 +4995,10 @@ packages: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -4185,7 +5011,7 @@ packages: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 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) transitivePeerDependencies: @@ -4199,7 +5025,7 @@ packages: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' dependencies: - '@babel/core': 7.21.3 + '@babel/core': 7.23.6 postcss: 8.4.27 postcss-syntax: 0.36.2(postcss@8.4.32) transitivePeerDependencies: @@ -4327,7 +5153,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 entities: 4.5.0 dev: true @@ -4417,7 +5243,6 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true @@ -4427,7 +5252,6 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true @@ -4437,7 +5261,6 @@ packages: engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true @@ -4447,7 +5270,6 @@ packages: engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true @@ -4623,8 +5445,8 @@ packages: /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -4633,20 +5455,20 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 dev: true /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.6 dev: true /@types/cacheable-request@6.0.3: @@ -4681,13 +5503,6 @@ packages: '@types/json-schema': 7.0.11 dev: true - /@types/eslint@8.21.2: - resolution: {integrity: sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==} - dependencies: - '@types/estree': 1.0.0 - '@types/json-schema': 7.0.11 - dev: true - /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true @@ -4734,10 +5549,6 @@ packages: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} dev: true - /@types/http-errors@1.8.2: - resolution: {integrity: sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==} - dev: true - /@types/invariant@2.2.35: resolution: {integrity: sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==} dev: true @@ -4831,10 +5642,6 @@ packages: dev: true optional: true - /@types/prettier@2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} - dev: true - /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true @@ -5078,22 +5885,23 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.55.0(eslint@8.36.0)(typescript@4.9.5): - resolution: {integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.17.0(eslint@8.36.0)(typescript@5.3.3): + resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.55.0 - '@typescript-eslint/types': 5.55.0 - '@typescript-eslint/typescript-estree': 5.55.0(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 debug: 4.3.4 eslint: 8.36.0 - typescript: 4.9.5 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -5122,6 +5930,14 @@ packages: '@typescript-eslint/visitor-keys': 5.55.0 dev: true + /@typescript-eslint/scope-manager@6.17.0: + resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + dev: true + /@typescript-eslint/type-utils@5.48.1(eslint@8.35.0)(typescript@4.9.5): resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5177,6 +5993,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@6.17.0: + resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5): resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5240,6 +6061,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): + resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.48.1(eslint@8.35.0)(typescript@4.9.5): resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5313,7 +6156,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.48.1 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 dev: true /@typescript-eslint/visitor-keys@5.55.0: @@ -5321,7 +6164,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.55.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.17.0: + resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + eslint-visitor-keys: 3.4.3 dev: true /@umijs/ast@4.0.66: @@ -5717,7 +6568,7 @@ packages: axios: 0.27.2 babel-plugin-import: 1.13.6 dayjs: 1.11.7 - dva-core: 2.0.4(redux@4.2.1) + dva-core: 2.0.4(redux@3.7.2) dva-immer: 1.0.0(dva@2.5.0-beta.2) dva-loading: 3.0.23(dva-core@2.0.4) event-emitter: 0.3.5 @@ -5900,26 +6751,15 @@ packages: resolution: {integrity: sha512-L06igsowmBRF0K05KsBOHJQ6BZKmZ2VTThA8CUAktypPwOTwBgdhHz2jzAPCVOL8tdZco6ux3UrMEXp/OFrl9A==} dev: true - /@vitalets/google-translate-api@9.2.0: - resolution: {integrity: sha512-w98IPWGuexlGmh8Y19AxF6cgWT0U5JLevVNDKEuFpTWtBC9z3YtDWKTDxF3nPP1k9bWicuB1V7I7YfHoZiDScw==} - engines: {node: '>=14'} - dependencies: - '@types/http-errors': 1.8.2 - http-errors: 2.0.0 - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - dev: true - /@vitejs/plugin-react@3.1.0(vite@4.2.0): resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.1.0-beta.0 dependencies: - '@babel/core': 7.21.3 - '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.21.3) - '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.3) + '@babel/core': 7.23.6 + '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.23.6) magic-string: 0.27.0 react-refresh: 0.14.0 vite: 4.2.0(@types/node@9.6.61)(less@4.1.3) @@ -6252,11 +7092,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} @@ -6267,6 +7102,11 @@ packages: engines: {node: '>=8'} dev: true + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -6286,6 +7126,16 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /antd-dayjs-webpack-plugin@1.0.6(dayjs@1.11.7): resolution: {integrity: sha512-UlK3BfA0iE2c5+Zz/Bd2iPAkT6cICtrKG4/swSik5MZweBHtgmu1aUQCHvICdiv39EAShdZy/edfP6mlkS/xXg==} peerDependencies: @@ -6660,8 +7510,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001468 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001566 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -6676,8 +7526,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001468 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001566 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -6689,8 +7539,8 @@ packages: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001468 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001566 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -6736,16 +7586,6 @@ packages: - debug dev: true - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - /babel-jest@29.5.0(@babel/core@7.23.6): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6773,7 +7613,7 @@ packages: /babel-plugin-import@1.13.6: resolution: {integrity: sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==} dependencies: - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-module-imports': 7.22.15 dev: true /babel-plugin-istanbul@6.1.1: @@ -6793,20 +7633,33 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.3): + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.3): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.23.6): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.3) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.6) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -6824,6 +7677,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.23.6): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.6) + core-js-compat: 3.29.1 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.3): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: @@ -6835,13 +7700,24 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.23.6): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.6) + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-styled-components@2.0.7(styled-components@6.1.2): resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==} peerDependencies: styled-components: '>= 2' dependencies: - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 babel-plugin-syntax-jsx: 6.18.0 lodash: 4.17.21 picomatch: 2.3.1 @@ -7128,17 +8004,6 @@ packages: pako: 1.0.11 dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001468 - electron-to-chromium: 1.4.333 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: true - /browserslist@4.22.2: resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7322,10 +8187,6 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: true - /caniuse-lite@1.0.30001468: - resolution: {integrity: sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==} - dev: true - /caniuse-lite@1.0.30001566: resolution: {integrity: sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==} dev: true @@ -7374,30 +8235,6 @@ packages: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: true - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - dev: true - - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: true - /cherio@1.0.0-rc.2: resolution: {integrity: sha512-6uMRxujZ6LouVnjv9dYNehbqGEkzQE0anmo70ExdxX3NlyliOcUcAcWDaUEVVPKGGdK5CP6I+bB76+Ud+SEJ6Q==} engines: {node: '>= 0.6'} @@ -7634,6 +8471,11 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -7644,6 +8486,11 @@ packages: resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} dev: true + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -7831,7 +8678,7 @@ packages: /core-js-compat@3.29.1: resolution: {integrity: sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==} dependencies: - browserslist: 4.21.5 + browserslist: 4.22.2 dev: true /core-js-pure@3.29.1: @@ -8119,16 +8966,6 @@ packages: nth-check: 2.1.1 dev: true - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - dev: true - /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -8551,14 +9388,6 @@ packages: entities: 2.2.0 dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - /dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dev: true @@ -8589,13 +9418,6 @@ packages: domelementtype: 2.3.0 dev: true - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - /domutils@1.5.1: resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==} dependencies: @@ -8618,14 +9440,6 @@ packages: domhandler: 4.3.1 dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -8684,7 +9498,7 @@ packages: warning: 3.0.0 dev: true - /dva-core@2.0.4(redux@4.2.1): + /dva-core@2.0.4(redux@3.7.2): resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} peerDependencies: redux: 4.x @@ -8694,7 +9508,7 @@ packages: global: 4.4.0 invariant: 2.2.4 is-plain-object: 2.0.4 - redux: 4.2.1 + redux: 3.7.2 redux-saga: 0.16.2 warning: 3.0.0 dev: true @@ -8715,7 +9529,7 @@ packages: dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0 dependencies: '@babel/runtime': 7.23.2 - dva-core: 2.0.4(redux@4.2.1) + dva-core: 2.0.4(redux@3.7.2) dev: true /dva@2.5.0-beta.2(react-dom@17.0.2)(react@17.0.2): @@ -8741,6 +9555,10 @@ packages: redux: 3.7.2 dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: @@ -8831,10 +9649,6 @@ packages: - supports-color dev: true - /electron-to-chromium@1.4.333: - resolution: {integrity: sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ==} - dev: true - /electron-to-chromium@1.4.603: resolution: {integrity: sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==} dev: true @@ -8884,6 +9698,10 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -9398,8 +10216,8 @@ packages: peerDependencies: eslint: '>=7.0.0' dependencies: - '@babel/core': 7.21.3 - '@babel/eslint-parser': 7.21.3(@babel/core@7.21.3)(eslint@7.32.0) + '@babel/core': 7.23.6 + '@babel/eslint-parser': 7.21.3(@babel/core@7.23.6)(eslint@7.32.0) eslint: 7.32.0 eslint-visitor-keys: 2.1.0 esquery: 1.5.0 @@ -9450,6 +10268,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9567,7 +10390,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 espree: 9.5.0 esquery: 1.5.0 esutils: 2.0.3 @@ -10109,6 +10932,14 @@ packages: for-in: 1.0.2 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false @@ -10124,7 +10955,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.23.5 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.1.0 @@ -10343,6 +11174,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true + /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -10445,6 +11281,18 @@ packages: find-index: 0.1.1 dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 5.0.0 + path-scurry: 1.10.1 + dev: true + /glob@7.0.6: resolution: {integrity: sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==} dependencies: @@ -10466,17 +11314,6 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - /global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -10886,15 +11723,6 @@ packages: entities: 2.2.0 dev: true - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true - /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true @@ -11758,8 +12586,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.3 - '@babel/parser': 7.22.10 + '@babel/core': 7.23.6 + '@babel/parser': 7.23.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -11767,6 +12595,15 @@ packages: - supports-color dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -12410,6 +13247,11 @@ packages: engines: {node: '>=8'} dev: true + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -12448,7 +13290,7 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /make-dir@2.1.0: @@ -12775,6 +13617,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -13057,18 +13906,6 @@ packages: is-stream: 1.1.0 dev: true - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -13122,10 +13959,6 @@ packages: vm-browserify: 1.1.2 dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -13578,7 +14411,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -13594,25 +14427,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - dev: true - /parse5@3.0.3: resolution: {integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==} dependencies: '@types/node': 9.6.61 dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: @@ -13663,6 +14483,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 5.0.0 + dev: true + /path-to-regexp@1.7.0: resolution: {integrity: sha512-nifX1uj4S9IrK/w3Xe7kKvNEepXivANs9ng60Iq7PU/BlouV3yL/VUhFqTuTq33ykwUqoNcTeGo5vdOBP4jS/Q==} dependencies: @@ -14418,7 +15246,7 @@ packages: '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.27) '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.27) autoprefixer: 10.4.14(postcss@8.4.27) - browserslist: 4.21.5 + browserslist: 4.22.2 css-blank-pseudo: 3.0.3(postcss@8.4.27) css-has-pseudo: 3.0.4(postcss@8.4.27) css-prefers-color-scheme: 6.0.3(postcss@8.4.27) @@ -14472,7 +15300,7 @@ packages: '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.32) '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.32) autoprefixer: 10.4.14(postcss@8.4.32) - browserslist: 4.21.5 + browserslist: 4.22.2 css-blank-pseudo: 3.0.3(postcss@8.4.32) css-has-pseudo: 3.0.4(postcss@8.4.32) css-prefers-color-scheme: 6.0.3(postcss@8.4.32) @@ -14710,24 +15538,22 @@ packages: engines: {node: '>=0.10.0'} dev: true - /prettier-eslint@15.0.1: - resolution: {integrity: sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==} - engines: {node: '>=10.0.0'} + /prettier-eslint@16.2.0: + resolution: {integrity: sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==} + engines: {node: '>=16.10.0'} dependencies: - '@types/eslint': 8.21.2 - '@types/prettier': 2.7.2 - '@typescript-eslint/parser': 5.55.0(eslint@8.36.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.17.0(eslint@8.36.0)(typescript@5.3.3) common-tags: 1.8.2 dlv: 1.1.3 eslint: 8.36.0 indent-string: 4.0.0 lodash.merge: 4.6.2 loglevel-colored-level-prefix: 1.0.0 - prettier: 2.8.4 - pretty-format: 23.6.0 + prettier: 3.1.1 + pretty-format: 29.7.0 require-relative: 0.8.7 - typescript: 4.9.5 - vue-eslint-parser: 8.3.0(eslint@8.36.0) + typescript: 5.3.3 + vue-eslint-parser: 9.3.2(eslint@8.36.0) transitivePeerDependencies: - supports-color dev: true @@ -14766,6 +15592,23 @@ packages: typescript: 4.9.5 dev: true + /prettier-plugin-organize-imports@3.2.4(prettier@2.2.1)(typescript@4.9.5): + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + dependencies: + prettier: 2.2.1 + typescript: 4.9.5 + dev: true + /prettier-plugin-packagejson@2.4.3(prettier@2.2.1): resolution: {integrity: sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ==} peerDependencies: @@ -14792,6 +15635,19 @@ packages: synckit: 0.8.5 dev: true + /prettier-plugin-packagejson@2.4.8(prettier@2.2.1): + resolution: {integrity: sha512-ZK37c6pRUKeUIpQWNEdMgNUiGSG5BTfeeAIA01mRjVGTfWxxVzM55Cs+LaHyweFJbEgkgCNsqMA3LGEAjfOPtA==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + dependencies: + prettier: 2.2.1 + sort-package-json: 2.6.0 + synckit: 0.8.8 + dev: true + /prettier-plugin-two-style-order@1.0.1(prettier@2.8.4): resolution: {integrity: sha512-ETltO2FRR/Pxc7bsgz2XwuzWSPwafl7/v5+5Rria4S579CTas7dya+xsmbkix0q1tYQiuRjVVdfGnCKlH/aOuQ==} peerDependencies: @@ -14815,6 +15671,12 @@ packages: hasBin: true dev: true + /prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: @@ -14822,13 +15684,6 @@ packages: renderkid: 3.0.0 dev: true - /pretty-format@23.6.0: - resolution: {integrity: sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==} - dependencies: - ansi-regex: 3.0.1 - ansi-styles: 3.2.1 - dev: true - /pretty-format@26.6.2: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} engines: {node: '>= 10'} @@ -14839,6 +15694,15 @@ packages: react-is: 17.0.2 dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -15833,7 +16697,7 @@ packages: /react-redux@8.0.5(@types/react-dom@16.9.18)(@types/react@16.14.35)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1): resolution: {integrity: sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==} peerDependencies: - '@types/react': ^16.0.0 + '@types/react': ^16.8 || ^17.0 || ^18.0 '@types/react-dom': ^16.8 || ^17.0 || ^18.0 react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 @@ -16822,6 +17686,11 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -16848,11 +17717,6 @@ packages: engines: {node: '>=12'} dev: true - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: true - /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -16963,6 +17827,19 @@ packages: sort-object-keys: 1.1.3 dev: true + /sort-package-json@2.6.0: + resolution: {integrity: sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==} + hasBin: true + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.0 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.1.3 + is-plain-obj: 4.1.0 + sort-object-keys: 1.1.3 + dev: true + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true @@ -17264,6 +18141,15 @@ packages: strip-ansi: 6.0.1 dev: true + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: @@ -17355,6 +18241,13 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -17419,16 +18312,16 @@ packages: tslib: optional: true dependencies: - '@babel/cli': 7.21.0(@babel/core@7.21.3) - '@babel/core': 7.21.3 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.21.3) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.3) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.3) - '@babel/preset-env': 7.20.2(@babel/core@7.21.3) - '@babel/preset-react': 7.18.6(@babel/core@7.21.3) - '@babel/preset-typescript': 7.21.0(@babel/core@7.21.3) - '@babel/traverse': 7.22.10 + '@babel/cli': 7.21.0(@babel/core@7.23.6) + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.6) + '@babel/preset-env': 7.20.2(@babel/core@7.23.6) + '@babel/preset-react': 7.18.6(@babel/core@7.23.6) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) + '@babel/traverse': 7.23.6 '@emotion/unitless': 0.8.0 css-to-react-native: 3.2.0 react: 17.0.2 @@ -17750,6 +18643,14 @@ packages: tslib: 2.6.2 dev: true + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.0 + tslib: 2.6.2 + dev: true + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -18040,6 +18941,15 @@ packages: utf8-byte-length: 1.0.4 dev: true + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + /ts-is-present@1.2.2: resolution: {integrity: sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g==} dev: true @@ -18187,6 +19097,12 @@ packages: hasBin: true dev: true + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: true @@ -18374,17 +19290,6 @@ packages: dev: true optional: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -18659,16 +19564,16 @@ packages: acorn-walk: 8.2.0 dev: true - /vue-eslint-parser@8.3.0(eslint@8.36.0): - resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /vue-eslint-parser@9.3.2(eslint@8.36.0): + resolution: {integrity: sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 eslint: 8.36.0 eslint-scope: 7.1.1 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 espree: 9.5.0 esquery: 1.5.0 lodash: 4.17.21 @@ -18935,6 +19840,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/scripts/must.js b/scripts/must.js index b3e966a1e..8335ae382 100644 --- a/scripts/must.js +++ b/scripts/must.js @@ -14,7 +14,6 @@ * limitations under the License. */ -const must = require('@oceanbase-odc/ob-intl-cli'); const path = require('path'); const fs = require('fs'); const _ = require('lodash'); @@ -25,7 +24,7 @@ const baseDir = path.join(__dirname, '..'); const localePath = path.join(baseDir, 'src/locales'); -const outputPath = path.join(localePath, './must'); +const outputPath = path.join(localePath, './must/strings'); const exclude = 'src/main'; @@ -40,17 +39,29 @@ function matchText(text, path) { path.parentPath.parentPath.parentPath.parentPath.parentPath.toString(), ); } catch (e) {} - return /[^\x00-\xff]/.test(text) - // && !isConsoleLog && !isFormattedMessage; // ^\x00-\xff 表示匹配中文字符 + return /[\u{4E00}-\u{9FFF}]+(?![\u3000-\u303F\uFF01-\uFF5E])/gumi.test(text) && !isConsoleLog; } - +const commentContent = +`/* + * 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. + */\n`; const config = { - cwd: baseDir, name: pkg.name, entry: 'src', - fileType: 'ts', - sourceLang: 'zh-CN', - prettier: true, + output: outputPath, + sep: '.', exclude: (path) => { return ( path.includes('src/.umi') || @@ -58,133 +69,18 @@ const config = { (!!exclude && path.includes(exclude)) ); // 不处理 .umi 下的文件 }, - matchCopy: matchText, - macro: { - path: outputPath, - method: `formatMessage({id: '$key$'})`, + sourceLang: 'zh-CN', + targetLang: 'en-US', + matchFunc: matchText, + injectContent: { import: "import { formatMessage } from '@/util/intl';\n", - showComment: true, - }, - hook: { - beforeExtract: (sourceAST, absoluteFilePath, config) => { - if (absoluteFilePath.indexOf('/store/task') > -1) { - console.log(sourceAST); // 当前文件的 AST - console.log(absoluteFilePath); // 文件路径 - console.log(config); // must 配置 - } - return sourceAST; // 必须返回新的 AST - }, - afterExtract: (injectedAST, keyMap, absoluteFilePath, config) => { - if (absoluteFilePath.indexOf('/store/test') > -1) { - console.log(injectedAST); // 当前文件的 AST - console.log(keyMap); // 提取的文案列表 - console.log(absoluteFilePath); // 文件路径 - console.log(config); // must 配置 - } - return injectedAST; // 返回修改后的 AST - }, + importPath: '@/util/intl', + method: `formatMessage({id: '$key$' })`, + headComment: { + hasHeadComment: false, + commentContent, + } }, }; -const mode = process.argv[2]; - -async function run() { - await must.run(config, true); - // languages.forEach((language) => { - // const jsonPath = path.join(outputPath, 'strings', language + '.json'); - // if (fs.existsSync(jsonPath)) { - // cpx(jsonPath, localePath); - // } - // }); - // fs.unlinkSync(path.join(outputPath, 'index.ts')); - // fs.unlinkSync(path.join(outputPath, 'strings/index.d.ts')); - // fs.unlinkSync(path.join(outputPath, 'strings/index.js')); -} - -async function clear() { - await must.clear(config, true); - // languages.forEach((language) => { - // const jsonPath = path.join(outputPath, 'strings', language + '.json'); - // if (fs.existsSync(jsonPath)) { - // cpx(jsonPath, localePath); - // } - // }); - // fs.unlinkSync(path.join(outputPath, 'index.ts')); - // fs.unlinkSync(path.join(outputPath, 'strings/index.d.ts')); - // fs.unlinkSync(path.join(outputPath, 'strings/index.js')); -} - -async function online() { - await must.import.run({ - type: 'json', - path: outputPath, - medusa: { - appName: 'odc', - }, - }); - medusaCheck(); -} - -function medusaCheck() { - const baseline = path.join(outputPath, 'strings', 'zh-CN.json'); - const validTargets = [ - path.join(outputPath, 'strings', 'en-US.json'), - path.join(outputPath, 'strings', 'zh-TW.json'), - ]; - try { - function getAllKeyRow(data) { - Object.keys(data).map((key) => { - const value = data[key]; - if (!value.match) { - console.log('empty value ', value, '-', key); - } - const params = value.match(/\{[^}\s]+\}/g); - if (params && params.length) { - data[key] = { - params, - value, - }; - } else { - delete data[key]; - } - }); - return data; - } - const baselineData = getAllKeyRow(JSON.parse(fs.readFileSync(baseline).toString())); - validTargets.forEach((targetPath) => { - const targetData = getAllKeyRow(JSON.parse(fs.readFileSync(targetPath).toString())); - const baselineKeys = Object.keys(baselineData); - const targetKeys = Object.keys(targetData); - if (baselineKeys.length !== targetKeys.length) { - console.error( - `[error] 词条总量不一致, ${targetPath}\n count: ${targetPath.length} expect: ${baselineKeys.length}`, - ); - } - baselineKeys.forEach((baselineKey) => { - const { params, value } = baselineData[baselineKey] || {}; - const { params: targetParams, value: targetValue } = targetData[baselineKey] || {}; - if (!_.isEqual(params?.sort(), targetParams?.sort())) { - console.error( - `[error] ${targetPath} \n词条参数不一致 ${baselineKey} \n src: ${targetValue} \n zh-CN: ${value}`, - ); - } - }); - }); - } catch (e) { - console.error('解析错误', e); - process.exit(1); - } -} - -if (mode === 'online') { - online(); -} else if (mode === 'check') { - medusaCheck(); -} else if (mode === 'clear') { - clear() -} else if (mode) { - console.error(`${mode} is invalid`) - process.exit(1); -} else { - run(); -} \ No newline at end of file +module.exports = config; diff --git a/src/locales/must/strings/zh-CN.json b/src/locales/must/strings/zh-CN.json index dd5edae30..cec05d160 100644 --- a/src/locales/must/strings/zh-CN.json +++ b/src/locales/must/strings/zh-CN.json @@ -1,121 +1,62 @@ { - "portal.connection.form.back": "返回", "odc.TreeNodeMenu.config.table.ViewConstraints": "查看约束", - "workspace.window.table.object.upload": "上传修改", "odc.src.store.snippet.Delete": "删除", "odc.component.TaskDetailDrawer.csvTables.OriginalField": "原字段", - "odc.component.SQLConfig.DelimiterSettings": "界定符设置", - "workspace.tree.table.splitPartition.success": "分区分裂成功", - "workspace.window.createTable.column.comment.placeholder": "请填写字段注释", - "workspace.tree.table.createPartition": "新建分区", "odc.component.helpDoc.doc.AddACommitStatementTo": "导出指定行数据添加一句 COMMIT 语句", - "odc.ExportDrawer.ExportForm.exportTables.EnterAnObjectName": "请输入对象名称", - "workspace.window.export.drawer.format.onlyTransferDdl": "只导出表定义", - "workspace.window.sql.modal.export.limit": "行数限制", - "odc.component.CreateTypeModal.Next": "下一步", "workspace.header.tools.export": "导出", - "workspace.tree.sequence.refresh": "刷新", - "odc.ConnectionList.config.tools.OceanbaseCollege": "OceanBase 学院", - "workspace.window.createTable.constraint.columns.delayConfig.DEFERRABLE_INITIALLY_DEFERRED": "延迟验证", "workspace.window.createFunction.returnType.validation": "请输入函数返回值", "odc.component.SnippetForm.SyntaxType": "代码片段类型", - "menu.exception.not-found": "菜单未找到", "odc.component.EditPLParamsModal.Parameter": "参数名", "workspace.window.recyclebin.column.originName": "原名称", "odc.component.TaskDetailDrawer.csvTables.TargetField": "目标字段", - "workspace.window.sql.record.sql": "SQL 语句", - "odc.page.Gateway.JavaServiceExceptionPleaseRestart": "Java 服务异常,请重新启动!", "workspace.window.table.propstab.index": "索引", "workspace.header.create.table": "表", "odc.components.PackagePage.Created.2": "创建时间:", - "portal.connection.form.cloud.host.placeholder": "请填写公网地址", - "odc.components.TaskManagePage.ExportTask": "导出任务", "odc.ResourceTree.config.treeNodesActions.CreateAPackage.1": "新建包体", - "workspace.window.export.task.log.warn": "告警信息", "odc.component.GlobalHeader.BrowseHelpDocuments": "浏览帮助文档", "workspace.window.createProcedure.proName": "存储过程名称", - "odc.components.ResourceTree.Table": "表", - "odc.EditorToolBar.actions.text.Capital": "大写", "workspace.window.createTable.baseInfo.tableName.placeholder": "请填写表名称", "workspace.window.createFunction.dataType.validation": "请填写数据类型", - "odc.component.ReconnectModal.Reconnect": "重新连接", - "workspace.window.export.drawer.format.rowsPerCommit.required": "请填写行提交一次", - "workspace.window.import.form.format": "文件格式", "workspace.window.table.object.upload.failure": "上传失败", "odc.component.EditPLParamsModal.DataType": "数据类型", - "odc.components.CreateTablePartitionRuleForm.EnterAPartitionValue": "请输入分区值", "workspace.window.sql.explain.tab.detail.title": "执行详情", "odc.component.SubmitConfirm.TheOperationTakesEffectFor": "操作会对所有窗口生效。", - "workspace.window.import.task.status.success": "导入成功", "odc.ImportDrawer.ImportForm.PleaseUploadTheImportedFile": "请上传导入文件", - "odc.ConnectionList.config.tools.OmsIsAServiceProvided": "OMS 是 OceanBase 提供的一种支持同构或异构 RDBMS 与 OceanBase 之间进行数据交互的服务,它提供了数据的在线迁移和实时增量同步的数据复制能力。", "odc.components.TriggerPage.Owner.2": "所有者:", "odc.component.GrammerHelpSider.YouCanDragCodeSnippets": "可将代码片段拖入编辑器使用", "odc.EditorToolBar.actions.text.AllUppercase": "全部大写", "odc.components.TriggerPage.Editing": "编辑", "odc.components.PLDebugResultSet.StacksAndVariables": "堆栈与变量", - "workspace.window.import.form.format.sql": "SQL 文件", "odc.CreateTriggerPage.component.BaseInfoForm.TheLengthCannotExceedCharacters": "长度不超过 128 个字符", - "workspace.window.sql.button.export": "导出数据", - "layout.user.link.terms": "条款", "odc.component.CreateTypeModal.NewType": "新建类型", - "workspace.window.createSequence.params.startValue.validation": "请输入起始值", - "odc.component.DatabaseChangeDetailModal.CreationTime": "创建时间", - "workspace.window.createTable.column.defaultValue": "缺省值", - "workspace.window.sql.explain.tab.summary": "计划统计", "odc.page.Gateway.Jumping": "跳转中...", - "workspace.window.import.form.blankToNull.no": "否", "workspace.window.session.management.column.sessionId": "会话 ID", "workspace.window.createTable.partition.button.add": "添加分区", - "odc.ExportDrawer.ExportForm.exportTables.ObjectType": "对象类型", "odc.component.WindowManager.CloseAllWindows": "关闭所有窗口", - "odc.components.ConnectionCardList.SetTags": "设置标签", "workspace.header.create.sql": "SQL 窗口", "workspace.header.recycle": "回收站", "odc.components.CreateTriggerPage.StepBasicInformation": "第一步:基本信息", "odc.component.TaskDetailDrawer.status.Terminated": "已终止", "odc.components.DDLResultSet.JumpToTheBottom": "跳至底部", "workspace.window.sql.record.column.lock": "固定", - "workspace.window.createTable.partition.validation.mismatchColumns.list": "字段与枚举值不匹配,请注意使用括号与逗号分隔", "workspace.window.createFunction.params": "参数", - "workspace.tree.table.renamePartition": "重命名分区", - "portal.wizard.create.button": "创建连接", "workspace.window.createTable.column.comment": "字段注释", - "workspace.window.createFunction.button.addParam": "添加参数", "request.connection.killed": "SQL 执行异常,导致连接断开", - "odc.components.TaskManagePage.status.Failed": "失败", "odc.component.TaskDetailDrawer.TaskInfo.CsvSettings": "CSV 设置", - "workspace.window.sequence.load.error": "加载序列失败", "odc.component.CreateSynonymModal.SynonymType": "同义词类型", - "workspace.tree.table.search.placeholder": "请输入表名称", "odc.component.SQLConfig.Set": "设置", - "workspace.tree.sequence.delete": "删除", "odc.EditorToolBar.actions.text.AddIndentation": "添加缩进", - "odc.ConnectionList.config.help.HowToExportData": "如何导出数据", "odc.src.store.sql.RollbackSucceeded": "回滚成功", - "workspace.window.createPackage.packageName.help": "系统将在程序包自动添加后缀 “pkg”", - "odc.component.TaskStatus.ExecutionFailed": "执行失败", "workspace.window.createTable.partition.value.rangeColumns.placelholder": "字段 1,字段 2", - "workspace.window.createTable.step.optional": "(可选)", - "workspace.tree.table.cancelDelete": "取消删除", - "workspace.tree.table": "表", - "workspace.tree.sequence.browserSchema": "查看序列", "odc.component.TaskDetailDrawer.TaskInfo.FieldSeparator": "字段分隔符:", "odc.EditorToolBar.actions.sql.Termination": "终止", - "workspace.window.createSequence.params.minValue.placeholder": "请输入最小值", - "odc.TreeNodeMenu.config.table.EditIndex": "编辑索引", - "workspace.window.createTable.column.position": "顺序", - "workspace.window.createTable.column.dataType.length": "请设置数据类型中包含的长度", "odc.component.TaskDetailDrawer.csvTables.TargetFieldType": "目标字段类型", "odc.EditorToolBar.actions.text.AddComments": "添加注释", "odc.components.SQLConfirmPage.PreviousStep": "上一步", "workspace.window.function.load.error": "加载函数失败", "workspace.window.createPackageBody.success": "新建程序包体成功", - "odc.components.ConnectionCardList.Mode": "模式", "odc.components.TaskManagePage.Operation": "操作", - "odc.component.ReconnectModal.TheConnectionIsDisconnected": "连接已断开", "odc.CreateTriggerPage.component.AdvancedInfoFrom.ReferenceANewValue": "引用新值", - "workspace.window.createTable.constraint.columnNames.validation": "约束的列为空", "odc.EditorToolBar.actions.text.FindReplace": "查找/替换", "odc.component.EditPLParamsModal.Value": "值", "workspace.window.createSequence.params.minValue.validation": "最小值必须小于最大值", @@ -123,56 +64,28 @@ "odc.component.SnippetForm.SyntaxFragmentValuesprefixIsCreated": "代码片段 {valuesPrefix} 创建成功!", "odc.page.Workspace.TheTaskIsNotSaved": "任务未保存", "workspace.window.table.toptab.package.head": "包头", - "odc.components.ResourceTree.EnterATriggerName": "请输入触发器名称", "odc.ImportDrawer.ImportForm.ImportFiles": "导入文件", - "odc.ExportDrawer.ExportForm.ConnectionName": "连接名:", - "workspace.tree.table.createColumn": "新建列", - "workspace.window.sql.modal.savePL.name.placeholder": "请输入 PL 脚本名称", - "odc.TreeNodeMenu.config.table.DeleteAnIndex": "删除索引", "workspace.window.session.modal.sql.execute.success": "编辑变量成功", "odc.ExportDrawer.ExportForm.UseGlobalSnapshots": "使用全局快照", - "portal.connection.form.test.success.cloud": "测试成功,保存后单击连接名称即可登录使用啦!", - "odc.components.ConnectionCardList.TheTagHasBeenModified": "修改标签成功", "login.account.valid": "支持英文、数字、下划线和特殊字符(._+@#$%)的组合,长度为 4~48 个字符", "odc.EditorToolBar.actions.sql.RunF": "运行 F8/CtrlCmd+Enter", "password.label.confirm1": "确认密码", - "odc.TreeNodeMenu.config.table.SingleTableExport": "单表导出", - "odc.ImportDrawer.ImportForm.Mode": "模式", - "app.button.submit": "提交", - "workspace.window.sql.modal.export.character": "字符集", "workspace.window.session.button.search": "搜索", "odc.component.TaskDetailDrawer.TaskInfo.ConvertAnEmptyStringTo": "空字符串转为空值", "app.button.deselectAll": "取消全选", - "odc.ConnectionList.config.tools.OceanbaseMigrationService": "OceanBase 迁移服务", "odc.component.TaskDetailDrawer.TaskInfo.Skip": "跳过", - "portal.connection.form.username.placeholder": "请填写数据库用户名", - "odc.ExportDrawer.ExportForm.ExportDataSettings": "导出数据设置", - "odc.component.CreateTypeModal.Name": "名称", - "odc.EditorToolBar.actions.pl.ThisRoundOfDebuggingHas": "本轮调试已完成", "odc.AddConnectionDrawer.AddConnectionForm.ChangePassword": "修改密码", "odc.component.ErrorBoundary.SorryAnUnpredictableExceptionOccurred": "抱歉,系统发生了不可预知的异常,请", - "portal.connection.form.host": "主机名", "odc.component.TaskDetailDrawer.TaskInfo.ImportContent": "导入内容", - "odc.TreeNodeMenu.config.table.Rename": "重命名", - "workspace.header.tools": "工具", "workspace.window.view.load.error": "加载视图失败", - "workspace.tree.view.browserSchema": "查看视图属性", - "workspace.window.createTable.column.defaultValue.placeholder": "请填写缺省值", "odc.EditorToolBar.actions.pl.ExitDebugging": "退出调试", "workspace.window.createTable.column.name": "字段名称", "workspace.window.createTable.baseInfo.collation": "默认排序规则", "odc.ResourceTree.config.treeNodesActions.See": "查看", - "odc.component.DatabaseChangeDetailModal.TaskType": "任务类型", "odc.components.SynonymPage.Name": "名称:", - "workspace.window.createTable.constraint.columns.column": "列信息", - "workspace.tree.package.type": "类型", "odc.EditorToolBar.actions.text.DeleteComments": "删除注释", "odc.ImportDrawer.ImportForm.ImportStructuresAndData": "导入结构和数据", "odc.EditorToolBar.actions.text.Case": "大小写", - "odc.src.store.task.TheSqlExecutionNeedsTo": "该 SQL 执行需要通过审核,是否确定?", - "portal.connection.form.name.placeholder": "请填写连接名称", - "workspace.window.createFunction.delete.success": "删除函数成功", - "odc.components.ConnectionCardList.TopOperationFailed": "置顶操作失败", "odc.components.TypePage.Owner": "所有者", "odc.component.TaskDetailDrawer.TaskInfo.Format": "格式", "odc.EditorToolBar.actions.pl.Debugging": "调试", @@ -181,450 +94,214 @@ "odc.components.PLPage.statusBar.Complete": "完成", "workspace.window.createFunction.funName": "函数名称", "odc.component.TaskDetailDrawer.status.Unknown": "未知", - "odc.page.Workspace.ISee": "我知道了", - "login.username.validation.email": "无效的邮箱", - "odc.components.ConnectionCardList.InvalidConnection": "失效连接", - "odc.ConnectionList.config.help.Faq": "常见问题解答", - "odc.components.ConnectionCardList.ConnectionName": "连接名", "workspace.window.sql.button.columnFilter.title": "请选择要展示的列", "portal.connection.form.address": "连接地址", - "workspace.window.sql.button.unIndent": "反缩进", "odc.component.TaskDetailDrawer.TaskInfo.ContainsColumnHeaders": "包含列头", - "odc.ConnectionList.config.help.InAdditionToThePreceding": "本教程除了上述常见操作外,将向您介绍 SQL 控制台中一些容易被忽略的小技巧,这些操作将帮助您更便利在 SQL 控制台中进行开发管理任务。", "workspace.window.table.propstab.ddl": "DDL", - "workspace.window.session.button.closeSession.query": "关闭会话当前查询", - "workspace.window.createView.columns.validation.empty": "字段不能为空", - "odc.TreeNodeMenu.config.table.RenameAColumn": "重命名列", - "workspace.window.createTable.constraint.columns.column.validation": "列信息不能为空", - "menu.login": "登录", - "workspace.window.createTable.constraint.columns.delayConfig": "可延迟状态", "odc.components.DDLResultSet.Rollback": "回滚", - "odc.components.TaskManagePage.TaskStatus": "任务状态", "odc.src.util.utils.Milliseconds": "毫秒", "odc.ResourceTree.config.treeNodesActions.Run": "运行", "odc.component.TaskDetailDrawer.TaskInfo.DoNotAddOrDelete": "不添加删除表语句", "odc.ResourceTree.config.treeNodesActions.CreateAPackage": "新建程序包", - "odc.ConnectionList.config.help.TipsForHidingInSql": "SQL 控制台中隐藏的小技巧", - "odc.src.d.ts.ExportTask": "导出任务", "odc.EditorToolBar.actions.pl.BatchExecution": "批量执行", "odc.TreeNodeMenu.config.sequence.Delete": "删除", - "workspace.tree.table.deleteIndex": "删除索引", "login.button.changePassword": "修改密码", "odc.component.CommonIDE.Result": "运行结果", "odc.ImportDrawer.ImportForm.SelectAFileEncoding": "请选择文件编码", - "workspace.window.sql.record.pagination.current": "第 {num} 页", - "layout.user.link.privacy": "隐私", - "odc.component.SQLCodeEditor.ViewDetails": "查看详情", "workspace.window.session.modal.title": "编辑变量", "workspace.window.createTable.partition.value.range": "区间上限值", "odc.ImportDrawer.ImportForm.ContainsColumnHeaders": "包含列头", "workspace.window.PackageBody.modal.delete": "是否确定删除程序包 {name} 的包体?", - "workspace.window.import.task.status.toberetry": "待重试", "workspace.window.session.button.closeSession": "关闭会话", - "odc.src.d.ts.DatabaseChanges": "数据库变更", - "login.password.placeholder.strength": "请输入密码,至少包含 2 个数字,2 个大写字母,2 个小写字母,2 个特殊字符", "workspace.window.session.management.column.command": "命令", - "odc.EditorToolBar.actions.text.Lowercase": "小写", - "odc.ExportDrawer.ExportForm.TheTaskNameCannotExceed": "任务名不超过 110 个字符", - "workspace.window.createTable.partition.columns": "选择字段", - "request.401": "会话已过期,请重新登录", "odc.components.PLDebugResultSet.LineNumber": "行号", - "odc.components.ResourceTree.Sequence": "序列", "odc.TreeNodeMenu.config.table.ViewPartitions": "查看分区", "odc.src.d.ts.StoredProcedure": "存储过程", "workspace.tree.procedure.create": "新建存储过程", "login.password.placeholder": "请输入密码", "login.subTitle": "一款安全、高效的企业级数据库开发平台", "odc.components.ExportDrawer.TheMaximumDataSizeCannot": "数据最大不能超过 2GB,如需导出大量数据,请使用导数工具 OBDUMPER", - "odc.component.SnippetForm.TheSyntaxCannotExceedCharacters": "代码片段长度不超过 2000 个字符", - "workspace.window.import.form.skippedDataType.custom": "用户自定义类型", - "workspace.window.createTable.baseInfo.tableSize": "数据块大小", "odc.component.helpDoc.doc.TheActionToPerformWhen": "当导入的表结构存在重复时执行的操作", - "odc.ImportDrawer.ImportForm.EnterTheTaskName": "请填写任务名", "odc.components.TypePage.Table": "表", - "workspace.window.createTable.partition.column": "字段", - "odc.components.TaskManagePage.DeletedSuccessfully": "删除成功", - "workspace.window.table.propstab.reffered": "被引用", "odc.TreeNodeMenu.config.table.ViewColumns": "查看列", "odc.EditorToolBar.actions.pl.JumpOut": "跳出", - "workspace.window.createSequence.params.maxValue.placeholder": "请输入最大值", "odc.ImportDrawer.ImportForm.EnterALineBreakSymbol": "请填写换行符号", - "workspace.header.create.package": "程序包", - "workspace.window.sql.modal.saveSQL.success": "保存 SQL 成功", - "portal.connection.delete.modal.content": "删除后将无法访问该连接", "odc.component.TaskDetailDrawer.status.Failed": "失败", - "workspace.tree.package.body.create": "新建包体", "odc.components.TypePage.Owner.1": "所有者:", "odc.TablePage.TableData.TheModificationIsSuccessfulAnd": "修改成功,手动提交后生效", "odc.ImportDrawer.csvMapping.OriginalField": "原字段", - "odc.ExportDrawer.ExportForm.AddAndDeleteTableStatements": "添加删除对象语句", - "odc.EditorToolBar.actions.pl.AreYouSureYouWant": "是否确定退出调试?", "odc.ImportDrawer.ImportForm.FileEncoding": "文件编码", "odc.components.TriggerPage.Cancel": "取消", - "workspace.window.export.modal.close.content": "关闭后所有正在导出的任务将会终止,并会删除已导出的文件。", - "odc.ConnectionList.config.help.ThisTopicDescribesHowTo": "本篇教程介绍在 ODC 中进行数据批量导出操作的详细步骤。", "workspace.window.table.datatab.placeholder": "请输入", "workspace.window.sql.modal.savePL.success": "保存 PL 成功", "workspace.window.session.management.column.status": "状态", "workspace.window.sql.modal.close.content": "“{name}” 已经被修改,如不保存,修改将丢失", - "odc.AddConnectionDrawer.AddConnectionForm.ApsaraStack": "专有云", "workspace.window.session.management.column.obproxyIp": "OB Proxy", - "odc.main.utils.CheckTheJavaEnvironmentFailed": "检查 Java 环境失败", - "workspace.header.create.procedure": "存储过程", "odc.TreeNodeMenu.config.synonym.CreateSynonym": "新建同义词", - "workspace.window.table.modal.column.title.create": "新建字段", - "workspace.window.createSequence.params.cycled": "是否循环", "odc.components.SQLConfirmPage.AreYouSureYouWant": "是否确认返回上一步?", "odc.EditorToolBar.actions.text.AllLowercase": "全部小写", - "workspace.window.recyclebin.button.cleanAll": "清空回收站", - "workspace.window.sql.modal.saveSQL.title": "保存 SQL", "odc.ImportDrawer.ImportForm.BatchSubmissionQuantity": "批量提交数量", "workspace.window.sql.explain.detail.failed": "查看 SQL 执行详情失败", - "odc.TreeNodeMenu.config.table.SingleTableImport": "单表导入", - "workspace.tree.table.partition": "分区", - "portal.connection.form.configUrl": "config url", "odc.component.SnippetForm.SyntaxDescription": "代码片段描述", "odc.components.ImportDrawer.NoMappingRelationshipSelected": "未选择映射关系", - "workspace.window.createSequence.step2": "第二步:设置属性", - "workspace.window.createSequence.step1": "第一步:基本信息", "odc.helper.page.openPage.CreateSynonym": "新建同义词", "odc.components.SynonymPage.Created": "创建时间:", "odc.src.d.ts.Function": "函数", - "odc.components.ConnectionCardList.Editing": "编辑", "odc.components.CreateTablePartitionRuleForm.ThePartitionNameMustBeUnique": "分区名称不能重复", - "workspace.window.database.size.unknown": "未知", "odc.ImportDrawer.ImportForm.EnterTheNumberOfBatch": "请填写批量提交数量", - "portal.connection.form.cluster.validation": "测试连接时请填写集群名", - "odc.ImportDrawer.csvMapping.NoTargetFieldIsSet": "未设置目标字段", - "odc.TaskManagePage.DatabaseChange.ViewTasks": "查看任务", - "workspace.window.export.task.log.error": "错误信息", - "workspace.window.createTable.constraint.columns.deleteAction": "删除", - "odc.components.RecycleBinPage.NoteDeletedObjectsAreOnly": "提示:已删除对象仅在回收站中暂存", - "odc.components.Header.homeMenu.SearchForKeywords": "请搜索关键字", "workspace.window.sql.button.edit.enable": "开启编辑", "workspace.window.sql.explain.tab.detail.card.time.label.execTime": "执行耗时", - "workspace.window.createTable.index.range.local": "局部索引", - "menu.exception.403": "无权限", "odc.components.DDLResultSet.Submitted": "提交", "odc.AddConnectionDrawer.AddConnectionForm.Password": "密码", - "workspace.window.sql.explain.tab.detail.card.time.label.waitTime": "执行过程等待时间", "odc.components.TriggerPage.Determine": "确定", - "workspace.window.table.modal.constraint.title": "新建约束", "workspace.window.createPackageBody.modal.title": "新建程序包体", - "odc.components.Header.homeMenu.NewWindowOpensConnection": "新窗口打开连接", "odc.components.ResourceTree.ViewTree.TheViewHasBeenDeleted": "删除视图成功", - "odc.ResourceTree.actions.EditSubject": "编辑主体", - "odc.components.ImportDrawer.TheNewSingleTableHas": "新建单表导入成功!", "odc.component.PartitionRange.PartitionName": "分区名称", "odc.components.CreateTableColumnForm.PrimaryKeyRowcolumnname": "<主键>{rowColumnName}", - "workspace.window.sql.modal.savePL.name": "名称", "portal.connection.form.test": "测试连接", - "odc.ImportDrawer.ImportForm.OdcFormat": "ODC 格式", "portal.connection.delete.success": "删除成功", - "workspace.window.import.form.columnSeparateCharac": "列分隔符", - "odc.components.TaskManagePage.Delete": "删除", - "workspace.window.createTable.constraint.columns.name.placeholder": "请填写约束名称", - "workspace.window.export.button.cancel.confirm.desc": "取消本次导出操作,文件会被删除。", - "workspace.window.sql.button.edit": "编辑", - "odc.components.CreateTablePartitionRuleForm.SelectAFieldFirst": "请先选择字段", - "portal.connection.list.search.placeholder": "连接名称", - "workspace.window.import.task.status.retring": "重试中", - "workspace.window.createTable.partition.avgRowLength": "平均长度", - "odc.TreeNodeMenu.config.table.PartitionSplitting": "分区分裂", "workspace.window.createSequence.params.maxValue.validation": "最大值必须大于最小值", - "workspace.window.export.table.modified": "最近更新时间", "odc.component.WindowManager.CloseOtherWindows": "关闭其它窗口", - "odc.component.TreeSearchBar.CommonSynonyms": "公用同义词", "workspace.window.sql.result.failure": "执行以下 SQL 失败", - "odc.component.TaskDetailDrawer.TaskInfo.ModeName": "模式名", "odc.components.PLDebugResultSet.PlObjectName": "PL 对象名", "workspace.window.createFunction.dataType": "数据类型", - "odc.component.DatabaseChangeDetailModal.ExecutionTime": "执行时间", - "workspace.window.createTable.constraint.columns.refColumns.validation": "关联字段不能为空", - "workspace.window.createTable.constraint.primary": "主键约束", "app.button.ok": "确定", - "odc.src.store.sql.TheAuditSystemIsAbnormal": "审核系统异常,无法执行", "odc.EditorToolBar.actions.pl.Jump": "跳入", - "workspace.window.export.button.showLog": "查看日志", - "portal.connection.form.databaseName": "数据库名称", "odc.components.PLPage.TheObjectNameCannotBe": "不能修改对象名称(原名称:{plChanged0}, 现名称:{plChanged1})", "odc.components.DDLResultSet.Plan": "计划", "workspace.window.createFunction.funName.validation": "请输入函数名称", "portal.connection.delete.modal.title": "是否确认删除 {name} ?", - "odc.ConnectionList.config.tools.SupportsDataExchangeBetweenHomogeneous": "支持同构/异构数据库的数据交换", - "workspace.window.createTable.partition.validation.mismatchColumns": "字段与区间值不匹配,请注意逗号分隔", "odc.src.util.utils.Days": "天", - "odc.ConnectionList.config.tools.OceanbaseCommunity": "OceanBase 社区", "workspace.window.sql.explain.tab.detail.card.base.hitPlanCache": "是否命中缓存", - "odc.components.TaskManagePage.Termination": "终止", - "odc.ImportDrawer.ImportForm.Name": "名:", "workspace.window.sql.explain.tab.summary.columns.operator": "算子", - "odc.ResourceTree.config.treeNodes.InvalidObject": "无效对象", - "workspace.window.sql.modal.download.button": "下载文件", - "workspace.window.createTable.partition.partValues": "区间上限值", "odc.component.SelectPackagePLModal.SelectPlObject": "选择 PL 对象", - "workspace.window.createTable.partition.split.source": "源", - "odc.TaskManagePage.DatabaseChange.Delete": "删除", "odc.components.ResourceTree.Type": "类型", "odc.TreeNodeMenu.config.sequence.Refresh": "刷新", "odc.src.util.utils.Hours": "小时", "odc.ImportDrawer.ImportForm.SelectAnImportFormat": "请选择导入格式", - "workspace.window.export.button.save.success": "保存成功", "workspace.window.createTable.partition.name": "分区名称", "password.change.success": "修改密码成功", - "workspace.tree.table.deleteIndex.success": "删除索引成功", - "workspace.window.createTable.index.success": "索引更新成功", - "odc.CreateTriggerPage.component.BaseInfoForm.ItCannotBeEmpty": "不允许为空", - "portal.connection.form.tenant.validation": "请填写租户名", "workspace.window.createView.comment": "注释", - "odc.AddConnectionDrawer.AddConnectionForm.PublicCloud": "公有云", "odc.TreeNodeMenu.config.table.ViewIndexes": "查看索引", "odc.component.CreateSynonymModal.EnterASynonymName": "请输入同义词名称", - "workspace.window.export.button.cancel": "取消", - "workspace.window.createTable.partition.validation.columns": "请选择字段", - "workspace.window.sql.button.executeSingle": "运行当前语句", - "odc.ConnectionList.config.help.ToMakeItEasierFor": "为了让数据库开发者更方便的维护数据库内的数据,OceanBase 开发者中心(OceanBase Developer Center,ODC) 提供整库导出和单表导出功能。通过整库导出您可以批量选择数据库中的表或视图以导出其中的数据,通过单表导出,您可以导出目标表中的数据。目前 ODC 支持的导出格式有 ODC 格式和 SQL 格式。其中 SQL 格式和 ODC 格式是 OceanBase 导出工具特有的格式。创建导出任务后,您可以进入任务管理页面下载导出文件和查看任务详情和日志等信息。", - "workspace.window.sql.modal.export.failure": "生成文件失败", "workspace.window.sql.explain.tab.detail.card.io.rpcCount": "RPC(次)", - "workspace.window.table.modal.index.title": "新建索引", "odc.component.PropertyModal.WhenTheValueIsOff": "1、当该值为 OFF\n 时:主动触发提交/回滚操作;或通过产品功能创建、修改、删除数据库对象,执行 DDL\n 语句被动触发提交操作,会在所有窗口生效。", - "odc.main.utils.InstallJavaLaterThanMinjdkversion": "请安装 {minJDKVersion} 版本以上的Java", "workspace.window.createSequence.params.cycled.yes": "是", "odc.component.SnippetForm.TheSyntaxDescriptionCannotExceed": "代码片段描述长度不超过 200 个字符", "odc.components.SQLExplain.ViewFormattingInformation": "查看格式化信息", - "portal.connection.form.defaultDatabase.placeholder": "请填写默认数据库", - "workspace.window.sql.button.debug": "调试", "odc.components.TriggerPage.Status": "状态:", "odc.ImportDrawer.ImportForm.ImportContent": "导入内容", "odc.ExportDrawer.ExportForm.SelectExportContent": "请选择导出内容", "workspace.window.sql.explain.tab.detail.card.base.sqlID": "SQL ID", - "workspace.window.createTable.constraint.columns.refDatabase.oracle": "关联 Schema", "workspace.window.sql.explain.tab.detail.card.io.physicalRead": "物理读(次)", "odc.components.SQLConfirmPage.ExecuteDdlError": "执行 DDL 出错", - "odc.EditorToolBar.actions.pl.Save": "保存", - "workspace.window.export.modal.close.title": "是否确定关闭导出窗口?", - "workspace.window.import.form.format.text": "文本文件", "odc.components.PLPage.statusBar.Time": "时间:", "odc.component.TaskDetailDrawer.ObjTables.ObjectName": "对象名称", "workspace.window.createSequence.params.increament": "增量", "workspace.window.createView.definer": "创建人", "odc.components.SQLPage.Is": "是", - "odc.ConnectionList.config.tools.OceanbaseAlibabaCloud": "OceanBase 阿里云", - "workspace.tree.table.renameIndex": "重命名索引", - "odc.components.TaskManagePage.NoteOnlyTasksInThe": "提示:仅保留最近 48 小时内的任务", - "odc.ExportDrawer.ExportForm.ExportStructureSettings": "导出结构设置", - "workspace.window.createTable.index.invalidColumnNames": "索引使用的列发生变化,请重新编辑", "workspace.window.createProcedure.success": "创建存储过程成功", - "odc.main.utils.CheckWhetherJavaIsInstalled": "请确认 Java 是否正确安装", - "odc.AddConnectionDrawer.AddConnectionForm.SqlQueryTimeout": "SQL 查询超时", - "odc.component.TaskDetailDrawer.ObjTables.NumberOfProcessedData": "数据已处理数", "odc.ExportDrawer.ExportForm.EnterTheNumberOfBatch": "请填写批量提交数量", "app.button.cancel": "取消", "odc.component.SaveSQLModal.CannotContainBlankCharacters": "不能含有空白字符", "workspace.window.createTable.column.name.validation": "请填写字段名称", - "odc.component.TaskStatus.AuditDonTPass": "审核不通过", - "odc.ImportDrawer.ImportForm.TaskName": "任务名", - "odc.page.ConnectionList.HiWelcomeToOceanbaseDeveloper": "Hi,欢迎使用 OceanBase 开发者中心", - "portal.connection.form.cloud.host": "公网地址", - "workspace.tree.package.edit": "编辑包头包体", - "odc.components.ConnectionCardList.ConnectionManagement": "连接管理", "register.success": "注册用户成功", - "odc.components.LabelList.SetTags": "设置标签", "odc.components.PLDebugResultSet.Selected": "已选", "odc.page.Gateway.customConnect.DecryptionFailed": "解密失败!", - "workspace.header.session": "会话", - "odc.components.ConnectionCardList.Operation": "操作", "workspace.window.sql.record.column.executeSql": "SQL 语句", "odc.component.TaskDetailDrawer.TaskInfo.ImportDataSettings": "导入数据设置", "odc.TreeNodeMenu.config.sequence.ViewSequence": "查看序列", "odc.components.PLDebugResultSet.See": "查看", "workspace.window.sql.explain.button.showOutputFilter": "查看", - "workspace.header.tools.import": "导入", - "workspace.window.sequence.propstab.ddl": "DDL", - "odc.component.TaskDetailDrawer.TaskInfo.ExportTask": "导出任务", "workspace.window.createSequence.params.cacheSize.placeholder": "请输入缓存大小", - "odc.components.ConnectionCardList.All": "全部", "odc.component.CreateSynonymModal.CommonSynonym": "普通同义词", - "odc.components.Header.TaskPopover.ExportTask": "导出任务", - "odc.src.d.ts.ImportTask": "导入任务", "odc.component.PartitionRange.PartitionValueInput.PleaseFillIn": "请填写", - "odc.components.EditPLPage.ModifiedSuccessfully": "修改成功", - "workspace.tree.table.browserPartition": "查看分区", "odc.component.helpDoc.doc.TheTableDataInOdc": "ODC 格式的表数据内容为 CSV 文本", "workspace.window.recyclebin.column.objName": "对象名称", "odc.TablePage.TableData.SubmittedSuccessfully": "提交成功", - "portal.connection.form.cluster.validation.trim": "集群名首尾包含空格,请注意", "workspace.window.sql.explain.tab.summary.title": "计划详情", "odc.component.SubmitConfirm.TheCurrentConnectionUsesA": "当前连接采用共享 Session,", - "workspace.window.createTable.constraint.columns.refTable.validation": "关联表不能为空", "odc.components.TriggerPage.Type": "类型", - "odc.ConnectionList.config.tools.DatabaseManagementPlatform": "数据库管理平台", "odc.component.TaskDetailDrawer.status.Waiting": "等待中", "odc.component.GlobalHeader.Feedback": "意见反馈", "odc.component.TaskDetailDrawer.TaskInfo.Label": "{label}:", - "odc.components.Sider.Type": "类型", "workspace.window.createTable.partition.position": "顺序", "odc.ImportDrawer.ImportForm.DataTypeSkipped": "不导入的数据类型", - "workspace.tree.package.refresh": "刷新", "workspace.window.createSequence.params.ordered.no": "否", "workspace.window.createTable.partition.type.validation": "请选择分区方法", - "workspace.window.session.globalParams": "全局变量", "workspace.window.table.propstab.info": "基本信息", - "odc.page.ConnectionList.JavaServiceExceptionPleaseRestart": "Java 服务异常,请重新启动!", - "workspace.window.sql.record.pagination.totalPageNum": "共 {num} 页", - "workspace.tree.package.head": "包头", - "odc.ConnectionList.config.help.OceanbaseDeveloperCenterOdcIs": "OceanBase 开发者中心(OceanBase Developer Center,ODC)是为 OceanBase 数据库量身打造的企业级数据库开发平台。ODC 支持连接 OceanBase 中 MySQL 和 Oracle 模式下的数据库,同时为数据库开发者提供了数据库日常开发操作、WebSQL、SQL 诊断、会话管理和数据导入导出等功能。", "workspace.window.recyclebin.column.newName": "重命名(可选)", "odc.component.SnippetForm.Syntax": "代码片段名称", - "odc.components.Sider.Trigger": "触发器", "odc.component.helpDoc.doc.EachTimeASpecifiedRow": "每导入指定行数据,数据库自动提交一次", "odc.component.CreateSynonymModal.EnterAnObjectOwner": "请输入对象所有者", - "portal.connection.form.password.placeholder": "请填写数据库密码", "odc.AddConnectionDrawer.AddConnectionForm.IntelligentResolution": "智能解析", - "odc.AddConnectionDrawer.AddConnectionForm.Seconds": "秒", "odc.components.Header.ConnectionPopover.HostnamePort": "主机名/端口:", - "workspace.window.import.drawer.title": "导入设置", - "workspace.tree.table.editColumn": "编辑列", "odc.component.GrammerHelpSider.AreYouSureYouWant": "是否确认删除代码片段 {snippetPrefix}?", - "odc.ImportDrawer.ImportForm.TheTaskNameCannotExceed": "任务名不超过 110 个字符", "odc.component.TaskDetailDrawer.TaskInfo.FileEncoding": "文件编码", - "portal.connection.form.test.failure.cloud": "测试失败,请修改后重试!", - "portal.connection.form.test.success": "连接成功", - "workspace.window.export.task.status.retring": "重试中", - "odc.components.ConnectionCardList.Top": "置顶", - "odc.component.TaskDetailDrawer.TaskLog": "任务日志", "odc.components.TypePage.Name": "名称", "odc.ExportDrawer.ExportForm.SqlFormat": "SQL 格式", "odc.components.SQLConfirmPage.TheNameTriggerWasCreated": "{name} 触发器创建成功", "workspace.window.createTable.index.range": "索引范围", - "workspace.window.table.object.setNull": "设置为空", - "odc.components.ConnectionCardList.UnableToModifyTheTag": "修改标签失败", "odc.ResourceTree.actions.Disable": "禁用", - "odc.ConnectionList.config.help.ThisTutorialDescribesHowTo": "本教程介绍在 ODC 中创建数据库连接的详细步骤。", - "workspace.window.sql.record.result": "结果", "odc.component.TaskDetailDrawer.TaskInfo.ClearDataBeforeImport": "导入前清空数据", "password.label.new": "新密码", - "portal.connection.form.test.failure": "连接失败", "odc.components.PLPage.statusBar.Run": "运行", - "odc.component.TaskStatus.Approved": "审核通过", "workspace.header.session.params": "会话属性", - "odc.components.ConnectionCardList.TotalFilteredandsorteddatalopic": "共计{filteredAndSortedDataLength}条", - "workspace.header.sql": "工作台", "odc.ImportDrawer.csvMapping.FieldMapping": "字段映射", "workspace.window.createSequence.params.cached.no": "无缓存", "workspace.window.createPackage.modal.title": "新建程序包", - "odc.components.TaskManagePage.TryAgain": "重试", "odc.components.TaskManagePage.TerminatedSuccessfully": "终止成功", - "workspace.window.import.task.status.init": "待导入", - "odc.page.ConnectionList.IsInTheConnection": "正在连接中", - "odc.components.CreateSequenceParamsForm.NextBufferValue": "下一个缓冲值", - "odc.ExportDrawer.ExportForm.exportTables.SelectAllObjects": "选择所有对象", "odc.components.ImportDrawer.DuplicateMappingRelationships": "映射关系存在重复", "odc.components.PackagePage.LastModifiedTime": "最近修改时间:", - "odc.ImportDrawer.ImportForm.CsvSettings": "CSV 设置", - "workspace.tree.table.deleteColumn": "删除列", - "workspace.window.sql.button.compile": "编译", - "odc.components.ConnectionCardList.ConnectionSucceeded": "连接成功", "odc.CreateTriggerPage.component.AdvancedInfoFrom.SelectAtLeastOneEvent": "请至少选择一个事件", "workspace.window.function.propstab.params": "参数", "odc.components.PLDebugResultSet.State": "状态", - "odc.ExportDrawer.ExportForm.Database": "数据库", - "workspace.window.createSequence.name.placeholder": "请输入序列名称", "workspace.window.createSequence.delete.success": "删除序列成功", "odc.component.TaskDetailDrawer.TaskInfo.ExportContent": "导出内容", "odc.components.SQLConfirmPage.NameTypeCreated": "{name} 类型创建成功", - "portal.connection.form.defaultDBName.validation": "测试连接时请填写默认数据库名", - "odc.page.ConnectionList.RelatedTools": "相关工具", - "workspace.window.createTable.column.dataType.required": "请填写数据类型", - "workspace.tree.table.deleteConstraint.success": "删除约束成功", "odc.components.PLDebugResultSet.FailedToRun": "运行失败", "odc.component.TaskDetailDrawer.csvTables.FirstLineValue": "首行值", "odc.ResourceTree.config.treeNodesActions.Delete": "删除", "odc.ImportDrawer.ImportForm.TextRecognizer": "文本识别符", - "workspace.tree.table.createPartition.success": "新建分区成功", - "portal.connection.form.host.cloud.placeholder": "请填写数据库地址", "workspace.window.sql.result.pagination.total": "共 {total} 行", - "workspace.window.export.task.created.success": "创建导出任务成功", "odc.components.PLDebugResultSet.Mode": "模式", - "odc.src.store.sql.SystemException": "系统异常", - "odc.components.TaskManagePage.AreYouSureYouWant": "是否确认删除该任务?", - "odc.component.TaskDetailDrawer.TaskInfo.TaskName": "任务名", "workspace.window.createSequence.modal.title": "新建序列", "odc.components.ConnectionCardList.Copy": "复制", - "portal.connection.form.username": "数据库用户名", "odc.ResourceTree.config.treeNodesActions.Debugging": "调试", "odc.EditorToolBar.actions.script.SyntaxHelp": "代码片段", - "workspace.window.sql.modal.export.title": "导出数据", "workspace.window.sql.explain.tab.detail.card.base.traceID": "Trace ID", - "odc.components.TaskManagePage.ImportAndExport": "导入导出", "odc.components.PLDebugResultSet.RunSuccessfully": "运行成功", "odc.page.Exception.404.ReturnToHomePage": "返回主页", - "portal.connection.form.host.validation": "测试连接时请填写主机名", "odc.component.TaskStatus.Executing": "执行中", - "odc.components.ResourceTree.TypeTree.Delete": "删除", - "odc.ConnectionList.config.tools.OmsProvidesAVisualCentralized": "OMS 提供可视化的集中管控平台,通过简单的配置即可完成数据的实时迁移,且对源数据库和业务系统的影响可忽略不计。OMS 旨在帮助您以低风险、低成本、高效率实现同构或异构数据库向 OceanBase 进行实时数据迁移和数据同步。", - "odc.EditorToolBar.actions.pl.AutomaticDebugging": "自动调试", - "odc.components.TaskManagePage.Retry": "重试中", "odc.components.SQLConfirmPage.Create": "创建", "workspace.window.procedure.load.error": "加载存储过程失败", "odc.component.SnippetForm.TheSyntaxNameCannotExceed": "代码片段名称不能超过 60 个字符", - "workspace.header.tools.task.title": "任务管理", - "odc.src.store.test.OhMyGod": "我的天啊", - "odc.component.SQLCodeEditor.Shear": "剪切", "odc.ResourceTree.config.treeNodesActions.EditThePackageHeader": "编辑包头包体", - "odc.ExportDrawer.ExportForm.EnterTheTaskName": "请填写任务名", "workspace.window.recyclebin.drawer.restore.title": "还原数据库对象", "odc.components.DDLResultSet.EnterAKeyword": "请输入关键字", "odc.component.CreateSynonymModal.ObjectOwner": "对象所有者", "odc.components.PLDebugResultSet.DbmsOutput": "DBMS 输出", "odc.EditorToolBar.actions.text.Revocation": "撤销", - "odc.components.ExportDrawer.CreatedAndExportedSuccessfully": "新建导出成功!", - "odc.components.ConnectionCardList.SetTopSuccessfully": "置顶成功", "workspace.window.recyclebin.success": "操作数据库对象成功", - "workspace.window.session.params": "会话变量", - "workspace.tree.package.create": "新建程序包", - "odc.components.Header.homeMenu.ExitTheConnection": "退出连接", "workspace.window.sql.result": "结果", - "odc.component.DatabaseChangeDetailModal.TaskName": "任务名", "odc.component.TaskDetailDrawer.TaskInfo.DataTypeSkipped": "不导入的数据类型", "odc.ExportDrawer.ExportForm.BatchSubmissionQuantity": "批量提交数量", - "odc.component.DatabaseChangeDetailModal.ExecuteSql": "执行 SQL", "odc.component.SnippetForm.TheSyntaxNameMustContain": "代码片段名称为英文字母、数字、下划线组成", - "layout.user.link.help": "帮助", - "odc.components.ConnectionCardList.Connecting": "连接中", "login.username.validation.length": "不少于 4 个字符且不超过 14 个字符", - "workspace.window.import.button.cancel.confirm.title": "是否确定取消本次导入?", - "odc.page.Workspace.NoReminder": "不再提醒", - "workspace.window.createTable.constraint.columns.refDatabase.validation": "关联数据库不能为空", - "odc.TreeNodeMenu.config.table.DeleteAPartition": "删除分区", "login.common.placeholder": "请输入", - "workspace.window.createTable.baseInfo.collation.validation": "请填写默认排序规则", "workspace.window.sql.record.column.status": "状态", - "odc.components.ImportDrawer.TheMaximumDataSizeCannot": "数据最大不能超过 250 MB,如需导入大量数据,请使用导数工具 OBLOADER", "workspace.tree.table.delete": "删除", "odc.components.TriggerPage.Disable": "禁用", "odc.components.ImportDrawer.AreYouSureYouWant": "是否确定取消导入?", "odc.components.SynonymPage.ModificationTime": "修改时间:", - "workspace.window.createTable.constraint.columns.updateAction": "更新", - "odc.page.Workspace.Note": "注意信息", "odc.components.ResourceTree.Function": "函数", - "portal.connection.tooltip.edit": "编辑", "workspace.window.createTable.index.name": "索引名", - "odc.ConnectionList.config.tools.ViewOfficialWebsite": "查看官网", "workspace.window.createView.viewName.placeholder": "请填写视图名称", "workspace.window.session.button.refresh": "刷新", - "workspace.window.import.form.format.odc": "ODC 格式", - "workspace.window.export.drawer.format.dropTable": "删除表语句", - "odc.components.ImportDrawer.NextFieldMapping": "下一步:字段映射", "workspace.window.table.object.upload.success": "上传成功", "workspace.window.createSequence.params.startValue": "起始于", - "workspace.window.sql.modal.savePL.pl.validation": "请输入 PL 脚本内容", - "workspace.header.tools.import.title": "导入任务", "workspace.window.sql.button.columnMode": "列模式", - "odc.CreateTriggerPage.component.AdvancedInfoFrom.Column": "列", "workspace.window.table.propstab.column": "列", - "odc.ConnectionList.config.help.HowToCreateAConnection": "如何创建连接", - "workspace.tree.table.importDatabase": "整库导入", "odc.components.PLDebugResultSet.Parameter.1": "参数名", "odc.EditorToolBar.actions.sql.RunTheCurrentStatementF": "运行当前语句 F9", "odc.ExportDrawer.ExportForm.SelectExportFormat": "请选择导出格式", @@ -632,198 +309,105 @@ "odc.components.PLDebugResultSet.CompilationResult": "编译结果", "workspace.window.createPackage.modal.delete.success": "删除程序包成功", "odc.components.PackagePage.Created": "创建人:", - "odc.ConnectionList.config.help.ViewPdf": "查看文档", "workspace.window.createTable.baseInfo.character": "默认字符集", "odc.component.WindowManager.OpenANewSqlWindow": "打开新的 SQL 窗口", "workspace.window.sql.explain.tab.detail.card.base.planType": "计划类型", "odc.AddConnectionDrawer.AddConnectionForm.EnterThePortNumber": "请填写端口号", - "workspace.window.createView.success": "新建视图成功", - "workspace.window.createView.columns": "字段", - "portal.connection.form.cluster": "集群", "workspace.window.import.form.hasColumnTitle": "包含列头", "odc.EditorToolBar.actions.text.Formatting": "格式化", - "workspace.window.table.propstab.code": "代码", - "odc.components.TaskManagePage.TaskName": "任务名", - "workspace.window.database.unknown": "未知", "odc.page.Workspace.Closed": "关闭", "odc.component.SubmitConfirm.Rollback": "回滚", "workspace.window.createProcedure.modal.delete.success": "删除存储过程成功", "workspace.window.createPackage.modal.delete": "是否确定删除程序包 {name} ?", "workspace.window.createFunction.params.validation": "请填写参数名称", - "odc.component.TaskDetailDrawer.TaskInfo.ImportObjectSize": "导入对象大小", - "odc.TreeNodeMenu.config.table.CreateConstraint": "新建约束", "workspace.window.session.form.key": "变量名", - "portal.connection.form.name.validation.required": "请填写连接名称", "login.password.validation.required": "请输入密码", "odc.page.Gateway.ConfirmTheFormatOfThe": "请确认传入的参数格式", "odc.src.store.snippet.Regular": "常规", - "odc.ConnectionList.config.tools.OceanbaseOfficialWebsite": "OceanBase 官网", "odc.components.TriggerPage.Name.2": "名称:", - "workspace.window.createView.columns.validation.required": "请至少添加一个字段", "odc.ImportDrawer.ImportForm.ClearDataBeforeImport": "导入前清空数据", "odc.component.GrammerHelpSider.New": "新建", - "workspace.header.tools.export.title": "导出任务", - "odc.component.TaskDetailDrawer.TaskLog.CommonLogs": "普通日志", - "odc.components.ConnectionCardList.Status": "状态:", - "workspace.tree.table.createIndex": "新建索引", "workspace.window.sql.explain.tab.summary.columns.name": "名称", - "portal.connection.form.dbMode.cloud": "连接模式", "odc.ImportDrawer.ImportForm.Replacement": "替换", "odc.src.d.ts.Sequence": "序列", "workspace.window.PackageBody.modal.delete.success": "删除程序包体成功", "odc.CreateTriggerPage.component.AdvancedInfoFrom.Trigger": "触发", "odc.components.CreateTriggerPage.NextConfirmTheSqlStatement": "下一步:确认 SQL", - "odc.TreeNodeMenu.config.table.RenameAPartition": "重命名分区", - "workspace.window.createTable.constraint.columns.delayConfig.NOT_DEFERRABLE": "不可延迟", "odc.src.constant.SimplifiedChinese": "简体中文", - "odc.main.utils.InstallJavaLaterThanMinjdkversion.1": "请先安装{minJDKVersion}版本以上的 Java", - "odc.ConnectionList.config.help.ViewOfficialWebsiteDocuments": "查看官网文档", - "odc.ConnectionList.config.help.OceanbaseDeveloperCenterOdcAs": "OceanBase 开发者中心(OceanBase Developer Center,ODC)作为为 OceanBase 数据库量身打造的企业级数据库开发平台可以与您的 OceanBase 数据库建立连接,然后对其中的数据库对象和资源进行编辑和管理。当您安装或部署 ODC 后,创建连接将是您要进行的一步重要操作。ODC 支持连接专有云和公有云环境中的 OceanBase 数据库,并支持连接 OceanBase MySQL 模式和 Oracle 模式。", "odc.components.Header.ConnectionPopover.DatabaseUsernameConnectiondbuser": "数据库用户名:{connectionDbUser}", - "odc.ImportDrawer.ImportForm.WhenTheStructureAlreadyExists": "结构已存在时", "odc.components.TriggerPage.Type.1": "类型:", - "odc.TreeNodeMenu.config.table.RenameConstraints": "重命名约束", - "workspace.window.export.task.status.toberetry": "待重试", "odc.TreeNodeMenu.config.sequence.CreateASequence": "新建序列", "workspace.window.createPackage.packageName.required": "程序包不能为空", - "workspace.tree.package.program": "子程序", - "workspace.window.createTable.constraint.columns.refTable": "关联表", - "odc.src.util.openapi.TheSystemIsBusyPlease": "系统繁忙中,请稍后再试", "password.label.origin": "原密码", - "odc.TreeNodeMenu.config.table.OpenTheSqlConsole": "打开 SQL 控制台", "odc.component.CreateTypeModal.TheTypeMustBeSpecified": "类型不能为空", "odc.CreateTriggerPage.component.AdvancedInfoFrom.ClauseCondition": "子句条件", "odc.component.Toolbar.DoNotClickAgainWhile": "执行中请勿重复点击", - "workspace.window.createTable.tableName.empty": "表名不能为空", "odc.component.SnippetCard.Description": "描述", - "workspace.window.createTable.partition.delete.check": "请至少保留一个分区", "odc.component.TaskDetailDrawer.TaskInfo.AddAndDeleteTableStatements": "添加删除表语句", "odc.component.WindowManager.CloseThisWindow": "关闭该窗口", "workspace.window.createProcedure.modal.title": "新建存储过程", - "workspace.window.export.drawer.snapshot.desc": "全局快照可以保证导出数据的一致性,详细说明参看", "odc.TreeNodeMenu.config.table.Table": "表", - "login.logout.failure": "登出失败", - "workspace.tree.table.deleteConstraint": "删除约束", "odc.CreateTriggerPage.component.BaseInfoForm.ReferenceObjectMode": "基准对象模式", "login.logout.success": "登出成功", - "odc.ConnectionList.config.help.ToMakeItEasierFor.1": "为了让数据库开发者更方便的维护数据库内的数据,OceanBase 开发者中心(OceanBase Developer Center,ODC) 提供整库导入和单表导入功能。通过整库导入您可以批量向数据库中的表或视图中导入数据,通过单表导入,您可以向目标表中导入数据。目前 ODC 支持的导入格式有 ODC 格式、SQL 格式、SQL 文件(批量导入)和 CSV 文件(单表导入)。其中 SQL 格式和 ODC 格式是 OceanBase 导入工具特有的格式。创建导入任务后,您可以进入任务管理页面查看任务详情和日志等信息。", "request.execute.ddl.default": "出错了", "odc.components.SQLPage.No": "否", "odc.component.SnippetForm.EnterASyntax": "请输入代码片段", "odc.components.PLPage.statusBar.Compile": "编译", - "odc.src.store.task.TheSystemDoesNotEnable": "系统未开启审批,请勿调用该接口!", "odc.components.TypePage.Array": "数组", - "workspace.window.sql.button.unComment": "反注释", - "workspace.window.createTable.column.validation.empty.columnName": "字段名不能为空", "odc.components.PLDebugResultSet.Item": "项", "workspace.window.session.management.column.dbUser": "用户", - "workspace.window.sql.modal.saveSQL.name.placeholder": "请输入 SQL 脚本名称", "odc.components.TypePage.Type.1": "类型:", - "odc.component.SQLCodeEditor.Copy": "复制", "workspace.window.createFunction.modal.title": "新建函数", "odc.components.PLDebugResultSet.DataType": "数据类型", "odc.component.TaskDetailDrawer.TaskInfo.ExportDataSettings": "导出数据设置", "odc.component.helpDoc.doc.ReplacingAnExistingStructureAutomatically": "替换已存在的结构将自动清空数据", "odc.ImportDrawer.ImportForm.ImportStructureOnly": "仅导入结构", - "workspace.window.sql.button.lowerCase": "全部小写", - "odc.TaskManagePage.DatabaseChange.ViewResults": "查看结果", "odc.component.Exception.typeConfig.SorryThePageYouVisited": "抱歉,你访问的页面不存在", - "workspace.window.createTable.index.editType.unique": "唯一索引", - "workspace.tree.sequence.update": "修改", - "header.title": "开发者中心", - "odc.ConnectionList.config.tools.OcpIsAnEnterpriseLevel": "OCP 伴随 OceanBase 数据库而生,是一款以 OceanBase 为核心的企业级数据库管理平台。不仅提供对 OceanBase 集群和租户等组件的全生命周期管理服务,同时也对 OceanBase 相关的资源(主机、网络和软件包等)提供管理服务,让您能够更加高效地管理 OceanBase 集群,降低企业的 IT 运维成本。", "odc.components.PLDebugResultSet.CompilationFailed": "编译失败", - "portal.connection.form.username.validation.trim": "数据库用户名首尾包含空格,请注意", - "odc.component.SysAccountConfigModal.Configure": "去配置", "odc.components.DDLResultSet.PreviousPage": "上一页", - "odc.components.LabelMange.Closed": "关闭", - "odc.component.ReconnectModal.FailedToReconnect": "重新连接失败", - "odc.main.utils.JavaIsNotInstalled": "Java 未安装", "odc.component.TaskDetailDrawer.TaskInfo.LineBreakSymbol": "换行符号:", - "workspace.tree.view.create": "新建视图", - "portal.connection.tooltip.delete": "删除", - "workspace.window.createTable.partition.validation.emptyname": "分区名不能为空", - "workspace.window.export.drawer.snapshot.label": "全局快照", - "workspace.window.createTable.constraint.columns.condition.validation": "检查条件不能为空", "odc.EditorToolBar.actions.pl.SingleStepExecution": "单步执行", "odc.components.PLDebugResultSet.Time": "时间", "odc.components.SynonymPage.FailedToLoadSynonyms": "加载同义词失败", "workspace.window.createProcedure.modifyTime": "最近修改时间", "odc.EditorToolBar.actions.text.Redo": "重做", - "workspace.window.export.button.retry.success": "重试任务成功", "odc.component.CreateSynonymModal.CreateSynonym": "新建同义词", "odc.component.SQLConfig.UnlimitedSystemInstability": "无限制易导致系统不稳定", - "odc.components.TablePage.UnableToObtainTableInformation": "无法获取表信息", - "odc.components.ConnectionCardList.Open": "打开", "workspace.window.sql.explain.tab.detail.card.time.label.otherTime": "其他", - "workspace.window.sql.result.uneditable": "当前结果集不可编辑", - "app.home.introduce": "介绍", "odc.AddConnectionDrawer.AddConnectionForm.CancelModification": "取消修改", - "workspace.window.import.form.upload": "上传", "odc.components.ImportDrawer.AnErrorOccurredWhileParsing": "上传的 CSV 文件解析异常,请检查文件格式是否正确", - "workspace.database.info": "数据库详情", - "odc.components.DDLResultSet.Export": "导出", "odc.TreeNodeMenu.config.view.Delete": "删除", - "menu.exception": "菜单异常", - "odc.components.Header.TaskPopover.ViewTaskManagement": "查看任务管理", "odc.component.SnippetForm.Determine": "确定", - "workspace.window.sql.modal.savePL.title": "保存 PL", "odc.component.helpDoc.doc.SqlFormatTableDataContent": "SQL 格式的表数据内容为 SQL 文本", "odc.component.CreateSynonymModal.EnterASynonymType": "请输入同义词类型", "odc.component.TaskDetailDrawer.TaskInfo.ImportObjects": "导入对象", "workspace.window.createView.columnName": "名称", "login.username.placeholder": "请输入账号", - "workspace.tree.procedure": "存储过程", - "workspace.window.export.size.limit": "数据导出最大不能超过 250 MB,超出部分无法导出", "odc.components.PLDebugResultSet.Parameter": "参数", "odc.component.SnippetForm.EnterASyntaxName": "请填写代码片段名称", "odc.component.TaskStatus.ExecutionSucceeded": "执行成功", "odc.components.ModalHelpAbout.VersionNumberPkgversion": "版本号:{pkgVersion}", "odc.components.SynonymPage.ObjectOwner": "对象所有者:", - "workspace.window.createTable.constraint.columns.name.validation": "约束名称不能为空", "workspace.window.sql.explain.tab.summary.columns.rows": "预估行", - "workspace.window.recyclebin.info": "提示:七天后自动清空!", "odc.component.EditPLParamsModal.SetParameters": "设置参数", - "workspace.tree.table.index": "索引", "odc.ImportDrawer.ImportForm.FieldSeparator": "字段分隔符", - "portal.wizard.help.createConnection": "如何快速创建连接", "odc.component.CreateSynonymModal.CommonSynonyms": "公用同义词", - "workspace.window.sql.modal.saveSQL.name": "名称", "app.button.selectAll": "全选", "odc.components.PLDebugResultSet.Result": "运行结果", - "odc.ConnectionList.config.help.PlProgramDevelopmentIsAn": "PL 程序的开发工作是数据库服务开发人员重要的日常工作,同时和 SQL 语句的支持模块类似,PL 的调试模块也是非常重要的功能。所以对于开发人员来说,在编程过程中需要一个PL 开发区域和调试功能。", - "workspace.window.session.management": "会话管理", - "workspace.window.sql.record.status": "状态", "odc.components.ModalHelpFeedBack.SupportedEmailAddresses": "支持邮箱", - "odc.component.PropertyModal.OdcConnectionIsAShared": "ODC 连接为共享 Session 设计模式因此:", - "odc.ExportDrawer.ExportForm.exportTables.CancelAllObjects": "取消所有对象", "workspace.window.sql.explain.tab.detail.card.time.title": "耗时统计 (us)", "odc.components.PLDebugResultSet.Cancel": "取消", "workspace.tree.table.importSingleTable": "单表导入", "odc.EditorToolBar.actions.pl.TerminateDebugging": "终止调试", - "workspace.window.session.modal.sql.close.title": "是否保存变量?", "workspace.window.table.toptab.props": "属性", - "odc.component.ReconnectModal.ReturnConnectionList": "返回连接列表", - "workspace.window.sql.result.total": "条数据", "odc.ImportDrawer.csvMapping.IncorrectFormSettings": "表单设置有误", - "workspace.tree.view.search.placeholder": "请输入视图名称", - "workspace.window.sql.modal.reselect.database": "当前数据库已被删除,请重新选择数据库", - "workspace.window.sql.modal.editSQL.title": "编辑 SQL", "odc.component.SysAccountConfigModal.ToAccessTheSysTenant": "该功能需要访问 sys 租户视图,请配置 root@sys 账号信息", - "odc.components.Header.homeMenu.Reload": "重新加载", "portal.connection.form.tenant.validation.trim": "租户名首尾包含空格,请注意", - "workspace.window.createTable.index.editType.normal": "普通索引", - "workspace.window.createTable.partition.validation.maxvalue": "请至少添加一个默认分区", - "workspace.tree.table.editColumn.success": "编辑列成功", - "workspace.window.database.createTime.unknown": "未知", "odc.components.ResourceTree.StoredProcedure": "存储过程", "workspace.window.createSequence.params.ordered.yes": "是", "workspace.window.sql.button.add": "添加行", "workspace.window.createSequence.params.minValue.validation.required": "最小值必须填写", "odc.components.SQLPage.SubmittedSuccessfully": "提交成功", - "workspace.window.createTable.index.editType.primary": "主键索引", - "odc.ExportDrawer.ExportForm.exportTables.ExportObjects": "导出对象", - "workspace.window.export.drawer.tables.empty": "请选择待导出表", "odc.components.ExportDrawer.AreYouSureYouWant": "是否确定取消导出?", "workspace.window.sql.record.notify.desc": "点击鼠标右键可固定结果集。", "odc.component.SnippetForm.TheSyntaxSnippetSnippetprefixHas": "代码片段 {snippetPrefix} 更新成功!", @@ -832,195 +416,97 @@ "odc.components.AddConnectionDrawer.TheConnectionInformationIsCopied": "连接信息复制成功", "odc.CreateTriggerPage.component.AdvancedInfoFrom.ReferenceOldValues": "引用旧值", "workspace.window.sql.record.column.executeTimestamp": "时间", - "workspace.tree.package.rename": "重命名", - "password.label.confirm": "确认新密码", "odc.page.Workspace.UnsavedContentWillDisappearAfter": "关闭之后未保存内容将会消失", "odc.component.CreateSynonymModal.ObjectName": "对象名称", "odc.components.SQLConfirmPage.IfYouReturnToThe": "若返回上一步,当前编辑的代码将不会生效且不保存", "odc.src.store.sql.Run": "运行", - "workspace.window.createTable.partition.split.title": "分区分裂", "workspace.window.createSequence.baseInfo.name.validation": "请输入序列名称", - "workspace.window.sql.modal.saveSQL.sql.validation": "请输入 SQL 脚本内容", "odc.component.CreateTypeModal.ObjectType": "对象类型", - "odc.ImportDrawer.ImportForm.helper.TheFileSizeCannotExceed": "文件大小不能超过 250 MB", - "odc.component.DelimiterSelect.DelimiterSettings": "界定符设置", "odc.src.d.ts.Database": "数据库", - "odc.ResourceTree.config.treeNodesActions.DebuggingIsNotSupportedIn": "{PLRunningStatus}中,不支持调试", "odc.src.store.sql.StoppedSuccessfully": "停止成功", "odc.components.PLDebugResultSet.Type": "类型", "odc.components.SQLExplain.ViewPlanText": "查看计划文本", - "workspace.window.createTable.constraint.columns.delayConfig.DEFERRABLE_INITIALLY_IMMEDIATE": "立即验证", "workspace.window.createTable.modal.delete": "是否确定删除 {name} ?", "odc.components.ResourceTree.Trigger": "触发器", "workspace.window.sql.button.delete": "删除行", - "odc.ConnectionList.config.help.ThisTopicDescribesHowTo.2": "本篇教程介绍在 ODC 中查看 SQL 性能的详细步骤。", "workspace.window.createTable.index.columnNames": "可选列", - "odc.ConnectionList.config.help.ThisTopicDescribesHowTo.1": "本篇教程介绍在 ODC 中进行数据批量导入操作的详细步骤。", - "workspace.window.createTable.column.empty": "暂无列信息,请新建", "workspace.window.createTable.index.type": "索引类型", "login.username.validation.required": "请输入账号", "odc.components.ConnectionCardList.ValidConnection": "有效连接", - "odc.components.TaskManagePage.status.Complete": "完成", - "odc.ConnectionList.config.help.ThisTutorialDescribesHowTo.1": "本篇教程介绍在 ODC 中调试一个存储过程的详细步骤。", - "odc.component.CreateSynonymModal.EnterATag": "请输入标签", "odc.component.DataTypeSelect.SelectADataType": "请选择数据类型", - "odc.CommonIDE.test.index.test.BasicRendering": "基础渲染", - "odc.ResourceTree.config.treeNodesActions.Refresh": "刷新", "odc.components.SynonymPage.BasicInformation": "基本信息", - "odc.ExportDrawer.ExportForm.exportTables.ObjectName": "对象名称", - "workspace.header.create.view": "视图", - "odc.component.TaskDetailDrawer.TaskInfo.ImportTask": "导入任务", - "odc.components.ResourceTree.View": "视图", - "workspace.window.createSequence.params.maxValue": "最大值", - "workspace.window.import.form.truncateTable": "截断表语句", "odc.component.ErrorBoundary.Reload": "重新加载", "workspace.window.createSequence.params.validation.integer": "请输入整数", "odc.component.CreateSynonymModal.NextConfirmTheSqlStatement": "下一步:确认 SQL", - "workspace.window.table.sql.failure": "执行 SQL 失败", "workspace.window.createFunction.paramName": "名称", - "portal.connection.form.save": "保存", "workspace.window.createTable.partition.value.range.placelholder": "字段1", - "workspace.tree.table.editPartition": "编辑分区", - "workspace.tree.table.rename": "重命名", - "odc.ExportDrawer.ExportForm.OdcFormat": "ODC 格式", "request.execute.ddl.error": "执行 DDL 出错", "odc.TreeNodeMenu.config.view.CreateAView": "新建视图", "odc.CreateTriggerPage.component.BaseInfoForm.TriggerName": "请输入触发器名称", "odc.CreateTriggerPage.component.AdvancedInfoFrom.Level": "级别", - "workspace.tree.table.browserIndexes": "查看索引", - "odc.components.ResourceTree.EnterASynonymName": "请输入同义词名称", "odc.EditorToolBar.actions.sql.Plan": "执行计划", - "odc.components.Header.TaskPopover.Task": "任务", - "odc.src.store.task.AfterTheAuditIsApproved": "审核通过后将自动执行,您可在任务管理中查看审核进度", "odc.src.store.snippet.New": "新建", "odc.ImportDrawer.csvMapping.FirstLineValue": "首行值", "odc.component.GlobalHeader.LogOut": "退出登录", - "login.title": "OceanBase 开发者中心", "workspace.window.createSequence.params.startValue.placeholder": "请输入起始值", "odc.page.Gateway.SorryTheActionDoesNot": "抱歉,系统中不存在该 Action", - "odc.ConnectionList.config.help.AsAPowerfulEnterpriseLevel.1": "OceanBase 开发者中心(OceanBase Developer Center,ODC)作为一款强大的企业级数据库开发平台,提供了图形化查看 SQL 语句执行计划的功能,借助 ODC 您可以更直观便捷查看 SQL 语句的执行情况并分析 SQL 语句的性能。", - "odc.components.LabelForm.LabelIsTooLong": "标签不能超过 12 个字符", "odc.component.CreateSynonymModal.EnterAnObjectName": "请选择对象", - "odc.component.DatabaseChangeDetailModal.Closed": "关闭", "odc.ImportDrawer.ImportForm.ImportDataOnly": "仅导入数据", "app.button.copy": "复制", - "odc.components.SessionParamPage.ThisModificationWillTakeEffect": "本次修改将对本连接的所有窗口生效,请仔细确认", - "portal.connection.form.mode": "连接模式", "workspace.window.session.button.edit": "编辑", "workspace.window.createTable.column.allowNull": "非空", - "odc.components.Sider.Synonyms": "同义词", "odc.components.TriggerPage.ReferenceObject": "基准对象", - "workspace.window.createTable.index.name.validation": "请填写索引名", "odc.TreeNodeMenu.config.synonym.ViewSynonyms": "查看同义词", - "workspace.tree.sequence": "序列", "app.button.dontsave": "不保存", "odc.components.TriggerPage.Enable": "启用", - "workspace.window.sql.modal.deleteSQL.desc": "是否確定删除 SQL 脚本:", - "portal.connection.form.password": "数据库密码", - "workspace.window.export.drawer.title": "导出设置", - "workspace.window.export.task.log.summary": "汇总信息", "odc.component.GrammerHelpSider.TheSyntaxSnippetSnippetprefixHas": "代码片段 {snippetPrefix} 删除成功!", - "workspace.window.export.drawer.format.sql": "SQL 文本", "odc.TreeNodeMenu.config.sequence.Modify": "修改", - "workspace.window.sequence.propstab.params": "属性", "odc.TreeNodeMenu.config.view.ViewViewData": "查看视图数据", - "odc.ImportDrawer.ImportForm.ImportTableNameModaldatatablename": "| 导入表名:{modalDataTableName}", "odc.ImportDrawer.ImportForm.Skip": "跳过", - "workspace.window.sql.button.profile": "执行计划", "workspace.window.recyclebin.modal.purgeAll.title": "是否确定清空回收站?", "odc.components.DDLResultSet.BackToStart": "回到开始", - "odc.components.LabelManageCell.AfterTheTagIsDeleted": "删除后,标签会在连接上消失,确定删除?", "workspace.window.sql.record.column.unlock": "解除固定", - "odc.TreeNodeMenu.config.table.DeleteConstraint": "删除约束", "workspace.window.createTable.baseInfo.tableName.validation": "请填写表名称", - "odc.page.ConnectionList.RelatedResources": "相关资源", - "workspace.window.sql.explain.failed": "执行 SQL 计划失败", "odc.ImportDrawer.ImportForm.ConvertAnEmptyStringTo": "空字符串转为空值", - "odc.src.store.sql.ReturnValue": "返回值", "odc.ImportDrawer.ImportForm.SelectImportContent": "请选择导入内容", "request.execute.ddl.timeout": "执行 DDL 超时", "workspace.window.createView.button.addColumn": "添加字段", "odc.EditorToolBar.actions.pl.Compile": "编译", - "workspace.window.sql.button.upperCase": "全部大写", "odc.ImportDrawer.ImportForm.SupportedExtensions": "支持扩展名:", - "workspace.window.sql.button.capitalize": "首字母大写", - "workspace.window.sql.button.explain": "计划", "odc.components.TaskManagePage.CreationTime": "创建时间", - "workspace.window.createFunction.params.empty": "无参数", - "portal.connection.form.defaultDatabase": "默认数据库(选填)", - "odc.component.DatabaseChangeDetailModal.ModeName": "模式名", "odc.EditorToolBar.actions.sql.Rollback": "回滚", "odc.ResourceTree.actions.Compile": "编译", "login.button": "登录", - "workspace.window.createTable.baseInfo.character.validation": "请填写默认字符集", - "workspace.window.import.form.characFormat": "列定界符", - "odc.components.TaskManagePage.CommonPage.TaskId": "任务 ID", "odc.components.SQLPage.TheModificationIsSuccessfulAnd": "修改成功,手动提交后生效", - "workspace.window.import.form.encoding": "文件编码", - "odc.component.TaskDetailDrawer.TaskLog.AlertLogs": "告警日志", "workspace.window.createTable.baseInfo.comment": "描述", "workspace.window.sql.record.column.track": "结果", - "workspace.window.createTable.column.name.placeholder": "请填写字段名称", "odc.EditorToolBar.actions.pl.RunF": "运行 F8", - "workspace.window.export.button.cancel.confirm.title": "是否确定取消本次导出?", "odc.component.PropertyModal.WhenTheValueIsOn": "2、当该值为 ON 时:如存在未提交的内容,会默认自动提交。", - "workspace.header.create.function": "函数", - "workspace.tree.table.deleteColumn.success": "删除列成功", "odc.components.TypePage.FailedToLoadTheType": "加载类型失败", "workspace.window.createView.modal.title": "新建视图", "odc.components.PLDebugResultSet.ResponseType": "返回类型", - "odc.ExportDrawer.ExportForm.ExportFormat": "导出格式", - "workspace.window.sql.button.save": "保存", - "workspace.window.createTable.column.validation.empty.dataType": "数据类型不能为空", "login.password.valid": "至少包含 2 个数字、2 个大写字母、2 个小写字母和 2 个特殊字符(._+@#$%),长度为 8~32 个字符", - "odc.CreateTriggerPage.component.BaseInfoForm.NameBaseObjectType": "名称基准对象类型", - "odc.page.ConnectionList.Help": "使用帮助", - "workspace.window.import.form.skippedDataType.blob": "BLOB", - "odc.AddConnectionDrawer.AddConnectionForm.EnterTheHostName": "请填写主机名", - "odc.ImportDrawer.ImportForm.ConnectionName": "连接名:", "odc.components.PLDebugResultSet.VariableName": "变量名", - "odc.components.CreateTableConstraintForm.YouCannotViewForeignKey": "暂不支持查看外键约束", - "odc.ConnectionList.config.help.WhatIsOdc": "什么是 ODC?", "workspace.window.session.management.column.srcIp": "来源", "request.connection.expired": "当前连接已断开,请重新连接", "workspace.window.createSequence.params.cached": "缓存设置", - "workspace.window.createView.loadColumns.failure": "获取视图字段失败", - "odc.components.EditableTable.NoData": "暂无数据", - "odc.components.ConnectionCardList.Delete": "删除", - "workspace.window.import.form.rowsPerCommit": "行提交一次", "odc.src.store.snippet.ProcessControlStatement": "流程控制语句", "workspace.window.sql.explain.tab.detail.card.time.label.queueTime": "排队时间", "workspace.window.createView.viewName": "视图名称", "workspace.window.sql.record.column.elapsedTime": "耗时", "login.password.validation.strength": "密码强度不符合要求", - "odc.component.CreateTypeModal.EnterAName": "请输入名称", - "odc.ConnectionList.config.help.HowToImportData": "如何导入数据", - "workspace.tree.package.param": "参数", - "odc.ConnectionList.config.help.SqlStructuredQueryLanguageIs": "SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,大多数数据库开发者依赖 SQL 语言对数据库内容进行管理与开发。所以 SQL 的性能一定程度上会影响数据库的性能,SQL 本身提供了执行计划命令( EXPLAIN)供用户查看语句在数据库中具体的执行步骤并以此作为判断 SQL 性能和改进 SQL 语句的依据。", - "workspace.window.import.task.status.failure": "导入失败", "workspace.window.sql.explain.tab.detail.card.base.title": "基本信息", "login.error": "登录名或登录密码不正确", - "odc.components.ImportDrawer.PreviousStep": "上一步", - "app.common.valid.notnull": "该项不能为空", "odc.components.TypePage.Object": "对象", - "workspace.window.sql.button.format": "格式化", - "workspace.window.createTable.partition.validation.emptyvalue": "区间上限值不能为空", - "odc.components.Header.TaskPopover.ImportTask": "导入任务", "workspace.window.createSequence.params.cached.yes": "缓存", "password.label": "密码", - "odc.ResourceTree.config.treeNodesActions.PlrunningstatusDoesNotSupportRunning": "{PLRunningStatus}中,不支持运行", "odc.components.CreateTriggerPage.StepAdvancedSettings": "第二步:高级设置", - "odc.ResourceTree.config.treeNodesActions.TheObjectIsInvalidAnd": "无效对象,不支持运行", "odc.component.SnippetForm.Cancel": "取消", "odc.ResourceTree.config.procedure.Enable": "启用", "odc.component.TaskDetailDrawer.TaskInfo.Replacement": "替换", - "workspace.window.sql.modal.saveSQL.name.validation": "请输入 SQL 脚本名称", - "workspace.window.sql.button.edit.submit": "提交", "odc.component.SnippetCard.SnippetprefixSyntaxHelpsCopySuccessfully": "{snippetPrefix} 代码片段复制成功!", "odc.src.d.ts.Package": "程序包", - "portal.connection.form.username.validation": "请填写数据库用户名", "odc.ImportDrawer.csvMapping.TargetField": "目标字段", - "workspace.tree.table.browserSchema": "查看表结构", "odc.component.TaskDetailDrawer.TaskInfo.CreationTime": "创建时间", "workspace.window.session.management.column.executeTime": "执行时间(s)", "odc.EditorToolBar.actions.pl.ReDebug": "重新调试", @@ -1028,459 +514,224 @@ "workspace.window.recyclebin.button.clean": "清除", "odc.TreeNodeMenu.config.table.Refresh": "刷新", "odc.src.util.utils.Minutes": "分钟", - "workspace.window.sql.button.edit.disable": "关闭编辑", - "workspace.tree.package.program.varibale": "变量", "odc.components.SynonymPage.ObjectName": "对象名称:", "workspace.window.table.toptab.package.body": "包体", "workspace.window.sql.explain.tab.detail.card.base.reqTime": "请求到达时间", "odc.ImportDrawer.csvMapping.No": "无", "odc.CreateTriggerPage.component.AdvancedInfoFrom.Event": "事件", "odc.component.CreateTypeModal.ArrayType": "数组类型", - "odc.components.TaskManagePage.EnterASearchKeyword": "请输入搜索关键字", - "workspace.header.sql.saved": "已保存的脚本", "odc.src.d.ts.View": "视图", - "workspace.window.sql.modal.export.fileType": "文件类型", - "odc.components.Header.Trigger": "触发器", "workspace.window.session.modal.sql.copied": "已拷贝到剪贴板", "workspace.window.session.modal.sql.title": "SQL 确认", "odc.components.PLDebugResultSet.DebuggingLogs": "调试日志", "request.500": "服务器通讯异常", "workspace.window.createSequence.params.maxValue.validation.required": "最大值必须填写", "portal.connection.form.save.success": "保存成功", - "odc.ConnectionList.config.help.AsAPowerfulEnterpriseLevel": "OceanBase 开发者中心(OceanBase Developer Center,ODC)作为一款强大的企业级数据库开发平台,旨在为用户提供更全面和人性化的服务与功能。每个 ODC 新版本都会针对现有功能和客户实际需求做出功能优化和功能新增。我们为您提供 What's New 帮助您在使用新版本时,快速了解当前版本新增和优化的功能信息。What's New 章节的产品动态部分通过列表的方式按模块为您一一列举出了当前版本的功能变动,当您在列表中看到想详细了解的功能时,可通过介绍信息和操作信息两个跳转按钮查看该功能的详细信息。在主要功能优化部分,您可以查看到当前版本所有主要优化和新增功能的详细介绍。所以,通过 What's New 您可以快速了解当前版本的功能变化信息。", - "odc.component.helpDoc.doc.AnSqlFileConsistingOf": "SQL 文件为由 DDL 或 DML 语句组成的 SQL 文件", - "workspace.window.createTable.index.primaryKey": "主键", "odc.components.PLPage.statusBar.Status": "状态:", "workspace.window.createFunction.success": "创建函数成功", - "odc.component.TaskDetailDrawer.Closed": "关闭", "workspace.window.createSequence.baseInfo.name": "序列名称", "odc.EditorToolBar.actions.pl.TheWindowContentDoesNot": "窗口内容不符合匿名块语法定义", "odc.CreateTriggerPage.component.AdvancedInfoFrom.RowLevel": "行级", "odc.component.helpDoc.doc.EnterTheAccountAndPassword": "请输入拥有查询 sys 租户视图权限的账号和密码", "odc.component.TaskDetailDrawer.TaskInfo.ExportObjects": "导出对象", - "workspace.window.sql.button.redo": "重做", - "portal.connection.form.host.placeholder": "请填写 OBproxy 地址", - "odc.page.Workspace.TheConnectionIsDesignedAs": "连接为共享 session 设计,主动触发提交/回滚操作,或通过产品功能创建、修改、删除数据库对象,执行 DDL 语句被动触发提交操作,会在所有窗口生效。", "workspace.window.createFunction.paramMode": "模式", - "odc.component.TaskDetailDrawer.TaskDetails": "任务详情", "portal.connection.tooltip.copy": "复制", "odc.components.PLDebugResultSet.ReturnValue": "返回值", "workspace.window.createView.checkOption": "检查项", "odc.component.TaskDetailDrawer.TaskInfo.TaskType": "任务类型", "workspace.window.createTable.modal.delete.success": "删除表成功", "odc.components.SQLConfirmPage.SynonymCreatedSuccessfully": "同义词创建成功", - "odc.component.TaskStatus.Exception": "异常", "portal.connection.form.port": "端口", "odc.component.SQLConfig.QueryResultLimits": "查询结果限制", - "workspace.tree.table.browserColumns": "查看列", - "odc.components.LabelForm.EnterATag": "请输入标签", - "odc.CreateTriggerPage.component.BaseInfoForm.EnterATriggerName": "请输入触发器名称", - "odc.component.TaskDetailDrawer.Download": "下载", - "workspace.window.export.drawer.format.odc": "ODC 格式", - "odc.TaskManagePage.DatabaseChange.Termination": "终止", - "workspace.tree.sequence.create": "新建序列", "odc.src.util.utils.Seconds": "秒", "odc.components.ModalHelpFeedBack.Feedback": "意见反馈", - "workspace.window.createTable.constraint.columns.refColumns": "关联字段", "workspace.window.createSequence.baseInfo.name.placeholder": "请输入序列名称", - "odc.ExportDrawer.ExportForm.TaskName": "任务名", - "workspace.tree.table.deletePartition": "删除分区", - "workspace.window.createTable.constraint.columns.condition.placeholder": "请填写检查条件", "workspace.window.createTable.partition.expression": "表达式", "odc.component.PartitionRange.PartitionValueInput.SelectAFieldFirst": "请先选择字段", - "portal.connection.edit": "编辑连接", - "portal.connection.form.host.cloud.validation": "测试连接时请填写数据库地址", - "portal.connection.delete.failure": "删除失败", - "odc.ConnectionList.config.help.HowToDebugAStored": "如何调试存储过程", - "workspace.window.createTable.partition.modal.title": "新建分区", - "workspace.window.export.task.log.info": "日志信息", - "workspace.window.export.task.status.init": "待导出", - "odc.components.LabelMange.TagManagement": "标签管理", - "odc.components.TaskManagePage.See": "查看", "workspace.window.createTable.column.increment": "自增", "odc.ImportDrawer.ImportForm.EnterATextIdentifier": "请填写文本识别符", "workspace.window.sql.result.success": "执行以下 SQL 成功", - "odc.components.TaskManagePage.status.Preparing": "准备中", "workspace.window.table.modal.index.priority": "已选列(优先级从上到下)", "workspace.window.sql.explain.tab.detail.card.io.title": "I/O 统计", "odc.ResourceTree.actions.Delete": "删除", - "odc.components.ResourceTree.EnterATypeName": "请输入类型名称", - "portal.connection.form.port.placeholder": "请填写端口", "workspace.window.session.form.value": "值", - "odc.components.CreateTablePartitionRuleForm.ThePartitionNameMustBe": "分区名不能为空", - "odc.component.DatabaseChangeDetailModal.ErrorMessage": "错误信息", - "odc.ConnectionList.config.help.OdcAdoptsAMatureBrowser": "ODC 采用成熟的浏览器-服务端架构,拥有跨平台、轻量化和易部署的特点。同时,ODC 还提供客户端版本,不仅能满足个人开发者快速上手使用 OceanBase 的需求,还可提升开发人员与 DBA 的协作效率。", - "odc.component.TaskStatus.AuditTimeout": "审核超时", "odc.ExportDrawer.ExportForm.ExportDataOnly": "仅导出数据", "workspace.window.createSequence.params.cycled.no": "否", - "odc.ResourceTree.config.treeNodesActions.Compile": "编译", "workspace.window.createTable.baseInfo.comment.placeholder": "请填写描述", - "odc.components.Header.TaskPopover.Download": "下载", - "workspace.tree.package": "程序包", "workspace.window.createFunction.modal.delete": "是否确定删除函数 {name} ?", "odc.CreateTriggerPage.component.BaseInfoForm.Disable": "禁用", - "workspace.window.session.management.sql.execute.success": "关闭会话成功", - "workspace.tree.table.browserConstraints": "查看约束", - "odc.component.TaskDetailDrawer.TaskInfo.RetryTime": "重试时间", - "odc.TreeNodeMenu.config.table.CreatePartition": "新建分区", - "odc.AddConnectionDrawer.AddConnectionForm.EnterAPublicIpAddress": "请填写公网地址", - "workspace.window.sql.explain.tab.outline": "大纲", "workspace.window.session.management.column.database": "数据库名", "workspace.tree.procedure.browserSchema": "查看存储过程", "odc.component.SnippetCard.Syntax": "代码", "workspace.window.sql.button.search": "查找", - "workspace.window.import.form.file.required": "请上传文件", - "workspace.window.createTable.constraint.columns.refDatabase": "关联数据库", "odc.components.DDLResultSet.Cancel": "取消", - "odc.ExportDrawer.ExportForm.Name": "名:", - "odc.components.Header.ConnectionPopover.ConnectionMode": "连接模式:", - "workspace.window.import.form.blankToNull.yes": "是", "odc.src.store.sql.Compile": "编译", - "workspace.window.createProcedure.modal.delete": "是否确定删除存储过程 {name} ?", - "odc.ImportDrawer.ImportForm.SqlFormat": "SQL 格式", "odc.ImportDrawer.ImportForm.ClickOrDragTheFile": "点击或将文件拖拽到这里上传", - "odc.component.TaskDetailDrawer.TaskInfo.Retries": "重试次数", - "password.label.origin.validation": "原密码不正确", - "workspace.window.import.form.file": "输入文件", - "workspace.window.sql.modal.editSQL.success": "编辑 SQL 成功", - "odc.TreeNodeMenu.config.table.DeleteAColumn": "删除列", "workspace.window.createTable.partition.value.listColumns.placelholder": "(字段1,字段2),(字段1,字段2)", - "workspace.tree.table.rename.success": "重命名成功", - "odc.components.ImportDrawer.BatchImportIsCreated": "新建批量导入成功!", "workspace.window.sql.limit.placeholder": "1000", "workspace.window.recyclebin.button.purgeAll": "清空", - "workspace.window.createView.viewName.validation": "请填写视图名称", "odc.component.GrammerHelpSider.SnippetslacksInTotal": "共 {snippetsLength} 条", - "workspace.window.import.task.created.success": "创建导入任务成功", "odc.helper.page.openPage.CreateATrigger": "新建触发器", - "workspace.window.export.task.status.running": "导出中", "odc.ResourceTree.actions.ViewType": "查看类型", - "portal.connection.form.port.validation": "端口号必须为数字", - "workspace.window.database.size": "数据库大小", - "workspace.tree.package.program.returnValue": "返回值", - "odc.components.ConnectionCardList.Label": "标签", - "odc.EditorToolBar.actions.sql.SaveSql": "保存 SQL", "odc.component.GlobalHeader.AboutDeveloperCenter": "关于开发者中心", "odc.component.PropertyModal.RiskTips": "风险提示", - "workspace.window.createTable.partition.validation.range.singlevalue": "区间上限值不能包含逗号", - "odc.component.GlobalHeader.DownloadTheProductManual": "下载产品手册", "odc.CreateTriggerPage.component.AdvancedInfoFrom.Determine": "确定", - "odc.ConnectionList.config.help.OceanbaseDeveloperCenterOdcIs.1": "OceanBase 开发者中心(OceanBase Developer Center,ODC)是为 OceanBase 数据库量身打造的企业级数据库开发平台。ODC 在本章节收集整理了用户在使用过程中需要注意的一些问题和特殊的说明,并列出了过往版本中其他用户频繁遇到的问题以帮助您提前规避错误。", - "workspace.tree.table.editIndex": "编辑索引", - "odc.component.EditPLParamsModal.ItCannotBeEmpty": "不能为空", - "workspace.window.import.task.status.running": "导入中", "odc.component.TaskDetailDrawer.TaskInfo.BatchSubmissionQuantity": "批量提交数量", - "workspace.window.sql.modal.savePL.name.validation": "请输入 PL 脚本名称", "odc.src.store.page.TheNumberOfWindowsCannot": "窗口不能超过 32 个", - "portal.connection.form.tenant": "租户", - "workspace.window.sql.record.column.profile": "执行详情", - "workspace.tree.function": "函数", "odc.component.CreateSynonymModal.Cancel": "取消", - "portal.connection.form.configUrl.placeholder": "请填写 config url", - "workspace.tree.table.renameColumn": "重命名列", "workspace.window.createTable.partition.partNumber": "分区数量", "workspace.window.table.toptab.data": "数据", - "workspace.window.createTable.index.columnNames.validation": "索引的列为空", "odc.components.TypePage.Created": "创建时间:", "workspace.window.sql.explain.tab.summary.columns.cost": "代价", - "odc.ImportDrawer.ImportForm.SqlFile": "SQL 文件", "odc.components.TriggerPage.Owner": "所有者", - "odc.component.DatabaseChangeDetailModal.ConnectionName": "连接名", "workspace.window.sql.record.title": "执行记录", "workspace.window.createSequence.baseInfo.user": "用户", "workspace.window.sql.limit": "展示数据量", "odc.component.CreateTypeModal.TableType": "表类型", "odc.CreateTriggerPage.component.AdvancedInfoFrom.TriggerType": "触发器类型", - "odc.components.AddConnectionDrawer.YouHaveAnUnsavedWindow": "您有未保存的窗口,确定退出?", "workspace.window.createSequence.params.minValue.validation2": "最小值必须小于等于起始值", - "odc.AddConnectionDrawer.AddConnectionForm.AdvancedConfiguration": "高级配置", - "workspace.window.sql.button.execute": "运行", - "workspace.window.export.button.retry": "重试", - "workspace.window.createSequence.params.minValue": "最小值", "odc.component.Exception.typeConfig.SorryYouAreNotAuthorized": "抱歉,你无权访问该页面", - "login.username.validation.pattern2": "不能为纯数字", "odc.TablePage.TableData.NoContentToSubmit": "无内容可提交", "odc.AddConnectionDrawer.AddConnectionForm.Enter": "请输入", - "odc.components.ImportDrawer.TheMaximumSizeOfImported": "导入文件最大不能超过 250 MB", "odc.ImportDrawer.csvMapping.TargetFieldType": "目标字段类型", "odc.components.PLPage.SavedSuccessfully": "保存成功", - "workspace.tree.table.browserData": "查看表数据", - "workspace.tree.package.body": "包体", "odc.TreeNodeMenu.config.view.ViewViewProperties": "查看视图属性", - "workspace.tree.table.constraint": "约束", "odc.components.ImportDrawer.SelectTheFieldsToBe": "请选择需要映射的字段", "odc.components.PLPage.statusBar.ManualTermination": "手动终止", - "workspace.tree.table.deletePartition.success": "删除分区成功", "odc.components.TypePage.ModificationTime": "修改时间:", - "workspace.window.session.modal.sql.close.content": "变量已经被修改,如不保存,修改将丢失", "odc.component.CreateTypeModal.Cancel": "取消", - "odc.ConnectionList.config.help.HowToViewSqlPerformance": "如何查看 SQL 性能", "odc.components.PLDebugResultSet.CompiledSuccessfully": "编译成功", "workspace.window.createTable.column.dataType": "数据类型", "odc.components.TaskManagePage.DatabaseChanges": "数据库变更", "odc.components.PackagePage.PackageNamePkgpackagename": "程序包名称:{pkgPackageName}", - "odc.components.ConnectionCardList.CancelSetting": "取消置顶", - "portal.connection.form.save.failure": "保存失败", "odc.ImportDrawer.ImportForm.LineBreakSymbol": "换行符号", - "odc.components.Header.Type": "类型", - "odc.components.ConnectionCardList.ConnectionFailed": "连接失败", "odc.component.TaskDetailDrawer.TaskInfo.TextIdentifier": "文本识别符:", - "workspace.window.createTable.constraint.empty": "暂无约束信息,请新建", - "portal.wizard.empty2": "先创建连接吧 !", - "workspace.tree.table.column": "列", - "portal.wizard.empty1": "尚未连接数据库,", - "odc.component.TreeSearchBar.CommonSynonym": "普通同义词", - "portal.connection.create": "新建连接", "workspace.window.createFunction.funName.placeholder": "请输入函数名称", "odc.component.CreateSynonymModal.Synonym": "同义词名称", - "odc.components.TaskManagePage.TaskType": "任务类型", "odc.src.util.utils.Microseconds": "微秒", - "workspace.window.sql.modal.download.success": "下载文件成功", - "workspace.window.createTable.constraint.columns.enable": "是否启用", - "workspace.window.createTable.index.name.placeholder": "请填写索引名", "odc.component.CreateSynonymModal.TheObjectNameMustBe": "对象名称不能为空", "portal.connection.form.configUrl.desc": "获取集群信息的链接,通过指定 config url 客户端可不使用代理直连 OceanBase", "workspace.window.sequence.propstab.info": "基本信息", - "odc.components.LabelList.CreateTag": "新建标签", "workspace.header.session.management": "会话管理", - "workspace.window.import.form.blankToNull": "空字符串转换为空值", - "odc.src.store.sql.RequiredReview": "需要审核", - "odc.EditorToolBar.actions.pl.Skip": "跳过", "odc.src.constant.TraditionalChinese": "繁体中文", "odc.ResourceTree.config.treeNodesActions.InvalidObjectDebuggingIsNot": "无效对象,不支持调试", - "workspace.window.createTable.partition.split.target": "目标", - "odc.TaskManagePage.DatabaseChange.DeletedSuccessfully": "删除成功", - "workspace.window.sql.button.undo": "撤销", - "odc.ResourceTree.config.treeNodesActions.New": "新建", "workspace.window.recyclebin.button.restore": "还原", "odc.components.ResourceTree.TriggerTree.DeletedSuccessfully": "删除成功", - "workspace.window.createTable.column.primaryKey": "主键", "odc.component.CreateTypeModal.EnterAType": "请输入类型", "odc.AddConnectionDrawer.AddConnectionForm.Account": "账号", "odc.component.TaskDetailDrawer.csvTables.FieldMapping": "字段映射", - "odc.TreeNodeMenu.config.table.CreateAnIndex": "新建索引", "odc.TreeNodeMenu.config.table.Delete": "删除", "odc.components.PLDebugResultSet.Breakpoint": "断点", "odc.component.TaskDetailDrawer.TaskInfo.Structure": "结构", - "workspace.window.createTable.partition.button.split": "分裂", "workspace.window.sql.button.columnFilter": "列管理", - "workspace.window.sql.button.indent": "缩进", - "workspace.window.sql.modal.download.title": "下载文件", "odc.component.SubmitConfirm.Submitted": "提交", - "odc.components.TaskManagePage.Download": "下载", "odc.components.TriggerPage.WhetherToEnable": "是否启用:", - "workspace.window.sql.record.elapsedTime": "耗时", "workspace.window.createSequence.baseInfo.user.placeholder": "请输入用户", "workspace.window.createSequence.params.increament.placeholder": "请输入增量", "workspace.window.sql.modal.close.title": "是否保存脚本?", "workspace.window.createTable.partition.value.list.placelholder": "值1,值2", - "portal.connection.form.name.validation.length": "连接名称最大长度为 30", "workspace.window.sql.record.empty": "无法获得 SQL 执行记录", - "odc.components.ResourceTree.Synonyms": "同义词", - "workspace.window.createTable.index.range.global": "全局索引", - "workspace.tree.table.createIndex.success": "新建索引成功", "workspace.window.sql.result.affected": ",影响 {num} 条数据", "odc.ResourceTree.config.procedure.Disable": "禁用", - "odc.TaskManagePage.DatabaseChange.TerminatedSuccessfully": "终止成功", - "workspace.window.sql.record.executeTimestamp": "时间", "odc.ResourceTree.actions.Editing": "编辑", - "odc.ResourceTree.config.treeNodesActions.PlrunningstatusCompilationIsNotSupported": "{PLRunningStatus}中,不支持编译", - "workspace.window.import.form.skippedDataType": "不导入的数据类型", - "workspace.window.import.form.onlyTransferDdl": "只导入表定义", "odc.component.TaskDetailDrawer.TaskInfo.Data": "数据", - "odc.main.utils.JavaVersionIsTooLow": "Java 版本过低", - "odc.components.AddConnectionDrawer.Cancel": "取消", - "workspace.window.sql.button.searchAndReplace": "查找/替换", - "odc.component.TaskDetailDrawer.TaskInfo.ConnectionName": "连接名", "odc.components.TriggerPage.BasicInformation": "基本信息", "odc.components.TriggerPage.AreYouSureYouWant": "是否确认保存当前编辑的内容?", "odc.components.ResourceTree.Bag": "包", "odc.EditorToolBar.actions.sql.Submitted": "提交", - "workspace.window.import.form.skippedDataType.clob": "CLOB", "odc.EditorToolBar.actions.text.DeleteIndentation": "删除缩进", - "odc.TreeNodeMenu.config.table.EditConstraints": "编辑约束", "odc.component.GlobalHeader.ChangePassword": "修改密码", - "odc.ConnectionList.config.tools.OceanbaseYunPingtai": "OceanBase 云平台", "app.button.save": "保存", - "odc.ImportDrawer.ImportForm.CsvFormat": "CSV 格式", - "odc.component.TaskStatus.Terminating": "终止中", - "odc.components.LabelMange.CreateTag": "新建标签", - "login.username.validation.pattern": "包含英文字母、数字和下划线", - "login.login.failure": "登录失败", - "odc.ImportDrawer.ImportForm.Database": "数据库", - "workspace.tree.table.browserPartitions": "查看分区", "workspace.window.createTable.partition.type": "分区方法", - "odc.component.TaskStatus.Preparing": "准备中", - "workspace.tree.table.exportSingleTable": "单表导出", - "portal.connection.form.defaultDatabase.validation.trim": "默认数据库首尾包含空格,请注意", "workspace.window.createFunction.defaultValue": "默认值", "odc.components.PLDebugResultSet.BatchCancel": "批量取消", - "workspace.window.sql.modal.deleteSQL.title": "删除 SQL", - "odc.ExportDrawer.ExportForm.Mode": "模式", "odc.components.TriggerPage.Name": "名称", "workspace.window.sql.button.edit.add": "添加一行", "odc.ResourceTree.actions.NewType": "新建类型", - "workspace.window.export.drawer.format.odc.desc": "说明:ODC会按照指定的格式对数据进行导出,并将导出文件压缩。", "odc.EditorToolBar.actions.pl.AreYouSureToRe": "是否确定重新调试?", "workspace.window.recyclebin.column.createTime": "进入回收站时间", - "workspace.window.createTable.constraint.foreign": "外键约束", "login.login.success": "登录成功", "odc.component.SubmitConfirm.ConfirmTheTextCurrentTransaction": "是否确认{text}当前事务?", "odc.ResourceTree.actions.CreateATrigger": "新建触发器", - "workspace.tree.package.delete": "删除程序包", "odc.components.TypePage.BasicInformation": "基本信息", "odc.components.PLPage.statusBar.AbnormalTermination": "异常终止", - "workspace.window.import.button.cancel.confirm.desc": "取消本次导入操作,文件会被删除。", - "portal.connection.form.databaseName.placeholder": "请填写数据库名称", "odc.component.CreateTypeModal.TheLengthCannotExceedCharacters": "长度不超过 128 个字符", - "portal.welcome": "欢迎使用 OceanBase 开发者中心", - "odc.components.Header.TaskPopover.TheTaskContainsNull": "task 含有 null", - "odc.CreateTriggerPage.component.AdvancedInfoFrom.ItCannotBeEmpty": "不允许为空", - "workspace.window.createTable.constraint.columns.condition": "检查条件", "odc.EditorToolBar.actions.pl.ThereAreUnsavedContentsPlease": "存在未保存的内容,请先确认修改", - "odc.component.GlobalHeader.HelpCenter": "帮助中心", "odc.src.store.sql.SubmittedSuccessfully": "提交成功", - "workspace.tree.view.browserData": "查看视图数据", "odc.component.CreateSynonymModal.TheLengthCannotExceedCharacters": "长度不超过 128 个字符", - "workspace.window.createTable.index.editType": "约束类别", "odc.EditorToolBar.actions.pl.ConfirmModification": "确认修改", - "odc.component.DatabaseChangeDetailModal.TaskDetails": "任务详情", - "header.logout": "退出", "odc.ResourceTree.actions.ViewTriggers": "查看触发器", - "workspace.window.createTable.step3": "第三步:设置分表规则", - "portal.connection.form.cluster.placeholder": "请填写集群", - "workspace.window.createTable.step4": "第三步:设置分区规则", - "workspace.tree.table.browserDDL": "查看 DDL", - "workspace.window.createTable.step1": "第一步:基本信息", - "workspace.window.createTable.step2": "第二步:设置列", "workspace.window.createPackage.packageName": "程序包名称", "odc.component.SnippetForm.SelectASyntaxType": "请选择代码片段类型", - "workspace.header.create.sequence": "序列", "odc.component.SQLConfig.Unlimited": "无限制", "odc.EditorToolBar.actions.text.Indent": "缩进", - "odc.src.store.task.ReviewSubmittedSuccessfully": "审核提交成功", - "workspace.window.sql.button.comment": "注释", - "workspace.window.export.drawer.format.sql.desc": "说明:对象定义会被保存为 <表名>-schema.sql 文件,数据会以 SQL 语句的形式保存到 .sql 文件中", - "odc.components.TaskManagePage.status.Terminated": "已终止", "odc.components.PLPage.statusBar.Medium": "中", - "workspace.window.createTable.constraint.check": "检查约束", "odc.components.TypePage.State": "状态", - "workspace.window.createTable.step5": "第四步:设置索引", - "odc.components.AddConnectionDrawer.CopyConnectionString": "复制连接串", - "workspace.window.createTable.step6": "第五步:设置约束", "workspace.window.sql.button.copy": "复制当前行", "workspace.window.recyclebin.modal.purgeAll.content": "清空后数据库对象将无法恢复!", "workspace.window.recyclebin.column.objType": "对象类型", - "workspace.window.export.task.status.failure": "导出失败", "workspace.window.createProcedure.proName.placeholder": "请输入存储过程名称", "odc.component.TaskDetailDrawer.ObjTables.StructureProcessingStatus": "结构处理状态", - "odc.ResourceTree.config.treeNodesActions.PlrunningstatusDoesNotSupportDeletion": "{PLRunningStatus}中,不支持删除", - "portal.connection.form.connectType": "所属区域", "odc.EditorToolBar.actions.text.Annotation": "注释", "odc.src.store.snippet.AllTypes": "全部类型", - "odc.TreeNodeMenu.config.table.CreateColumn": "新建列", "workspace.window.createPackage.success": "新建程序包成功", "odc.component.helpDoc.doc.SqlQueryTimesOutAnd": "SQL 查询超时会自动终止", "odc.component.TaskDetailDrawer.status.Complete": "完成", - "odc.ExportDrawer.ExportForm.DataTypeSkipped": "不导入的数据类型", - "workspace.window.createTable.constraint.name.validation": "请填写约束名", - "odc.ConnectionList.config.help.OceanbaseDeveloperCenterOdcV": "OceanBase 开发者中心(OceanBase Developer Center,ODC) V2.2.0 及之后版本支持了 PL 对象和匿名块的创建、编译、运行和调试等功能。您可以在匿名块窗口的编辑区域中编译 PL 语句,同时也可以对创建好的 PL 对象进行编辑和调试等操作。对 PL 对象的调试 ODC 提供了批量执行、单步执行、跳入、跳出、终止调试、重新调试和退出调试等功能,还提供了 参数、堆栈和变量、DBMS 输出、断点和调试日志等页签查看调试产生的信息。", - "portal.connection.form.host.cloud": "数据库地址", "odc.components.PLDebugResultSet.Operation": "操作", - "odc.component.TaskDetailDrawer.TaskInfo.FileFormat": "文件格式", "odc.TreeNodeMenu.config.table.ViewTableData": "查看表数据", - "navBar.lang": "语言", "workspace.window.sql.result.pagination.current": "第 {current} 行", "odc.component.SnippetForm.EnterASyntaxDescription": "请输入代码片段描述", "odc.src.d.ts.Table": "表", "workspace.window.createSequence.params.maxValue.validation2": "最大值必须大于等于起始值", "password.label.confirm.validation": "确认密码不一致", - "odc.component.EditPLParamsModal.Enter": "请输入", "workspace.window.recyclebin.drawer.delete.title": "清除数据库对象", - "odc.components.TaskManagePage.status.Running": "运行中", - "portal.wizard.create.desc": "OceanBase 开发者中心 支持以下两种连接模式: Oracle 和 MySQL", - "workspace.window.createTable.index.empty": "暂无索引信息,请新建", "workspace.window.session.management.column.sql": "SQL", "odc.AddConnectionDrawer.AddConnectionForm.TheConnectionNameCannotContain": "连接名称不能含有空格", - "workspace.window.export.drawer.snapshot.doc": "用户文档", "workspace.window.createFunction.returnType": "返回类型", "login.button.register": "注册账号", "workspace.window.sql.explain.tab.detail.card.base.sql": "SQL", "workspace.window.createTable.partition.value.list": "枚举值", "odc.components.DDLResultSet.ConfirmModification": "确认修改", "workspace.window.createTable.index.unique": "唯一", - "workspace.window.table.modal.column.title": "编辑字段", "workspace.window.createView.model.delete": "是否确定删除视图 {name} ?", - "odc.AddConnectionDrawer.AddConnectionForm.SetTags": "设置标签", "password.label.account.validation": "该账号已存在", "odc.component.TaskDetailDrawer.TaskInfo.UseGlobalSnapshots": "使用全局快照", "odc.component.TaskDetailDrawer.TaskInfo.ExportStructureSettings": "导出结构设置", - "odc.src.store.sql.TheOperationIsBlockedBy": "当前操作被黑名单拦截", - "odc.EditorToolBar.actions.sql.Save": "保存", "workspace.window.sql.button.edit.delete": "删除", - "workspace.window.export.button.save": "保存到本地", "odc.CreateTriggerPage.component.BaseInfoForm.Determine": "确定", "odc.component.GrammerHelpSider.SearchSyntaxHelp": "搜索代码片段", - "workspace.window.table.propstab.reffer": "引用", - "workspace.window.createTable.constraint.success": "约束更新成功", - "workspace.window.import.modal.close.content": "关闭后所有正在导入的任务将会终止。", "odc.helper.page.openPage.NewType": "新建类型", "odc.TreeNodeMenu.config.table.ViewTableStructure": "查看表结构", "odc.components.ImportDrawer.TheCsvFileTypeIs": "CSV 文件类型有误", - "workspace.window.createTable.constraint.columns.name": "约束名称", - "odc.components.ResourceTree.TriggerTree.Delete": "删除", "odc.AddConnectionDrawer.AddConnectionForm.PasteTheConnectionStringInformation": "粘贴连接串信息,自动识别连接信息,如:obclient -h 10.210.2.51 -P2883 -uroot@tenantname#clustername -p'oBpasswORd'", "odc.TreeNodeMenu.config.table.New": "新建", - "odc.ConnectionList.config.help.BasedOnWebsqlOceanbaseDeveloper": "基于 WebSQL,OceanBase 开发者中心(OceanBase Developer Center,ODC) 提供了 SQL 控制台作为数据库开发者编辑和诊断 SQL 的工作区。在 SQL 窗口中您可以对 SQL 及 PL 脚本进行运行和保存等操作,还会有对应页签展示脚本的的各种执行详情和执行结果等诊断信息。在 SQL 窗口的编辑区域您可以体验到较多的细节,如窗口中会对数据库的关键字进行不同颜色的标识,其次还有输入自动提示、格式化等功能以提升您编辑 SQL 语句的效率。在编辑区域的下方是执行记录和结果两个展示页签,您可以在执行记录页签查看当前连接进程中每次执行语句的记录,并在结果页签中查看当前语句的执行结果。", "workspace.tree.function.create": "新建函数", - "odc.ConnectionList.config.help.IfYouHaveAnyQuestions": "当您在使用过程中有疑问时,可以在本章节中按模块寻找相关问题的解答。您也可以联系您的技术支持代表,或是通过我们的支持邮箱(odcsupport@service.alipay.com)反馈您的宝贵意见。", "workspace.window.session.form.value.validation": "请填写变量值", "odc.ImportDrawer.ImportForm.ImportFormat": "导入文件格式", "workspace.window.database.createTime": "创建时间", - "workspace.tree.table.openSQLWindow": "打开 SQL 控制台", - "odc.components.Header.homeMenu.ConnectionManagement": "连接管理", - "odc.components.Header.TaskPopover.TaskList": "任务列表", "portal.connection.form.mode.desc": "连接 OceanBase 的数据库兼容模式", "odc.components.DDLResultSet.ModifyAndSubmit": "修改并提交", - "odc.components.TaskManagePage.ImportTask": "导入任务", - "workspace.tree.view": "视图", "portal.connection.form.connectType.desc": "连接实例所属的区域", "odc.component.SnippetForm.Syntax.1": "代码片段", - "workspace.window.createSequence.params.ordered": "是否排序", "odc.components.CreateTriggerPage.SelectUpdateEventTheColumn": "选择 Update 事件,列不能为空", "odc.component.Exception.typeConfig.SorryTheServerHasAn": "抱歉,服务器出错了", "odc.component.EditorToolBar.TheToolbarIsIncorrectlyConfigured": "toolbar 配置错误!请检查 actions 中的配置符合 TS 定义", - "workspace.window.export.drawer.format.rowsPerCommit": "行提交一次", "workspace.window.createPackage.packageName.placeholder": "请输入程序包名称", - "odc.components.Header.Synonyms": "同义词", - "workspace.window.sql.button.stop": "终止", - "workspace.window.export.button.cancel.success": "取消任务成功", "odc.components.PLDebugResultSet.Results": "结果", "odc.components.SQLPage.TimeConsumptionStatisticsUs": "耗时统计(us)", - "odc.components.ResourceTree.SynonymtTree.Delete": "删除", - "workspace.window.import.form.escapeChara": "转义符", - "odc.component.ReconnectModal.TheConnectionHasBeenDisconnected": "由于长时间未操作,连接已断开", - "workspace.window.table.object.download": "下载查看", - "workspace.window.createTable.constraint.unique": "唯一约束", - "workspace.window.createTable.column.validation.empty": "请至少添加一个字段", "workspace.window.createProcedure.proName.validation": "请输入存储过程名称", "odc.ResourceTree.actions.Refresh": "刷新", "workspace.window.table.propstab.constraint": "约束", - "portal.wizard.doc": "产品使用文档", "odc.component.SysAccountConfigModal.Cue": "提示", "odc.components.Header.ConnectionPopover.ClusterTenant": "集群/租户:", "odc.component.helpDoc.doc.UseGlobalSnapshotsToEnsure": "使用全局快照,可保证导出数据的一致性", "workspace.window.sql.record.notify.title": "新功能提醒", - "odc.component.TaskStatus.ParameterException": "参数异常", "odc.components.TriggerPage.State": "状态", "odc.ExportDrawer.ExportForm.ExportDataStructure": "导出结构和数据", "odc.component.TaskStatus.Terminated": "已终止", "odc.component.TaskDetailDrawer.TaskInfo.WhenTheStructureAlreadyExists": "结构已存在时", "workspace.window.createSequence.modal.delete": "是否确定删除序列 {name}?", - "portal.connection.form.name": "连接名称", "odc.ExportDrawer.ExportForm.ExportContent": "导出内容", - "odc.components.ConnectionCardList.OperationTime": "操作时间", - "odc.components.CreateTableConstraintForm.NotEditable": "不可编辑", "workspace.window.sql.explain.tab.summary.columns.output": "输出过滤", "odc.component.YearPicker.SelectAYear": "请选择年份", "workspace.window.createTable.baseInfo.tableName": "表名称", @@ -1489,50 +740,30 @@ "workspace.window.sql.explain.tab.detail.card.io.ssstoreRead": "SSSTORE 中读取(行)", "odc.component.SelectPackagePLModal.PlObject": "PL 对象", "odc.src.store.snippet.Editing": "编辑", - "odc.component.TaskDetailDrawer.ObjTables.TotalDataRecords": "数据总记录数", - "odc.TreeNodeMenu.config.table.RenameAnIndex": "重命名索引", - "workspace.window.import.modal.close.title": "是否确定关闭导入窗口?", "odc.ExportDrawer.ExportForm.SelectExportObjects": "请选择导出对象", "odc.CreateTriggerPage.component.BaseInfoForm.Enable": "启用", "odc.component.SnippetForm.ActionitemnameSyntaxFragment": "{actionItemName}代码片段", - "odc.ResourceTree.config.treeNodesActions.InvalidObjectCompilationIsNot": "无效对象,不支持编译", "workspace.header.create.pl": "匿名块窗口", "odc.ExportDrawer.ExportForm.ExportStructureOnly": "仅导出结构", - "portal.wizard.create": "快速创建连接", "workspace.window.table.propstab.partition": "分区", - "portal.connection.form.tenant.placeholder": "请填写租户", "odc.components.TypePage.Type": "类型", - "workspace.window.createTable.partition.validation.emptyvalue.list": "枚举值不能为空", "odc.src.store.sql.Debugging": "调试", - "workspace.tree.table.createColumn.success": "新建列成功", "password.label.account": "账号", "workspace.tree.function.browserSchema": "查看函数", - "workspace.window.import.form.rowsPerCommit.validation": "行提交一次需填写正整数", - "odc.component.TaskDetailDrawer.TaskInformation": "任务信息", "odc.component.SysAccountConfigModal.ThisFeatureRequiresAccessTo": "该功能需要访问 sys 租户视图,root@sys 账号连通性检查未通过", "odc.components.DDLResultSet.NextPage": "下一页", - "workspace.window.import.form.newLineCharac": "换行符", - "odc.TreeNodeMenu.config.table.EditColumn": "编辑列", - "odc.TreeNodeMenu.config.table.ViewDdl": "查看 DDL", "workspace.header.create": "新建", - "odc.component.TaskStatus.Reviewing": "审核中", - "odc.AddConnectionDrawer.AddConnectionForm.QueryTheSysTenantView": "查询 sys 租户视图", - "workspace.window.sql.record.button.profile": "查看", "odc.component.CreateTypeModal.Type": "类型", - "odc.component.helpDoc.doc.AddTheCorrespondingDropTable": "Create 语句前都添加对应的 drop 语句", "odc.CreateTriggerPage.component.BaseInfoForm.TriggerStatus": "触发器状态", "odc.component.PartitionRange.Enter": "请输入", "odc.ResourceTree.config.treeNodesActions.Editing": "编辑", - "workspace.window.createFunction.seqNum": "顺序", "workspace.window.table.modal.index.columnNames1": "可选列", "odc.components.ConnectionCardList.StatusSynchronizationInProgress": "状态同步中", "workspace.window.session.form.value.placeholder": "请填写变量值", "odc.component.TaskDetailDrawer.ObjTables.DataProcessingStatus": "数据处理状态", "odc.ResourceTree.actions.Enable": "启用", "odc.ImportDrawer.ImportForm.EnterAFieldDelimiter": "请填写字段分隔符", - "portal.wizard.help.browser": "浏览产品帮助文档", "odc.components.ResourceTree.TypeTree.DeletedSuccessfully": "删除成功", - "workspace.window.export.task.status.success": "导出成功", "odc.ImportDrawer.ImportForm.ImportDataSettings": "导入数据设置", "workspace.window.sql.result.failureReason": "失败原因:", "odc.ruleItems.CharItem.LengthRange": "长度区间", @@ -1542,21 +773,16 @@ "odc.components.CreateViewPage.Result": "运行结果", "odc.TaskManagePage.DataMocker.SimulateTheGeneratedDataVolume": "模拟生成数据量", "odc.CreateTriggerPage.component.AdvancedInfoFrom.SelectTrigger": "请选择触发", - "odc.components.RecycleBinPage.NoteDeletedObjectsAreSaved": "提示:已删除对象仅在回收站中暂存{saveTime}", "odc.components.OBClientPage.NetworkException": "网络异常:", - "odc.components.Header.CommandLineWindow": "命令行窗口", - "odc.components.OBClientPage.ScriptManageModal.ScriptManagement": "脚本管理", "odc.components.ResourceTree.SynonymTree.SynonymDeletedSuccessfully": "删除同义词成功", "odc.component.TaskPopover.TaskCenter": "任务中心", "odc.ruleItems.DateItem.DateRange": "日期范围", "odc.components.CreateViewPage.BaseTableSelection": "基表选择", "odc.src.layout.LoadingPage.SystemLoadingFailedPleaseReload": "系统加载失败,请重新加载", - "odc.components.Header.AnalogData": "模拟数据", "odc.RuleContent.RangeInput.Interval": "区间", "odc.component.HelpMenus.Help": "帮助", "odc.ruleItems.CharItem.Sort": "排序", "odc.ruleItems.CharItem.Interval": "区间", - "odc.component.DataMockerDrawer.AnalogData": "模拟数据", "odc.TaskManagePage.DataMocker.RuleSettings": "规则设置展示", "odc.helper.page.openPage.YouCannotOpenMoreThan": "不能打开超过 {MAXCLIENTPAGE} 个命令行窗口", "odc.components.OBClientPage.ConnectionFailed": "***连接失败***", @@ -1564,36 +790,23 @@ "odc.component.DataMockerDrawer.RuleSelect.RandomText": "随机文本", "odc.RuleContent.ruleItems.valid.TheMaximumValueCannotBe": "最大值需大于起始值", "odc.CreateTriggerPage.component.BaseInfoForm.SelectABaseObjectType": "请选择基准对象类型", - "odc.components.TaskManagePage.CommonPage.Connection": "所属连接", "odc.component.SnippetForm.IfTheContentIsNot": "存在未保存内容,退出{actionName}代码片段", "odc.component.ColumnSelector.AllFields": "全部字段", "odc.component.DataMockerDrawer.CreatedSuccessfully": "创建成功!", "odc.component.DataMockerDrawer.RuleConfigTable.SelectARule": "请选择规则", "odc.component.DataMockerDrawer.RuleSelect.Order": "顺序", "odc.page.Workspace.ConfirmCloseWindow": "是否确认关闭窗口?", - "odc.TaskManagePage.DataMocker.Delete": "删除", - "odc.TaskManagePage.DataMocker.DeletedSuccessfully": "删除成功", "odc.component.DataMockerDrawer.form.EnterTheBatchSize": "请输入批处理大小", "odc.component.DataMockerDrawer.RuleSelect.NumericValue": "定值数字值", "odc.component.BaseInfoForm.Determine": "确定", - "odc.components.ResourceTree.SynonymTree.ConfirmThatYouWantTo": "是否确定删除同义词?", "odc.src.store.setting.SystemInitializationFailedRefreshAnd": "系统初始化失败,请刷新重试!", "odc.component.BaseInfoForm.ViewName": "视图名称", - "odc.component.DataMockerDrawer.form.TaskName": "任务名", - "odc.components.OBClientPage.ScriptManageModal.Operation": "操作", - "odc.component.ExportResultSetModal.ThisParameterCannotBeEmpty": "该项不能为空", - "odc.component.SnippetForm.ExitTheCreateCodeSnippet": "退出创建代码片段", "odc.component.DataMockerDrawer.AreYouSureYouWant": "是否确定取消模拟数据?", "odc.ruleItems.NumberItem.PositiveSequence": "正序", - "odc.components.OBClientPage.ScriptManageModal.ScriptName": "脚本名称", "odc.CreateTriggerPage.component.AdvancedInfoFrom.ClauseConditionOptional": "子句条件", "odc.component.BaseInfoForm.No": "无", - "odc.components.OBClientPage.ScriptManageModal.TheMaximumNumberOfImported": "导入文件最大不能超过 250 MB", "odc.components.OBClientPage.NoteToReferenceAScript": "提示:如需引用脚本,可在脚本管理中上传脚本后引用", - "odc.TaskManagePage.DataMocker.TaskName": "任务名称", "odc.components.CreateViewPage.TheViewViewnameHasBeen": "创建视图 {viewName} 成功!", - "odc.components.TaskManagePage.CommonPage.EnterATaskName": "请输入任务名称", - "odc.components.SQLPage.SqlWindowPagename": "SQL 窗口_{pageName}", "odc.component.DataMockerDrawer.form.Is": "是", "odc.components.CreateViewPage.MultipleTExistYouNeed": "存在多个{t}, 需要设置不同别名", "odc.page.Login.NetworkException": "网络异常", @@ -1601,17 +814,13 @@ "odc.component.BaseInfoForm.CheckItem": "检查项", "odc.ruleItems.IntervalItem.Value": "值", "odc.ruleItems.DateItem.Reverse": "倒序", - "odc.components.Sider.Sequence": "序列", "odc.ruleItems.DateItem.SortingMethod": "排序方式", "odc.component.DataMockerDrawer.form.TheBatchSizeCannotExceed": "批处理大小不能超过 1000", "odc.component.DataMockerDrawer.form.DataConflictHandlingMethod": "数据冲突处理方式", "odc.component.DataMockerDrawer.RuleSelect.FixedValueDateValue": "定值日期值", "odc.components.CreateViewPage.NextConfirmTheSqlStatement": "下一步:确认 SQL", "odc.CreateTriggerPage.component.BaseInfoForm.SelectABaseObjectName": "请选择基准对象名称", - "odc.TaskManagePage.DataMocker.OperationSuccessful": "操作成功", "odc.CreateTriggerPage.component.AdvancedInfoFrom.SelectALevel": "请选择级别", - "odc.components.OBClientPage.ScriptManageModal.ScriptList": "脚本列表", - "odc.components.OBClientPage.ScriptManagement": "脚本管理", "odc.ruleItems.CharItem.PositiveSequence": "正序", "odc.ruleItems.DateItem.Sort": "排序", "odc.page.Workspace.WhenTheOperationIsRunning": "操作执行中,关闭窗口将终止窗口操作,是否确认关闭?", @@ -1620,18 +829,12 @@ "odc.component.TableSelector.EnterATableOrView": "请输入表/视图名称", "odc.TaskManagePage.DataMocker.BatchSize": "批处理大小", "odc.component.DataMockerDrawer.RuleConfigTable.FieldName": "字段名称", - "odc.components.Sider.StoredProcedure": "存储过程", "odc.TaskManagePage.DataMocker.ConflictRecords": "冲突记录", - "odc.component.ExportResultSetModal.TheExportRangeIsTo": "导出范围限制为 1~10000", - "odc.components.Sider.View": "视图", "odc.TaskManagePage.DataMocker.CreationTime": "创建时间", "odc.component.CommonTaskDetailModal.TaskDetails": "任务详情", "odc.component.CreateSynonymModal.SelectAnObjectType": "请选择对象类型", "odc.CreateTriggerPage.component.BaseInfoForm.SelectTheBaseObjectMode": "请选择基准对象模式", "odc.ruleItems.CharItem.StepSize": "步长", - "odc.page.ConnectionList.SetTopSuccessfully": "置顶成功", - "odc.components.Sider.Function": "函数", - "odc.components.OBClientPage.ScriptManageModal.ClickOrDragTheFile": "点击或将文件拖拽到这里上传", "odc.component.DataMockerDrawer.RuleSelect.RegularText": "正则文本", "odc.component.DataMockerDrawer.form.SelectATable": "请选择表", "odc.components.DDLResultSet.AnalogData": "模拟数据", @@ -1652,30 +855,17 @@ "odc.component.DataMockerDrawer.RuleSelect.FixedValueText": "定值文本", "odc.ruleItems.CharItem.Reverse": "倒序", "odc.component.DataMockerDrawer.RuleSelect.Value": "定值", - "odc.src.store.schema.FailedToObtainThePackage": "获取包失败", - "odc.src.layout.LoadingPage.Loading": "系统加载中...", "odc.components.ResourceTree.TypeTree.AreYouSureYouWant": "是否确定删除类型{title}?", - "odc.components.OBClientPage.ScriptManageModal.ScriptPath": "脚本路径", "odc.components.TaskManagePage.AnalogData": "模拟数据", - "odc.TaskManagePage.DataMocker.Stop": "停止", - "odc.components.OBClientPage.ScriptManageModal.FileSize": "文件大小", - "odc.TaskManagePage.DataMocker.See": "查看", "odc.CreateTriggerPage.component.BaseInfoForm.SelectABaseObject": "请选择基准对象", - "odc.components.OBClientPage.ScriptManageModal.AreYouSureYouWant": "是否确认删除已上传文件?", "odc.ruleItems.DateItem.PositiveSequence": "正序", - "odc.components.LabelMange.Determine": "确定", "odc.component.DataMockerDrawer.RuleConfigTable.Rules.1": "细则", "odc.component.DataMockerDrawer.Cancel": "取消", - "odc.component.DataMockerDrawer.form.TheMaximumValueCannotExceed": "最大值不能超过 1000000", - "odc.TaskManagePage.DataMocker.ConnectionName": "连接名称", - "odc.components.Sider.Table": "表", "odc.EditorToolBar.actions.sql.Create": "创建", "odc.component.CommonTaskDetailModal.TaskLog": "任务日志", - "odc.components.Sider.Bag": "包", "odc.components.ResourceTree.SynonymTree.AreYouSureYouWant": "是否确定删除同义词{synonymName}?", "odc.component.ColumnSelector.Item.Alias": "别名", "odc.ruleItems.CharItem.Value": "值", - "odc.components.Header.homeMenu.HasdebugpagetitleIsBeingDebuggedAnd": "{hasDebugPageTitle}正在调试,无法关闭", "odc.TaskManagePage.DataMocker.IgnoreInsert": "忽略插入", "odc.EditorToolBar.actions.script.DeletePlaceholder": "删除占位符", "odc.component.TableSelector.Item.Alias": "别名", @@ -1684,59 +874,39 @@ "odc.component.DataMockerDrawer.RuleSelect.Random": "随机", "odc.component.DataMockerDrawer.Submitted": "提交", "odc.component.DataMockerDrawer.RuleSelect.RandomBooleanValue": "随机布尔值", - "odc.component.TaskStatus.Failed": "失败", "odc.TaskManagePage.DataMocker.TargetTable": "目标表", - "odc.components.OBClientPage.ScriptManageModal.Closed": "关闭", - "odc.components.LabelMange.AfterTheTagIsClosed": "关闭后,未提交的标签不会生效,是否确定关闭?", "odc.components.TaskManagePage.Export": "导出", "odc.ruleItems.CharItem.DateRange": "日期范围", "odc.components.SQLPage.Closed": "关闭", "odc.components.OBClientPage.EstablishingConnection": "建立连接中....", - "odc.component.DataMockerDrawer.form.ConnectionNameConnectionstoreconnectionsessionnameSchemaName": "连接名:{connectionStoreConnectionSessionName} | 模式名:{schemaStoreDatabaseName}", - "odc.components.OBClientPage.ScriptManageModal.Delete": "删除", - "odc.TaskManagePage.DataMocker.Download": "下载", - "odc.RuleContent.ruleItems.valid.TheStartValueMustBe": "起始值不能为空", "odc.ruleItems.CharItem.BooleanValue": "布尔值", "odc.ruleItems.NumberItem.Reverse": "倒序", "odc.components.ResourceTree.TriggerTree.AreYouSureYouWant": "是否确定删除触发器{title}?", "odc.components.OBClientPage.ConnectionEstablished": "建立连接成功....", - "odc.components.OBClientPage.ScriptManageModal.DeletedSuccessfully": "删除成功", - "odc.TaskManagePage.DataMocker.TaskType": "任务类型", "odc.ruleItems.NumberItem.Interval": "区间", - "odc.src.d.ts.AnalogData": "模拟数据", "odc.ruleItems.CharItem.Date": "日期", "odc.components.OBClientPage.Reconnect": "重新连接", "odc.component.ColumnSelector.Custom": "自定义", "odc.component.DataMockerDrawer.TheFieldEditingcolumncolumnnameIsBeing": "字段{editingColumnColumnName}正在编辑中", "odc.src.store.schema.TheHeaderOfTheObtained": "获取包体包头为空", "odc.component.CommonTaskDetailModal.TaskLog.AlertLogs": "告警日志", - "odc.page.ConnectionList.UnableToModifyTheTag": "修改标签失败", "odc.ruleItems.DateItem.StepSize": "步长", "odc.component.BaseInfoForm.EnterAViewName": "请输入视图名称", "odc.component.DataMockerDrawer.RuleConfigTable.FieldType": "字段类型", - "odc.component.CommonTaskDetailModal.Closed": "关闭", - "odc.AddConnectionDrawer.AddConnectionForm.IndependentDeployment": "独立部署", "odc.ruleItems.DateItem.Date": "日期", - "odc.component.CommonTaskDetailModal.Download": "下载", "odc.TreeNodeMenu.config.table.AnalogData": "模拟数据", - "odc.RuleContent.ruleItems.valid.TheMaximumValueMustBe": "最大值不能为空", "odc.component.DataMockerDrawer.RuleSelect.RandomNumericValue": "随机数字值", "odc.components.CreateViewPage.BasicInformation": "基本信息", "odc.components.CreateViewPage.FieldSelection": "字段选择", "odc.ruleItems.CharItem.Days": "天", - "odc.component.DataMockerDrawer.form.EnterATaskName": "请输入任务名", "odc.components.TaskManagePage.Import": "导入", "odc.TaskManagePage.DataMocker.ClearTheTableBeforeInserting": "插入模拟数据前清空表", - "odc.page.ConnectionList.TopOperationFailed": "置顶操作失败", "odc.component.DataMockerDrawer.form.InsertASimulatedDataEmptying": "插入模拟数据清空表", - "odc.components.LabelForm.DuplicateTags": "标签已存在", "odc.components.OBClientPage.TheConnectionHasBeenDisconnected": "***连接已断开***", "odc.component.CreateSynonymModal.TheSynonymNameAlreadyExists": "同义词名称已存在", "odc.component.DataMockerDrawer.RuleSelect.RandomDateValue": "随机日期值", - "odc.components.ResourceTree.Package": "程序包", "odc.ruleItems.CharItem.AllLowercase": "全部小写", "odc.component.BaseInfoForm.ReadOnly": "只读", - "odc.component.TaskStatus.Complete": "完成", "odc.EditorToolBar.actions.script.AddPlaceholder": "添加占位符", "odc.RuleContent.ruleItems.valid.TheValueMustBeSpecified": "该值不能为空", "odc.CreateTriggerPage.component.BaseInfoForm.BaseObjectType": "基准对象类型", @@ -1745,20 +915,14 @@ "odc.components.OBClientPage.ScriptManageModal.TheSizeOfTheUploaded": "上传文件大小不能超出限制", "odc.ruleItems.NumberItem.StartValue": "起始值", "odc.component.CreateTypeModal.NextConfirmTheSqlStatement": "下一步:确认 SQL", - "odc.components.OBClientPage.ScriptManageModal.CopyPath": "复制路径", "odc.ruleItems.DateItem.Days": "天", - "odc.components.OBClientPage.ScriptManageModal.UploadTime": "上传时间", - "odc.component.CreateSynonymModal.SynonymNameDuplicate": "同义词名称重复", "odc.CreateTriggerPage.component.AdvancedInfoFrom.SelectATriggerType": "请选择触发器类型", "odc.ruleItems.CharItem.AllUppercase": "全部大写", - "odc.components.OBClientPage.ScriptManageModal.ImportScript": "导入脚本", "odc.ruleItems.NumberItem.StepSize": "步长", - "odc.TaskManagePage.DataMocker.ModeName": "模式名", "odc.component.DataMockerDrawer.RuleSelect.SequentialDateValue": "顺序日期值", "odc.component.ColumnSelector.TipYouCanClickCustom": "提示:可点击自定义新建字段", "odc.TaskManagePage.DataMocker.DataConflictHandlingMethod": "数据冲突处理方式", "odc.components.OBClientPage.ScriptManageModal.CopiedSuccessfully": "复制成功!", - "odc.TaskManagePage.DataMocker.ConfirmDelete": "是否确认删除?", "odc.component.DataMockerDrawer.form.SimulateTheGeneratedDataVolume": "模拟生成数据量", "odc.component.DataMockerDrawer.type.Termination": "终止", "odc.CreateTriggerPage.component.AdvancedInfoFrom.ReferenceOldValuesOptional": "引用旧值", @@ -1766,27 +930,18 @@ "odc.EditorToolBar.actions.script.Placeholder": "占位符", "odc.ruleItems.NumberItem.Sort": "排序", "odc.page.Workspace.DockedpagetitleIsBeingDebuggedAnd": "{dockedPageTitle}正在调试,无法关闭", - "odc.component.TaskStatus.Running": "运行中", - "odc.component.CommonTaskDetailModal.TaskLog.CommonLogs": "普通日志", - "odc.components.ResourceTree.TypeTree.DetermineTheTypeToDelete": "是否确定删除该类型?", "odc.component.DataMockerDrawer.RuleConfigTable.Rules": "规则", "odc.component.DataMockerDrawer.form.Table": "表", "odc.ruleItems.NumberItem.SortingMethod": "排序方式", "odc.CreateTriggerPage.component.BaseInfoForm.EnterTheTriggerName": "请填写触发器名称", "odc.src.store.setting.SystemConfigurationQueryFailed": "系统配置查询失败", - "odc.components.OBClientPage.ScriptManageModal.NoteTheScriptCanBe": "提示:脚本最多保留 30 分钟", "odc.component.TableSelector.Determine": "确定", "odc.CreateTriggerPage.component.AdvancedInfoFrom.SelectAll": "全选", - "odc.components.ResourceTree.TriggerTree.DetermineIfYouWantTo": "是否确定删除触发器?", "odc.ruleItems.CharItem.StartValue": "起始值", "odc.component.DataMockerDrawer.form.BatchSize": "批处理大小", - "odc.components.LabelMange.Cancel": "取消", "odc.component.DataMockerDrawer.RuleSelect.SequentialNumericValue": "顺序数字值", "odc.components.CreateViewPage.Optional": "(选填)", "odc.CreateTriggerPage.component.BaseInfoForm.SelectTheTriggerStatus": "请选择触发器状态", - "odc.components.Sider.Package": "程序包", - "odc.page.ConnectionList.TheTagHasBeenModified": "修改标签成功", - "odc.TaskManagePage.DataMocker.SimulateDataTasks": "模拟数据任务", "odc.components.CreateAsyncTaskModal.TaskErrorHandling": "任务错误处理", "odc.ExportDrawer.ExportForm.YouCanEnterOnlyOne": "只能输入一个字符", "odc.component.TaskDetailDrawer.TaskInfo.TaskErrorHandling": "任务出错处理", @@ -1799,72 +954,52 @@ "odc.component.TaskDetailDrawer.TaskInfo.SysTenantAccountConfiguration": "sys 租户账号配置", "odc.component.LoginMenus.ChangeLockPwd.DeletePassword": "删除密码", "odc.component.SysFormItem.SaveTheAccountInformationTo": "保存此账号信息至连接属性中", - "odc.components.CreateAsyncTaskModal.EnterATaskName": "请输入任务名", "odc.component.SysFormItem.EnterASysAccount": "请输入 sys 账号", "odc.components.CreateAsyncTaskModal.PopconfirmButton.AreYouSureYouWant": "是否确定取消新建?", "odc.page.Lock.SystemException": "系统异常", "odc.components.CreateAsyncTaskModal.SelectSqlContent": "请选择 SQL 内容", "odc.page.Lock.EnterTheUnlockPassword": "请输入解锁密码", "odc.components.CreateAsyncTaskModal.IgnoreErrorsContinueTasks": "忽略错误继续任务", - "odc.TaskManagePage.AsyncTask.ExecutionTimeout": "执行超时时间", "odc.ExportDrawer.ExportForm.CsvFormat": "CSV 格式", "odc.components.CreateAsyncTaskModal.SelectTaskErrorHandling": "请选择任务错误处理", - "odc.components.CreateAsyncTaskModal.CreateAsynchronousExecution": "新建异步执行", - "odc.components.CreateAsyncTaskModal.TheTaskNameCannotExceed": "任务名称不超过 110 个字符", "odc.component.TaskDetailDrawer.ObjTables.ActualProcessingQuantity": "实际处理数量", "odc.component.TaskDetailDrawer.TaskInfo.ImportFileFormat": "导入文件格式", "odc.page.Lock.AreYouSureYouWant": "是否确定重置所有数据?", "odc.component.TaskDetailDrawer.TaskInfo.StopATask": "停止任务", "odc.ImportDrawer.ImportForm.StopATask": "停止任务", "odc.page.Lock.ForgotThePasswordTry": "忘记密码?尝试", - "odc.TaskManagePage.AsyncTask.Delete": "删除", "odc.ImportDrawer.ImportForm.CsvFile": "CSV 文件", "odc.component.TaskDetailDrawer.TaskInfo.UseTheSysTenantAccount": "使用 sys 租户账号提升导出速度", "odc.ImportDrawer.ImportForm.IgnoreErrorsContinueTasks": "忽略错误继续任务", - "odc.TaskManagePage.AsyncTask.ExecutionFailure": "执行失败记录", "odc.component.SysFormItem.ConnectionSucceeded": "连接成功", "odc.ImportForm.formitem.StructDataFormItem.ImportStructureSettingsWhenThe": "导入结构设置:结构已存在时", "odc.components.CreateAsyncTaskModal.Cancel": "取消", - "odc.components.CreateAsyncTaskModal.TaskDescription": "任务描述", "odc.AsyncTask.components.PropssuccesscountSqlStatementsFailedTo": "{propsSuccessCount} 条 SQL 执行失败", "odc.page.Lock.WillAllConnectionsAndPasswords": "重置后将删除所有连接,并且删除密码?", "odc.page.Lock.ResetData": "重置数据", "odc.components.OBClientPage.ToAvoidGarbledCodesKeep": "为避免乱码问题,请保持数据库客户端编码和操作系统编码一致。", - "odc.component.TaskDetailDrawer.ObjTables.PlannedProcessingQuantity": "计划处理数量", "odc.component.SysFormItem.Password": "密码", "odc.component.SysFormItem.ToExportObjectsOtherThan": "导出表/视图之外的对象需要开启配置", "odc.component.LoginMenus.ChangeLockPwd.SetTheApplicationPassword": "设置应用密码", "odc.ImportDrawer.ImportForm.ZipCompressedFiles": "ZIP 压缩文件", - "odc.components.CreateAsyncTaskModal.ClickOrDragTheFile": "点击或将文件拖拽到这里上传", - "odc.components.CreateAsyncTaskModal.SupportedExtensionNameSql": "支持扩展名:.sql", "odc.components.OBClientPage.GenerallyTheLinuxOperatingSystem": "(一般情况下 Linux 操作系统默认字符编码为 UTF8,Windows 操作系统默认字符编码为 GBK,具体以实际情况为准)", - "odc.AddConnectionDrawer.AddConnectionForm.ThePublicIpAddressFormat": "公网地址格式不符合要求", "odc.components.CreateAsyncTaskModal.UploadAttachments": "上传附件", "odc.component.SysFormItem.Account": "账号", "odc.components.CreateAsyncTaskModal.SqlContent": "SQL 内容", - "odc.ExportDrawer.ExportForm.DataTypesThatAreNot": "不导出的数据类型", "odc.TaskManagePage.AsyncTask.SqlContent": "SQL 内容", "odc.TaskManagePage.AsyncTask.TaskErrorHandling": "任务错误处理", - "odc.components.CreateAsyncTaskModal.TheFileSizeCannotExceed": "文件大小不超过 20 MB", - "odc.components.Header.AsynchronousExecution": "异步执行", "odc.component.LoginMenus.ChangeLockPwd.SystemException": "系统异常", "odc.component.LoginMenus.ChangeLockPwd.Password": "密码", - "odc.TaskManagePage.AsyncTask.Stop": "停止", "odc.components.CreateAsyncTaskModal.SqlEntry": "SQL 录入", "odc.components.CreateAsyncTaskModal.PopconfirmButton.Cancel": "取消", - "odc.components.CreateAsyncTaskModal.TheTaskNameAlreadyExists": "任务名已存在", "odc.ImportDrawer.ImportForm.TaskErrorHandling": "任务错误处理", "odc.component.LoginMenus.ChangeLockPwd.Modified": "修改成功!", - "odc.component.TaskDetailDrawer.TaskLog.AllLogs": "全部日志", - "odc.components.TaskManagePage.AsynchronousExecution": "异步执行", "odc.components.CreateAsyncTaskModal.PopconfirmButton.Determine": "确定", "odc.components.CreateAsyncTaskModal.ExecutionTimeout": "执行超时时间", "odc.component.SysFormItem.Configuration": "配置", - "odc.ImportDrawer.ImportForm.DataFormat": "数据格式", "odc.ImportDrawer.ImportForm.SqlFile.1": "SQL 文件", "odc.component.FormItemPanel.Superior": "高级", "odc.AsyncTask.components.PropssuccesscountSqlStatementsAreExecuted": "{propsSuccessCount} 条 SQL 执行成功", - "odc.TaskManagePage.AsyncTask.TaskDescription": "任务描述", "odc.component.SysFormItem.UseTheSysTenantAccount": "使用 sys 租户账号提升任务速度", "odc.TaskManagePage.AsyncTask.See": "查看", "odc.component.LoginMenus.ChangeLockPwd.EnterANewPassword": "请输入新密码", @@ -1873,8 +1008,6 @@ "odc.component.SysFormItem.TestConnection": "测试连接", "odc.TaskManagePage.AsyncTask.IgnoreErrorsContinueTasks": "忽略错误继续任务", "odc.components.CreateAsyncTaskModal.EnterTheSqlContent": "请填写 SQL 内容", - "odc.components.ChangePasswordModal.IncorrectPassword": "密码不正确", - "odc.ExportDrawer.ExportForm.exportTables.SelectcountSelected": "已选中 {selectCount} 个", "odc.src.d.ts.Synonyms": "同义词", "odc.components.CreateAsyncTaskModal.EnterATimeoutPeriod": "请输入超时时间", "odc.TaskManagePage.AsyncTask.ExecutiontimeoutHours": "{executionTimeout} 小时", @@ -1882,77 +1015,52 @@ "odc.components.CreateAsyncTaskModal.Hours": "小时", "odc.component.SysFormItem.EnterTheSysAccount": "请填写 sys 账号", "odc.component.SysFormItem.SysTenantAccountSettings": "sys 租户账号设置", - "odc.AddConnectionDrawer.AddConnectionForm.Function": "功能", "odc.component.LoginMenus.ChangeLockPwd.ChangePassword": "修改密码", - "odc.page.Lock.ResetFailed": "重置失败!", - "odc.ExportDrawer.ExportForm.exportTables.TotalTotal": "共 {total} 个", "odc.component.TaskDetailDrawer.TaskInfo.DataFormat": "数据格式", "odc.src.d.ts.CommonSynonyms": "公共同义词", "odc.components.CreateAsyncTaskModal.StopATask": "停止任务", "odc.ExportDrawer.ExportForm.DataFormat": "数据格式", - "odc.components.CreateAsyncTaskModal.TaskName": "任务名称", "odc.src.d.ts.Trigger": "触发器", "odc.component.SysFormItem.ChangePassword": "修改密码", - "odc.TaskManagePage.AsyncTask.TaskName": "任务名", - "odc.components.CreateAsyncTaskModal.TheTaskDescriptionCannotExceed": "任务描述不超过 200 个字符", - "odc.AddConnectionDrawer.AddConnectionForm.AnalogData": "模拟数据", "odc.component.LoginMenus.ChangeLockPwd.Deleted": "删除成功!", - "odc.TaskManagePage.AsyncTask.Created": "创建时间", - "odc.TaskManagePage.AsyncTask.ExecutionResult": "执行结果", "odc.components.SQLPage.TheTraceIdIsEmpty": "TRACE ID 为空,请确保该语句运行时 ob_enable_trace_log 变量已设置为 ON", - "odc.AddConnectionDrawer.AddConnectionForm.TheMaximumValueIs": "超过最大值 2147484 限制", "odc.component.helpDoc.doc.YouCanObtainTheOptimal": "通过访问 sys 租户下的视图信息得到最优的数据路由策略,从而提升速度", "odc.components.CreateAsyncTaskModal.MaximumLengthOfHours": "最大不超过 480 小时", "odc.TablePage.TableData.DoNotSubmitBlankLines": "请不要提交空行", - "odc.components.CreateAsyncTaskModal.AreYouSureYouWant": "是否确定取消异步执行?", - "odc.components.SessionManagementPage.TheQueryIsClosed": "关闭查询成功", "odc.component.DisplayTable.TotalTotal": "共 {total} 条", "odc.ImportDrawer.ImportForm.UpToObjectsCanBe": "最多上传 500 个文件", "odc.components.SQLResultSet.SQLResultLog.DbmsOutput": "DBMS 输出", "odc.component.LoginMenus.ApplicationPassword": "应用密码", "odc.components.TablePage.Formatting": "格式化", "odc.component.LoginMenus.UserConfig.Save": "保存", - "odc.components.TabHistory.Open": "打开", - "odc.components.SQLResultSet.ExecuteHistory.TheTraceIdIsEmpty": "TRACE ID 为空,请确保该语句运行时 enable_sql_audit 系统参数及 ob_enable_trace_log 变量值均为 ON", "odc.component.LoginMenus.ChangeLockPwdModal.TheTwoPasswordsAreInconsistent": "两次密码输入不一致!", "odc.components.DDLResultSet.UploadAndModify": "上传修改", "odc.component.LoginMenus.ChangeLockPwdModal.EnterANewPasswordAgain": "请再次输入新密码", - "odc.component.ExportResultSetModal.TableName": "表名", "odc.components.SynonymPage.Formatting": "格式化", "odc.component.LoginMenus.UserConfig.SelectADelimiter": "请选择界定符设置", "odc.component.LoginMenus.ChangeLockPwdModal.OriginalPassword": "原密码", "odc.component.LoginMenus.UserConfig.Automatic": "自动", "odc.component.LoginMenus.ChangeLockPwdModal.EnterTheOriginalPassword": "请输入原密码", - "odc.components.TabHistory.DatabaseNameSchema": "库名/Schema", "odc.components.TriggerPage.Formatting": "格式化", - "odc.ConnectionList.config.help.OdcIntroduction": "ODC 介绍", - "odc.components.TabHistory.History": "历史记录", "odc.components.DDLResultSet.DownloadAndView": "下载查看", "odc.component.LoginMenus.ChangeLockPwdModal.UnableToDeleteCheckWhether": "删除失败,请确认密码是否正确", "odc.component.LoginMenus.UserConfig.SetTheDefaultCommitMode": "设置 Oracle 模式下事务的默认提交模式", "odc.component.LoginMenus.UserConfig.SelectMysqlTransactionCommitMode": "请选择 MySQL 事务提交模式", - "odc.components.TabHistory.SearchConnectionName": "搜索连接名", "odc.component.LoginMenus.ChangeLockPwdModal.ConfirmPassword": "确认密码", "odc.component.LoginMenus.UserConfig.SetTheDefaultDelimiterIn": "设置 SQL 窗口内默认的 Delimiter 符号", "odc.components.ProcedurePage.Formatting": "格式化", - "odc.components.SQLResultSet.ExecuteHistory.DbTimeConsumedQuerycostmillisMs": "DB 耗时: {queryCostMillis} ms", "odc.component.helpDoc.doc.NetworkTimeConsumptionTheTime": "网络耗时:请求在网络传输上所花费的时间", "odc.components.FunctionPage.Formatting": "格式化", "odc.components.SequencePage.Formatting": "格式化", "odc.component.LoginMenus.UserConfig.EditPersonalSettings": "编辑个人设置", - "odc.components.TabHistory.HistoryWindowRecordsAreSaved": "历史打开窗口记录默认保存 48 小时", "odc.component.helpDoc.doc.DbTimeConsumptionTheTime": "DB 耗时:请求经数据库处理所花费的时间", - "odc.components.SQLResultSet.ExecuteHistory.OdcTimeConsumedOdcprocesscostmillisMs": "ODC 耗时: {odcProcessCostMillis} ms", - "odc.component.ExportResultSetModal.EnterATableName": "请输入表名", "odc.component.helpDoc.doc.TheTimeConsumptionConsistsOf": "耗时由三部分组成,分别为:", "odc.components.DDLResultSet.TheTraceIdIsEmpty": "TRACE ID 为空,请确保该语句运行时 enable_sql_audit 系统参数及 ob_enable_trace_log 变量值均为 ON", "odc.component.LoginMenus.UserConfig.Cancel": "取消", - "odc.components.SQLResultSet.ExecuteHistory.TheCurrentStatementTypeDoes": "当前语句类型不支持查看执行详情", "odc.component.LoginMenus.UserConfig.SetTheDefaultNumberOf": "设置 SQL 窗口内执行 SQL 默认返回的结果行数", "odc.components.DDLResultSet.TheCurrentStatementTypeDoes": "当前语句类型不支持查看执行详情", "odc.component.LoginMenus.Account": "账户", "odc.component.helpDoc.doc.OdcTimeConsumptionTheTime": "ODC 耗时:请求经过 ODC 处理所花费的时间", - "odc.components.TabHistory.ConnectionName": "连接名", "odc.component.LoginMenus.UserConfig.PersonalSettingsSaved": "个人设置保存成功", "odc.page.Lock.Unlocking": "解锁中", "odc.components.SQLResultSet.ExecuteHistory.TheOdcUsageEnvironmentClock": "ODC 使用环境时钟和 ODC 部署环境时钟设置不一致,差异大于 {lagRecordLag} ms,会导致网络耗时统计不精准,请检查两个环境时间和 UTC 时间的差异", @@ -1963,734 +1071,332 @@ "odc.components.TypePage.Unformat": "取消格式化", "odc.page.Lock.Unlock": "解锁", "odc.component.LoginMenus.UserConfig.AreYouSureYouWant": "确认取消修改个人配置吗", - "odc.components.TabHistory.NoContent": "无内容", "odc.component.LoginMenus.ChangeLockPwdModal.UnableToModifyThePassword": "修改失败,请确认密码是否正确", "odc.component.LoginMenus.UserConfig.SelectOracleTransactionCommitMode": "请选择 Oracle 事务提交模式", "odc.component.LoginMenus.UserConfig.SetTheDefaultCommitMode.1": "设置 MySQL 模式下事务的默认提交模式", "odc.components.ViewPage.Formatting": "格式化", "odc.component.LoginMenus.UserConfig.EnterTheNumberOfEntries": "请输入结果集查询条数", - "odc.components.SQLResultSet.ExecuteHistory.NetworkTimeOdcfrontcostmillisMs": "网络耗时: {odcFrontCostMillis} ms", "odc.component.LoginMenus.UserConfig.OracleTransactionSubmissionMode": "Oracle 事务提交模式", - "odc.components.TabHistory.Operation": "操作", "odc.component.LoginMenus.UserConfig.Manual": "手动", "odc.component.LoginMenus.PersonalSettings": "个人设置", "odc.component.LoginMenus.UserConfig.DelimiterSettings": "界定符设置", "odc.ImportDrawer.csvMapping.Null": "(空)", - "odc.components.TabHistory.SqlPlWindow": "SQL/PL 窗口", "odc.component.LoginMenus.ChangeLockPwdModal.EnterThePasswordAgain": "请再次输入密码", - "odc.components.TabHistory.HistoryWindow": "历史打开窗口", "odc.component.SQLCodeEditor.InvalidCharacterUAThis": "非法字符(\\u00a0),该字符有可能造成运行报错", - "odc.components.TabHistory.LastOpenTime": "最近打开时间", - "odc.component.ReconnectModal.NotConnected": "暂不连接", "odc.EditableTable.Editors.TextEditor.Submitted": "提交", - "odc.components.TabHistory.EnterAConnectionName": "请输入连接名", - "odc.page.ConnectionList.UnstickSuccess": "取消置顶成功", "odc.components.PackagePage.Unformat": "取消格式化", "odc.components.DDLResultSet.SetToNull": "设置为 Null", "odc.components.ProcedurePage.Unformat": "取消格式化", "odc.components.DDLResultSet.ColumnModeModal.ColumnName": "列名", "odc.components.TriggerPage.Unformat": "取消格式化", - "odc.components.TabHistory.NoteTheHistoryWindowRecords": "提示:历史打开窗口记录默认保存 48 小时", - "odc.components.SQLResultSet.ExecuteHistory.OdcTimeConsumption": "ODC 耗时:", "odc.component.TableRenameModal.TheTableNameHasNot": "表名称未修改", - "odc.components.SQLResultSet.ExecuteHistory.SqlFailedToBeExecuted": "SQL 未成功执行,不支持查看执行详情", "odc.components.TablePage.Unformat": "取消格式化", - "odc.components.SQLResultSet.ExecuteHistory.NetworkTimeConsumed": "网络耗时:", "odc.components.FunctionPage.Unformat": "取消格式化", - "odc.components.SQLResultSet.ExecuteHistory.DbTimeConsumption": "DB 耗时:", "odc.components.ViewPage.Unformat": "取消格式化", "odc.components.DDLResultSet.ColumnModeModal.Value": "值", "odc.components.SequencePage.Unformat": "取消格式化", "odc.components.SynonymPage.Unformat": "取消格式化", "odc.component.ConnectPassowrd.EnterTheConnectionPassword": "请输入连接密码", - "odc.AddConnectionDrawer.AddConnectionForm.SaveDatabasePassword": "保存数据库密码", "odc.components.ConnectionCardList.TheConnectionPasswordIsNot": "连接密码未保存,无法获取状态", "odc.component.ProcedureParam.AddParameters": "添加参数", - "odc.components.FormConnectionModal.Determine": "确定", "odc.components.ShowFunctionBaseInfoForm.LastModifiedTime": "最近修改时间", "odc.components.FormUserModal.EnterAName": "请输入姓名", "odc.components.ShowFunctionBaseInfoForm.Created": "创建时间", - "odc.components.ResourceGroupPage.component.PublicConnection": "公共连接", "odc.components.UserPage.UserInformation": "用户信息", - "odc.components.FormConnectionModal.AreYouSureYouWant.1": "是否确定取消新建?", - "odc.components.UserPage.TheInformationOfTheDeactivated": "被停用的用户账号信息仍保留,支持启用", "odc.components.FormRoleModal.New": "新建", "odc.components.SequencePage.ValidValues": "取值范围", - "odc.component.AddConnectionForm.UsersWithReadOnlyPermissions": "拥有只读权限的用户使用该账号登录数据库,为保障权限可控,请确认账号对数据库仅具备只读权限", - "odc.components.UserPage.DisabledUsersWillNotBe": "被停用的用户将无法进行登录", "odc.components.CommonStatus.Enable": "启用", "odc.components.FormUserModal.ToEnsureSecurityTheSystem": "为保障安全,系统内无法查看用户密码,请先保存用户信息,如忘记密码可重置", - "odc.components.FormRoleModal.component.PublicResourcePermissionsGrantAccess": "公共资源权限:授予公共连接的访问权限,支持只读和读写两类权限的授予,该两类权限包含的具体内容可参考产品手册说明。", - "odc.components.UserPage.Cancel": "取消", - "odc.components.ResourceGroupPage.component.Created": "创建时间", - "odc.components.PublicConnectionPage.AfterTheResourceGroupIs": "被停用后用户将无法访问资源组包含的连接", "odc.components.UserPage.component.Account": "账号", "odc.components.CreateSequenceModal.EditSequence": "编辑序列", - "odc.components.PublicConnectionPage.EnterAConnectionName": "请输入连接名称", - "odc.components.PublicConnectionPage.component.Endpoint": "连接地址", - "odc.components.FormConnectionModal.FailedToCreateAPublic": "公共连接创建失败", - "odc.components.FormRoleModal.component.Delete": "删除", - "odc.component.VersionModal.config.TheConsoleAllowsYouTo": "通过管控台可进行系统用户、角色、资源、资源组以及系统配置的管理,进而实现权限管控的目的。", - "odc.page.Manage.ResourceManagement": "资源管理", - "odc.components.FormRoleModal.component.ReadAndWrite": "读写", - "odc.page.ConnectionList.columns.ResourceGroup": "所属资源组", "odc.components.CommonDeleteModal.Delete": "删除", - "odc.components.FormConnectionModal.Cancel": "取消", - "odc.component.VersionModal.config.AsynchronousExecution": "异步执行:", - "odc.components.FormResourceGroupModal.UnableToSaveTheResource": "资源组保存失败", - "odc.components.FormConnectionModal.AreYouSureYouWant": "是否确定取消编辑?取消后,编辑的内容将不生效", - "odc.components.ResourceGroupPage.component.ConnectionName": "连接名称", - "odc.components.FormResourceGroupModal.New": "新建", "odc.components.FormUserModal.Name": "姓名", - "odc.components.RolePage.component.New": "新建", "odc.components.FormRoleModal.component.Name": "姓名", "odc.components.FormRoleModal.RoleDetails": "角色详情", - "odc.component.HelpMenus.NewFeatures": "新功能介绍", "odc.components.FormUserModal.AccountStatus": "账号状态", - "odc.components.FormConnectionModal.Save": "保存", "odc.components.RolePage.component.State": "状态", "odc.component.VersionModal.Next": "下一个", - "odc.components.ResourceGroupPage.State": "状态", - "odc.components.FormResourceGroupModal.CreateAResourceGroup": "新建资源组", - "odc.components.RolePage.component.SystemConfiguration": "系统配置", - "odc.components.FormResourceGroupModal.TheResourceGroupIsSaved": "资源组保存成功", - "odc.page.ConnectionList.columns.See": "查看", - "odc.components.FormConnectionModal.New": "新建", "odc.components.FormRoleModal.component.Account": "账号", "odc.components.FormUserModal.TheDescriptionCannotExceedCharacters": "备注不超过 140 个字符", "odc.components.SequencePage.No": "否", "odc.components.ShowTableBaseInfoForm.Refresh": "刷新", - "odc.page.Manage.PublicConnectionManagement": "公共连接管理", - "odc.components.ConnectionCardList.PersonalConnection": "个人连接", "odc.components.CreateSequenceModal.CreateASequence": "新建序列", - "odc.component.AddConnectionForm.ResourceGroup": "所属资源组", - "odc.component.VersionModal.config.CanPassUpperLeftCorner": "可通过左上角导航栏的“新窗口打开连接”按钮同时打开多个连接,且各连接间会话独立,互不影响。", "odc.components.FormUserModal.TheDescriptionMustBeTo": "长度为 8~32 个字符,至少包含 2 个数字、2 个大写字母、2 个小写字母和 2 个特殊字符(即:._+@#$%)", "odc.components.UserPage.Account": "账号", - "odc.components.FormUserModal.AccountItemaccountnameNusernameItemnameNpassword": "账号:{itemAccountName}\\n用户名:{itemName}\\n密码:{itemPassword}\\n\\r", - "odc.page.Manage.UserManagement": "用户管理", - "odc.components.PublicConnectionPage.component.ConnectionName": "连接名称", "odc.components.UserPage.component.Password": "密码", "odc.components.SequencePage.NoCache": "不缓存", "odc.components.UserPage.component.AfterAUserIsDeleted": "删除用户后,用户将无法登录系统,相关数据也无法恢复", - "odc.components.SystemConfigPage.components.SetTheDefaultNumberOf": "设置 SQL 窗口内执行 SQL 默认返回的结果行数", - "odc.components.UserPage.component.ResourceGroup": "资源组", "odc.components.UserPage.Closed": "关闭", - "odc.components.FormResourceGroupModal.EnterAName": "请输入姓名", "odc.components.ShowTableBaseInfoForm.Editing": "编辑", - "odc.components.SystemConfigPage.SystemConfiguration": "系统配置", "odc.components.FormUserModal.UserInformation": "用户信息", - "odc.components.FormResourceGroupModal.TheDescriptionCannotExceedCharacters": "备注不超过 140 个字符", - "odc.components.FormResourceGroupModal.Enable": "启用", "odc.components.RolePage.RelatedUsers": "相关用户", - "odc.components.PublicConnectionPage.component.SqlQueryTimeout": "SQL 查询超时", "odc.components.CreateSequenceModal.ValidValues": "取值范围", - "odc.component.VersionModal.config.Tool": "工具", - "odc.components.RolePage.component.See": "查看", - "odc.page.ConnectionList.columns.ReadAndWrite": "读写", "odc.component.ProcedureParam.MoveDown": "向下移动", - "odc.page.Manage.RoleManagement": "角色管理", "odc.component.ProcedureParam.DeleteParameters": "删除参数", - "odc.components.ResourceGroupPage.AreYouSureYouWant": "是否确定停用资源组?", "odc.components.PackagePage.Refresh": "刷新", - "odc.components.PublicConnectionPage.PublicConnectionManagement": "公共连接管理", - "odc.component.AddConnectionForm.ReadOnlyAccount": "只读账号", "odc.components.ShowTableBaseInfoForm.Determine": "确定", - "odc.components.FormRoleModal.SelectAtLeastOnePermission": "至少选择一个权限", - "odc.components.PublicConnectionPage.component.ConnectionMode": "连接模式", - "odc.components.FormRoleModal.component.SystemPermissionsGrantSystemAccess": "系统权限:授予系统访问相关的权限,包含用户、角色、资源组、资源以及系统配置的管理权限", "odc.components.UserPage.Editing": "编辑", "odc.components.ShowFunctionBaseInfoForm.ResponseType": "返回类型", "odc.components.FormRoleModal.UnableToCreateTheRole": "角色创建失败", "odc.components.FormUserModal.EnterAPassword": "请输入密码", "odc.components.FormUserModal.TheAccountCannotBeModified": "用户新建成功后,账号无法修改", "odc.components.UserPage.Name": "姓名", - "odc.component.AddConnectionForm.UseThisAccountToLog": "拥有读写权限的用户使用该账号登录数据库", "odc.components.UserPage.component.Permissions": "权限", "odc.components.FormRoleModal.CreateARole": "新建角色", - "odc.components.FormConnectionModal.PublicConnectionSaved": "公共连接保存成功", - "odc.components.FormRoleModal.component.UserManagement": "用户管理", "odc.components.FormUserModal.EnterAnAccount": "请输入账号", - "odc.components.FormRoleModal.component.SelectTheRequiredPermissionType": "请先选择该角色需要的权限类型", - "odc.components.FormUserModal.TheNameCannotExceedCharacters": "姓名不超过 110 个字符", "odc.components.FormRoleModal.RoleSaved": "角色保存成功", "odc.components.RolePage.component.Permissions": "权限", - "odc.components.FormResourceGroupModal.Disable": "停用", - "odc.components.ResourceGroupPage.component.State": "状态", - "odc.components.RolePage.component.Modify": "修改", "odc.components.FormUserModal.Cancel": "取消", - "odc.components.PublicConnectionPage.component.QueryTheSysTenantAccount": "查询 sys 租户账号", "odc.components.RolePage.component.UnableToDelete": "删除失败", - "odc.components.ResourceGroupPage.component.ResourceGroup": "资源组", - "odc.components.FormResourceGroupModal.ResourceGroupCreated": "资源组创建成功", - "odc.component.VersionModal.config.SqlWindow": "SQL 窗口", - "odc.components.PublicConnectionPage.component.DatabaseUsername": "数据库用户名", - "odc.components.FormResourceGroupModal.Note": "备注", "odc.components.UserPage.Operation": "操作", - "odc.components.ResourceGroupPage.ResourceGroupManagement": "资源组管理", "odc.components.RolePage.component.Deleted": "删除成功", "odc.components.FormRoleModal.component.Note": "备注", - "odc.components.FormUserModal.AMaximumOfCharactersAre": "账号长度为 4~48 个字符", - "odc.components.FormRoleModal.component.PublicResourcePermissions": "公共资源权限", "odc.components.FormUserModal.EditUser": "编辑用户", - "odc.component.VersionModal.config.ThroughTheCommandLineWindow": "通过命令行窗口,无需额外下载安装 OBClient,就可快速在 ODC 上使用黑屏命令,并实时返回语句执行结果。", "odc.components.RolePage.See": "查看", - "odc.page.Manage.PublicResourceConsole": "公共资源管控台", "odc.components.CreateSequenceModal.MinimumValue": "最小值", - "odc.component.VersionModal.config.CommandLineWindow": "命令行窗口:", "odc.components.FormRoleModal.AreYouSureYouWant.1": "是否确定取消新建?", "odc.components.RolePage.RoleDetails": "角色详情", "odc.components.UserPage.UserDetails": "用户详情", "odc.components.CommonUserResource.Permissions": "权限", - "odc.components.UserPage.UserManagement": "用户管理", "odc.components.FormRoleModal.AreYouSureYouWant": "是否确定取消编辑?取消后,编辑的内容将不生效", "odc.components.FormRoleModal.component.AddUser": "添加用户", - "odc.components.SystemConfigPage.components.DelimiterSettings": "界定符设置", - "odc.components.PublicConnectionPage.component.Port": "端口", "odc.components.UserPage.component.Founder": "创建人", "odc.components.SQLConfirmPage.SequenceNameCreated": "创建序列 {name} 成功", - "odc.page.ConnectionList.columns.Editing": "编辑", "odc.components.UserPage.Disable": "停用", "odc.components.FormRoleModal.Cancel": "取消", - "odc.components.FormUserModal.CopiedSuccessfully": "复制成功", - "odc.components.RolePage.RoleManagement": "角色管理", "odc.components.UserPage.component.ResetPassword": "重置密码", "odc.components.ShowTableBaseInfoForm.Cancel": "取消", "odc.components.FormRoleModal.Save": "保存", - "odc.components.RolePage.PublicResourcePermissions": "公共资源权限", "odc.components.FormUserModal.RandomPassword": "随机密码", "odc.components.RolePage.Disable": "停用", "odc.components.UserPage.UpdateTime": "更新时间", - "odc.components.PublicConnectionPage.component.Connection": "连接", - "odc.component.VersionModal.config.ForAQueryResultSet": "结果集支持全选、单列选择、多列选择、单行选择、多行选择和复制等操作,不仅实现了类似 Excel 的交互体验并且支持结果集列排序、列筛选、列模式查看以及部分场景下查询结果集的编辑等功能。", "odc.components.FormUserModal.AreYouSureYouWant.1": "是否确定取消新建?", "odc.components.RolePage.component.UpdateTime": "更新时间", "odc.component.ProcedureParam.MoveUp": "向上移动", - "odc.components.ResourceGroupPage.component.Deleted": "删除成功", - "odc.page.ConnectionList.columns.Enable": "启用", - "odc.components.FormConnectionModal.UnableToSaveThePublic": "公共连接保存失败", - "odc.components.FormRoleModal.component.Modify": "修改", "odc.components.FormUserModal.Account": "账号", "odc.components.FormRoleModal.Determine": "确定", "odc.components.CommonTable.TotalTotals": "共 {totals} 条", "odc.components.RolePage.component.Role": "角色", - "odc.components.FormRoleModal.component.SystemConfigurationManagement": "系统配置管理", - "odc.component.VersionModal.config.TheSqlWindowProvidesA": "SQL 窗口提供了一系列编辑辅助工具及快捷功能入口。\n打开 SQL 窗口,用户可快速编辑和保存 SQL 或 PL 语句,在编写过程中会根据语法和语义展示相关提示,涉及到关键字部分会高亮展示。同时提供了代码片段功能,用于辅助记忆常用片段,提高编写效率。", - "odc.components.UserPage.component.ReadOnly": "只读", "odc.components.RolePage.component.RoleName": "角色名称", - "odc.components.FormConnectionModal.PublicConnectionCreated": "公共连接创建成功", - "odc.components.ResourceGroupPage.ResourceGroupDetails": "资源组详情", "odc.components.UserPage.EnterAUserOrAccount": "请输入用户/账号搜索", - "odc.components.UserPage.component.UserName": "用户名称", "odc.components.SequencePage.Incremental": "增量", - "odc.page.ConnectionList.columns.State": "状态", "odc.components.FormUserModal.DownloadUserInformation": "下载用户信息", - "odc.components.PublicConnectionPage.component.UpdateTime": "更新时间", "odc.components.RolePage.component.Note": "备注", "odc.components.RolePage.CreateARole": "新建角色", - "odc.page.ConnectionList.columns.Operation": "操作", - "odc.components.PublicConnectionPage.Editing": "编辑", - "odc.components.PublicConnectionPage.component.UnableToDelete": "删除失败", - "odc.components.ResourceGroupPage.Enable": "启用", "odc.components.ShowFunctionBaseInfoForm.FunctionName": "函数名称", - "odc.components.ResourceGroupPage.Operation": "操作", - "odc.component.VersionModal.config.YouCanConfigurePersonalPreferences": "可在个人设置中进行个人偏好配置。比如常见的界定符设置、事务提交模式以及结果集查询条数限制,个人设置修改后持久生效。", - "odc.components.PublicConnectionPage.component.Cluster": "集群", "odc.component.ProcedureParam.Length": "长度", - "odc.components.SystemConfigPage.components.MysqlTransactionCommitMode": "MySQL 事务提交模式", - "odc.components.FormResourceGroupModal.Save": "保存", - "odc.page.ConnectionList.columns.Disable": "停用", - "odc.page.Manage.SystemSettings": "系统设置", - "odc.components.SystemConfigPage.components.SetTheDefaultCommitMode": "设置 Oracle 模式下事务的默认提交模式", "odc.components.FormRoleModal.component.Enable": "启用", - "odc.component.AddConnectionForm.ReadWriteAccounts": "读写账号", - "odc.components.PublicConnectionPage.PublicConnectionInformation": "公共连接信息", - "odc.page.ConnectionList.columns.Permissions": "权限", - "odc.components.CommonCheckboxAll.SelectAll": "全选", - "odc.components.PublicConnectionPage.component.AfterAPublicConnectionIs": "删除公共连接后,被赋予该连接的用户将无法访问", - "odc.components.RolePage.component.PublicConnectionManagement": "公共连接管理", - "odc.components.FormResourceGroupModal.AddConnection": "添加连接", - "odc.components.SystemConfigPage.SystemSettingsSaved": "系统设置保存成功", "odc.components.UserPage.RelatedResources": "相关资源", - "odc.components.FormResourceGroupModal.UnableToCreateTheResource": "资源组创建失败", "odc.components.UserPage.component.AreYouSureYouWant": "是否确定删除用户?", - "odc.components.FormResourceGroupModal.TheNameCannotExceedCharacters": "姓名不超过 110 个字符", - "odc.components.UserPage.component.Editable": "可编辑", "odc.components.RolePage.RoleName": "角色名称", - "odc.components.FormRoleModal.component.ResourceGroupManagement": "资源组管理", - "odc.component.VersionModal.NewFeatures": "新功能介绍", "odc.components.RolePage.PermissionType": "权限类型", "odc.components.SequencePage.Sort": "是否排序", - "odc.components.RolePage.component.ResourceGroup": "资源组", "odc.components.FormRoleModal.component.SelectAStatus": "请选择状态", "odc.components.SequencePage.Cache": "缓存", - "odc.components.RolePage.component.SystemPermissions": "系统权限", - "odc.component.VersionModal.config.OpenMultipleConnectionsConcurrently": "并发打开多个连接:", "odc.components.FormUserModal.CreateUser": "新建用户", "odc.components.UserPage.component.Note": "备注", "odc.component.ProcedureParam.Mode": "模式", - "odc.components.PublicConnectionPage.AreYouSureYouWant": "是否确定停用资源组?", "odc.component.SQLExecuteModal.SqlConfirmation": "SQL 确认", "odc.components.RolePage.component.PermissionType": "权限类型", - "odc.components.FormResourceGroupModal.Determine": "确定", - "odc.components.FormRoleModal.component.PublicConnectionManagement": "公共连接管理", - "odc.components.FormRoleModal.component.RoleManagement": "角色管理", - "odc.components.FormResourceGroupModal.SelectPublicConnection": "请选择公共连接", - "odc.components.UserPage.component.CommonConnectionName": "公共连接名称", "odc.components.FormUserModal.UserCreated": "用户创建成功", "odc.components.FormRoleModal.component.RoleName": "角色名称", "odc.components.FunctionPage.Length": "长度", - "odc.components.PublicConnectionPage.component.AfterTheConnectionIsDeleted": "删除后,被赋予该连接的用户将无法访问,且不可恢复", - "odc.components.ResourceGroupPage.TheDeactivatedResourceGroupRemains": "被停用的资源组仍保留,支持启用", "odc.components.RolePage.EnterARoleName": "请输入角色名称", "odc.components.RolePage.component.ObjectType": "对象类型", "odc.component.CreatePackageModal.NextConfirmTheSqlStatement": "下一步:确认 SQL", "odc.components.FormUserModal.Disable": "停用", - "odc.components.SystemConfigPage.components.SetTheDefaultDelimiterSymbol": "设置 SQL 窗口内默认的 Delimiter 符号", "odc.src.util.notification.Details": "详情", "odc.components.UserPage.CreateUser": "新建用户", - "odc.components.ResourceGroupPage.Closed": "关闭", "odc.component.ProcedureParam.Name": "名称", "odc.EditorToolBar.actions.text.InValueConversion": "IN 值转化", "odc.components.FormUserModal.UnableToSaveTheUser": "用户保存失败", - "odc.components.ResourceGroupPage.component.UnableToDelete": "删除失败", - "odc.components.PublicConnectionPage.component.Founder": "创建人", "odc.components.RolePage.Enable": "启用", "odc.components.CommonUserResource.Name": "姓名", - "odc.components.ResourceGroupPage.Determine": "确定", - "odc.components.FormRoleModal.component.New": "新建", "odc.components.UserPage.component.Determine": "确定", - "odc.components.ResourceGroupPage.component.ResourceGroupName": "资源组名称", - "odc.components.FormRoleModal.component.AddResources": "添加资源", "odc.components.CommonDeleteModal.Enter": "请输入", "odc.components.FormRoleModal.component.PermissionType": "权限类型", "odc.components.RolePage.Closed": "关闭", "odc.components.RolePage.Determine": "确定", "odc.components.FormUserModal.UnableToCreateTheUser": "用户创建失败", "odc.components.RolePage.Cancel": "取消", - "odc.components.PublicConnectionPage.Closed": "关闭", - "odc.components.ResourceGroupPage.ResourceGroupName": "资源组名称", - "odc.components.ResourceGroupPage.Cancel": "取消", "odc.components.UserPage.Role": "角色", "odc.components.CommonStatus.Disable": "停用", - "odc.page.Manage.MemberManagement": "成员管理", - "odc.components.RolePage.component.RoleManagement": "角色管理", "odc.components.RolePage.DisabledRolesCannotBeUsed": "被停用的角色将无法使用", - "odc.components.PublicConnectionPage.component.Region": "所属区域", - "odc.components.ResourceGroupPage.CreateAResourceGroup": "新建资源组", "odc.component.CreateFunctionModal.Parameter": "参数", - "odc.components.ResourceGroupPage.component.DeleteAResourceGroup": "删除资源组", - "odc.components.FormConnectionModal.EditPublicConnection": "编辑公共连接", - "odc.components.FormResourceGroupModal.AreYouSureYouWant.1": "是否确定取消新建?", "odc.components.CreateSequenceModal.Circulating": "循环", "odc.components.RolePage.RoleInformation": "角色信息", "odc.components.ShowTableBaseInfoForm.Empty": "空", - "odc.page.ConnectionList.columns.ReadOnly": "只读", "odc.components.FormRoleModal.RelatedUsers": "相关用户", - "odc.page.ConnectionList.PublicResourceManagement": "公共资源管理", - "odc.component.VersionModal.config.SchemaSwitching": "Schema 切换:", "odc.components.CommonDeleteModal.DeleteType": "删除{type}", - "odc.components.RolePage.component.UserManagement": "用户管理", "odc.components.SequencePage.NextBufferValue": "下一个缓冲值", - "odc.components.ResourceGroupPage.component.AfterAResourceGroupIs": "删除资源组后,赋予该资源组的用户将丢失相关公共资源", - "odc.component.VersionModal.config.Console": "管控台", - "odc.components.FormResourceGroupModal.ResourceGroupName": "资源组名称", "odc.components.FormUserModal.Save": "保存", - "odc.components.ResourceGroupPage.See": "查看", - "odc.components.FormResourceGroupModal.EditAResourceGroup": "编辑资源组", "odc.components.ProcedurePage.Length": "长度", "odc.components.RolePage.component.Created": "创建时间", - "odc.component.AddConnectionForm.ConnectionStatus": "连接状态", - "odc.component.VersionModal.config.PersonalSettings": "个人设置", - "odc.components.ResourceGroupPage.ResourceGroupInformation": "资源组信息", "odc.components.RolePage.component.AfterARoleIsDeleted": "删除角色后,赋予该角色的用户将失去相关权限/公共资源", - "odc.components.PublicConnectionPage.component.Tenant": "租户", "odc.components.RolePage.component.DeleteARole": "删除角色", "odc.components.RolePage.TheDisabledRoleInformationIs": "被停用的角色信息仍保留,支持启用", "odc.components.FormRoleModal.component.EnterARoleName": "请输入角色名称", "odc.components.FormRoleModal.component.RoleStatus": "角色状态", "odc.components.UserPage.component.DeleteAUser": "删除用户", - "odc.components.RolePage.component.User": "用户", "odc.components.RolePage.Editing": "编辑", - "odc.component.VersionModal.config.SimulationData": "模拟数据:", - "odc.component.VersionModal.config.YouCanUseSchemaSwitching": "通过 Schema 切换可实现连接内不同 Schema之间的跳转,并且可以对相应 Schema 下的对象进行白屏化管理。", "odc.components.UserPage.See": "查看", "odc.components.FormUserModal.Determine": "确定", "odc.components.FormUserModal.New": "新建", "odc.components.FormUserModal.Role": "角色", - "odc.components.RolePage.component.Delete": "删除", - "odc.component.VersionModal.config.AnonymousBlockWindow": "匿名块窗口:", "odc.components.UserPage.component.UpdateTime": "更新时间", - "odc.components.ResourceGroupPage.EnterAResourceGroupName": "请输入资源组名称", - "odc.components.PublicConnectionPage.TheDeactivatedResourceGroupRemains": "被停用的资源组仍保留,支持启用", - "odc.components.PublicConnectionPage.component.DeleteAPublicConnection": "删除公共连接", "odc.components.FormRoleModal.component.Operation": "操作", - "odc.components.SystemConfigPage.components.OracleTransactionSubmissionMode": "Oracle 事务提交模式", - "odc.components.FormResourceGroupModal.ConnectionInformation": "连接信息", - "odc.components.SystemConfigPage.components.ResultSetQueryNumberLimit": "结果集查询条数限制", "odc.components.RolePage.component.ObjectName": "对象名称", - "odc.component.VersionModal.config.ConnectionManagement": "连接管理", "odc.components.FormUserModal.SelectARole": "请选择角色", - "odc.components.FormResourceGroupModal.Cancel": "取消", - "odc.components.RolePage.component.PublicResourcePermissions": "公共资源权限", "odc.components.CommonDeleteModal.Cancel": "取消", - "odc.components.RolePage.SystemPermissions": "系统权限", - "odc.components.SystemConfigPage.components.SetTheDefaultCommitMode.1": "设置 MySQL 模式下事务的默认提交模式", "odc.components.UserPage.LogonTime": "登录时间", - "odc.component.AddConnectionForm.EnterADatabaseUsername": "请填写数据库用户名", - "odc.components.FormResourceGroupModal.AreYouSureYouWant": "是否确定取消编辑?取消后,编辑的内容将不生效", - "odc.components.FormRoleModal.component.PublicConnection": "公共连接", - "odc.components.RolePage.State": "状态", "odc.components.RolePage.component.Name": "姓名", - "odc.components.ResourceGroupPage.AfterTheResourceGroupIs": "被停用后用户将无法访问资源组包含的连接", "odc.components.UserPage.component.UnableToDelete": "删除失败", - "odc.components.RolePage.component.AfterYouDeleteTheColor": "删除校色后,赋予该角色的用户将失去相关权限/公共资源", "odc.components.RolePage.CopyRoles": "复制角色", - "odc.components.RolePage.component.ReadOnly": "只读", - "odc.components.UserPage.AreYouSureYouWant": "是否确定停用用户?", "odc.components.CommonDeleteModal.TypeName": "{type}名称:", - "odc.components.CommonUserResource.Editable": "可编辑", - "odc.components.ResourceGroupPage.RelatedUsers": "相关用户", - "odc.components.RolePage.component.Editable": "可编辑", - "odc.components.FormRoleModal.component.See": "查看", "odc.components.FormRoleModal.RoleCreated": "角色创建成功", - "odc.components.FormResourceGroupModal.ResourceGroupStatus": "资源组状态", "odc.components.CreateSequenceModal.MaximumValue": "最大值", - "odc.page.Manage.ResourceGroupManagement": "资源组管理", "odc.components.FormUserModal.Note": "备注", "odc.component.SQLExecuteModal.ExecutionSucceeded": "执行成功", "odc.components.FormUserModal.CopyUserInformation": "复制用户信息", "odc.components.FormRoleModal.component.SelectAPermissionType": "请选择权限类型", - "odc.components.PublicConnectionPage.RelatedUsers": "相关用户", - "odc.component.VersionModal.config.AsynchronousExecutionAllowsYouTo": "通过异步执行,可后台执行指定的 SQL 语句,不受连接超时限制的影响。", "odc.components.FormRoleModal.EditARole": "编辑角色", - "odc.components.FormRoleModal.component.SystemPermissions": "系统权限", - "odc.components.FormConnectionModal.CreateAPublicConnection": "新建公共连接", "odc.components.CreateSequenceModal.Sort": "排序", "odc.components.FormRoleModal.component.TheDescriptionCannotExceedCharacters": "备注不超过 140 个字符", "odc.components.FormRoleModal.component.Select": "请选择", - "odc.components.PublicConnectionPage.Cancel": "取消", "odc.components.UserPage.Enable": "启用", "odc.components.SequencePage.LoopOrNot": "是否循环", - "odc.components.RolePage.component.PublicConnection": "公共连接", - "odc.component.VersionModal.config.ForObOracleTheAnonymous": "对于 OB Oracle 模式通过匿名块窗口,可在窗口内编写匿名块代码,并提供了编译、运行、调试的能力。", "odc.component.VersionModal.ISee": "我知道了", - "odc.components.PublicConnectionPage.component.Created": "创建时间", - "odc.components.ConnectionCardList.PublicConnection": "公共连接", "odc.components.SequencePage.Is": "是", "odc.component.ProcedureParam.Type": "类型", "odc.components.SequencePage.Owner": "所有者", - "odc.components.UserPage.Determine": "确定", "odc.components.FormRoleModal.component.State": "状态", - "odc.components.ResourceGroupPage.component.UpdateTime": "更新时间", - "odc.components.CommonUserResource.ReadOnly": "只读", "odc.components.FormRoleModal.UnableToSaveTheRole": "角色保存失败", - "odc.components.ResourceGroupPage.Disable": "停用", - "odc.component.VersionModal.config.ImportAndExport": "导入导出:", "odc.components.RolePage.component.Founder": "创建人", - "odc.components.PublicConnectionPage.component.HostName": "主机名", "odc.components.FormUserModal.ItCanContainLettersDigits": "支持英文、数字、下划线和特殊字符的组合(即:._+@#$%)", "odc.components.SequencePage.CacheSettings": "缓存设置", - "odc.component.AddConnectionForm.Enable": "启用", "odc.components.FormRoleModal.component.Remove": "移除", "odc.components.FormUserModal.AreYouSureYouWant": "是否确定取消编辑?取消后,编辑的内容将不生效", - "odc.components.FormRoleModal.component.ReadOnly": "只读", "odc.components.FormUserModal.AddUser": "添加用户", - "odc.components.ResourceGroupPage.component.Founder": "创建人", "odc.components.FormUserModal.NoRoleIsAvailableCreate": "暂无角色,请在角色管理中创建角色", - "odc.components.RolePage.component.ResourceGroupManagement": "资源组管理", - "odc.components.ResourceGroupPage.component.Enable": "启用", "odc.components.ShowFunctionBaseInfoForm.Founder": "创建人", - "odc.components.SystemConfigPage.Editing": "编辑", - "odc.components.ResourceGroupPage.component.Disable": "停用", - "odc.components.ResourceGroupPage.component.Note": "备注", "odc.components.SequencePage.SequenceName": "序列名称", - "odc.component.VersionModal.config.Workbench": "工作台", "odc.components.CommonUserResource.Role": "角色", - "odc.components.PublicConnectionPage.ConnectionDetails": "连接详情", - "odc.component.VersionModal.config.ResultSet": "结果集", "odc.components.RolePage.AreYouSureYouWant": "是否确定停用角色?", - "odc.components.PublicConnectionPage.component.Deleted": "删除成功", - "odc.components.FormResourceGroupModal.EnterAResourceGroupName": "请输入资源组名称", - "odc.components.FormRoleModal.component.ResourceGroup": "资源组", "odc.components.CreateSequenceModal.NextConfirmTheSqlStatement": "下一步:确认 SQL", - "odc.component.AddConnectionForm.Disable": "停用", - "odc.components.RolePage.component.SystemConfigurationManagement": "系统配置管理", - "odc.component.VersionModal.config.TheSimulatedDataFeatureAllows": "通过模拟数据功能可一键按默认规则生成大量测试数据,同时也支持对数据生成规则进行自定义调整。", "odc.components.RolePage.UpdateTime": "更新时间", "odc.src.util.notification.RequestFailed": "请求失败", "odc.src.util.notification.NoErrorMessage": "无错误信息", - "odc.components.ResourceGroupPage.UpdateTime": "更新时间", - "odc.components.ResourceGroupPage.Connections": "连接数量", "odc.components.UserPage.component.Created": "创建时间", "odc.components.RolePage.Operation": "操作", "odc.components.UserPage.component.Deleted": "删除成功", - "odc.components.FormUserModal.TheAccountAlreadyExists": "账号已存在", - "odc.components.ResourceGroupPage.component.AfterYouDeleteAResource": "删除资源组后,赋予该连接的用户将无法访问", "odc.component.ProcedureParam.DefaultValue": "默认值", "odc.components.FormRoleModal.component.Disable": "停用", - "odc.components.ResourceGroupPage.Editing": "编辑", "odc.components.FormUserModal.Enable": "启用", "odc.components.UserPage.component.Role": "角色", - "odc.components.PublicConnectionPage.CreateAPublicConnection": "新建公共连接", "odc.components.CommonDeleteModal.ConfirmTheOperation": "以确认操作", "odc.components.CommonStatus.NotActivated": "未激活", "odc.components.FormUserModal.Password": "密码", "odc.components.FormRoleModal.component.SelectAUser": "请选择用户", - "odc.components.UserPage.State": "状态", - "odc.components.PublicConnectionPage.Determine": "确定", "odc.components.FormUserModal.Saved": "用户保存成功", "odc.components.UserPage.component.Cancel": "取消", - "odc.component.VersionModal.config.TheImportAndExportFunction": "通过导入导出功能可将外部数据文件导入到数据库中,也支持将数据库对象导出成数据文件。目前支持\n SQL 和 CSV 两种数据文件格式的导入与导出。", "odc.components.UserPage.component.RoleDisabled": "角色已停用", - "odc.components.FormResourceGroupModal.SelectAStatus": "请选择状态", - "odc.component.AddConnectionForm.SelectAStatus": "请选择状态", - "odc.component.AddConnectionForm.CheckWhetherTheCorrectIp": "请确认填写的 IP 与 端口是否正确", "odc.components.RolePage.Enabled": "启用成功", "odc.components.DDLResultSet.DefaultValue": "设置为默认值", "odc.components.FormRoleModal.SelectAPermissionType": "请选择权限类型", - "odc.components.PublicConnectionPage.component.DatabaseReadWriteUsername": "数据库读写用户名", - "odc.TaskManagePage.AsyncTask.Separator": "分隔符", - "odc.page.ConnectionList.columns.ConnectionId": "连接 ID", "odc.component.SnippetForm.ExitTheActionnameCodeSnippet": "退出{actionName}代码片段", - "odc.component.AddConnectionForm.DefaultDatabase": "默认数据库", - "odc.components.PublicConnectionPage.Enabled": "启用成功", - "odc.components.PublicConnectionPage.AfterTheConnectionIsDisabled": "被停用后用户将无法访问该连接", - "odc.components.FormResourceGroupModal.TheResourceGroupNameCannot": "资源组名称不超过 48 个 字符", "odc.page.Login.ActivationFailed": "激活失败", - "odc.components.ResourceGroupPage.Disabled": "停用成功", "odc.components.CreateAsyncTaskModal.QueryResultLimits": "查询结果限制", - "odc.components.PublicConnectionPage.Disabled.1": "停用失败", - "odc.components.CommonUserResource.ReadAndWrite": "读写", - "odc.components.RolePage.component.AllPersonalResourcePermissionsIncluding": "全部个人资源权限(包含:查看连接/管理连接/使用连接)", - "odc.components.RolePage.component.ReadAndWrite": "读写", - "odc.component.AuthNoticeModal.PermissionChange": "权限变更", "odc.components.CommonDeleteModal.EnterName": "请输入{name}", - "odc.components.DDLResultSet.SqlFile": "SQL 文件", "odc.page.ConnectionList.columns.TheConnectionIsDisabled": "连接已停用", - "odc.page.ConnectionList.PublicResourceConsole": "公共资源管控台", - "odc.components.PublicConnectionPage.component.AfterAPublicConnectionIs.1": "删除公共连接后,赋与该连接的用户将无法访问", - "odc.TaskManagePage.AsyncTask.DownloadQueryResults": "下载查询结果", - "odc.TaskManagePage.AsyncTask.QueryResults": "查询结果", - "odc.components.ResourceGroupPage.Enabled": "启用成功", "odc.components.CommonUserResource.NameName": "姓名:{name}", - "odc.components.DDLResultSet.CsvFile": "CSV 文件", - "odc.components.ResourceGroupPage.ResourceGroupId": "资源组 ID", "odc.components.DDLResultSet.OutputToShearPlate": "输出到剪切板", - "odc.page.Manage.UnableToObtainUserInformation": "获取用户信息失败!", "odc.components.UserPage.Disabled.1": "停用失败", "odc.components.RolePage.component.Disable": "停用", - "odc.components.FormResourceGroupModal.PublicConnection": "公共连接", - "odc.components.RolePage.component.NoPersonalResourcePermissionIs": "暂无个人资源权限", - "odc.components.PublicConnectionPage.component.PublicCloud": "公有云", "odc.components.UserPage.FailedToEnable": "启用失败", "odc.components.UserPage.Enabled": "启用成功", - "odc.components.PublicConnectionPage.Disabled": "停用成功", - "odc.page.ConnectionList.UnableToObtainUserInformation": "获取用户信息失败!", "odc.components.RolePage.component.AllPublicResources": "所有公共资源", "odc.components.RolePage.component.Enable": "启用", - "odc.components.FormResourceGroupModal.TheResourceGroupNameAlready": "资源组名称已存在", - "odc.component.AddConnectionForm.NoResourceGroupIsAvailable": "暂无资源组,请在资源组管理中创建", - "odc.components.SystemConfigPage.components.Manual": "手动", - "odc.components.PublicConnectionPage.component.DatabaseReadOnlyUsername": "数据库只读用户名", - "odc.components.PublicConnectionPage.TheDisabledConnectionIsRetained": "被停用的连接仍保留,支持启用", - "odc.components.RolePage.component.NoSystemPermissionIsGranted": "暂无系统权限", "odc.components.CommonUserResource.AccountRecordaccountname": "账号:{recordAccountName}", "odc.components.FormRoleModal.NameCopy": "{name}_复制", "odc.components.RolePage.FailedToEnable": "启用失败", "odc.components.CommonDeleteModal.IncorrectInputInformation": "输入信息有误", - "odc.components.PublicConnectionPage.component.ResourceGroup": "所属资源组", "odc.components.RolePage.component.NameName": "姓名:{name}", - "odc.util.request.cloud.TheParamsParameterOfThe": "主应用 Params 参数未传入", - "odc.components.ResourceGroupPage.Disabled.1": "停用失败", - "odc.component.AddConnectionForm.TheConnectionNameAlreadyExists": "连接名称已存在", - "odc.components.RolePage.component.PersonalResourcePermissions": "个人资源权限", - "odc.component.AuthNoticeModal.Determine": "确定", "odc.components.RolePage.Disabled.1": "停用失败", "odc.page.Login.Activated": "激活成功", - "odc.components.PublicConnectionPage.AreYouSureYouWant.1": "是否确定停用公共连接", - "odc.component.AuthNoticeModal.ThePermissionHasChangedPlease": "权限发生变化,请重试", - "odc.util.request.cloud.SystemErrorOdcresIsEmpty": "系统错误(odcRes 为空)", "odc.components.RolePage.component.AccountRecordaccountname": "账号:{recordAccountName}", "odc.components.CreateAsyncTaskModal.Separator": "分隔符", - "odc.components.SystemConfigPage.components.Automatic": "自动", - "odc.page.Workspace.UnableToObtainUserInformation": "获取用户信息失败!", - "odc.components.PublicConnectionPage.FailedToEnable": "启用失败", - "odc.components.ConnectionCardList.Stateless": "无状态", "odc.components.RolePage.Disabled": "停用成功", - "odc.page.Manage.PublicResourceManagement": "公共资源管理", - "odc.components.ResourceGroupPage.FailedToEnable": "启用失败", "odc.components.UserPage.Disabled": "停用成功", - "odc.components.PublicConnectionPage.component.PublicConnection": "公共连接", - "odc.TaskManagePage.AsyncTask.QueryResultLimits": "查询结果限制", - "odc.components.PublicConnectionPage.component.ApsaraStack": "专有云", "odc.component.ErrorConfirmModal.LoginTimedOutPleaseLog": "登录超时,请重新登录", "odc.components.FormUserModal.EnterAName.1": "请输姓名", - "odc.components.FormConnectionModal.AreYouSureYouWant.2": "是否确定{actionText}连接?", "odc.components.UserPage.component.ThePasswordHasBeenReset": "重置密码成功", - "odc.components.TenantFilter.CurrentTenant": "当前租户", - "odc.components.FormRoleModal.component.PersonalResourcePermissions": "个人资源权限", "odc.components.FormRoleModal.component.SelectPermissions": "请选择权限", - "odc.ConnectionList.config.help.DeveloperCenter": "开发者中心介绍", - "odc.components.FormRoleModal.component.RolePrompts": "角色提示", - "odc.components.TenantFilter.Determine": "确定", "odc.component.ErrorConfirmModal.PermissionChange": "权限变更", "odc.component.CommonFilter.Determine": "确定", - "odc.components.PublicConnectionPage.component.AllModes": "全部模式", "odc.components.SQLResultSet.ExecuteHistory.Delete": "删除", "odc.components.FormUserModal.AccountItemaccountnameNameItemnamePassword": "账号: {itemAccountName}\n 姓名: {itemName}\n 密码: {itemPassword}", - "odc.components.FormRoleModal.component.TheRoleNameCannotExceed": "角色名称不超过 48 个字符", "odc.component.CommonFilter.Cancel": "取消", "odc.components.SQLResultSet.ExecuteHistory.Deleted": "删除成功", - "odc.components.FormRoleModal.component.AllPersonalResourcePermissionsIncluding": "全部个人资源权限(包含:查看连接/管理连接/使用连接)", "odc.component.CommonFilter.CancelAll": "取消全选", "odc.components.UserPage.component.Name": "姓名", "odc.components.SQLResultSet.Log": "日志", - "odc.page.ConnectionList.columns.Tenant": "租户", - "odc.components.FormRoleModal.component.GrantSystemAccessRelatedPermissions": "授予系统访问相关的权限,包含用户、角色、资源组、资源以及系统配置的管理权限", "odc.ImportDrawer.ImportForm.helper.TheFileSizeCannotExceed.1": "文件大小不能超过 {size}", "odc.component.ErrorConfirmModal.Determine": "确定", - "odc.components.TenantFilter.AllTenants": "所有租户", - "odc.page.ConnectionList.columns.Cluster": "集群", - "odc.components.SystemConfigPage.SystemSettings": "系统设置", "odc.component.ErrorConfirmModal.ThePermissionHasChangedPlease": "权限发生变化,请重试", - "odc.components.FormRoleModal.component.GrantPersonalResourcePermissions": "授予个人资源权限", - "odc.components.FormRoleModal.component.GrantAccessPermissionsToPublic": "授予公共连接的访问权限,支持只读和读写两类权限的授予", "odc.component.CommonFilter.SelectAll": "全选", - "odc.components.UserPage.component.ReadAndWrite": "读写", - "odc.ResourceTree.config.procedure.More": "更多", "odc.components.ConnectionCardList.AllModes": "全部模式", - "odc.components.ConnectionCardList.AllPermissions": "全部权限", - "odc.components.DDLResultSet.ColumnModeModal.Note": "备注", - "odc.page.ConnectionList.columns.DefaultDatabaseDefaultschema": "默认数据库:{defaultSchema}", "odc.component.CommonFilter.Null": "(空)", - "odc.AddConnectionForm.cloud.CloudConnectionInfo.ClusterIdClusterid": "集群 ID:{clusterId}", - "odc.components.FormRoleModal.component.PublicResourcePermissionsGrantAccess.1": "公共资源权限:授予公共连接的访问权限,支持只读和读写两类权限的授予,", - "odc.page.ConnectionList.columns.ClusterId": "集群 ID:", - "odc.components.FormRoleModal.component.ForMoreInformationAboutThese": "这两类权限包含的具体内容可参考产品手册说明。", "odc.components.FormRoleModal.component.TheRoleNameAlreadyExists": "角色名称已存在", "odc.components.SQLResultSet.ExecuteHistory.SelectedrowkeyslengthRecordsSelected": "已选择 {selectedRowKeysLength} 个记录", - "odc.components.ConnectionCardList.ReadOnly": "只读", "odc.components.FormUserModal.UserInformationCopied": "用户信息复制成功", - "odc.AddConnectionForm.cloud.CloudConnectionInfo.TenantIdTenantid": "租户 ID:{tenantId}", "odc.component.ErrorConfirmModal.LogonTimeout": "登录超时", "odc.components.FormRoleModal.component.PermissionSettings": "权限设置", - "odc.components.FormConnectionModal.FormdatanameCopy": "{formDataName}_复制", "odc.components.ImportDrawer.TheMaximumSizeOfData": "数据最大不能超过 {size},如需导入大量数据,请使用导数工具 OBLOADER", - "odc.AddConnectionForm.cloud.CloudConnectionInfo.SelectACluster": "请选择集群", "odc.component.UserConfigForm.EnterAnInteger": "请输入整数", "odc.components.FormUserModal.EnterAnAccount.1": "请输账号", - "odc.components.ConnectionCardList.ReadAndWrite": "读写", "odc.components.FormUserModal.EnterAPassword.1": "请输入密码", "odc.component.CreateProcedureModal.CurrentPopUpDataWill": "当前弹窗数据将清空", - "odc.components.TablePage.IndexTab.TheIndexColumnMustBe": "索引列不能为空", "odc.component.CreateProcedureModal.ConfirmToClose": "确认关闭", "odc.components.PLDebugResultSet.AlertDetails": "告警详情:", - "odc.component.ExportResultSetModal.FileName": "文件名称", - "odc.component.SQLCodeEditor.service.CurrentlyCrossDatabaseRedirectionIs": "当前版本暂不支持跨库跳转", "odc.components.SQLResultSet.SQLResultLog.SqlExecutionCanceled": "SQL 执行被取消", - "odc.components.CreateAsyncTaskModal.YouCanEnterAMaximum": "最大允许输入 500000 个字符,如需超限执行可通过上传附件解决。", "odc.components.BlobFormatter.BlobViewModal.Text": "文本", "odc.components.SQLResultSet.SQLResultLog.ReasonForCancellation": "取消原因", - "odc.component.ExportResultSetModal.Download": "下载", - "odc.component.ExportResultSetModal.CsvSettings": "CSV 设置", "odc.components.PLDebugResultSet.CompiledSuccessfullyWithAnAlert": "编译成功,存在告警信息", "odc.components.SQLResultSet.SQLResultLog.TheExecutionIsSuccessfulWith": "执行成功,存在告警信息", - "odc.component.ExportResultSetModal.FileEncoding": "文件编码", "odc.components.SQLResultSet.SQLResultLog.AlertDetails": "告警详情:", "odc.component.CreateFunctionModal.CurrentPopUpDataWill": "当前弹窗数据将清空", "odc.src.util.notification.Cue": "提示", "odc.component.CreateFunctionModal.ConfirmToClose": "确认关闭", - "odc.component.ExportResultSetModal.StartDownloading": "文件开始下载", "odc.components.BlobFormatter.BlobViewModal.DownloadObjects": "下载文件", - "odc.component.ExportResultSetModal.FileFormat": "文件格式", "odc.components.BlobFormatter.BlobViewModal.JinZhi": "十六进制", - "odc.network.sql.executeSQL.TheDatabaseConnectionHasBeen": "数据库连接已重置。任何暂挂事务处理或会话状态均将丢失", - "odc.component.VersionModal.config.ResultSetManagement": "结果集管理", "odc.ImportDrawer.ImportForm.TooManyFilesAreUploaded": "同时上传文件过多,单次最多选择 50 个文件", - "odc.component.VersionModal.newVersionConfig.SupportsTheIntelligentIdentificationOf": "支持 PL 代码块智能识别、跨库查询账号时补全表名;格式化能力优化,最长时间控制在 2 秒", - "odc.component.VersionModal.config.OnTheOdcHomepageYou.1": "进入 ODC 首页,可查看连接列表。\n在个人连接 TAB 页签,用户可新建、编辑、删除和登录连接,并可设置标签和置顶连接等操作。", - "odc.component.TableIndexModal.TheIndexColumnMustBe": "索引列不能为空", "odc.util.request.private.AnErrorOccurredWhileParsing": "解析结果出错,请检查部署配置", "odc.component.VersionModal.newVersionConfig.SqlWindow": "SQL 窗口", - "odc.component.VersionModal.config.OdcCustomizesPlBasedOn": "ODC 根据 OceanBase 内核的调试能力定制了 PL 调试模块。\n调试过程中支持设置、取消断点,提供多种调试模式(批量执行、单步执行、跳入、跳出),并可在结果观察区查看调试过程中各种信息的变化。", - "odc.component.VersionModal.newVersionConfig.PlDebugging": "PL 调试", "odc.component.VersionModal.NewVersion.LearnMore": "了解详情", "odc.component.HelpMenus.ProductFunctionIntroduction": "产品功能介绍", - "odc.component.VersionModal.config.ArmVersionObIsNot": "1. 不支持调试 ARM 版 OceanBase 内核;", "odc.component.VersionModal.ProductFunctionIntroduction": "产品功能介绍", - "odc.component.VersionModal.config.OdcHasASeriesOf": "ODC 内置了一系列开发工具,进入连接内部,鼠标悬停在 [工具] 项,可显示导入、导出、模拟数据等工具。", - "odc.component.VersionModal.config.InAdditionToTheSql": "除 SQL 窗口外,ODC 同时提供匿名块窗口以进行匿名块的编辑、运行和调试。此外 ODC 还支持命令行窗口,通过命令行窗口用户可执行 SQL、运行脚本。", - "odc.component.VersionModal.config.PlDebugging": "PL 调试", "odc.component.VersionModal.NewVersion.GotIt": "知道了", - "odc.component.VersionModal.config.GoToTheInternalConnection": "进入连接内部,通过 Schema 切换可实现连接内不同 Schema 之间的跳转,跳转后可对相应的 Schema 下的对象进行相关的数据库开发工作。 \n如在连接内部,希望打开其它连接,可通过鼠标悬停左上角导航栏中的 ODC 图标,选择 [新窗口打开连接] 并发打开多个连接,连接间 Session 独立,互不影响。", - "odc.component.VersionModal.config.ForSqlTheQueryResult": "对于 SQL 查询的结果集,支持行模式、列模式查看;\n对于文本,支持用文本查看器查看;\n对于大字段,支持用大字段查看器查看。", - "odc.component.VersionModal.newVersionConfig.AddedTheLogTabTo": "新增「日志」标签查看其它 SQL 非查询类型的执行结果;支持清理执行记录", - "odc.component.VersionModal.config.HomePageManagement": "首页管理", - "odc.component.VersionModal.newVersionConfig.YouCanSelectMultipleRows": "表格支持多行多列选择、冻结行、大字段查看;列模式支持查看列备注;可直接导出 EXCEL 格式", - "odc.component.VersionModal.newVersionConfig.ExecutionRecord": "执行记录", - "odc.component.VersionModal.newVersionConfig.ResultSet": "结果集", - "odc.component.VersionModal.config.HistoryOnTheHomePage": "首页的 [历史记录] 保存了最近 48h 的登录记录,用户可通过该入口快速恢复未保存的 SQL\n 窗口内容。", - "odc.component.VersionModal.config.BuiltInTools": "内置工具", "odc.component.VersionModal.NewVersion.Previous": "上一个", - "odc.component.VersionModal.newVersionConfig.SupportsDebuggingThroughObproxyAnd": "支持通过 OBProxy 进行调试;程序包支持子程序并行调试", - "odc.component.VersionModal.config.Note": "需注意:", - "odc.component.VersionModal.config.TheHomepageNavigationBarProvides": "首页导航栏提供了部分功能的快捷入口,其中鼠标悬停在账号处可显示 [个人设置] 入口,用户可根据自己的开发习惯自定义分隔符、Oracle 或 MySQL 的事务提交模式以及查询结果条数限制。", - "odc.component.VersionModal.config.TheImportToolAllowsYou": "通过导入工具,可将通过 ODC 导出的文件、SQL 文件等导入到数据库中。\n通过导出工具,可将数据库中的结构和数据导出成 SQL 或 CSV 格式。\n通过模拟数据工具,可快速为指定表生成指定格式的测试数据,极大提升开发效率。", - "odc.component.VersionModal.config.OnTheOdcHomepageYou": "进入 ODC 首页,可查看连接列表。\n在个人连接 TAB 页签,用户可新建、编辑、删除和登录连接,并可设置标签和置顶连接等操作。\n在公共连接 TAB 页签,可查看、登录已获授权的连接。", - "odc.component.VersionModal.config.WhenYouSelectAndCopy": "在对结果集进行选择复制时,其交互类似 EXCEL 表格的操作交互。\n支持全选、单列、多列、单行、多行选择,支持冻结指定行数据,同时支持将结果集的内容直接复制粘贴到 EXCEL 中。", - "odc.component.VersionModal.NewVersion.ImprovedTableStructureAndSql": "优化提升了表结构、SQL 窗口、结果集、PL 对象调试、异步执行等多个功能,提供一个更加稳定易用的版本", - "odc.component.VersionModal.config.SqlWindowIsTheMain": "SQL 窗口是用户进行数据库开发的主要功能模块,其中内置了一系列编辑辅助工具及快捷功能入口。\n打开 SQL 窗口,用户可编辑和保存 SQL 或 PL 语句,在编写过程中会根据语法和语义展示相关提示,已编写内容涉及到关键字部分会高亮展示;同时提供了代码片段功能,用于辅助记忆常用片段,提高编写效率。", - "odc.component.VersionModal.config.OdcProvidesTheConsoleFunction": "ODC 提供了管控台功能,可根据企业的实际情况配置用户群体的角色和权限(默认内置 system_admin 角色及 admin 用户),并可对 ODC 内的连接资源进行单独和批量管理(可通过资源组实现批量管理的能力),从而可快速便捷地管控整个 ODC 平台的权限,以实现各角色间的高效协作。", - "odc.component.VersionModal.config.ForASingleTableQuery": "对于单表查询,支持对结果集进行编辑,编辑时可根据数据类型提供组件(数字、字符、日期等)辅助编辑。", "odc.component.VersionModal.NewVersion.OdcOptimizationUpdate": "新版本 ODC 优化更新", "odc.component.VersionModal.NewVersion.Next": "下一个", "odc.component.VersionModal.NewVersion.MoreProductTrends": "更多产品动态", - "odc.component.VersionModal.config.WhenExportingResultSetsYou": "在对结果集进行导出时,支持选中部分结果集复制成 SQL 语句或 CSV\n 文本。同时支持导出全部结果集成 SQL 、CSV 或 EXCEL 格式。", - "odc.ExportDrawer.ExportForm.Database.1": "所属库", - "odc.components.FormRecordExportModal.Connection": "所属连接", - "odc.page.Manage.ExitTheConsole": "退出管控台", "odc.components.RecordPage.No": "序号", "odc.component.TaskStatus.ToBeExecuted": "待执行", "odc.TaskManagePage.component.TaskTools.Run": "执行", - "odc.components.TaskFlowPage.Close": "关闭", - "odc.components.FormTaskModal.WaitForValidityPeriod": "执行等待有效期", "odc.component.DataTransferModal.Database": "所属数据库", - "odc.components.FormTaskModal.component.ReferenceSuperiorProcess": "引用上级流程", "odc.components.RecordPage.ExecutionTime": "执行时间", - "odc.component.UserConfigForm.SelectSessionMode": "请选择 Session 模式", "odc.TaskManagePage.component.TaskTools.Close": "关闭", - "odc.components.FormTaskModal.component.ApprovalNode": "审批节点", - "odc.components.IndexPage.config.Role": "角色", "odc.component.RecordPopover.components.IpSource": "IP 来源", - "odc.components.TaskFlowPage.Disabled.1": "停用失败", "odc.TaskManagePage.component.ApprovalModal.HandlingComments": "处理意见", "odc.component.CommonTaskDetailModal.TaskFlow.HandlingComments": "处理意见", - "odc.component.UserConfigForm.SqlWindowSessionMode": "SQL 窗口 Session 模式", "odc.component.RecordPopover.components.EventType": "事件类型", "odc.components.RecordPage.component.Executor": "执行人", "odc.TaskManagePage.component.ApprovalModal.PleaseEnterHandlingCommentsWithin": "请输入处理意见,200 字以内", "odc.components.FormRecordExportModal.Executor": "执行人", - "odc.components.TaskFlowPage.Deleted": "删除成功", - "odc.components.FormTaskModal.CreateTaskProcess": "新建任务流程", - "odc.ExportDrawer.ExportForm.ManuallyExecuteAfterApproval": "审批完成后手动执行", - "odc.components.FormTaskModal.AnalogData": "模拟数据", - "odc.component.TemplateInsertModal.InsertStatement": "Insert 语句", - "odc.TaskManagePage.component.TaskTools.QueryResults": "查询结果", "odc.components.FormRecordExportModal.Failed": "失败", "odc.components.RecordPage.CreateConnection": "新建连接", "odc.TaskManagePage.component.ApprovalModal.ProcessingStatus": "处理状态:", - "odc.components.FormTaskModal.UnableToSaveTheTask": "任务流程保存失败", - "odc.components.FormTaskModal.TaskProcessStatus": "任务流程状态", - "odc.ImportDrawer.ImportForm.ManuallyExecuteAfterApproval": "审批完成后手动执行", - "odc.ImportDrawer.ImportForm.Connection": "所属连接", - "odc.component.RecordPopover.components.Connection": "所属连接", - "odc.components.FormTaskModal.Export": "导出", - "odc.component.TemplateInsertModal.UpdateStatement": "Update 语句", - "odc.component.AddConnectionForm.ConnectTypeItem.LogicalDatabase": "逻辑库", "odc.component.CommonTable.TableInfo.SelectedrowkeyslengthIsSelected": "已选择{selectedRowKeysLength}项", - "odc.components.FormTaskModal.component.AddApprovalNode": "添加审批节点", - "odc.components.IndexPage.config.AddPublicConnectionResources": "添加公共连接资源", "odc.TreeNodeMenu.config.table.InsertStatement": "Insert 语句", "odc.components.RecordPage.Modify": "修改", "odc.TaskManagePage.component.TaskTable.Created": "创建人", @@ -2698,57 +1404,33 @@ "odc.component.TaskStatus.ApprovalExpired.1": "审批过期", "odc.component.RecordPopover.components.EventAction": "事件操作", "odc.component.TaskStatus.ExecutionExpiration": "执行过期", - "odc.components.TaskFlowPage.Actions": "操作", "odc.components.RecordPage.Export": "导出", - "odc.page.ConnectionList.AdministratorResourcePermissionManagementAnd": "管理员资源权限管理、安全审计管控后台", "odc.components.RecordPage.component.EventAction": "事件操作", "odc.component.TaskStatus.Failed.2": "执行失败", - "odc.components.TaskFlowPage.component.RiskData": "风险数据", "odc.component.TemplateInsertModal.WhenYouDragAndDrop": "选择对象进行拖放时,可在 SQL 窗口快速生成:", "odc.TaskManagePage.component.TaskTable.Export": "导出", - "odc.components.TaskFlowPage.BatchDelete": "批量删除", "odc.component.DataTransferModal.Created": "创建人", "odc.TaskManagePage.component.TaskTools.Download": "下载", - "odc.components.TaskFlowPage.component.Remarks": "备注", - "odc.components.FormTaskModal.Cancel": "取消", "odc.components.RecordPage.EnterTheExecutor": "请输入执行人", "odc.TreeNodeMenu.config.view.ObjectName": "对象名", "odc.component.OSSDragger2.FileListItem.Ok": "确定", - "odc.component.AsyncTaskModal.DatabaseChanges": "数据库变更", "odc.components.RecordPage.Failed": "失败", "odc.component.helpDoc.doc.DatabaseShardingAndTableSharding": "ODP (Sharding)", - "odc.components.TaskFlowPage.CreateTaskProcess": "新建任务流程", "odc.component.CommonTaskDetailModal.TaskFlow.Handler": "处理人", - "odc.component.DataMockerDrawer.form.AutomaticallyExecutedAfterApproval": "审批完成后自动执行", "odc.component.helpDoc.doc.TheApprovalTimesOutAnd": "审批超时,任务将过期", - "odc.TaskManagePage.component.TaskTable.CreateATask": "新建任务", "odc.component.DataTransferModal.ExecutionMethod": "执行方式", "odc.TaskManagePage.component.TaskTools.InitiateAgain": "再次发起", - "odc.components.TaskFlowPage.component.ChangeQuantityRange": "变更数量范围", "odc.component.CommonTaskDetailModal.TaskFlow.Handled": "可处理人", - "odc.components.TaskFlowPage.TaskFlowManagement": "任务流程管理", "odc.components.FormRecordExportModal.Cancel": "取消", "odc.component.OSSDragger2.Cancel": "取消", - "odc.component.AsyncTaskModal.Created": "创建人", - "odc.components.FormTaskModal.UnableToCreateTheTask": "任务流程创建失败", - "odc.component.DataMockerDrawer.form.ItemnameDefaultCurrentLibrary": "{itemName} (默认当前库)", "odc.components.RecordPage.component.ConnectionMode": "连接模式", - "odc.components.CreateAsyncTaskModal.TheFileSizeCannotExceed.1": "文件大小不超过 20 MB", "odc.component.OSSDragger2.SearchForFileName": "搜索文件名称", - "odc.components.FormTaskModal.DatabaseChanges": "数据库变更", "odc.TaskManagePage.component.TaskTools.Pass": "通过", - "odc.ExportDrawer.ExportForm.ItemnameDefaultCurrentLibrary": "{itemName} (默认当前库)", - "odc.components.FormTaskModal.EditTaskFlow": "编辑任务流程", - "odc.components.TaskFlowPage.component.RiskLevels": "风险等级数", "odc.component.helpDoc.doc.WaitForATimeoutBefore": "手动执行前等待超时,任务将过期", - "odc.components.TaskFlowPage.RiskLevels": "风险等级数", - "odc.components.FormTaskModal.component.MinimumValue": "最小值", "odc.TreeNodeMenu.config.view.SelectStatement": "Select 语句", "odc.component.TaskPopover.PendingMyApproval": "待我审批", - "odc.page.Workspace.InTheSharedSessionMode": "当前为共享 Session 模式,主动触发提交/回滚操作,或通过产品功能创建、修改、删除数据库对象,执行 DDL 语句被动触发提交操作,会在所有窗口生效。", "odc.components.RecordPage.OperationRecords": "操作记录", "odc.components.RecordPage.Delete": "删除", - "odc.TaskManagePage.component.TaskTable.CreateItemlabel": "新建{itemLabel}", "odc.component.UserConfigForm.SharedSession": "共享 Session", "odc.components.RecordPage.component.ConnectionName": "连接名称", "odc.components.RecordPage.component.Connection": "所属连接", @@ -2756,433 +1438,222 @@ "odc.components.RecordPage.component.ClusterTenant": "集群/租户", "odc.component.UserConfigForm.DeleteStatement": "Delete 语句", "odc.component.TemplateInsertModal.FastGeneration": "快速生成", - "odc.components.FormTaskModal.component.SelectTheTaskSubclassesIncluded": "选择当前风险等级下包含的任务子类", "odc.component.RecordPopover.components.EnterAnIpSource": "请输入 IP 来源", "odc.component.RecordPopover.components.ExecutionResult": "执行结果", "odc.components.RecordPage.MemberManagement": "成员管理", "odc.component.helpDoc.doc.EachRiskLevelCorrespondsTo": "每个风险等级对应一个任务审批流程", - "odc.component.DetailModal.dataMocker.Connection": "所属连接", - "odc.components.IndexPage.config.TheRiskDataSensitiveData": "风险数据、敏感数据、脱敏规则管理中心,保障风险数据严管控、敏感数据防泄漏", - "odc.component.DataMockerDrawer.form.ManuallyExecuteAfterApproval": "审批完成后手动执行", - "odc.component.AsyncTaskModal.ExecutionMethod": "执行方式", "odc.component.TaskStatus.PendingExecutionExpiration": "等待执行过期", - "odc.components.FormTaskModal.component.RiskData": "风险数据", "odc.components.RecordPage.ResourceGroupManagement": "资源组管理", - "odc.components.TaskManagePage.ManuallyExecuteAfterApproval": "审批完成后手动执行", "odc.components.TreeFilter.Reset": "重置", - "odc.components.IndexPage.config.ConfigureResourceGroups": "设置资源组", - "odc.component.DataMockerDrawer.form.Database": "所属库", "odc.component.DetailModal.dataMocker.Created": "创建人", - "odc.component.DataTransferModal.Connection": "所属连接", "odc.component.DetailModal.dataMocker.TaskType": "任务类型", - "odc.component.AsyncTaskModal.TaskNo": "任务编号", - "odc.components.IndexPage.HowToManageResourcePermissions": "如何管理资源权限", - "odc.components.IndexPage.config.ContainsMultiplePublicConnectionsIt": "包含多个公共连接,适用于将多个公共连接资源批量授权给角色", - "odc.TaskManagePage.component.TaskTable.EnterADatabase": "请输入所属数据库", "odc.TreeNodeMenu.config.table.Copy": "复制", - "odc.component.TemplateInsertModal.DeleteStatement": "Delete 语句", - "odc.component.TaskPopover.AllTasks": "全部任务", "odc.components.RecordPage.IpSource": "IP 来源", "odc.TaskManagePage.component.ApprovalModal.Rejected": "拒绝成功", "odc.TaskManagePage.component.TaskTools.InitiatedAgain": "再次发起成功", - "odc.components.TaskFlowPage.Edit": "编辑", "odc.TreeNodeMenu.config.view.UpdateStatement": "Update 语句", - "odc.components.TaskFlowPage.Cancel": "取消", - "odc.components.TaskFlowPage.component.NotIncluded": "不包含", - "odc.component.AsyncTaskModal.Connection": "所属连接", "odc.components.RecordPage.RecordDetails": "记录详情", "odc.component.AddConnectionForm.AddressItems.EnterTheHostAddress": "请输入主机地址", "odc.component.DetailModal.dataMocker.Database": "所属数据库", "odc.components.RecordPage.Create": "新建", - "odc.components.FormTaskModal.EnterATaskFlowName": "请输入任务流程名称", - "odc.TaskManagePage.component.TaskTable.CreateTasklabelinfolabel": "新建{taskLabelInfoLabel}", - "odc.TaskManagePage.component.TaskTools.AreYouSureYouWant": "是否确定回滚任务?", "odc.component.RecordPopover.components.View": "查看", "odc.component.CommonTaskDetailModal.TaskFlow.RollBack": "回滚", - "odc.TaskManagePage.component.TaskTable.TaskType": "任务类型", "odc.components.RecordPage.Close": "关闭", - "odc.page.ConnectionList.EnterNow": "立即进入", "odc.TaskManagePage.component.TaskTools.Copy": "复制", "odc.components.RecordPage.ExecutionResult": "执行结果", "odc.TaskManagePage.component.ApprovalModal.Reject": "拒绝", "odc.component.OSSDragger2.FileListItem.Cancel": "取消", "odc.components.RecordPage.ModifyAConnection": "修改连接", - "odc.components.AddConnectionDrawer.CreateAPersonalConnection": "新建个人连接", "odc.component.OSSDragger2.Search": "搜索", "odc.component.CommonTaskDetailModal.TaskFlow.ProcessingStatus": "处理状态", - "odc.components.TaskFlowPage.EnterTheCreator": "请输入创建人", "odc.components.RecordPage.EventAction": "事件操作", "odc.components.FormRecordExportModal.CsvFormat": "CSV 格式", - "odc.components.TaskFlowPage.component.TaskSubclass": "任务子类", - "odc.components.IndexPage.config.SetThePasswordOfThe": "设置用户账号密码,并通过角色授予相关连接资源权限", - "odc.components.TaskFlowPage.component.ValidityPeriod": "执行有效期", "odc.component.TemplateInsertModal.CopiedSuccessfully": "复制成功", "odc.components.RecordPage.ModifyAResourceGroup": "修改资源组", - "odc.components.TaskFlowPage.FailedToEnable": "启用失败", "odc.components.RecordPage.View": "查看", - "odc.components.TaskFlowPage.Copy": "复制", - "odc.components.TaskFlowPage.component.WaitForValidityPeriod": "执行等待有效期", "odc.TaskManagePage.component.TaskTools.ExecutionSucceeded": "执行成功", - "odc.components.IndexPage.config.ResourceGroup": "资源组", "odc.components.RecordPage.component.DatabaseUsername": "数据库用户名", - "odc.components.RecordPage.Connection": "所属连接", - "odc.components.CreateAsyncTaskModal.UploadTheRollbackSchemeFile": "请上传回滚方案文件", - "odc.component.UserConfigForm.SetTheSessionModeOf": "设置 SQL 窗口的 Session 模式", "odc.components.TreeFilter.Ok": "确定", - "odc.ExportDrawer.ExportForm.Connection": "所属连接", - "odc.component.AsyncTaskModal.RollbackContent": "回滚内容", "odc.components.FormRecordExportModal.SelectAllByDefault": "默认选择全部", "odc.component.RecordPopover.components.Failed": "失败", - "odc.components.TaskFlowPage.Enable": "启用", - "odc.component.DataMockerDrawer.form.ExecutionMethod": "执行方式", "odc.component.TaskPopover.IInitiated": "我发起的", - "odc.components.IndexPage.config.PublicConnection": "公共连接", "odc.component.DataTransferModal.Import": "导入", "odc.components.RecordPage.PasswordManagement": "密码管理", - "odc.component.SQLConfig.SessionVariables": "会话变量", "odc.components.RecordPage.Import": "导入", - "odc.components.FormTaskModal.ProcessValidityPeriod": "流程有效期", - "odc.component.TemplateInsertModal.ObjectName": "对象名", - "odc.components.FormTaskModal.TaskType": "任务类型", "odc.component.PropertyModal.TheSharedSessionModeIs": "当前为共享 Session 模式,因此:", - "odc.page.Manage.ResourcePermissions": "资源权限", - "odc.components.FormTaskModal.LevelRecommended": "等级 3(推荐)", - "odc.components.ExportDrawer.CreateExport": "新建导出", "odc.components.RecordPage.component.Failed": "失败", - "odc.components.CreateAsyncTaskModal.AutomaticallyExecutedAfterApproval": "审批完成后自动执行", "odc.components.RecordPage.Actions": "操作", - "odc.page.Manage.RiskData": "风险数据", - "odc.components.TaskFlowPage.Disabled": "停用成功", - "odc.components.IndexPage.config.CreateAUser": "创建用户", "odc.component.TaskStatus.RollbackFailed": "回滚失败", "odc.TaskManagePage.component.ApprovalModal.Pass": "通过", "odc.component.TaskStatus.Passed": "已通过", "odc.components.FormRecordExportModal.ExecutionResult": "执行结果", - "odc.components.FormTaskModal.Disable": "停用", - "odc.ImportDrawer.ImportForm.ExecutionMethod": "执行方式", "odc.component.RecordPopover.components.Actions": "操作", - "odc.components.TaskFlowPage.component.LevelDefault": "等级1(默认)", - "odc.components.TaskFlowPage.Status": "状态", - "odc.components.FormTaskModal.component.NotIncluded": "不包含", "odc.components.FormRecordExportModal.ExecutionTimeRange": "执行时间范围", - "odc.components.FormTaskModal.component.ChangeQuantityRange": "变更数量范围", "odc.component.TaskStatus.Rejected": "已拒绝", "odc.component.CommonTaskDetailModal.TaskResult.ExecutionFailure": "执行失败记录", "odc.component.UserConfigForm.TheDefaultStatementTypeGenerated": "设置拖放表/视图对象时默认生成的语句类型", "odc.components.FormRecordExportModal.EventAction": "事件操作", - "odc.TaskManagePage.component.TaskTable.TaskNo": "任务编号", "odc.component.helpDoc.doc.WhenTheExecutionTimesOut": "执行超时,任务将过期", "odc.TreeNodeMenu.config.table.ObjectName": "对象名", - "odc.components.TaskFlowPage.Created": "创建人", - "odc.components.IndexPage.config.ManageRolePermissions": "管理角色权限", - "odc.components.CreateAsyncTaskModal.EnterARollbackScheme": "请填写回滚方案", "odc.components.FormRecordExportModal.ExportOperationRecords": "导出操作记录", "odc.component.RecordPopover.components.ExecutionTime": "执行时间", "odc.TreeNodeMenu.config.view.DeleteStatement": "Delete 语句", - "odc.components.FormTaskModal.TaskFlowCreated": "任务流程创建成功", - "odc.components.TaskManagePage.AutomaticallyExecutedAfterApproval": "审批完成后自动执行", - "odc.component.TaskStatus.RollingBack": "回滚中", "odc.components.RecordPage.DeleteARole": "删除角色", - "odc.components.TaskFlowPage.Delete": "删除", "odc.component.UserConfigForm.ObjectName": "对象名", - "odc.components.FormTaskModal.TaskApprovalProcess": "任务审批流程", - "odc.components.TaskFlowPage.component.Created": "创建人", - "odc.components.FormTaskModal.Enable": "启用", - "odc.components.TaskFlowPage.component.Include": "包含", "odc.component.TimeSelect.ExecutionTime": "执行时间:", - "odc.components.FormTaskModal.component.TaskSubclass": "任务子类", "odc.component.TaskStatus.RolledBack": "已回滚", - "odc.page.Manage.SecurityAudit": "安全审计", - "odc.components.TaskFlowPage.AreYouSureYouWant.1": "是否确定删除流程?", - "odc.components.FormTaskModal.AreYouSureYouWant": "是否确定取消编辑?取消保存后,所编辑的内容将不生效", "odc.component.TimeSelect.Custom": "自定义", "odc.components.RecordPage.Reject": "拒绝", - "odc.TaskManagePage.component.TaskTools.AfterTheTaskIsRolled": "任务回滚后已执行的任务将重置", - "odc.Header.ConnectionItem.SwitchConnections": "切换连接", "odc.component.RecordPopover.OperationRecords": "操作记录", "odc.components.RecordPage.PersonalSettings": "个人设置", "odc.components.RecordPage.DatabaseChanges": "数据库变更", "odc.component.DataTransferModal.TaskNo": "任务编号", - "odc.components.TaskFlowPage.component.Hours": "小时", "odc.TreeNodeMenu.config.table.DeleteStatement": "Delete 语句", - "odc.components.FormTaskModal.TheProcessNameAlreadyExists": "流程名称已存在", - "odc.components.IndexPage.config.AdministratorsCanCreateOrEdit": "管理员可创建或编辑由多个用户共享的公共连接资源", - "odc.components.IndexPage.TextToBeDeterminedEasily": "轻松管理用户资源权限、规范配置风险任务流程并保障数据资源的安全管控", "odc.component.CommonTaskDetailModal.TaskFlow.Run": "执行", "odc.components.RecordPage.ModifyUser": "修改用户", "odc.component.RecordPopover.components.Close": "关闭", "odc.components.RecordPage.ExportOperationRecords": "导出操作记录", "odc.component.DataTransferModal.RiskLevel": "风险等级", "odc.component.DetailModal.dataMocker.TaskNo": "任务编号", - "odc.components.TaskFlowPage.Disable": "停用", - "odc.components.FormTaskModal.component.Maximum": "最大值", - "odc.components.TaskFlowPage.AfterTheTaskProcessIs": "删除该任务流程后,将不能发起相关任务审批流程,且无法恢复", - "odc.components.TaskFlowPage.component.TaskType": "任务类型", - "odc.components.IndexPage.Create": "新建", "odc.components.RecordPage.ScriptManagement": "脚本管理", "odc.component.CommonTaskDetailModal.TaskFlow": "任务流程", - "odc.ImportDrawer.ImportForm.Database.1": "所属库", "odc.TaskManagePage.component.TaskTools.DownloadQueryResults": "下载查询结果", - "odc.TaskManagePage.component.TaskTools.RollbackSucceeded": "回滚成功", - "odc.components.FormTaskModal.Create": "新建", "odc.component.OSSDragger2.FileListItem.AreYouSureYouWant": "是否确定移除文件?", "odc.components.CreateAsyncTaskModal.CreateDatabaseChanges": "新建数据库变更", "odc.components.RecordPage.ChangePassword": "修改密码", "odc.components.RecordPage.Executor": "执行人", - "odc.components.FormTaskModal.TheTaskFlowIsSaved": "任务流程保存成功", "odc.components.RecordPage.AnalogData": "模拟数据", "odc.component.SearchFilter.Reset": "重置", "odc.components.RecordPage.Pass": "通过", "odc.component.CommonTaskDetailModal.TaskFlow.ProcessingTime": "处理时间", "odc.TaskManagePage.component.TaskTable.EnterTheCreator": "请输入创建人", - "odc.TreeNodeMenu.config.table.OpenTheSqlWindow": "打开 SQL 窗口", "odc.components.RecordPage.AddRole": "新增角色", - "odc.components.FormTaskModal.RiskLevels": "风险等级数", "odc.component.TaskStatus.ApprovalFailed": "审批不通过", - "odc.components.AlertInfo.PublicConnectionsAreSharedDatabase": "公共连接是用户共享的数据库资源,如需新增/编辑公共连接,请进入公共资源管控台操作", "odc.component.TaskStatus.Completed": "已完成", "odc.components.RecordPage.component.EventType": "事件类型", - "odc.component.RecordPopover.components.EnterAConnection": "请输入所属连接", "odc.components.RecordPage.ModifyARole": "修改角色", - "odc.components.FormTaskModal.component.SelectARole": "请选择角色", - "odc.components.IndexPage.config.User": "用户", - "odc.component.AsyncTaskModal.TaskType": "任务类型", - "odc.component.AddConnectionForm.ConnectTypeItem.PhysicalDatabase": "物理库", - "odc.components.IndexPage.config.GrantMultiplePublicConnectionResource": "为角色赋予多个公共连接资源权限和个人资源权限", - "odc.ImportDrawer.ImportForm.ItemnameDefaultCurrentLibrary": "{itemName} (默认当前库)", "odc.component.CommonTaskDetailModal.TaskFlow.Completed": "完成", - "odc.components.CreateAsyncTaskModal.Database": "所属库", - "odc.components.TaskFlowPage.component.TaskFlowName": "任务流程名称", - "odc.components.TaskFlowPage.AreYouSureYouWant": "是否确定停用任务流程?", - "odc.page.Manage.TaskFlow": "任务流程", - "odc.components.FormTaskModal.ApprovalValidityPeriod": "审批有效期", - "odc.components.TaskFlowPage.component.Approver": "可审批人", "odc.components.SessionParamPage.SessionParamDrawer.SessionVariables": "会话变量", "odc.component.RecordPopover.components.ExecutionTime.1": "执行时间:", "odc.component.TaskStatus.PendingApproval": "待审批", - "odc.components.FormTaskModal.Ok": "确定", "odc.components.RecordPage.component.IpSource": "IP 来源", - "odc.components.CreateAsyncTaskModal.ItemnameDefaultCurrentLibrary": "{itemName} (默认当前库)", - "odc.components.FormTaskModal.component.Include": "包含", - "odc.component.DataMockerDrawer.form.Connection": "所属连接", "odc.component.UserConfigForm.UpdateStatement": "Update 语句", "odc.components.RecordPage.OrganizationConfiguration": "组织配置", - "odc.components.Header.DatabaseChanges": "数据库变更", "odc.component.DetailModal.dataMocker.ExecutionMethod": "执行方式", "odc.component.RecordPopover.components.Successful": "成功", "odc.component.TimeSelect.LastDays": "最近 7 天", "odc.components.RecordPage.component.ExecutionResult": "执行结果", - "odc.ImportDrawer.ImportForm.AutomaticallyExecutedAfterApproval": "审批完成后自动执行", "odc.TaskManagePage.component.ApprovalModal.Successful": "通过成功", "odc.components.RecordPage.AddResourceGroup": "新增资源组", - "odc.components.FormTaskModal.EnterRemarks": "请输入备注", "odc.TaskManagePage.component.TaskTable.DatabaseChanges": "数据库变更", - "odc.components.IndexPage.ResourceGroup": "资源组", - "odc.components.FormTaskModal.Remarks": "备注", - "odc.components.IndexPage.config.ResourcePermissionManagement": "资源权限管理", "odc.components.FormRecordExportModal.Successful": "成功", - "odc.components.FormTaskModal.TaskFlowName": "任务流程名称", "odc.TreeNodeMenu.config.view.Copy": "复制", - "odc.component.AsyncTaskModal.RiskLevel": "风险等级", "odc.components.CreateAsyncTaskModal.RollbackScheme": "回滚方案", - "odc.components.TaskFlowPage.AnalogData": "模拟数据", - "odc.components.TaskFlowPage.View": "查看", - "odc.components.TaskFlowPage.Risklevelconfigslength": "{riskLevelConfigsLength} 级", "odc.component.OSSDragger2.YouCanDragAndDrop": "支持拖拽文件上传,任务将按文件排列的先后顺序执行", - "odc.components.FormTaskModal.WhenATaskMatchesMultiple": "当任务匹配到多个风险等级时,系统优先匹配高等级的审批流程", "odc.component.DataTransferModal.Export": "导出", "odc.component.CommonTable.TableInfo.Deselect": "取消选择", "odc.TaskManagePage.component.ApprovalModal.PleaseEnterAHandlingOpinion": "请输入处理意见!", "odc.component.TaskStatus.Waiting": "执行等待中", - "odc.page.Manage.QuickStart": "快速入门", "odc.component.OSSDragger2.FileListItem.UploadFailed": "上传失败", "odc.component.helpDoc.doc.CommonDatabase": "普通数据库", - "odc.components.TaskFlowPage.AnUnfinishedTaskExistsIn": "当前任务流程中存在未完成的任务,暂不允许删除", "odc.components.FormRecordExportModal.ExportFormat": "导出格式", "odc.component.CommonTaskDetailModal.TaskFlow.Deadline": "截止时间", "odc.component.CommonTaskDetailModal.TaskFlow.TaskCompleted": "任务已完成", "odc.component.CommonTaskDetailModal.ExecutionResult": "执行结果", - "odc.components.IndexPage.config.TaskFlowManagement": "任务流程管理", "odc.components.RecordPage.component.ExecutionTime": "执行时间", "odc.components.RecordPage.AddUser": "新增用户", "odc.component.DataMockerDrawer.CreateSimulationData": "新建模拟数据", - "odc.components.FormTaskModal.TheProcessNameCannotExceed": "流程名称不超过 110 个字符", - "odc.components.TaskFlowPage.TaskFlowDetails": "任务流程详情", "odc.components.RecordPage.ExecutionTime.1": "执行时间:", "odc.components.RecordPage.EventType": "事件类型", "odc.TaskManagePage.component.TaskTable.AnalogData": "模拟数据", - "odc.components.IndexPage.config.SecurityAuditManagement": "安全审计管理", - "odc.components.FormTaskModal.Import": "导入", - "odc.components.TaskFlowPage.component.Created.1": "创建时间", "odc.component.RecordPopover.components.RecordDetails": "记录详情", "odc.components.RecordPage.DeleteAResourceGroup": "删除资源组", - "odc.TaskManagePage.component.TaskTable.Database": "所属数据库", "odc.component.SearchFilter.Ok": "确定", - "odc.components.TaskFlowPage.Enabled": "启用成功", - "odc.components.IndexPage.config.LimitChangesInitiatedByUsers": "根据任务类型限制用户发起的变更内容、定制不同的审批流程,达到数据库变更安全的目的", - "odc.components.TaskFlowPage.Ok": "确定", "odc.component.UserConfigForm.ObjectDragAndDropGeneration": "对象拖放生成语句类型", "odc.TreeNodeMenu.config.table.SelectStatement": "Select 语句", "odc.components.RecordPage.Run": "执行", - "odc.components.FormTaskModal.ValidityPeriod": "执行有效期", - "odc.components.TaskFlowPage.TaskType": "任务类型", "odc.TaskManagePage.component.TaskTools.RollBack": "回滚", "odc.components.RecordPage.component.HostnamePort": "主机名/端口", "odc.component.TimeSelect.LastDays.1": "最近 15 天", "odc.component.TimeSelect.LastDays.2": "最近 30 天", "odc.component.DetailModal.dataMocker.AnalogData": "模拟数据", - "odc.ExportDrawer.ExportForm.AutomaticallyExecutedAfterApproval": "审批完成后自动执行", - "odc.components.TaskFlowPage.UnableToDeleteTheTask": "删除任务流程失败", - "odc.TaskManagePage.component.TaskTable.AllRegions": "全部", "odc.components.RecordPage.EnterAnIpSource": "请输入 IP 来源", - "odc.components.TaskFlowPage.Others": "其他", "odc.TaskManagePage.component.TaskTools.Cancel": "取消", - "odc.components.TaskFlowPage.ISee": "我知道了", "odc.components.FormRecordExportModal.ExcelFormat": "Excel 格式", - "odc.components.RecordPage.EnterAConnection": "请输入所属连接", "odc.components.RecordPage.DeleteAUser": "删除用户", - "odc.components.TaskFlowPage.Export": "导出", - "odc.components.TaskFlowPage.DatabaseChanges": "数据库变更", "odc.components.RecordPage.ConnectionManagement": "连接管理", "odc.TreeNodeMenu.config.view.InsertStatement": "Insert 语句", - "odc.components.TaskFlowPage.Created.1": "创建时间", - "odc.components.FormTaskModal.SelectATaskSubclass": "请选择任务子类", "odc.components.RecordPage.SetPassword": "设置密码", "odc.components.ImportDrawer.CreateImport": "新建导入", "odc.components.RecordPage.DeleteAConnection": "删除连接", "odc.component.UserConfigForm.IndependentSession": "独立 Session", "odc.component.TimeSelect.LastSixMonths": "最近半年", - "odc.components.FormTaskModal.TheDescriptionCannotExceedCharacters": "备注不超过 200 个字符", - "odc.components.IndexPage.config.AssignReadAndWritePermissions": "为不同角色的用户分配公共连接、资源组的读写权限,实现数据库资源权限的分配和管控", "odc.components.RecordPage.Upload": "上传", - "odc.component.AsyncTaskModal.Database": "所属数据库", - "odc.components.SessionParamPage.ThisSessionVariableDoesNot": "当前为独立 Session 模式,该会话变量不会对 SQL 窗口生效", "odc.components.RecordPage.DatabaseOperations": "数据库操作", "odc.component.CommonTaskDetailModal.TaskFlow.Succeeded": "已成功", - "odc.components.CreateAsyncTaskModal.ManuallyExecuteAfterApproval": "审批完成后手动执行", - "odc.components.RecordPage.Connect": "进入连接", - "odc.components.CreateAsyncTaskModal.ExecutionMethod": "执行方式", "odc.components.RecordPage.Successful": "成功", "odc.component.UserConfigForm.InsertStatement": "Insert 语句", - "odc.TaskManagePage.component.TaskTable.EnterTheTaskNumber": "请输入任务编号", - "odc.components.FormTaskModal.AreYouSureYouWant.1": "是否确定取消新建?", - "odc.page.Manage.OperationRecords": "操作记录", "odc.component.TaskStatus.ExecutionExpired": "执行已过期", - "odc.components.CreateAsyncTaskModal.Connection": "所属连接", "odc.component.UserConfigForm.SelectStatement": "Select 语句", - "odc.component.TemplateInsertModal.SelectStatement": "Select 语句", - "odc.component.AddConnectionForm.ConnectTypeItem.DatabaseType": "数据库类型", "odc.TreeNodeMenu.config.table.UpdateStatement": "Update 语句", "odc.component.CommonTaskDetailModal.TaskFlow.InitiateATask": "发起任务", - "odc.components.FormTaskModal.Recommended": "3(推荐)", - "odc.components.TaskFlowPage.Import": "导入", "odc.components.FormRecordExportModal.Export": "导出", "odc.TaskManagePage.component.TaskTools.Reject": "拒绝", "odc.TaskManagePage.component.TaskTools.Terminate": "终止", - "odc.components.AlertInfo.EnterNow": "立即进入", - "odc.components.FormTaskModal.component.LevelIsUsedToEnsure": "等级 1 用于保障所有任务均能匹配到审批流程,默认选择任务子类,不支持修改", "odc.components.RecordPage.component.DetailedRules": "执行细则", - "odc.components.FormTaskModal.component.ConfigureApprovalNodes": "设置审批节点", - "odc.components.TaskFlowPage.TaskFlowName": "任务流程名称", - "odc.components.RecordPage.ExitTheConnection": "退出连接", "odc.component.DetailModal.dataMocker.RiskLevel": "风险等级", "odc.component.TaskStatus.ApprovalExpired": "审批已过期", - "odc.components.FormTaskModal.DatanameCopy": "{dataName}_复制", - "odc.ExportDrawer.ExportForm.ExecutionMethod": "执行方式", "odc.components.RecordPage.TaskFlow": "任务流程", - "odc.TaskManagePage.component.TaskTools.Ok": "确认", - "odc.components.TaskFlowPage.component.ApprovalValidityPeriod": "审批有效期", "odc.TaskManagePage.component.TaskTable.Import": "导入", - "odc.components.TaskFlowPage.EnterAProcessName": "请输入流程名称", - "odc.components.FormTaskModal.Save": "保存", "odc.components.RecordPage.component.Successful": "成功", - "odc.components.Header.ConnectionMenuList.SwitchConnections": "切换连接", - "odc.components.TaskFlowPage.component.ApprovalRole": "审批角色", "odc.component.TaskStatus.Approving": "审批中", - "odc.components.FormTaskModal.Hours": "小时", "odc.component.OSSDragger2.Add": "添加", - "odc.components.IndexPage.WelcomeToThePublicResource": "欢迎使用公共资源管控台", "odc.components.RecordPage.CreateASession": "创建会话", - "odc.page.Manage.Role": "角色", - "odc.Header.WorkbenchMenu.CurrentlyYouCannotEditFiles": "暂不支持超过 {maxLimitText} 的文件编辑", "odc.components.CreateAsyncTaskModal.EnterAQueryResultLimit": "请输入查询结果限制", "odc.component.RecordPopover.components.NoteTheOperationRecordContains": "提示:操作记录包含 ODC 上的历史操作", "odc.components.RecordPage.CreateProcess": "新建流程", "odc.components.RecordPage.EnableRole": "启用角色", - "odc.component.VersionModal.config.ToEnsureThatUserOperations": "为保证用户在 ODC 上进行的操作可追溯,自 ODC V3.3.0 版本起提供操作记录的能力。该能力包含查看操作记录和操作记录管理两部分。普通用户可根据事件类型、事件操作、所属连接等查找记录、并支持查看操作详情;管理员可查看和导出所有用户的操作记录。", - "odc.component.VersionModal.config.OperationRecords": "操作记录", - "odc.components.ScriptManageModal.BatchDelete": "批量删除", "odc.component.VersionModal.newVersionConfig.YouCanRightClickTable": "表对象右键能力增强,同时支持将表对象拖放至 SQL 窗口快速生成语句", - "odc.component.DataTransferModal.Maxrisklevel": "{maxRiskLevel}级", "odc.ScriptManageModal.ScriptEditorModal.ScriptContent": "脚本内容", - "odc.components.TaskFlowPage.AfterYouDisableTheTask": "停用该任务流程后,将不能发起相关任务审批", "odc.component.VersionModal.newVersionConfig.ObjectManagement": "对象管理", - "odc.components.ScriptManageModal.ScriptList": "脚本列表", - "odc.components.CreateTablePage.PartitionSettingsAreNotSupported": "该模式下不支持分区设置", - "odc.components.ScriptManageModal.SupportedExtensionsSqlPlTxt": ",支持扩展名:.sql / .pl / .txt", "odc.components.RecordPage.Process": "启用流程", "odc.RecycleBinPage.RecyleConfig.SupportTruncateTable": "支持 Truncate Table", "odc.components.RecordPage.DisableAResourceGroup": "停用资源组", "odc.component.VersionModal.newVersionConfig.TaskCenter": "任务中心", "odc.component.MultiLineOverflowText.Fold": "收起", - "odc.component.VersionModal.config.ToEnsureThatUserOperations.1": "为保证用户在 ODC 上进行的操作可追溯,ODC V3.3.0 及之后版本提供了操作记录的能力。用户可根据事件类型、事件操作、所属连接等查找记录,并支持查看操作详情。操作记录的保留时间为 30 天,超过 30 天的操作记录不再支持查看。", - "odc.Header.WorkbenchMenu.TaskManagement": "脚本管理", - "odc.component.VersionModal.config.ControlCollaboration": "管控协同", - "odc.component.VersionModal.config.OdcTheVersionProvidesUnified": "自 ODC V3.3.0 版本起提供变更统一管控的能力,用户可对公共只读连接数据库变更。该能力包含变更流程的定义,以及变更流程的发起两部分。管理员用户可定义、调整变更流程,普通用户可根据管理员定义的流程发起变更", - "odc.TaskManagePage.component.TaskTable.PersonalConnection": "个人连接", "odc.components.ScriptManageModal.columns.CurrentlyYouCannotEditFiles": "暂不支持超过 {maxLimitText} 的文件编辑", - "odc.components.ScriptManageModal.columns.ScriptContent": "脚本内容", - "odc.components.ScriptManageModal.BatchDownload": "批量下载", - "odc.page.Manage.ResourceGroup": "资源组", - "odc.component.DetailModal.dataMocker.Maxrisklevel": "{maxRiskLevel}级", "odc.components.RecordPage.DeleteProcess": "删除流程", "odc.components.RecycleBinPage.Settings": "设置", - "odc.components.ScriptManageModal.TheMaximumNumberOfImported": "导入文件最大不能超过", - "odc.page.Manage.User": "用户", "odc.ScriptManageModal.ScriptEditorModal.Save": "保存", "odc.component.VersionModal.newVersionConfig.ProvidesFullBusinessOperationRecords": "提供全量的业务操作记录功能,保证用户的操作可追溯,支持记录的查看、筛选", "odc.components.RecordPage.Disable": "停用", "odc.component.VersionModal.newVersionConfig.Workbench": "工作台", "odc.components.ScriptManageModal.columns.Deleted": "删除成功", "odc.component.UserPopover.Name": "姓名:", - "odc.components.ScriptManageModal.EnterAScriptName": "请输入脚本名称", "odc.RuleContent.ruleItems.valid.TheMaximumValueMustBe.1": "最大值必须为数字类型且不为空", "odc.components.RecordPage.ChangeProcess": "修改流程", "odc.RecycleBinPage.RecyleConfig.Permanent": "永久", "odc.components.RecordPage.DisableUser": "停用用户", - "odc.components.TaskFlowPage.AreYouSureYouWant.2": "是否确定停用流程?", "odc.component.VersionModal.newVersionConfig.PersonalSettingsSupportSwitchingIndependent": "个人设置支持切换独立 Session,各个 SQL 窗口可并发执行 SQL 语句", "odc.component.UserPopover.Role": "角色:", "odc.RuleContent.ruleItems.valid.TheStartValueMustBe.1": "起始值必须为数字类型且不为空", - "odc.components.FormTaskModal.component.NumberOfChangedSqlStatements": "变更的 SQL 数量范围", "odc.components.CreateAsyncTaskModal.EnterADelimiter": "请输入分隔符", "odc.components.RecycleBinPage.SelectAllObjects": "选择所有对象", "odc.component.helpDoc.doc.SetTheApprovalRoleFor": "设置每个节点的审批角色", "odc.component.OSSDragger2.SupportsDragAndDropFile": "支持拖拽文件上传", "odc.components.CreateAsyncTaskModal.AreYouSureYouWant.1": "是否确认取消数据库变更?", - "odc.component.AsyncTaskModal.Maxrisklevel": "{maxRiskLevel}级", - "odc.components.ScriptManageModal.Deleted": "删除成功", "odc.components.RecycleBinPage.CancelAllObjects": "取消所有对象", "odc.component.UserPopover.Account": "账号:", - "odc.page.Manage.PublicConnection": "公共连接", - "odc.components.TaskFlowPage.component.NumberOfChangedSqlStatements": "变更的 SQL 数量范围", "odc.components.RecordPage.CloseSession": "关闭会话", - "odc.components.CreateTablePartitionForm.ThePartitionOrderOfThe": "当前版本的 OB 的分区顺序显示可能存在异常,请查看 DDL 进行确认", "odc.RecycleBinPage.RecyleConfig.RecycleBinRetentionTime": "回收站保留时间", - "odc.components.FormTaskModal.LevelLevel": "等级 {level}", - "odc.components.ScriptManageModal.columns.Download": "下载", "odc.ScriptManageModal.ScriptEditorModal.EditScriptScriptname": "编辑脚本({scriptName})", "odc.RecycleBinPage.RecyleConfig.EnableRecycleBin": "启用回收站", "odc.component.VersionModal.newVersionConfig.OperationRecords": "操作记录", "odc.components.RecordPage.DisableARole": "停用角色", "odc.component.VersionModal.newVersionConfig.TheTaskCenterProvidesUnified": "任务中心提供统一的数据库变更管控,原异步执行功能升级为数据库变更,可按照管理员定义的审批流程,对公共只读连接发起数据库变更", "odc.component.MultiLineOverflowText.More": "更多", - "odc.component.VersionModal.NewVersion.ProvidesUnifiedDatabaseChangesAnd": "提供统一的数据库变更和全量的操作记录能力;脚本管理、表对象右键能力升级;支持切换独立 Session", - "odc.components.TaskFlowPage.component.ApprovalNodeLevel": "审批节点{level}", "odc.components.FormUserModal.Close": "关闭", - "odc.TaskManagePage.component.TaskTable.PublicConnection": "公共连接", "odc.components.RecordPage.Enable": "启用", - "odc.components.TaskFlowPage.component.LevelLevel": "等级{level}", "odc.common.network.script.YouCannotDownloadMoreThan": "不能同时下载超过 {MAXDOWNLOADCOUNT} 个文件", "odc.components.ScriptManageModal.columns.Edit": "编辑", "odc.components.RecordPage.BatchDelete": "批量删除", @@ -3191,32 +1662,21 @@ "odc.component.CommonTaskDetailModal.TaskFlow.Terminate": "终止", "odc.component.CommonTaskDetailModal.TaskFlow.ApprovalNodeCurrentapprovalcount": "审批节点{currentApprovalCount}", "odc.components.RecordPage.Terminate": "终止", - "odc.components.FormTaskModal.component.SelectATaskSubclass": "请选择任务子类", - "odc.components.TaskFlowPage.component.Level": "级", "odc.components.RecordPage.DeactivateProcess": "停用流程", "odc.ScriptManageModal.ScriptEditorModal.Cancel": "取消", - "odc.components.ScriptManageModal.columns.UpdateTime": "更新时间", "odc.components.RecordPage.EnableResourceGroups": "启用资源组", "odc.ScriptManageModal.ScriptEditorModal.ScriptName": "脚本名称", "odc.components.RecordPage.EnableUsers": "启用用户", "odc.component.SaveSQLModal.SaveScript": "保存脚本", - "odc.component.RecordPopover.components.PublicConnection": "所属公共连接", "odc.component.SaveSQLModal.EnterAScriptName": "请输入脚本名称", "odc.components.FormRecordExportModal.PublicConnection": "所属公共连接", - "odc.Header.WorkbenchMenu.AreYouSureYouWant": "是否确定删除脚本{scriptObjectName}", - "odc.components.RecordPage.EnterAPublicConnection": "请输入所属公共连接", - "odc.Header.WorkbenchMenu.DeleteScript": "删除脚本", "odc.component.SQLConfig.SetSessionVariables": "设置会话变量 >", - "odc.components.RecordPage.PublicConnection": "所属公共连接", - "odc.component.RecordPopover.components.EnterAPublicConnection": "请输入所属公共连接", "odc.ScriptManageModal.ScriptEditorModal.TheCurrentOperationIsNot": "当前的操作未保存,是否确定关闭窗口?", "odc.ScriptManageModal.ScriptEditorModal.CloseWindow": "关闭窗口", "odc.component.SaveSQLModal.ScriptName": "脚本名称", "odc.components.CreateAsyncTaskModal.TheMaximumSizeOfThe.2": "文件最多不超过 256 MB ,支持扩展名 .sql", "odc.components.RecordPage.Download": "下载", "odc.components.CreateAsyncTaskModal.TheMaximumSizeOfThe": "文件最多不超过 256 MB", - "odc.components.IndexPage.config.SupportsTypesOfAuditEvents": "支持 17类审计事件类型,确保安全合规,重要事件可追踪,审计报告可下载", - "odc.TaskManagePage.component.TaskTable.TheAttachmentUploadedByThe": "创建任务上传的附件保留时间为 {fileMaxRetainHours} 小时", "odc.components.CreateAsyncTaskModal.ClickOrDragMultipleFiles": "点击或将多个文件拖拽到这里上传", "odc.components.DDLResultSet.StatusBar.AutoIncrement": "自增", "odc.components.BlobFormatter.BlobViewModal.Image": "图片", @@ -3234,23 +1694,18 @@ "odc.components.BlobFormatter.BlobViewModal.TheSizeOfTheEditable": "可编辑的内容大小不能超过 {maxSizeText}", "odc.components.FormUserModal.ThePasswordCannotContainSpaces": "密码不能包含空格", "odc.components.SQLResultSet.ExecuteHistory.Completed": "完成", - "odc.components.SQLResultSet.ExecuteHistory.ObtainColumnComments": "获取列注释", "odc.components.SQLResultSet.ExecuteHistory.TotalTimeConsumed": "(总耗时:", "odc.components.SQLResultSet.ExecuteHistory.ObtainAlertContent": "获取告警内容", "odc.components.SQLResultSet.ExecuteHistory.ObtainEditableInformation": "获取可编辑信息", - "odc.components.SQLResultSet.ExecuteHistory.RewriteSql": "重写 SQL", - "odc.components.SQLResultSet.ExecuteHistory.ParseSqlStatements": "解析 SQL", "odc.components.SQLResultSet.ExecuteHistory.ObtainTheSqlType": "获取 SQL 类型", "odc.components.SQLResultSet.ExecuteHistory.Run": "执行", "odc.component.SaveSQLModal.TheScriptNameMustBe": "脚本名称不能为空", "odc.components.Status.More": "更多", "odc.components.PLBatchCompilePage.Ok": "确定", - "odc.component.TreeSearchBar.BatchCompilation": "批量编译", "odc.components.HeaderToolbar.CompileAllObjects": "编译全部对象", "odc.ResourceTree.actions.Download": "下载", "odc.helper.page.openPage.BatchCompilationLabel": "批量编译{label}", "odc.components.CompileResult.ObjectName": "对象名称", - "odc.component.FilterPopover.Reset": "重置", "odc.components.PLTable.Operation": "操作", "odc.plugins.4a.CurrentSqlExecutionIsNot": "不允许执行当前 SQL", "odc.components.CompileResult.Status": "状态", @@ -3268,20 +1723,14 @@ "odc.plugins.4a.TheCurrentSqlCannotBe": "当前 SQL 无法直接执行,请提交审批", "odc.components.ViewPage.Download": "下载", "odc.components.PLTable.Status": "状态", - "odc.src.util.valid.EnterAValidNumber": "请输入有效的数字", "odc.components.PLTable.ObjectType": "对象类型", "odc.components.PLBatchCompilePage.AreYouSureYouWant": "正在编译中,是否确定终止编译?", - "odc.component.FilterPopover.Filter": "筛选", "odc.TreeNodeMenu.config.table.Download": "下载", "odc.components.PLBatchCompilePage.Trigger": "触发器", "odc.components.CompileResult.Operation": "操作", - "odc.component.FilterPopover.Effective": "有效", "odc.EditorToolBar.actions.script.Download": "下载", - "odc.src.util.valid.EnterANumberBetweenMin": "请输入 {min} ~ {max} 之间的数字", "odc.components.HeaderToolbar.Termination": "终止", "odc.page.Gateway.customConnect.EncryptOrDataParameterError": "encrypt 或 data 参数错误", - "odc.components.TablePage.Download": "下载", - "odc.component.FilterPopover.Invalid": "无效", "odc.components.TypePage.Download": "下载", "odc.components.FunctionPage.Download": "下载", "odc.components.PLTable.View": "查看", @@ -3294,7 +1743,6 @@ "odc.components.PLBatchCompilePage.Bag": "包", "odc.components.TriggerPage.Download": "下载", "odc.components.SequencePage.Download": "下载", - "odc.component.FilterPopover.Ok": "确定", "odc.TreeNodeMenu.config.sequence.Download": "下载", "odc.components.CompileResult.CompilationResults": "编译结果", "odc.components.CompileResult.Effective": "有效", @@ -3302,113 +1750,54 @@ "odc.components.PLTable.Effective": "有效", "odc.components.PLTable.Invalid": "无效", "odc.component.helpDoc.doc.YouCanSpecifyTheTarget": "可指定 INSERT 语句的目标表名", - "odc.components.TaskOrderModal.AnalogData": "模拟数据", - "odc.components.FormMaskDataModal.RuleStatus": "规则状态", - "odc.components.TaskFlowPage.ProcessInformation": "流程信息", - "odc.components.FormMaskDataModal.Create": "新建", - "odc.FormMaskDataModal.component.rulePreview.ResultPreview": "结果预览", - "odc.components.TaskFlowPage.component.ObjectType": "对象类型", "odc.components.ExportDrawer.SelectAtLeastOneExport": "至少选择一个导出对象", - "odc.FormMaskDataModal.component.customSegement.EnterTitle": "请输入{title}", - "odc.components.FormMaskDataModal.RuleName": "规则名称", - "odc.components.FormMaskDataModal.Enable": "启用", "odc.TablePage.Partitions.PartitionMethodPartitionnamemapparttype": "分区方法: {partitionNameMapPartType}", - "odc.components.MaskDataPage.CreateADesensitizationRule": "新建脱敏规则", - "odc.components.TaskOrderModal.Import": "导入", - "odc.component.searchBar.SupportsSearchingForConnectionsHosts": "支持搜索连接/主机/集群/租户", "odc.components.FormMaskDataModal.config.ReplaceSensitiveCharactersWithCharacters": "对应敏感字符替换成相同类型的字符,保留原始数据的数据格式", "odc.CreateTable.TableIndex.Delete": "删除", "odc.components.CreateTable.Constraints": "约束", - "odc.component.ExportResultSetModal.DownloadData": "下载数据", - "odc.ExportForm.ConfigPanel.ManualExecution": "手动执行", "odc.TreeNodeMenu.config.table.Export": "导出", - "odc.components.FormMaskDataModal.SelectAStatus": "请选择状态", "odc.TreeNodeMenu.config.synonym.Export": "导出", - "odc.FormMaskDataModal.component.ruleDetail.ReplacementValue": "替换值", "odc.component.helpDoc.doc.ForExampleDbTableA": "例如: db*.table.*a, *.*.name", - "odc.component.MaskPolicyManager.editableCell.Exclude": "排除", "odc.TablePage.Constraints.PrimaryKeyConstraintsCannotBe": "主键约束不可修改;已存在的约束无法修改,仅支持新增/删除", - "odc.components.MaskDataPage.Operation": "操作", "odc.Columns.ColumnExtraInfo.Character.SortingRules": "排序规则", "odc.Columns.ColumnExtraInfo.DateSync.TimeSetting": "时间设置", - "odc.component.MaskPolicyManager.table.Cancel": "取消", - "odc.FormMaskDataModal.component.customSegement.SetsTheProportionOfSegments": "设置分段占总字符的比例。例如设置分段:「位数比例,25%,掩盖」", - "odc.component.ExportResultSetModal.PleaseFillInTheDocument": "请填写文件名称", "odc.TablePage.Constraints.UniqueConstraint": "唯一约束", "odc.component.TableRenameModal.TheContentInQuotationMarks": "引号中内容区分大小写", - "odc.FormMaskDataModal.component.ruleDetail.SpecifyACharacterSet": "指定字符集", "odc.ImportForm.FileSelecterPanel.YouCanImportDataFrom": "支持导入单表数据,可自定义映射字段", "odc.CreateTable.Columns.columns.Comment": "注释", "odc.TreeNodeMenu.config.view.Export": "导出", - "odc.components.MaskDataPage.Close": "关闭", - "odc.component.MaskPolicyManager.table.Edit": "编辑", - "odc.component.MaskPolicyManager.TheDesensitizationPolicyHasBeen": "脱敏策略已修改,是否确认保存", "odc.components.FormMaskDataModal.config.ShowTheFirstThreeAnd.1": "展示前三后四", - "odc.src.d.ts.ApplyForConnectionPermissions": "申请连接权限", "odc.ImportForm.FileSelecterPanel.OnlyCompressedFilesExportedBy": "仅支持上传由 ODC 导出的压缩文件,可批量导入数据或结构", - "odc.components.RelativeTaskFlow.Import": "导入", "odc.components.SQLResultSet.CancelExecution": "执行取消", - "odc.component.MaskPolicyManager.PolicyName": "策略名称", "odc.ImportForm.ConfigPanel.PleaseConfigureTheSysTenant": "请配置 sys 租户账号,该账号信息仅用于此次导入", "odc.ExportForm.ObjSelecterPanel.ExportTheEntireLibrary": "整库导出", "odc.Columns.ColumnExtraInfo.Enum.EnumeratedValues": "枚举值", - "odc.TableConstraint.Check.columns.ConstraintName": "约束名称", - "odc.component.ExportResultSetModal.SqlFileSettings": "SQL 文件设置", - "odc.component.MaskPolicyManager.actionMenu.ThePolicyNameAlreadyExists": "策略名称已存在", "odc.component.Log.ReplicationFailed": "复制失败", "odc.Columns.ColumnExtraInfo.Generation.VirtualColumnSettings": "虚拟列设置", - "odc.components.TaskFlowPage.component.AllPublicConnections": "全部公共连接", "odc.ImportForm.FileSelecterPanel.TheFilesAreExecutedIn": "文件将按磁盘顺序执行", - "odc.component.MaskPolicyManager.RuleCreationFailed": "规则创建失败", "odc.components.RecycleBinPage.Clear": "清空", - "odc.component.DetailModal.permission.PermissionType": "申请权限类型", - "odc.components.RelativeTaskFlow.Matched": "已匹配", - "odc.components.MaskDataPage.Cancel": "取消", "odc.components.FormMaskDataModal.config.TheOriginalDataIsSet": "原始数据将被置为空字符串", "odc.CreateTable.Columns.Delete": "删除", "odc.Columns.ColumnExtraInfo.Enum.SortingRules": "排序规则", - "odc.components.RelativeTaskFlow.AnalogData": "模拟数据", "odc.TablePage.Partitions.Expression": "表达式:", "odc.CreateTable.TableIndex.columns.Type": "类型", - "odc.page.Gateway.tutorial.FailedToInitializeTheConnection": "初始化连接失败", - "odc.FormMaskDataModal.component.ruleDetail.YouCanEnterUppercaseAnd": "可输入大小写字母、数字区间,多个字符或区间用英文逗号隔开", - "odc.component.DetailModal.permission.Enable": "启用", - "odc.components.TaskOrderModal.Save": "保存", - "odc.components.TaskOrderModal.TaskType": "任务类型", "odc.ImportDrawer.csvMapping.ImportFile": "导入文件", - "odc.component.MaskPolicyManager.CopyName": "复制 {name}", "odc.component.Log.Find": "查找", - "odc.components.MaskDataPage.component.Founder": "创建人", "odc.component.ThemeBtn.Theme": "主题", "odc.components.RecordPage.DesensitizationRules": "脱敏规则", "odc.Columns.ColumnExtraInfo.Precision.DayPrecision": "天精度", - "odc.component.MaskPolicyManager.actionMenu.Rename": "重命名", - "odc.component.MaskPolicyManager.table.TheDesensitizationRuleIsDisabled": "该脱敏规则已停用,匹配或排除的对象不会被处理", - "odc.components.MaskDataPage.View": "查看", "odc.component.helpDoc.doc.AddDeleteStatement": "添加删除语句", - "odc.components.TaskFlowPage.component.AssociatedConnection": "关联连接", - "odc.components.FormMaskDataModal.RuleCreationFailed": "规则创建失败", - "odc.FormMaskDataModal.component.rulePreview.TestData": "测试数据", "odc.TablePage.Partitions.Delete": "删除", "odc.TableConstraint.Foreign.columns.AssociatedTable": "关联表", "odc.CreateTable.Columns.columns.Type": "类型", - "odc.component.MaskPolicyManager.editableCell.Match": "匹配", - "odc.components.TaskOrderModal.SavedSuccessfully": "保存成功", - "odc.components.TaskOrderModal.ApplyForConnectionPermissions": "申请连接权限", - "odc.components.FormMaskDataModal.RuleCreatedSuccessfully": "规则创建成功", "odc.CreateTable.Columns.columns.Name": "名称", "odc.ImportForm.FileSelecterPanel.ImportObjectPreview": "导入对象预览", - "odc.components.MaskDataPage.component.RetainValidNumbersPrecision": "保留有效数字/精度", "odc.components.FormMaskDataModal.config.ReplaceTheLastFourDigits": "替换后四位", "odc.ExportSelecter.ExportCard.SearchKeywords": "搜索关键字", - "odc.component.MaskPolicyManager.table.DesensitizationRules": "脱敏规则", "odc.Log.component.Search.FindClips": "查找片段", "odc.TableConstraint.Foreign.columns.AssociatedSchema": "关联 Schema", - "odc.components.RelativeTaskFlow.Export": "导出", - "odc.component.ApplyPermission.form.PleaseEnterTheReasonFor": "请输入申请原因", "odc.CreateTable.TableConstraint.baseColumn.NonDelayed": "不可延迟", "odc.component.ExecuteSQLModal.Format": "格式化", - "odc.ExportForm.ConfigPanel.ExecutionMethodAfterTheApproval": "执行方式: 审批完成后", "odc.page.Manage.CanApply": "可申请", "odc.components.RecordPage.DesensitizationStrategy": "脱敏策略", "odc.ImportForm.ConfigPanel.TheAccountConfiguredForThe": "默认使用连接设置的账号,若连接失败,建议修改密码用于此次导入", @@ -3416,374 +1805,164 @@ "odc.ExportForm.ConfigPanel.SqlFileSettings": "SQL 文件设置", "odc.ImportDrawer.csvMapping.TargetTable": "目标表", "odc.CreateTable.TableIndex.columns.Empty": "空", - "odc.components.RelativeTaskFlow.DatabaseChanges": "数据库变更", - "odc.components.TaskOrderModal.WhenMultipleProcessesAreAssociated": "同一连接关联多个流程时,连接内的任务将按排序的优先级匹配流程", "odc.TableConstraint.Foreign.columns.Delete": "删除", - "odc.components.FormTaskModal.resourceForm.AllPublicConnections": "全部公共连接", - "odc.components.FormTaskModal.PreviousStepSetTheProcess": "上一步:设置流程", "odc.component.DetailModal.permission.TaskNumber": "任务编号", - "odc.components.FormMaskDataModal.TheRuleIsSavedSuccessfully": "规则保存成功", - "odc.components.TaskOrderModal.SetPriority": "设置优先级", "odc.TablePage.Partitions.Column": "列:", - "odc.component.MaskPolicyManager.SensitiveDataWillBePrioritized": "敏感数据将按照脱敏规则从上往下的排序优先级,进行匹配和排除", - "odc.component.connectionSelector.SelectConnectionSelectedlenAlllen": "选择连接({selectedLen}/{allLen})", "odc.TaskManagePage.component.TaskTools.OpenFolder": "打开文件夹", - "odc.components.TaskOrderModal.Export": "导出", "odc.ImportForm.ConfigPanel.TaskSettings": "任务设置", - "odc.components.FormMaskDataModal.Ok": "确定", - "odc.components.FormMaskDataModal.EditDesensitizationRules": "编辑脱敏规则", "odc.component.WindowManager.NotSaved": "未保存", - "odc.component.MaskPolicyManager.RenamedSuccessfully": "重命名成功", "odc.CreateTable.Columns.columns.DefaultValueExpression": "缺省值/表达式", - "odc.components.FormTaskModal.ProcessConfiguration": "流程配置", - "odc.FormMaskDataModal.component.customSegement.SetsTheIdentifierForThe": "设置分段末位的识别符。例如设置分段:「指定分隔符前,@,掩盖」", - "odc.components.MaskDataPage.DisableFailed": "停用失败", - "odc.component.ApplyPermission.form.ReasonForApplication": "申请原因", "odc.component.VersionModal.NewVersion.DarkTheme": "暗色主题", "odc.component.Log.Copy": "复制", "odc.components.FormMaskDataModal.config.Replace": "替换", - "odc.TableConstraint.Unique.columns.ConstraintName": "约束名称", - "odc.components.FormTaskModal.configForm.PermissionApplication": "权限申请", - "odc.components.FormTaskModal.resourceForm.AssociatedConnection": "关联连接", - "odc.FormMaskDataModal.component.customSegement.NumberOfDigits": "位数", - "odc.components.MaskDataPage.FailedToEnable": "启用失败", - "odc.component.MaskPolicyManager.editableCell.SelectADesensitizationRule": "请选择脱敏规则", "odc.CreateTable.TableIndex.columns.Invisible": "不可见", - "odc.component.MaskPolicyManager.TheRuleIsSavedSuccessfully": "规则保存成功", - "odc.components.MaskDataPage.Enabled": "启用成功", - "odc.components.MaskDataPage.component.DesensitizationMethod": "脱敏方式", "odc.components.CreateTable.Partition": "分区", "odc.components.DDLResultSet.DownloadData": "下载数据", - "odc.components.MaskDataPage.component.DesensitizationEffect": "脱敏效果", - "odc.components.RelativeTaskFlow.Disable": "停用", - "odc.components.FormTaskModal.RelatedResources": "相关资源", - "odc.component.ApplyPermission.ApplyForConnectionPermissions": "申请连接权限", "odc.Columns.ColumnExtraInfo.Precision.AnnualAccuracy": "年精度", - "odc.component.DetailModal.permission.Founder": "创建人", "odc.Columns.ColumnExtraInfo.Enum.EnterTheEnumerationValueAnd": "录入枚举值按“回车 Enter”确认", "odc.ExportForm.ObjSelecterPanel.ExportRange": "导出范围", - "odc.component.MaskPolicyManager.Return": "返回", - "odc.components.TaskFlowPage.component.ConnectionList": "连接列表", "odc.component.Log.CopiedSuccessfully": "复制成功", "odc.ExportForm.ConfigPanel.DataFileSettings": "数据文件设置", "odc.component.helpDoc.doc.SetOptionsForStructureDefinition": "设置压缩文件中包含的结构定义文件(.sql)相关选项", - "odc.components.FormMaskDataModal.EnterARuleName": "请输入规则名称", - "odc.component.ApplyPermissionTip.InsufficientDatabasePermissions": "当前数据库权限不足", "odc.ExportForm.ExportSelecter.SelectObject": "选择对象", - "odc.component.MaskPolicyManager.RenameFailed": "重命名失败", - "odc.components.MaskDataPage.component.RuleName": "规则名称:", - "odc.component.DetailModal.permission.Disable": "停用", - "odc.component.MaskPolicyManager.actionMenu.Copy": "复制", "odc.TaskManagePage.component.TaskTable.PleaseEnterTheNumber": "请输入编号", - "odc.component.MaskPolicyManager.ManageDesensitizationPolicies": "管理脱敏策略", "odc.CreateTable.TableIndex.columns.Column": "列", - "odc.CreateTable.TableIndex.columns.IndexName": "索引名称", - "odc.components.ScriptManageModal.ConfirmDeletion": "确认删除", "odc.CreateTable.TableConstraint.baseColumn.VerifyNow": "立即验证", - "odc.components.TaskOrderModal.DatabaseChanges": "数据库变更", - "odc.FormMaskDataModal.component.customSegement.OtherDigits": "其他位数", - "odc.FormMaskDataModal.component.customSegement.AddSegmentsFieldslength": "添加分段({fieldsLength}/10)", - "odc.component.ApplyPermission.AreYouSureYouWant": "是否确认取消权限申请?", "odc.TreeNodeMenu.config.table.Import": "导入", "odc.components.FormMaskDataModal.config.ReplaceTheMaskWithFor": "对应敏感字符用 * 替换掩盖,保留原始数据长度", - "odc.components.MaskDataPage.component.SegmentSelection": "分段选择", - "odc.components.FormMaskDataModal.RuleDetails": "规则详情", - "odc.components.FormTaskModal.resourceForm.SelectResources": "选择资源", - "odc.components.TaskOrderModal.ProcessPriority": "流程优先级", - "odc.component.MaskPolicyManager.actionMenu.Delete": "删除", "odc.components.ImportDrawer.PreviousStep.1": "上一步:", "odc.component.helpDoc.doc.MatchProcessesByPriorityYou": "按优先级匹配流程,可在流程管理设置优先级", - "odc.TableConstraint.Primary.columns.ConstraintName": "约束名称", - "odc.components.FormTaskModal.resourceForm.PartialPublicConnection": "部分公共连接", "odc.TablePage.Constraints.PrimaryKeyConstraint": "主键约束", - "odc.components.MaskDataPage.RuleName": "规则名称", - "odc.component.DetailModal.permission.Status": "状态", "odc.components.FormMaskDataModal.config.HashEncryption": "哈希加密", - "odc.components.MaskDataPage.DesensitizationRules": "脱敏规则", - "odc.component.MaskPolicyManager.DoNotSave": "不保存", - "odc.component.ExportResultSetModal.LimitOnTheNumberOf": "查询结果条数限制", "odc.component.helpDoc.doc.UseAsTheWildcardAnd": "使用「*」作为通配符,使用「,」 为分隔符", "odc.CreateTable.TableConstraint.UniqueConstraint": "唯一约束", - "odc.components.MaskDataPage.AreYouSureYouWant.1": "是否确认删除脱敏规则?", "odc.components.SQLResultSet.SuccessfulExecution": "执行成功", "odc.CreateTable.TableConstraint.baseColumn.DelayedState": "可延迟状态", "odc.TableConstraint.Foreign.columns.Update": "更新", - "odc.component.MaskPolicySelecter.ManageDesensitizationPolicies": "管理脱敏策略", - "odc.component.ExportResultSetModal.PleaseFillInTheNumber": "请填写条数限制", - "odc.FormMaskDataModal.component.ruleDetail.SegmentTheCharactersFromLeft.1": "将字符按从左至右的顺序进行分段,并选择是否替换", - "odc.FormMaskDataModal.component.ruleDetail.SegmentTheCharactersFromLeft": "将字符按从左至右的顺序进行分段,并选择是否掩盖", "odc.component.Log.Refresh": "刷新", - "odc.components.MaskDataPage.Edit": "编辑", "odc.CreateTable.TableConstraint.baseColumn.DelayedVerification": "延迟验证", - "odc.components.MaskDataPage.Disable": "停用", - "odc.FormMaskDataModal.component.customSegement.DigitRatio": "位数比例", - "odc.components.FormMaskDataModal.FailedToSaveTheRule": "规则保存失败", "odc.ExportForm.ConfigPanel.PleaseConfigureTheSysTenant": "请配置 sys 租户账号,该账号信息仅用于此次导出", "odc.Columns.ColumnExtraInfo.Generation.Storage": "存储", "odc.components.ExportDrawer.SelectObject": "选择对象", - "odc.components.TaskFlowPage.SetPriority": "设置优先级", "odc.Partition.CreateTablePartitionRuleForm.PartitionSettings": "分区设置", "odc.ImportForm.ConfigPanel.ImportTargetTable": "导入目标表", "odc.CreateTable.TableConstraint.PrimaryKeyConstraint": "主键约束", - "odc.component.ExportResultSetModal.QuerySql": "查询 SQL", "odc.CreateTable.Columns.columns.Length": "长度", - "odc.components.TaskOrderModal.Sort": "排序", "odc.CreateTable.TableIndex.columns.Scope": "范围", "odc.ExportForm.ExportSelecter.SelectedtreedatacountItemsSelected": "已选 {selectedTreeDataCount} 项", "odc.TablePage.ShowTableBaseInfoForm.Owner": "所有者", - "odc.component.MaskPolicyManager.table.AddDesensitizationRules": "添加脱敏规则", - "odc.components.RelativeTaskFlow.TaskFlowName": "任务流程名称", - "odc.components.MaskDataPage.UpdateTime": "更新时间", - "odc.component.ApplyPermission.form.PermissionType": "申请权限类型", "odc.components.FormMaskDataModal.config.NotCoveredUp": "不掩盖", - "odc.component.MaskPolicyManager.Save": "保存", - "odc.component.MaskPolicySelecter.NonDesensitization": "不脱敏", "odc.ExportForm.ConfigPanel.StructureFileSettings": "结构文件设置", "odc.page.Manage.ReadWrite": "读写", - "odc.component.MaskPolicyManager.RuleCreatedSuccessfully": "规则创建成功", "odc.ExportForm.ConfigPanel.AddADropStatementBefore": "Create 语句前添加 Drop 语句", - "odc.component.ExportResultSetModal.Cancel": "取消", "odc.component.DetailModal.permission.TaskType": "任务类型", "odc.ExportForm.ExportSelecter.Clear": "清空", - "odc.component.ApplyPermission.SuccessfulApplication": "申请成功!", "odc.components.ImportDrawer.ImportSettings": "导入设置", "odc.TableConstraint.Primary.Delete": "删除", - "odc.components.TaskFlowPage.ApplyForConnectionPermissions": "申请连接权限", "odc.CreateTable.TableConstraint.CheckConstraints": "检查约束", - "odc.components.FormTaskModal.component.AutomaticApproval": "自动审批", - "odc.components.FormMaskDataModal.Save": "保存", "odc.ExportForm.ExportSelecter.AreYouSureYouWant": "是否确定清空已选对象?", - "odc.TableConstraint.Foreign.columns.ConstraintName": "约束名称", "odc.components.FormMaskDataModal.config.CustomSegmentation": "自定义分段", "odc.component.Log.NoDataAvailable": "暂无数据", - "odc.ExportForm.ConfigPanel.IfYouDoNotUse": "若不使用 sys 租户账号,导出可能缺少注释和索引", - "odc.component.ApplyPermissionButton.ApplyForConnectionPermissions": "申请连接权限", "odc.component.MaskPolicySelecter.Masktypesmapitemtype": "({maskTypesMapItemType})", "odc.components.FormMaskDataModal.config.CharacterReplacement": "字符替换", - "odc.components.FormMaskDataModal.Disable": "停用", - "odc.component.ApplyPermission.form.ReadWriteIncludingReadOnly": "读写(包含只读)", "odc.TablePage.ShowTableBaseInfoForm.LastModifiedDate": "最近修改日期", "odc.ImportForm.ConfigPanel.TheImportTargetTableCannot": "导入目标表不能为空", - "odc.components.TaskFlowPage.component.ObjectName": "对象名称", - "odc.components.MaskDataPage.component.DesensitizationDetails": "脱敏详情", - "odc.component.MaskPolicyManager.Cancel": "取消", "odc.components.FormMaskDataModal.config.ReplaceAll": "替换全部", - "odc.components.MaskDataPage.TheDesensitizationRuleAfterBeing": "被停用后的脱敏规则,可能导致引用规则的敏感数据识别策略失效", - "odc.component.ApplyPermission.Submit": "提交", - "odc.component.DetailModal.permission.CreationTime": "创建时间", - "odc.components.MaskDataPage.DisabledDesensitizationRulesAreStill": "被停用的脱敏规则仍保留,支持启用", - "odc.components.TaskFlowPage.component.PartialPublicConnection": "部分公共连接", "odc.ResourceTree.actions.Export": "导出", - "odc.components.FormMaskDataModal.Cancel": "取消", - "odc.FormMaskDataModal.component.customSegement.SetsTheNumberOfSegments": "设置无法判断数量的分段。例如设置分段:「其他位数,掩盖」「位数,2,不掩盖」", "odc.components.FormMaskDataModal.config.ReplaceTheCorrespondingSensitiveCharacter": "对应敏感字符用替换值进行替换,不保留原始数据长度", - "odc.ExportForm.ConfigPanel.AutomaticExecution": "自动执行", - "odc.components.RelativeTaskFlow.PermissionApplication": "权限申请", - "odc.component.MaskPolicyManager.table.Remove": "移除", - "odc.components.MaskDataPage.AreYouSureYouWant": "是否确定停用脱敏规则?", - "odc.components.FormMaskDataModal.DesensitizationEffect": "脱敏效果", - "odc.FormMaskDataModal.component.ruleDetail.CustomSegmentation": "自定义分段", - "odc.FormMaskDataModal.component.ruleDetail.RetainValidNumbersPrecision": "保留有效数字/精度", "odc.components.SQLResultSet.ExecutionFailed": "执行失败", "odc.TableConstraint.Foreign.columns.Column": "列", - "odc.components.RelativeTaskFlow.MatchOrNot": "是否匹配", "odc.components.CreateTable.EditToolbar.NextStepConfirmSql": "下一步:确认 SQL", - "odc.TableConstraint.Foreign.columns.AssociatedFields": "关联字段", - "odc.components.FormMaskDataModal.TheRuleNameAlreadyExists": "规则名称已存在", - "odc.components.TaskFlowPage.component.ResourceGroup": "资源组", - "odc.component.MaskPolicyManager.table.MatchingRuleDatabaseNameTable": "匹配规则(库名.表名.字段名)", "odc.CreateTable.TableConstraint.baseColumn.WhetherToEnable": "是否启用", "odc.src.d.ts.PackageBody": "程序包体", - "odc.components.MaskDataPage.component.UpdateTime": "更新时间", "odc.components.FormMaskDataModal.config.ShowTheFirstThreeAnd": "展示前三后二", - "odc.component.MaskPolicyManager.table.Operation": "操作", "odc.components.ExportDrawer.PreviousStep": "上一步:", - "odc.components.FormMaskDataModal.TheRuleNameCannotExceed": "规则名称不超过 48 个字符", - "odc.component.ApplyPermission.Cancel": "取消", - "odc.TaskManagePage.component.TaskTable.ApplyForConnectionPermissions": "申请连接权限", "odc.component.Log.Download": "下载", "odc.TableConstraint.Unique.columns.Column": "列", - "odc.FormMaskDataModal.component.rulePreview.DesensitizationVerification": "脱敏验证", "odc.component.WindowManager.Running": "运行中", "odc.Columns.ColumnExtraInfo.DateSync.UpdateBasedOnTheCurrent": "根据当前时间戳更新", "odc.components.CreateTable.Index": "索引", "odc.components.RecycleBinPage.Delete": "删除", - "odc.FormMaskDataModal.component.ruleDetail.EnterACharacterSet": "请输入字符集", - "odc.components.MaskDataPage.component.ReplacementValue": "替换值", - "odc.components.MaskDataPage.DesensitizationMethod": "脱敏方式", - "odc.components.MaskDataPage.Status": "状态", - "odc.component.DetailModal.permission.RiskLevel": "风险等级", "odc.components.FormMaskDataModal.config.ShowPreviousAndLater": "展示前一后一", - "odc.components.MaskDataPage.Delete": "删除", "odc.CreateTable.Columns.columns.VirtualColumn": "虚拟列", "odc.component.WorkspaceSideTip.WelcomeToTheOceanbaseTutorial": "欢迎使用 OceanBase 教程中心", "odc.CreateTable.Columns.columns.DecimalPoint": "小数点", "odc.ExportForm.ObjSelecterPanel.ExportObjects": "导出对象", "odc.components.FormMaskDataModal.config.Rounding": "取整", - "odc.component.MaskPolicyManager.table.Match": "匹配:", "odc.component.GlobalHeader.OceanbaseDeveloperCenter": "OceanBase 开发者中心", "odc.CreateTable.TableIndex.columns.Method": "方法", "odc.component.helpDoc.doc.TheSegmentationRuleTakesPrecedence": "分段规则优先从上至下,将字符按从左往右的顺序进行分段", - "odc.components.RecordPage.ApplyForConnectionPermissions": "申请连接权限", - "odc.components.MaskDataPage.EnterARuleName": "请输入规则名称", - "odc.FormMaskDataModal.component.customSegement.BeforeTheDelimiterIsSpecified": "指定分隔符前", - "odc.components.MaskDataPage.component.EncryptionAlgorithm": "加密算法", - "odc.components.FormMaskDataModal.CreateADesensitizationRule": "新建脱敏规则", "odc.components.CreateTable.BasicInformation": "基本信息", - "odc.page.Manage.DataDesensitization": "数据脱敏", "odc.component.ThemeBtn.DefaultTheme": "默认主题", - "odc.components.MaskDataPage.DeletedSuccessfully": "删除成功", "odc.TableConstraint.Primary.columns.Column": "列", "odc.component.PageLoading.ThereAreStillPropsqueuewaitnumberPeople": "前方{propsQueueWaitNumber}人排队中,请耐心等待。", "odc.TablePage.Constraints.ForeignKeyConstraint": "外键约束", - "odc.components.TaskOrderModal.Cancel": "取消", "odc.ExportForm.ConfigPanel.CsvSettings": "CSV 设置", "odc.ExportForm.ObjSelecterPanel.PartialExport": "部分导出", - "odc.TaskManagePage.component.TaskTable.PermissionApplication": "权限申请", - "odc.component.ExportResultSetModal.ExportSqlToAnotherSheet": "导出 SQL 到另一个 Sheet", - "odc.component.ExportResultSetModal.ExcelFileSettings": "Excel 文件设置", "odc.CreateTable.TableConstraint.ForeignKeyConstraint": "外键约束", "odc.components.FormMaskDataModal.config.ReplaceTheFirstThree": "替换前三位", "odc.component.WorkspaceSideTip.GetStartedWithDistributedDatabases": "快速入门分布式数据库,掌握 OceanBase 核心能力", - "odc.components.MaskDataPage.Ok": "确定", "odc.component.helpDoc.doc.SetOptionsSuchAsThe": "设置压缩文件中包含的数据文件格式等相关选项", - "odc.components.MaskDataPage.Enable": "启用", "odc.components.FormMaskDataModal.config.Empty": "置空", "odc.Columns.ColumnExtraInfo.Precision.SecondPrecision": "秒精度", - "odc.FormMaskDataModal.component.rulePreview.PleaseEnterTestData": "请输入测试数据", - "odc.FormMaskDataModal.component.customSegement.SetsTheNumberOfCharacters": "设置分段的字符数量。例如设置分段:「位数,3,掩盖」", - "odc.component.MaskPolicyManager.table.Ok": "确定", - "odc.components.FormTaskModal.resourceForm.TheAssociatedConnectionMatchesThe": "关联的连接将默认匹配当前流程;如需修改,可在流程管理列表设置流程优先级", - "odc.component.MaskPolicyManager.table.Sort": "排序", - "odc.component.MaskPolicyManager.table.Exclude": "排除:", "odc.Columns.ColumnExtraInfo.Number.OnlyOneAutoIncrementField": "每个表仅设置一个自增字段", - "odc.components.MaskDataPage.component.CustomSegmentation": "自定义分段", - "odc.component.ApplyPermission.form.ReadOnly": "只读", "odc.components.FormMaskDataModal.config.CalculateTheHashValueTo": "通过指定算法对数据进行运算,计算出哈希值替代原始数据", "odc.components.ImportDrawer.PleaseUploadTheImportFile": "请上传导入文件", - "odc.component.ExportResultSetModal.SpecifyATableName": "指定表名", "odc.components.ExportDrawer.ExportSettings": "导出设置", - "odc.component.MaskPolicySelecter.DataDesensitization": "数据脱敏", - "odc.component.DetailModal.permission.ReasonForApplication": "申请原因", - "odc.component.DetailModal.permission.MaxrisklevelLevel": "{maxRiskLevel}级", - "odc.component.DetailModal.permission.ConnectionName": "连接名称", - "odc.component.MaskPolicyManager.FailedToSaveTheRule": "规则保存失败", - "odc.components.MaskDataPage.DisabledSuccessfully": "停用成功", - "odc.component.DetailModal.permission.ApplyForAPublicConnection": "申请公共连接", "odc.TableConstraint.Check.columns.CheckConditions": "检查条件", "odc.components.FormMaskDataModal.config.ApplicableToNumericTypesYou": "适用于数值类型,支持保留小数点位数不超过 5 位", - "odc.components.MaskDataPage.AfterTheDesensitizationRuleIs": "删除脱敏规则后,可能导致引用规则的敏感数据识别策略失效", - "odc.component.MaskPolicyManager.table.ThereAreUneditedDesensitizationRules": "存在未编辑完成的脱敏规则,是否确定修改?", - "odc.components.PublicConnectionPage.RelatedProcesses": "相关流程", - "odc.components.TaskFlowPage.component.AutomaticApproval": "(自动审批)", - "odc.ImportForm.ConfigPanel.CurrentConnectionName": "当前连接: {name}", "odc.TreeNodeMenu.config.sequence.Export": "导出", "odc.components.SessionManagementPage.CloseQuery": "关闭查询", - "odc.component.connectionSelector.SelectedlenItemsSelected": "已选 {selectedLen} 项", "odc.components.CreateTable.BasicInformationAsRequiredOptional": "基本信息,列为必填项,其他选填", - "odc.components.RelativeTaskFlow.Enable": "启用", "odc.components.ExportDrawer.NextStep": "下一步:", - "odc.components.TaskFlowPage.RelatedConnections": "相关连接", "odc.component.ThemeBtn.DarkTheme": "暗黑主题", "odc.components.CreateTable.SubmitAndConfirmSql": "提交并确认 SQL", "odc.components.ImportDrawer.UploadFiles": "上传文件", - "odc.component.DetailModal.permission.PermissionApplication": "权限申请", - "odc.components.FormMaskDataModal.AreYouSureYouWant.1": "是否确定取消新建?", - "odc.FormMaskDataModal.component.rulePreview.PreviewOfDesensitizationResults": "脱敏结果预览", - "odc.FormMaskDataModal.component.ruleDetail.SegmentSelection": "分段选择", "odc.Columns.ColumnExtraInfo.Number.FillZero": "填充零", - "odc.component.MaskPolicyManager.editableCell.EnterAMatchingRule": "请输入匹配规则", - "odc.component.ExportResultSetModal.CsvFileSettings": "CSV 文件设置", - "odc.FormMaskDataModal.component.ruleDetail.ForExampleTheDataBefore": "例如:脱敏前数据是 0~3 和 a~d 的数字字母组合,脱敏后也是这个范围内的数字和字母", - "odc.components.SQLResultSet.ItemcountSqlItemlable": "{itemCount} 条 SQL {itemLabel}", - "odc.FormMaskDataModal.component.ruleDetail.PleaseEnterAReplacementValue": "请输入替换值", "odc.components.CreateTable.EditToolbar.Cancel": "取消", "odc.Columns.ColumnExtraInfo.Number.ValueSetting": "数值设置", "odc.Columns.ColumnExtraInfo.Number.Unsigned": "无符号", "odc.TablePage.Constraints.CheckConstraints": "检查约束", - "odc.components.FormTaskModal.NextStepAssociateConnections": "下一步: 关联连接", "odc.Columns.ColumnExtraInfo.Character.CharacterSet": "字符集", "odc.TableConstraint.Unique.Delete": "删除", - "odc.components.TaskFlowPage.CreateProcess": "新建流程", "odc.components.FormMaskDataModal.config.ReservedFormat": "保留格式", - "odc.components.ResourceGroupPage.RelatedProcesses": "相关流程", - "odc.components.TaskOrderModal.TaskFlowName": "任务流程名称", "odc.ImportDrawer.ImportForm.FileUploading": "文件上传中", "odc.components.ImportDrawer.Submit": "提交", - "odc.ImportForm.ConfigPanel.IfYouDoNotUse": "若不使用 sys 租户账号,导入可能缺少注释和索引", "odc.components.ImportDrawer.NextStep": "下一步:", - "odc.FormMaskDataModal.component.ruleDetail.EncryptionAlgorithm": "加密算法", - "odc.components.MaskDataPage.DetailsOfDesensitizationRules": "脱敏规则详情", - "odc.component.MaskPolicyManager.AllPolicies": "全部策略", "odc.components.FormMaskDataModal.config.NotReplaced": "不替换", "odc.ExportForm.ConfigPanel.TheAccountConfiguredForThe": "默认使用连接设置的账号,若连接失败,建议修改密码用于此次导出", "odc.Columns.ColumnExtraInfo.Enum.CharacterSet": "字符集", "odc.component.VersionModal.NewVersion.TheNewDarkThemeHas": "全新暗色主题已上线", - "odc.components.RelativeTaskFlow.ProcessStatus": "流程状态", "odc.components.CreateTable.Column": "列", - "odc.components.MaskDataPage.component.CreationTime": "创建时间", "odc.page.Manage.ReadOnly": "只读", - "odc.component.ApplyPermission.form.SelectPublicConnection": "选择公共连接", "odc.components.FormMaskDataModal.config.CoverUp": "掩盖", - "odc.components.MaskDataPage.component.SpecifyACharacterSet": "指定字符集", - "odc.component.connectionSelector.Clear": "清空", - "odc.components.FormMaskDataModal.AreYouSureYouWant": "是否确定取消编辑?取消保存后,所编辑的内容将不生效", - "odc.components.TaskFlowPage.component.PublicConnection": "公共连接", "odc.ExportForm.ConfigPanel.TaskSettings": "任务设置", - "odc.components.RolePage.component.DesensitizationRuleManagement": "脱敏规则管理", "odc.component.DetailModal.dataMocker.ExecutionTime": "执行时间", "odc.components.TablePage.Export": "导出", "odc.component.CommonTaskDetailModal.TaskFlow.AutomaticApproval": "(自动审批)", - "odc.component.AsyncTaskModal.ExecutionTime": "执行时间", - "odc.components.ResourceSelector.CanApply": "可申请", "odc.components.TaskTimer.ManualExecution": "手动执行", "odc.components.TaskTimer.ExecutionMethodAfterTheApproval": "执行方式:审批完成后", "odc.components.TaskManagePage.ManualExecution": "手动执行", - "odc.components.RolePage.component.DesensitizationPolicyManagement": "脱敏策略管理", - "odc.components.FormTaskModal.SetPriority": "设置优先级", - "odc.components.FormTaskModal.IfTheConnectionIsCreated": "新建成功,关联的连接已默认匹配该流程;如需修改连接匹配的流程,可", "odc.components.TaskTimer.ExecutionTime": "执行时间", - "odc.components.TaskOrderModal.TheBuiltInProcessOf": "系统内置流程默认优先级最低,不支持修改", - "odc.components.RolePage.component.OperationAuditManagement": "操作审计管理", "odc.components.TaskManagePage.ExecuteNow": "立即执行", "odc.Partitions.AddPartitionModal.CreatePartition": "新建分区", "odc.components.TaskTimer.SelectAnExecutionTime": "请选择执行时间", "odc.components.CreateTable.PleaseFillInTheBasic": "请填写基本信息和列", - "odc.components.RolePage.component.OperationAudit": "操作审计", "odc.components.TaskTimer.ExecutionMethod": "执行方式", "odc.components.TaskTimer.ScheduledExecution": "定时执行", "odc.components.TaskTimer.IfTheApprovalIsNot": "若执行时间前未完成审批,则任务将终止不执行", "odc.components.TaskManagePage.ScheduledExecution": "定时执行", - "odc.component.ApplyPermission.PermissionApplicationSubmittedSuccessfullyRescount": "权限申请提交成功,已生成{resCount}条审批任务", "odc.network.table.CurrentlyNoSqlCanBe": "当前无 SQL 可提交", "odc.components.TaskTimer.ExecuteNow": "立即执行", - "odc.components.RolePage.component.DesensitizationStrategy": "脱敏策略", "odc.components.CreateAsyncTaskModal.TaskSettings": "任务设置", - "odc.components.RolePage.component.DesensitizationRules": "脱敏规则", "odc.component.DataTransferModal.ExecutionTime": "执行时间", "odc.component.DataMockerDrawer.form.TaskSettings": "任务设置", "odc.ImportForm.FileSelecterPanel.TheFileHasNoContent": "该文件无内容", "odc.component.MaskPolicySelecter.DesensitizationRuleShownumber": "脱敏规则{showNumber}:", - "odc.ExportForm.ObjSelecterPanel.CurrentConnectionConnectionname": "当前连接: {connectionName}", - "odc.component.DataTransferModal.NonDesensitization": "不脱敏", - "odc.component.MaskPolicyManager.AreYouSureYouWant": "确认要删除脱敏策略吗?", - "odc.components.TaskOrderModal.TaskFlowDisabled": "任务流程已停用", - "odc.component.MaskPolicyManager.CreateAPolicy": "新建策略", - "odc.component.MaskPolicyManager.Ok": "确定", - "odc.component.MaskPolicyManager.WhetherToCancelTheNew": "是否取消新建策略", - "odc.component.MaskPolicyManager.SelectAtLeastOneRule": "至少选择一条规则", - "odc.component.MaskPolicyManager.AfterTheDesensitizationPolicyIs": "删除脱敏策略后,相关字段匹配规则将移除", - "odc.component.MaskPolicyManager.PolicyNamePolicyindex": "策略名称-{policyIndex}", - "odc.FormMaskDataModal.component.ruleDetail.SupportsCombinationsOfEnglishNumbers": "支持英文、数字和特殊字符的组合(即:,~)", - "odc.component.DataTransferModal.DesensitizationData": "脱敏数据", - "odc.component.MaskPolicyManager.actionMenu.EnterAPolicyName": "请输入策略名称", - "odc.component.MaskPolicyManager.NoDesensitizationStrategy": "暂无脱敏策略", - "odc.component.MaskPolicyManager.actionMenu.NoMoreThanCharacters": "不超过 32 个字符", "odc.components.SQLResultSet.ItemcountSqlItemlabel": "{itemCount} 条 SQL {itemLabel}", "odc.component.DataTransferModal.DataDesensitizationMayResultIn": "数据脱敏可能会导致导出执行时间延长,以及导出结果的数据膨胀", "odc.components.PartitionPolicyTable.configModal.NamingRules": "命名规则", "odc.CreateShadowSyncModal.SelectPanel.ShadowTableName": "影子表名", - "odc.components.TaskOrderModal.PartitionPlan": "分区计划", "odc.components.PartitionPolicyTable.configModal.Cancel": "取消", "odc.src.d.ts.ToBeAnalyzed": "待分析", "odc.StructConfigPanel.StructAnalysisResult.UnsynchronizedTables": "不同步的表", @@ -3791,16 +1970,13 @@ "odc.StructConfigPanel.RecordSQLView.SourceTableStructure": "源表结构", "odc.components.PartitionPolicyTable.configModal.Year": "年", "odc.components.PartitionPolicyTable.NamingRulePrefixPartitionnamingprefixSuffix": "命名规则: 前缀 {partitionNamingPrefix},后缀 {partitionNamingSuffixExpression}", - "odc.component.AddConnectionForm.SysForm.SysTenantAccountSettings": "sys 租户账号设置", "odc.components.PartitionPolicyTable.OnlyTablesThatAreNot": "仅显示未设置的表", "odc.components.PartitionDrawer.Cancel": "取消", "odc.components.CreateShadowSyncModal.AreYouSureYouWant": "确认取消影子表同步吗?", "odc.CreateShadowSyncModal.SelectPanel.PartialTable": "部分表", "odc.StructConfigPanel.StructAnalysisResult.SqlPreview": "SQL 预览", - "odc.components.FormTaskModal.configForm.ShadowTable": "影子表", "odc.components.CreateShadowSyncModal.PreviousStepPrevstepname": "上一步: {prevStepName}", "odc.src.d.ts.Consistent": "一致", - "odc.component.DetailModal.shadowSync.Remarks": "备注", "odc.components.PartitionDrawer.SetPartitionPoliciesForAll": "请设置所有 Range 分区表的分区策略", "odc.StructConfigPanel.StructAnalysisResult.column.SourceTable": "源表", "odc.components.CreateShadowSyncModal.interface.ExecutionFailed": "执行失败", @@ -3813,13 +1989,11 @@ "odc.component.CommonTaskDetailModal.TaskRecord.TaskNumber": "任务编号", "odc.src.d.ts.Skip": "跳过", "odc.StructConfigPanel.StructAnalysisResult.column.ShadowTable": "影子表", - "odc.components.FormTaskModal.configForm.ConfirmPartitionPolicy": "确认分区策略", "odc.components.PartitionPolicyTable.configModal.Ok": "确定", "odc.components.PartitionDrawer.AreYouSureYouWant": "确认取消新建分区计划吗?", "odc.component.CommonTaskDetailModal.TaskFlow.ViewApprovalDetails": "查看审批详情", "odc.component.EditPLParamsModal.ValueInput.SetToNull": "设置为 NULL", "odc.component.CommonTaskDetailModal.TaskRecord.CreationTime": "创建时间", - "odc.components.FormTaskModal.configForm.PartitionPlan": "分区计划", "odc.components.PartitionPolicyTable.configModal.OnlyEnglishDigitsAndUnderscores": "仅支持英文/数字/下划线,且以英文开头", "odc.components.PartitionPolicyTable.configModal.NoMoreThanCharacters": "不超过 32 个字符", "odc.components.DDLResultSet.ColumnModeModal.Comment": "注释", @@ -3830,11 +2004,9 @@ "odc.StructConfigPanel.StructAnalysisResult.column.AnalysisResults": "分析结果", "odc.components.PartitionPolicyTable.configModal.NumberOfPreCreatedPartitions": "预创建分区数量", "odc.CreateShadowSyncModal.SelectPanel.AddPrefix": "添加前缀", - "odc.component.DetailModal.partition.CreationTime": "创建时间", "odc.components.TutorialPage.helper.InsertToWorkbench": "插入到工作台", "odc.StructConfigPanel.RecordSQLView.StructureChangeSql": "结构变更SQL", "odc.component.EditPLParamsModal.ValueInput.SetToAnEmptyString": "设置为空字符串", - "odc.component.DetailModal.partition.Founder": "创建人", "odc.components.CreateShadowSyncModal.SelectObject": "选择对象", "odc.components.PartitionPolicyTable.configModal.SetPartitionPolicies": "设置分区策略", "odc.CreateShadowSyncModal.SelectPanel.NoMoreThanCharacters": "不超过 32 个字符", @@ -3842,14 +2014,10 @@ "odc.components.CreateShadowSyncModal.CreateAShadowTableSynchronization": "新建影子表同步", "odc.CreateShadowSyncModal.SelectPanel.AllTables": "全部表", "odc.CreateShadowSyncModal.SelectPanel.OnlyEnglishNumbersAndUnderscores": "仅支持英文/数字/下划线", - "odc.component.DetailModal.partition.TaskNumber": "任务编号", "odc.component.CommonTable.TableInfo.SelectAll": "全选所有", "odc.StructConfigPanel.StructAnalysisResult.column.Skip": "跳过", - "odc.components.TaskOrderModal.ShadowTable": "影子表", "odc.component.helpDoc.doc.TheShadowTableNameIs": "影子表名根据源表名添加前缀或后缀的方式自动生成", "odc.components.CreateShadowSyncModal.interface.SuccessfulExecution": "执行成功", - "odc.components.TaskFlowPage.PartitionPlan": "分区计划", - "odc.component.DetailModal.partition.InspectionCycle": "巡检周期", "odc.components.CreateShadowSyncModal.Cancel": "取消", "odc.components.PartitionPolicyTable.configModal.Day": "日", "odc.components.PartitionPolicyTable.NumberOfPartitions": "分区数量", @@ -3863,17 +2031,12 @@ "odc.CreateShadowSyncModal.StructConfigPanel.StructuralAnalysis": "结构分析", "odc.components.PartitionDrawer.InspectionCycle": "巡检周期", "odc.StructConfigPanel.RecordSQLView.StructuralAnalysisDetails": "结构分析详情", - "odc.CreateShadowSyncModal.SelectPanel.Library": "所属库", "odc.component.CommonTaskDetailModal.TaskFlow.ConfirmPolicy": "确认策略", "odc.CreateShadowSyncModal.SelectPanel.SelectASynchronizationObject": "请选择同步对象", "odc.components.PartitionDrawer.FirstDayOfEachMonth": "每月第一天", - "odc.component.DetailModal.partition.Remarks": "备注", "odc.components.PartitionPolicyTable.RangePartitionTable": "Range 分区表", - "odc.AddConnectionForm.Account.PrivateAccount.SavePassword": "保存密码", "odc.components.PartitionPolicyTable.Library": "所属库", "odc.CreateShadowSyncModal.SelectPanel.SelectSourceTable": "选择源表", - "odc.components.Header.ShadowTableSynchronization": "影子表同步", - "odc.component.AddConnectionForm.ConnectTypeItem.CheckTheCompatibilityModeOf": "请检查当前租户的兼容模式", "odc.components.PartitionDrawer.EveryDayCheckTheNewly": "每天,定时检查连接内新增的分区表,并生成新的分区计划任务", "odc.component.DetailModal.shadowSync.ShadowTableSynchronization": "影子表同步", "odc.components.CreateShadowSyncModal.NextStepNextstepname": "下一步: {nextStepName}", @@ -3882,12 +2045,10 @@ "odc.components.PartitionPolicyTable.configModal.Month": "月", "odc.components.PartitionDrawer.Submit": "提交", "odc.component.DetailModal.shadowSync.StructuralAnalysis": "结构分析", - "odc.components.PartitionDrawer.Connection": "所属连接", "odc.StructConfigPanel.StructAnalysisResult.BatchSkip": "批量跳过", "odc.components.PartitionPolicyTable.configModal.Return": "返回", "odc.component.CommonTaskDetailModal.TaskRecord.Library": "所属库", "odc.component.CommonTaskDetailModal.TaskRecord.TaskStatus": "任务状态", - "odc.components.TaskFlowPage.ShadowTable": "影子表", "odc.components.PartitionPolicyTable.EnterATableName": "请输入表名", "odc.components.PartitionDrawer.OnTheFirstDayOf": "每月第一天,定时检查连接内新增的分区表,并生成新的分区计划任务", "odc.components.PartitionDrawer.LastDayOfEachMonth": "每月最后一天", @@ -3896,7 +2057,6 @@ "odc.components.PartitionPolicyTable.configModal.PleaseSelectASuffix": "请选择后缀", "odc.TaskManagePage.component.TaskTable.PartitionPlan": "分区计划", "odc.components.PartitionPolicyTable.configModal.EnterAPrefix": "请输入前缀", - "odc.component.DetailModal.partition.Connection": "所属连接", "odc.components.PartitionPolicyTable.NumberOfPreCreatedPartitions": "预创建分区数量: {preCreatePartitionCount}", "odc.components.PartitionPolicyTable.configModal.RangePartitionTable": "Range 分区表", "odc.components.PartitionPolicyTable.configModal.EnterTheNumberOfPre": "请输入预创建分区数量", @@ -3908,24 +2068,15 @@ "odc.components.PartitionDrawer.NoInspectionRequired": "无需巡检", "odc.TableConstraint.Foreign.columns.AssociatedColumn": "关联列", "odc.CreateShadowSyncModal.SelectPanel.SynchronizeObjects": "同步对象", - "odc.components.Header.PartitionPlan": "分区计划", "odc.CreateShadowSyncModal.SelectPanel.SynchronizationRange": "同步范围", "odc.TaskManagePage.component.TaskTools.SetPartitionPoliciesForAll": "请设置所有Range分区表的分区策略", - "odc.component.DetailModal.partition.TaskType": "任务类型", "odc.CreateShadowSyncModal.SelectPanel.EnterAShadowTableName": "请输入影子表名", "odc.StructConfigPanel.StructAnalysisResult.column.View": "查看", - "odc.components.PartitionDrawer.APartitionPlanAlreadyExists": "当前连接已存在一个分区计划,任务审批通过后,原分区计划将终止", - "odc.component.DetailModal.partition.PartitionPlan": "分区计划", - "odc.component.CommonTaskDetailModal.TaskFlow.AlibabaGroupApproval": "阿里集团审批", "odc.StructConfigPanel.StructAnalysisResult.SynchronizedTables": "同步的表", - "odc.component.AddConnectionForm.SysForm.PartitionViewImportExportSome": "分区查看、导入/导出部分对象和提升速度均依赖该账号", - "odc.AddConnectionForm.Account.PrivateAccount.ThePasswordIsNotSaved": "不保存密码,每次进入连接或测试连接时均需重新输入密码", "odc.components.CreateShadowSyncModal.StructuralAnalysis": "结构分析", - "odc.CreateShadowSyncModal.StructConfigPanel.Remarks": "备注", "odc.CreateShadowSyncModal.SelectPanel.AddSuffix": "添加后缀", "odc.components.PartitionPolicyTable.configModal.PleaseEnterTheRetentionPeriod": "请输入保留时长", "odc.components.PartitionDrawer.EnterAComment": "请输入备注", - "odc.CreateShadowSyncModal.SelectPanel.CurrentConnectionConnectionname": "当前连接: {connectionName}", "odc.TaskManagePage.component.TaskTable.ShadowTableSynchronization": "影子表同步", "odc.components.PartitionDrawer.EveryDay": "每天", "odc.components.PartitionPolicyTable.configModal.Suffix": "后缀", @@ -3937,35 +2088,19 @@ "odc.src.d.ts.Create": "新建", "odc.component.helpDoc.doc.SetTheNumberOfPre": "设置预创建分区数量", "odc.src.d.ts.Analyzing": "分析中", - "odc.component.AddConnectionForm.SysForm.ImportExportSomeObjectsAnd": "导入/导出部分对象和提升速度均依赖该账号", - "odc.component.DetailModal.partition.RiskLevel": "风险等级", "odc.components.CreateShadowSyncModal.Submit": "提交", "odc.StructConfigPanel.StructAnalysisResult.column.ExecutionResult": "执行结果", "odc.component.CommonTaskDetailModal.TaskRecord.View": "查看", "odc.components.PartitionDrawer.Remarks": "备注", "odc.components.PartitionPolicyTable.OnlyModifiedTablesAreDisplayed": "仅显示修改的表", - "odc.AddConnectionForm.Account.PrivateAccount.Account": "账号", "odc.component.AddConnectionForm.AddressItems.ClusterName": "集群名", "odc.AddConnectionForm.Account.PrivateAccount.TheEndOfTheAccount": "账号首尾包含空格", "odc.components.SQLPage.BecauseTheSqlIsToo": "由于 SQL 过长,编辑器将只支持预览", - "odc.component.AddConnectionForm.SessionConfigItem.SqlQueryTimeout": "SQL 查询超时", - "odc.component.AddConnectionForm.DefaultDatabaseSchema": "默认数据库/Schema", - "odc.AddConnectionForm.Account.PrivateAccount.Password": "密码", - "odc.AddConnectionForm.Account.PublicAccount.Password": "密码", - "odc.AddConnectionForm.Account.PublicAccount.EnterAPassword": "请输入密码", - "odc.components.TenantCloudTip.TheNewPersonalConnectionUnder": "已筛选当前租户下新建的个人连接", - "odc.AddConnectionForm.Account.PublicAccount.Account": "账号", "odc.component.AddConnectionForm.NameItems.EnterAConnectionName": "请输入连接名称", - "odc.AddConnectionForm.Account.PublicAccount.EnterAnAccount": "请输入账号", - "odc.components.TenantCloudTip.GotIt": "知道了", "odc.AddConnectionForm.Account.PrivateAccount.EnterAnAccount": "请输入账号", - "odc.AddConnectionForm.Account.PublicAccount.TheEndOfTheAccount": "账号首尾包含空格", - "odc.component.AddConnectionForm.AddressItems.HostIp": "主机 IP", "odc.component.AddConnectionForm.AddressItems.EnterATenantName": "请输入租户名", - "odc.component.AddConnectionForm.NameItems.EnterAConnectionNameLess": "请输入连接名称,30字以内", "odc.component.AddConnectionForm.AddressItems.TenantName": "租户名", "odc.AddConnectionForm.Account.PrivateAccount.EnterAPassword": "请输入密码", - "odc.components.TenantCloudTip.ClearFilter": "清除筛选", "odc.component.AddConnectionForm.AddressItems.EnterAClusterName": "请输入集群名", "odc.component.AddConnectionForm.AddressItems.EnterAPort": "请输入端口", "odc.components.RecordPage.PartitionPlan": "分区计划", @@ -3973,56 +2108,31 @@ "odc.components.RecordPage.ShadowTableSynchronization": "影子表同步", "odc.components.RecordPage.Execute": "执行", "odc.components.RecordPage.Termination": "终止", - "odc.components.AddConnectionDrawer.EnterAConnectionName": "请输入连接名", - "odc.component.ConnectPassowrd.SavePassword": "保存密码", "odc.cloud.InstanceSelect.SelectAConnectionInstance": "请选择连接实例", - "odc.component.AddConnectionForm.AddressItems.ConnectToAnInstance": "连接实例", "odc.component.ConnectPassowrd.Password": "密码", "odc.AddConnectionForm.Account.PrivateAccount.DatabasePassword": "数据库密码", "odc.component.ConnectionPopover.InstanceIdTenantId": "实例ID/租户ID:", - "odc.AddConnectionForm.Account.UserInput.NoDatabaseAccountIsAvailable": "暂无数据库账号,请在租户工作台创建", - "odc.page.ConnectionList.columns.InstanceNameId": "实例名/ID", "odc.component.ConnectionPopover.InstanceId": "实例 ID:", "odc.cloud.InstanceSelect.Mode": "模式:", - "odc.TaskManagePage.component.TaskTools.NoResultsToView": "无可查看的结果信息", "odc.AddConnectionForm.Account.PrivateAccount.DatabaseUsername": "数据库用户名", - "odc.page.ConnectionList.columns.InstanceId": "实例ID:", "odc.AddConnectionForm.Account.PrivateAccount.EnterADatabaseUsername": "请输入数据库用户名", "odc.component.Crontab.utils.Hours": "小时", "odc.CommonTaskDetailModal.Nodes.SQLCheckNode.Question": " 个问题", "odc.component.Crontab.const.CrontabIllegal": "crontab 不合法", "odc.component.Crontab.const.Month": "月", - "odc.component.CommonTaskDetailModal.TaskExecuteRecord.Library": "所属库", "odc.components.RolePage.SystemOperatingPermissions": "系统操作权限", "odc.Header.Filter.Type": "类型", - "odc.TaskManagePage.component.TaskTable.Status": "状态", "odc.components.CreateSQLPlanTaskModal.Separator": "分隔符", "odc.components.RecordPage.PlannedChange": "计划变更", "odc.component.DetailModal.sqlPlan.IgnoreErrorsToContinueThe": "忽略错误继续任务", - "odc.TaskManagePage.component.SubTaskTable.Operation": "操作", - "odc.TaskManagePage.component.TaskTable.UpdateTime": "更新时间", "odc.component.helpDoc.doc.OperationalIncludingAllOperationPermissions": "可操作:包括全部操作权限", - "odc.Index.Sider.ControlDesk": "管控台", "odc.component.helpDoc.doc.RetainTheCurrentPartialData": "保留当前部分数据文件和结构文件配置", "odc.components.CreateSQLPlanTaskModal.TaskSettings": "任务设置", - "odc.components.FormResourceSelector.const.ReadOnly": "只读", - "odc.List.ConnectionNameItem.Public": "公共", - "odc.components.FormAuthManageModal.SelectAUser": "请选择用户", "odc.component.Crontab.utils.LastWeek": "最后一周的", "odc.components.CreateSQLPlanTaskModal.AreYouSureYouWant.1": "是否确认修改此 SQL 计划?", - "odc.Content.ListActionBar.ContextselectedkeyssizeItemSelected": "已选择 {contextSelectedKeysSize} 项", - "odc.Header.Filter.FilterConnections": "筛选连接", "odc.components.CreateSQLPlanTaskModal.PleaseEnterTheQueryResult": "请输入查询结果限制", - "odc.components.CreateSQLPlanTaskModal.EnterAComment": "请输入备注", - "odc.components.PublicConnectionPage.relativeRoles.Permission": "权限", "odc.component.CommonTaskDetailModal.TaskOperationRecord.CreateATask": "创建任务", - "odc.components.TaskOrderModal.PlannedChange": "计划变更", - "odc.components.FormResourceSelector.const.SystemConfiguration": "系统配置", "odc.AddConnectionForm.SSLItem.HowToObtain": "如何获取?", - "odc.components.FormResourceSelector.AccessiblePublicConnections": "可访问的公共连接", - "odc.Header.Sorter.SortByConnectionNameA": "按连接名(A-Z)排序", - "odc.Header.Sorter.SortByConnectionNameZ": "按连接名(Z-A)排序", - "odc.components.SystemConfigPage.components.SqlCheck": "SQL 检查", "odc.components.FormResourceSelector.const.AutomaticAuthorization": "自动授权", "odc.components.CreateSQLPlanTaskModal.YouCanDragAndDrop": "支持拖拽文件上传,任务将按文件排列的先后顺序执行", "odc.components.CreateSQLPlanTaskModal.SqlContent": "SQL 内容", @@ -4033,18 +2143,12 @@ "odc.Index.Sider.Mine": "我的", "odc.components.ExportDrawer.RetainTheCurrentConfiguration": "保留当前配置", "odc.component.Crontab.EveryFriday": "每周五", - "odc.components.FormAuthManageModal.ReadWrite": "读写", - "odc.TaskManagePage.component.SubTaskTable.LoadMore": "加载更多", "odc.component.DetailModal.sqlPlan.IgnoreTheCurrentTaskStatus": "忽略当前任务状态,定期发起新任务", "odc.component.DetailModal.sqlPlan.TaskType": "任务类型", - "odc.PublicConnectionPage.ConnectionList.columns.PermissionManagement": "权限管理", - "odc.ConnectionList.Header.PublicConnection": "公共连接", "odc.components.CreateSQLPlanTaskModal.PleaseUploadTheSqlFile": "请上传 SQL 文件", "odc.component.helpDoc.doc.ManageableIncludingViewingEditingAnd": "可管理:包括查看、编辑、删除", - "odc.components.FormAuthManageModal.Save": "保存", "odc.components.CreateSQLPlanTaskModal.Hours": "小时", "odc.component.Crontab.const.Zhou": "周", - "odc.Content.ListActionBar.BatchDeletion": "批量删除", "odc.component.Crontab.const.DefaultMode": "默认模式", "odc.components.CreateSQLPlanTaskModal.Cancel": "取消", "odc.component.Crontab.const.Tuesday": "周二", @@ -4053,103 +2157,68 @@ "odc.Header.Sorter.SortByUpdateTime": "按更新时间排序", "odc.Sider.MineItem.OperationRecord": "操作记录", "odc.component.Crontab.const.LastDayOfTheMonth": "本月最后一天", - "odc.components.Header.SqlPlan": "SQL 计划", - "odc.TaskManagePage.component.TaskTable.No": "编号", "odc.components.CreateSQLPlanTaskModal.TheTaskNeedsToBe": "任务需要重新审批,审批通过后此任务将重新执行", "odc.component.DetailModal.sqlPlan.QueryResultLimits": "查询结果限制", "odc.component.Crontab.const.ExampleLMondayOfThe": "例:1L(最后一周的周一)", "odc.component.CommonTaskDetailModal.TaskOperationRecord.DisableATask": "停用任务", - "odc.components.FormResourceSelector.const.ResourceGroup": "资源组", "odc.components.FormResourceSelector.NoPermissionTypeSelected": "未选择权限类型", "odc.AddConnectionForm.SSLItem.SingleUploadFile.UploadedFile": "已上传文件", - "odc.components.PublicConnectionPage.relativeRoles.RoleName": "角色名称", "odc.component.Crontab.const.CustomMode": "自定义模式", - "odc.TaskManagePage.component.TaskTable.Connection": "所属连接", - "odc.Content.List.IfNoConnectionInformationIs": "若无连接信息,可尝试申请数据库连接的权限", "odc.component.Crontab.utils.WeekValue": "第{value}周的", "odc.components.ResourceSelector2.All": "全部", "odc.component.Crontab.EveryNight": "每天晚上", "odc.component.Crontab.Hourly": "每小时", - "odc.components.PublicConnectionPage.relativeRoles.RolesThatCanAccessConnections": "可访问连接的角色", "odc.components.CreateSQLPlanTaskModal.TheFileCanBeUp": "文件最多不超过 256 MB ,支持扩展名 .sql", - "odc.TablePage.ShowTableBaseInfoForm.RowCount": "行数据量", "odc.TaskManagePage.component.TaskTools.Edit": "编辑", "odc.component.TaskStatus.Disabled": "已禁用", - "odc.ConnectionList.Header.PersonalConnection": "个人连接", "odc.components.RolePage.component.Operational": "可操作", - "odc.components.FormResourceSelector.const.PersonalConnection": "个人连接", - "odc.components.FormAuthManageModal.Cancel": "取消", "odc.components.FormResourceSelector.const.User": "用户", "odc.components.RolePage.ResourceManagementPermissions": "资源管理权限", - "odc.Index.Sider.Connection": "连接", "odc.component.DetailModal.sqlPlan.ExecutiontimeoutHours": "{executionTimeout}小时", - "odc.Connecion.Banner.WelcomeToOceanbaseDeveloperCenter": "欢迎使用 OceanBase 开发者中心", "odc.component.Crontab.TimingPeriod": "定时周期", "odc.component.helpDoc.doc.ViewOnlyViewOnly": "仅查看:仅支持查看", - "odc.component.DetailModal.sqlPlan.Connection": "所属连接", "odc.Connecion.ConnectionList.ParamContext.All": "全部", "odc.component.Crontab.const.Thursday": "周四", "odc.Content.List.NoDatabaseConnection": "暂无数据库连接", "odc.components.SQLPage.SqlCheckPassed": "SQL 检查通过", - "odc.component.ConnectionPopover.PersonalConnection": "个人连接", "odc.component.Crontab.const.DelimiterBetweenMultipleValues": "多个值之间的分隔符", "odc.components.RolePage.component.SystemOperatingPermissions": "系统操作权限", "odc.component.Crontab.const.Points": "分", "odc.Connecion.ConnectionList.ParamContext.HostPort": "主机端口", - "odc.components.FormTaskModal.configForm.PlannedChange": "计划变更", "odc.components.FormResourceSelector.const.Editable": "可编辑", "odc.components.CreateSQLPlanTaskModal.Create": "新建", "odc.component.Crontab.utils.Day": "日", - "odc.components.FormAuthManageModal.ReadOnly": "只读", - "odc.components.FormResourceSelector.const.CanApply": "可申请", "odc.components.CreateSQLPlanTaskModal.TaskExecutionDurationHypercycleProcessing": "任务执行时长超周期处理", "odc.List.MoreBtn.UpdatedOn": "更新于", - "odc.List.MoreBtn.Copy": "复制", "odc.components.CreateSQLPlanTaskModal.QueryResultLimits": "查询结果限制", "odc.component.ConnectionPopover.TypeConnecttypetexttype": "类型:{ConnectTypeTextType}", "odc.component.CommonTaskDetailModal.TaskOperationRecord.EditTask": "编辑任务", - "odc.components.CreateSQLPlanTaskModal.TheDescriptionCannotExceedCharacters": "备注不超过 200 个字符", "odc.component.CommonTaskDetailModal.TaskOperationRecord.OperationTime": "操作时间", "odc.components.CreateSQLPlanTaskModal.TaskErrorHandling": "任务错误处理", "odc.components.FormResourceSelector.OperationPermission": "操作权限", - "odc.TaskManagePage.component.SubTaskTable.Type": "类型", - "odc.components.FormResourceSelector.IncludingTheOperationPermissionsOf": "包括个人连接及管控台的操作权限(查看/操作)", "odc.CommonTaskDetailModal.Nodes.SQLCheckNode.Existence": "存在 ", - "odc.ConnectionList.Header.ConnectAll": "全部连接", "odc.component.Crontab.const.Monthly": "每月", "odc.component.Crontab.utils.EveryDay": "每天", - "odc.Index.History.HistoricalConversation": "历史会话", - "odc.components.FormResourceSelector.const.TaskFlow": "任务流程", "odc.TaskManagePage.component.TaskTools.AreYouSureYouWant.2": "是否确认启用此 SQL 计划?", "odc.TaskManagePage.component.TaskTools.AreYouSureYouWant.1": "是否确认禁用此 SQL 计划?", "odc.component.DetailModal.sqlPlan.TaskNumber": "任务编号", "odc.components.DDLResultSet.StatusBar.DbTimeConsumption": "DB 耗时:", - "odc.Content.TitleButton.CreateAPersonalConnection": "新建个人连接", "odc.component.Crontab.utils.Month": "月", "odc.EditorToolBar.actions.sql.SqlCheck": "SQL 检查", "odc.component.Crontab.NextExecutionTime": "下一次执行时间:", "odc.components.FormResourceSelector.OperationalType": "可操作的类型", "odc.component.DetailModal.sqlPlan.Founder": "创建人", "odc.Connecion.ConnectionList.ParamContext.PublicReadWriteConnection": "公共读写连接", - "odc.component.ConnectionPopover.ReadWrite": "读写", - "odc.TaskManagePage.component.helper.Task": "任务", - "odc.components.FormResourceSelector.IncludingPublicConnectionsResourceGroups": "包括公共连接、资源组、角色、用户的管理权限(新建/管理/编辑/查看)", - "odc.component.CommonTaskDetailModal.TaskExecuteRecord.Operation": "操作", "odc.TaskManagePage.component.TaskTools.Ok.2": "确定", "odc.AddConnectionForm.SSLItem.CaCertificate": "CA 证书", "odc.Content.ListItem.HostPortHost": "主机:端口: {host}", "odc.component.DetailModal.sqlPlan.StopATask": "停止任务", - "odc.components.FormResourceSelector.const.ReadWrite": "读写", "odc.Header.Sorter.SortByCreationTime": "按创建时间排序", "odc.component.CommonTaskDetailModal.TaskFlow.PreCheck": "预检查", - "odc.components.FormAuthManageModal.CurrentlyUsersWhoCanObtain": "暂不支持通过角色获得连接访问权限的用户", "odc.component.DetailModal.sqlPlan.RiskLevel": "风险等级", - "odc.components.FormResourceSelector.IncludingAccessPermissionsForPublic": "包括公共连接和资源组的访问权限(只读/读写/可申请)", "odc.component.Crontab.const.Day": "日", "odc.Index.Sider.Help": "帮助", "odc.component.DetailModal.sqlPlan.Separator": "分隔符", - "odc.Content.List.Top": "置顶", - "odc.Connecion.ConnectionList.ParamContext.ConnectionName": "连接名", "odc.Sider.HelpItem.Features": "功能介绍", "odc.component.Crontab.const.Time": "时", "odc.TaskManagePage.component.TaskTools.Termination": "终止", @@ -4158,38 +2227,27 @@ "odc.AddConnectionForm.SSLItem.ClientKey": "客户端密钥", "odc.Sider.MineItem.Exit": "退出", "odc.TaskManagePage.component.TaskTable.PlannedChange": "计划变更", - "odc.TaskManagePage.component.helper.AutomaticOperation": "自动运行", "odc.component.AddConnectionForm.SysForm.TheExportAndDerivativeSpeed": "部分对象的导出和导数速度提升均依赖该账号", "odc.components.CreateSQLPlanTaskModal.EnterTheSqlContent": "请填写 SQL 内容", "odc.component.DetailModal.sqlPlan.ExecutionTimeout": "执行超时时间", - "odc.components.FormAuthManageModal.FailedToSubmit": "提交失败", "odc.component.Crontab.utils.BeginToEndEveryInterval": "{begin}至{end}每{interval}{unit}", "odc.Sider.MineItem.Theme.Theme": "主题", - "odc.components.FormAuthManageModal.ManagePermissions": "管理权限", - "odc.TaskManagePage.component.TaskTable.Founder": "创建人", - "odc.components.FormResourceSelector.AccessPermission": "访问权限", "odc.component.DetailModal.sqlPlan.AfterTheCurrentTaskIs": "待当前任务执行完毕在新周期发起任务", "odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe.1": "任务需要重新审批,审批通过后此任务将启用", "odc.component.Crontab.const.AverageDistribution": "平均分配", "odc.component.DetailModal.sqlPlan.TimingPeriod": "定时周期", - "odc.TaskManagePage.component.SubTaskTable.Status": "状态", "odc.src.d.ts.Manual": "手动", - "odc.TaskManagePage.component.TaskTable.NextExecutionTime": "下一次执行时间", "odc.component.CommonTaskDetailModal.TaskOperationRecord.ApprovalStatus": "审批状态", - "odc.TaskManagePage.component.SubTaskTable.DatabaseToWhichTheDatabase": "所属数据库", "odc.component.Crontab.utils.Point": "点", - "odc.components.SQLResultSet.Result": "结果", "odc.component.Crontab.const.Weekly": "每周", "odc.Content.List.YouCanConnectToOceanbase": "支持连接 OceanBase 数据库;", "odc.component.CommonTaskDetailModal.FlowModal.ApprovalRecord": "审批记录", "odc.components.ResourceSelector2.CancelAll": "取消全部", - "odc.Connecion.Banner.Features": "功能介绍", "odc.component.Crontab.const.Friday": "周五", "odc.TaskManagePage.component.TaskTools.EnableSqlScheduling": "启用 SQL 计划", "odc.components.CreateSQLPlanTaskModal.StopATask": "停止任务", "odc.component.Crontab.const.Monday": "周一", "odc.components.ResourceSelector2.NameName": "姓名:{name}", - "odc.CommonTaskDetailModal.Nodes.SQLCheckNode.ProcessingResult": "处理结果", "odc.Connecion.ConnectionList.ParamContext.Cluster": "集群", "odc.components.FormResourceSelector.const.Manageable": "可管理", "odc.component.Crontab.utils.Monthly": "每月", @@ -4198,125 +2256,85 @@ "odc.component.SQLLintResult.Drawer.CheckResult": "检查结果", "odc.components.SQLResultSet.SQLResultLog.CheckviolationslengthSpecificationSuggestionsExist": "存在 {checkViolationsLength} 个规范建议", "odc.components.CreateSQLPlanTaskModal.AreYouSureYouWant": "是否确认取消此 SQL 计划?", - "odc.TaskManagePage.component.TaskTable.ExecutionCycle": "执行周期", "odc.List.MoreBtn.Edit": "编辑", "odc.components.FormResourceSelector.const.Role": "角色", - "odc.TaskManagePage.component.SubTaskTable.No": "编号", - "odc.component.UserConfigForm.SqlCheck": "SQL 检查", "odc.TaskManagePage.component.TaskTools.Disable": "禁用", "odc.components.CreateSQLPlanTaskModal.SelectTaskErrorHandling": "请选择任务错误处理", "odc.Sider.MineItem.Preferences": "偏好设置", - "odc.component.CommonTaskDetailModal.TaskExecuteRecord.TaskStatus": "任务状态", "odc.Header.Filter.Item": "项", "odc.component.Crontab.const.EveryDay": "每天", - "odc.component.ExecuteSQLModal.SqlCheck": "SQL 检查", "odc.components.CreateSQLPlanTaskModal.Ok": "确定", "odc.component.Crontab.utils.BeginStartsEveryIntervalUnit": "{begin}开始 每{interval}{unit}", "odc.component.Crontab.utils.Zhou": "周", "odc.component.Crontab.utils.Weekly": "每周", "odc.components.ImportDrawer.RetainTheCurrentConfiguration": "保留当前配置", - "odc.components.FormResourceSelector.const.DesensitizationRules": "脱敏规则", "odc.Connecion.ConnectionList.ParamContext.Tenant": "租户", "odc.Sider.MineItem.Locale.Language": "语言", "odc.component.Crontab.const.Seconds": "秒", "odc.Index.Sider.Logo.DeveloperCenter": "开发者中心", "odc.components.CreateSQLPlanTaskModal.SelectSqlContent": "请选择 SQL 内容", - "odc.Index.Sider.Task": "任务", "odc.components.CreateSQLPlanTaskModal.UploadAnAttachment": "上传附件", "odc.component.TaskStatus.Enabled": "已启用", "odc.component.DetailModal.sqlPlan.NextExecutionTime": "下一次执行时间", "odc.components.CreateSQLPlanTaskModal.PleaseSelectTaskExecutionDuration": "请选择任务执行时长超周期处理", "odc.component.Crontab.utils.BeginToEnd": "{begin}至{end}", "odc.components.ResourceSelector2.Account": "账号:", - "odc.Content.ListActionBar.DeletedSuccessfully": "删除成功", "odc.components.CreateSQLPlanTaskModal.SqlEntry": "SQL 录入", "odc.component.CommonTaskDetailModal.FlowModal.ActionEvents": "操作事件:", "odc.AddConnectionForm.SSLItem.SingleUploadFile.UploadAPemFile": "上传 PEM 文件", - "odc.components.TaskFlowPage.PlannedChange": "计划变更", "odc.components.CreateSQLPlanTaskModal.EditSqlPlan": "编辑 SQL 计划", "odc.component.DetailModal.sqlPlan.PlannedChange": "计划变更", "odc.components.CreateSQLPlanTaskModal.ExecutionTimeout": "执行超时时间", "odc.Header.Filter.Clear": "清空", - "odc.components.FormAuthManageModal.AccessPermission": "访问权限", "odc.AddConnectionForm.SSLItem.EnableSsl": "启用 SSL", "odc.component.Crontab.const.Sunday": "周日", "odc.component.CommonTaskDetailModal.TaskOperationRecord.TerminateATask": "终止任务", "odc.Sider.HelpItem.HelpDocument": "帮助文档", "odc.component.helpDoc.doc.EditableIncludesViewingAndEditing": "可编辑:包括查看、编辑", - "odc.components.FormResourceSelector.ConnectionAccess": "连接访问权限", "odc.components.FormResourceSelector.ResourceManagementPermissions": "资源管理权限", - "odc.component.AddConnectionForm.BaseInfoItems.ConnectionType": "连接类型", "odc.TaskManagePage.component.TaskTools.TheTaskNeedsToBe": "任务需要重新审批,审批通过后此任务将禁用", "odc.component.Crontab.utils.Points": "分", - "odc.component.UserConfigForm.SelectTheStandardCheckMethod": "选择 SQL 执行时规范检查方式", "odc.components.CreateSQLPlanTaskModal.EnterADelimiter": "请输入分隔符", "odc.Connecion.ConnectionList.ParamContext.PublicReadOnlyConnection": "公共只读连接", "odc.components.CreateSQLPlanTaskModal.UpToMbOfFiles": "文件最多不超过 256 MB", "odc.component.DetailModal.sqlPlan.CreationTime": "创建时间", "odc.Content.ListItem.ClusterCluster": "集群: {cluster}", - "odc.TaskManagePage.component.SubTaskTable.CreationTime": "创建时间", "odc.components.FormResourceSelector.const.ViewOnly": "仅查看", "odc.components.RolePage.component.ConnectionAccess": "连接访问权限", "odc.component.Crontab.const.NotSpecified": "不指定", - "odc.TablePage.ShowTableBaseInfoForm.TableSize": "大小", "odc.components.FormResourceSelector.const.OperationRecord": "操作记录", - "odc.Header.Filter.Label": "标签", "odc.component.CommonTaskDetailModal.TaskOperationRecord.EnableTasks": "启用任务", - "odc.List.MoreBtn.Remove": "移除", "odc.component.CommonTaskDetailModal.OperationRecord": "操作记录", - "odc.TaskManagePage.component.SubTaskTable.CompletionTime": "完成时间", - "odc.Connecion.Banner.OceanbaseDeveloperCenterOceanbaseDeveloper": "OceanBase 开发者中心(OceanBase Developer Center,ODC)是为 OceanBase\n 量身打造的企业级数据库开发平台,支持连接 OceanBase\n 数据库,并提供数据库日常开发操作、WebSQL、SQL 诊断、导入导出等功能。", - "odc.components.PublicConnectionPage.relativeRoles.RolesThatCanManageConnections": "可管理连接的角色", - "odc.components.SystemConfigPage.components.SelectTheStandardCheckMethod": "选择 SQL 执行时规范检查方式", "odc.ExportForm.ConfigPanel.IfYouDoNotUse.1": "若不使用 sys 租户账号,导出可能缺少索引", "odc.component.DetailModal.sqlPlan.SqlContent": "SQL 内容", "odc.component.Crontab.const.ExampleMondayOfTheThird": "例:1#3(第三周的周一)", "odc.TaskManagePage.component.TaskTools.DisableSqlScheduling": "禁用 SQL 计划", "odc.component.Crontab.const.ArbitraryValue": "任意值", - "odc.components.FormAuthManageModal.UsersWhoCanAccessThe": "可访问连接的用户", "odc.src.d.ts.Automatic": "自动", - "odc.components.FormAuthManageModal.Add": "添加", - "odc.components.CreateSQLPlanTaskModal.Remarks": "备注", - "odc.Index.Sider.History": "历史", - "odc.component.CommonTaskDetailModal.TaskExecuteRecord.TaskNumber": "任务编号", "odc.component.DetailModal.sqlPlan.ChangeType": "变更类型", - "odc.component.ExecuteSQLModal.SqlCheckPassed": "SQL 检查通过", "odc.component.CommonTaskDetailModal.TaskOperationRecord.ViewApprovalRecords": "查看审批记录", "odc.TaskManagePage.component.TaskTools.Enable": "启用", - "odc.component.ConnectionPopover.ReadOnly": "只读", "odc.components.FormResourceSelector.ObjectsThatCanBeCreated": "可新建的对象", "odc.component.Crontab.const.Wednesday": "周三", - "odc.components.FormAuthManageModal.CanApply": "可申请", "odc.components.FormResourceSelector.SystemOperatingPermissions": "系统操作权限", - "odc.component.DetailModal.sqlPlan.Remarks": "备注", - "odc.components.RolePage.ConnectionAccess": "连接访问权限", "odc.component.Crontab.const.TheConnectorOfTheInterval": "区间值的连接符", - "odc.component.ConnectionPopover.PropertyTypetext": "属性:{typeText}", "odc.component.DetailModal.sqlPlan.SqlPlan": "SQL 计划", "odc.components.FormResourceSelector.const.Operational": "可操作", - "odc.component.CommonTaskDetailModal.TaskExecuteRecord.CreationTime": "创建时间", - "odc.components.FormResourceSelector.const.PublicConnection": "公共连接", "odc.component.CommonTaskDetailModal.TaskOperationRecord.EventOperations": "事件操作", "odc.TaskManagePage.component.helper.SqlPlan": "SQL 计划", - "odc.Content.ListActionBar.Deselect": "取消选择", "odc.component.CommonTaskDetailModal.ExecutionRecord": "执行记录", "odc.components.RolePage.component.ViewOnly": "仅查看", "odc.component.Crontab.utils.Seconds": "秒", "odc.components.FormResourceSelector.ManageableObjects": "可管理的对象", - "odc.Content.List.CancelTheTop": "取消置顶", "odc.component.DetailModal.sqlPlan.TaskErrorHandling": "任务错误处理", - "odc.Header.Filter.Permission": "权限", "odc.component.CommonTaskDetailModal.TaskOperationRecord.Operation": "操作", "odc.components.RolePage.component.ObjectsThatCanBeCreated": "可新建的对象", "odc.components.CreateSQLPlanTaskModal.ClickOrDragMultipleFiles": "点击或将多个文件拖拽到这里上传", "odc.component.Crontab.utils.LastDayOfTheMonth": "本月最后一天", "odc.component.Crontab.utils.EveryYear": "每年", "odc.Header.Filter.Total": "共", - "odc.component.ConnectionPopover.PublicConnection": "公共连接", "odc.components.CreateSQLPlanTaskModal.IgnoreErrorsToContinueThe": "忽略错误继续任务", "odc.components.FormResourceSelector.ManagePermissions": "管理权限", - "odc.components.FormAuthManageModal.SubmittedSuccessfully": "提交成功", - "odc.component.Sider.TaskCenter": "任务中心", "odc.Content.ListItem.TenantTenant": "租户: {tenant}", "odc.component.Crontab.const.Saturday": "周六", "odc.components.CreateSQLPlanTaskModal.Save": "保存", @@ -4326,19 +2344,14 @@ "odc.src.d.ts.TableGroup": "表组", "odc.components.AutoAuthPage.component.PerformAnAction": "执行动作", "odc.components.AutoAuthPage.Disable": "停用", - "odc.components.AutoAuthPage.component.ConnectionAccess": "连接访问权限", "odc.components.AutoAuthPage.AreYouSureYouWant.1": "确认要删除自动授权规则吗?", "odc.components.FormAutoAuthModal.Status": "状态", - "odc.components.AutoAuthPage.Status": "状态", - "odc.components.ResourceSelector.Add": "添加", "odc.component.BatchImportButton.modal.ImportObjectPreview": "导入对象预览", "odc.components.FormAutoAuthModal.Cancel": "取消", "odc.components.FormAutoAuthModal.RuleCreatedSuccessfully": "规则创建成功", "odc.components.UserPage.TheFileMustContainInformation": "文件需包含用户账号、姓名、密码等信息,建议使用用户配置模版", "odc.components.AutoAuthPage.component.Founder": "创建人", "odc.components.FormAutoAuthModal.SelectAStatus": "请选择状态", - "odc.components.PublicConnectionPage.BatchImportSucceeded": "批量导入成功", - "odc.components.AutoAuthPage.component.ObjectName": "对象名称", "odc.components.AutoAuthPage.DisabledSuccessfully": "停用成功", "odc.components.FormAutoAuthModal.PleaseSelectTriggerEvent": "请选择触发事件", "odc.component.TemplateInsertModal.Cancel": "取消", @@ -4346,7 +2359,6 @@ "odc.components.FormAutoAuthModal.AreYouSureYouWant.1": "确定要取消新建吗?", "odc.components.FormAutoAuthModal.Disable": "停用", "odc.components.AutoAuthPage.component.RuleName": "规则名称:", - "odc.page.Manage.AutomaticAuthorizationRules": "自动授权规则", "odc.components.ResourceSelector2.Add": "添加", "odc.components.AutoAuthPage.Operation": "操作", "odc.component.BatchImportButton.modal.Cancel": "取消", @@ -4355,52 +2367,39 @@ "odc.component.BatchImportButton.modal.BatchImport": "批量导入", "odc.components.AutoAuthPage.EnterARuleName": "请输入规则名称", "odc.components.FormAutoAuthModal.AreYouSureYouWant": "确定要取消编辑吗?取消保存后,所编辑的内容将不生效", - "odc.components.PublicConnectionPage.NoValidConnectionInformationIs": "暂无有效连接信息", "odc.components.AutoAuthPage.component.CreationTime": "创建时间", - "odc.Content.TitleButton.TheFileMustContainConnection": "文件需包含连接类型、主机端口、租户名、数据库账号等相关连接信息,建议使用连接配置模版", "odc.components.AutoAuthPage.View": "查看", "odc.components.FormAutoAuthModal.conditionSelect.PleaseSelect": "请选择", "odc.components.AutoAuthPage.component.Role": "角色", "odc.components.AutoAuthPage.DisableFailed": "停用失败", "odc.components.AutoAuthPage.FailedToEnable": "启用失败", - "odc.components.FormAutoAuthModal.CanApply": "可申请", "odc.component.BatchImportButton.modal.DownloadTemplate": "下载模版", "odc.components.FormAutoAuthModal.conditionSelect.Add": "添加", "odc.components.AutoAuthPage.CreateARule": "新建规则", - "odc.components.FormAutoAuthModal.TheRuleNameCannotExceed": "规则名称不超过 48个字符", "odc.components.FormAutoAuthModal.FailedToSaveTheRule": "规则保存失败", "odc.components.AutoAuthPage.CreationTime": "创建时间", - "odc.components.FormAutoAuthModal.AccessiblePublicConnections": "可访问的公共连接", "odc.component.BatchImportButton.modal.SupportedExtensionExtension": "支持扩展名:.xls,.xlsx", "odc.components.AutoAuthPage.Enable": "启用", "odc.components.FormAutoAuthModal.conditionSelect.PleaseEnter": "请输入", - "odc.components.AutoAuthPage.GrantAccessToConnections": "授予连接访问权限", "odc.components.FormAutoAuthModal.conditionSelect.EnterAValue": "请输入值", "odc.component.TemplateInsertModal.NoMorePromptInThe": "以后不再提示", - "odc.components.FormAutoAuthModal.ReadWrite": "读写", "odc.components.FormAutoAuthModal.GrantRoleRelatedConnectionAccess": "将角色相关的连接访问权限、资源管理权限、系统操作权限均授予用户", - "odc.component.BatchImportButton.modal.Save": "保存", "odc.components.AutoAuthPage.Delete": "删除", "odc.components.FormAutoAuthModal.Remarks": "备注", "odc.components.FormAutoAuthModal.PerformAnAction": "执行动作", "odc.component.TemplateInsertModal.Ok": "确定", - "odc.components.AutoAuthPage.component.All": "全部", "odc.components.AutoAuthPage.RuleName": "规则名称", "odc.components.FormRoleModal.SelectANewObject": "请选择可新建的对象", "odc.components.FormAutoAuthModal.Enable": "启用", "odc.components.FormAutoAuthModal.EnterARuleName": "请输入规则名称", - "odc.PublicConnectionPage.ConnectionList.columns.ManagePermissions": "管理权限", "odc.components.FormAutoAuthModal.MatchingCondition": "匹配条件", - "odc.components.FormAutoAuthModal.ReadOnly": "只读", "odc.components.FormAutoAuthModal.Ok": "确定", "odc.component.BatchImportButton.modal.TheFileExceedsTheLimit": "文件超过限制", - "odc.components.PublicConnectionPage.TheFileMustContainConnection": "文件需包含连接类型、主机端口、租户名、读写账号、只读账号等相关连接信息,建议使用连接配置模版", "odc.components.FormAutoAuthModal.RuleCreationFailed": "规则创建失败", "odc.components.AutoAuthPage.component.TriggerEvent": "触发事件", "odc.component.BatchImportButton.BatchImport": "批量导入", "odc.components.FormAutoAuthModal.Role": "角色", "odc.components.FormAutoAuthModal.EditRule": "编辑规则", - "odc.components.AutoAuthPage.component.ObjectType": "对象类型", "odc.components.AutoAuthPage.Founder": "创建人", "odc.components.AutoAuthPage.component.Remarks": "备注", "odc.components.AutoAuthPage.component.MatchingCondition": "匹配条件", @@ -4413,17 +2412,11 @@ "odc.Content.TitleButton.BatchImportSucceeded": "批量导入成功", "odc.components.FormAutoAuthModal.SelectARole": "请选择角色", "odc.components.FormAutoAuthModal.CreateARule": "新建规则", - "odc.components.FormAutoAuthModal.AccessPermission": "访问权限", "odc.component.TemplateInsertModal.PersonalSettings": "个人设置", "odc.components.FormAutoAuthModal.conditionSelect.Equal": "等于", - "odc.components.FormAutoAuthModal.PublicConnection": "公共连接", - "odc.Content.TitleButton.NoValidConnectionInformationIs": "暂无有效连接信息", - "odc.components.AutoAuthPage.component.Permission": "权限", "odc.components.FormAutoAuthModal.conditionSelect.Match": "匹配", - "odc.components.AutoAuthPage.AutomaticAuthorizationRules": "自动授权规则", "odc.components.AutoAuthPage.Edit": "编辑", "odc.components.FormAutoAuthModal.conditionSelect.Include": "包含", - "odc.components.FormAutoAuthModal.GrantAccessToConnections": "授予连接访问权限", "odc.components.AutoAuthPage.Enabled": "启用成功", "odc.component.helpDoc.doc.BecauseTheDataIsObtained": "由于该数据是通过静态基线数据得到的,因此会有延迟,可能出现不准确的情况。如想得到准确的数据请使用\n “select count(*) from table_name;” 进行查询。", "odc.components.FormAutoAuthModal.TheRuleNameAlreadyExists": "规则名称已存在", @@ -4432,7 +2425,6 @@ "odc.components.FormAutoAuthModal.TriggerEvent": "触发事件", "odc.components.FormAutoAuthModal.RuleName": "规则名称", "odc.components.AutoAuthPage.GrantRoles": "授予角色", - "odc.components.FormAutoAuthModal.CustomPublicConnectionAccessPermissions": "自定义公共连接的访问权限(只读/读写/申请)", "odc.components.FormAutoAuthModal.conditionSelect.EnterAnIndexKeySuch": "请输入索引键,如 dept[0].deptname", "odc.components.FormAutoAuthModal.TheRuleIsSavedSuccessfully": "规则保存成功", "odc.components.AutoAuthPage.component.UpdateTime": "更新时间", @@ -4443,7 +2435,6 @@ "odc.component.BatchImportButton.modal.ClickOrDragTheFile": "点击或将文件拖拽到这里上传", "odc.TablePage.ShowTableBaseInfoForm.RowDataVolume": "行数据量", "odc.components.FormAutoAuthModal.Create": "新建", - "odc.components.FormAuthManageModal.PleaseSelect": "请选择", "odc.components.FormAutoAuthModal.HelpDocument": "帮助文档", "odc.component.Crontab.utils.Sunday": "周日", "odc.component.AskEventTrackingModal.Disagree": "不同意", @@ -4451,14 +2442,11 @@ "odc.components.FormAutoAuthModal.TheRuleNameCannotExceed.1": "规则名称不超过 64 个字符", "odc.component.Login.RegisterForm.ConfirmPasswordInconsistency": "确认密码不一致", "odc.component.Login.RegisterForm.TheUsernameMustBeTo": "用户名长度为 4~48 个字符", - "odc.component.AddConnectionForm.NameItems.TheMaximumLengthOfThe": "连接名称不超过 128 个字符", - "odc.components.FormTaskModal.configForm.TheProcessNameContainsSpaces": "流程名称首尾包含空格", "odc.component.AskEventTrackingModal.Login": "登录", "odc.component.SQLConfig.ObtainTheColumnInformationOf": "获取结果集列信息", "odc.component.Login.RegisterForm.TheUsernameCannotBeEmpty": "用户名不能为空", "odc.component.AskEventTrackingModal.InformationCollectionList": "信息采集列表", "odc.component.Login.ActivateForm.Activate": "激活", - "odc.component.MaskPolicyManager.actionMenu.NoMoreThanCharacters.1": "不超过 64 个字符", "odc.components.PLPage.NoMorePrompt": "不再提示", "odc.component.Login.ActivateForm.ThePasswordCannotBeEmpty": "密码不能为空", "odc.ExportForm.ConfigPanel.PleaseFillInOrSelect": "请填写或者选择单个文件上限(MB)", @@ -4475,7 +2463,6 @@ "odc.component.AskEventTrackingModal.Agree": "同意", "odc.component.AskEventTrackingModal.TaskCenter": "任务中心", "odc.component.Login.RegisterForm.PleaseEnterThePasswordAgain": "请再次输入密码", - "odc.component.MaskPolicyManager.actionMenu.ThePolicyNameContainsSpaces": "策略名称首尾包含空格", "odc.component.AskEventTrackingModal.CreateSimulationData": "创建模拟数据", "odc.component.Crontab.utils.CannotBeSetToBoth": "日和周不能同时设置为?", "odc.component.Login.RegisterForm.ConfirmPassword": "确认密码", @@ -4487,16 +2474,12 @@ "odc.component.helpDoc.doc.IfTheFirstRowValue": "首行值为字段列头时,可选择跳过不导入", "odc.component.Login.LogOnToAnExisting": "登录已有账号", "odc.components.PLPage.Cancel": "取消", - "odc.component.AddConnectionForm.NameItems.EnterAConnectionNameLess.1": "请输入连接名称,不超过 128 个字符", - "odc.component.AddConnectionForm.NameItems.TheConnectionNameContainsSpaces": "连接名称首尾包含空格", "odc.component.Login.ActivateForm.ContainsAtLeastDigitsUppercase": "至少包含 2 个数字、2 个大写字母、2 个小写字母和 2 个特殊字符 (._+@#$%),长度为 8~32 个字符", "odc.components.UserPage.Role.1": "角色:", "odc.component.Login.LoginForm.EnterAUsername": "请输入用户名", "odc.component.AskEventTrackingModal.ThirdPartyJumpPage": "第三方跳转页面", - "odc.components.FormMaskDataModal.TheRuleNameContainsSpaces": "规则名称首尾包含空格", "odc.component.Login.ActivateForm.PleaseEnterThePasswordAgain": "请再次输入密码", "odc.component.AskEventTrackingModal.ApplicationPassword": "应用密码", - "odc.component.AddConnectionDrawer.TheConnectionNameAlreadyExists": "连接名称已存在", "odc.components.UserPage.NameItemname": "姓名:{itemName}", "odc.component.Login.Running": "正在执行中", "odc.components.PLPage.WeRecommendThatYouUpgrade": "建议将 OceanBase 数据库升级至 3.2.4 及以上版本,获取更优的调试能力和稳定性", @@ -4510,7 +2493,6 @@ "odc.component.AskEventTrackingModal.Workbench": "工作台", "odc.component.Login.SetPasswordToActivateAccount": "设置密码激活账号", "odc.component.Login.RegisterForm.ContainsAtLeastDigitsUppercase": "至少包含 2 个数字、2 个大写字母、2 个小写字母和 2 个特殊字符 (._+@#$%),长度为 8~32 个字符", - "odc.components.FormResourceGroupModal.TheResourceGroupNameCannot.1": "资源组名称不超过 64 个字符", "odc.component.Login.RegisterForm.TheUserNameFormatDoes": "用户名格式不符合要求", "odc.component.AskEventTrackingModal.ControlDesk": "管控台", "odc.component.Login.ActivateForm.ConfirmPasswordInconsistency": "确认密码不一致", @@ -4524,13 +2506,10 @@ "odc.components.ScriptManageModal.columns.ReplicationFailed": "复制失败", "odc.component.SQLConfig.AfterClosingColumnCommentsAnd": "关闭后将不查询获取列注释及可编辑的列信息,可降低 DB 耗时", "odc.components.SQLResultSet.ExecuteHistory.OdcParsesSql": "ODC 解析 SQL", - "odc.components.FormMaskDataModal.TheRuleNameCannotExceed.1": "规则名称不超过 64 个字符", - "odc.src.d.ts.File": "文件", "odc.ExportForm.ConfigPanel.Unlimited": "无限制", "odc.ExportForm.ConfigPanel.MergeTheExportResultsInto": "导出结果合并为一个 SQL 文件", "odc.components.FormUserModal.TheNameCannotExceedCharacters.2": "姓名不超过 64 个字符", "odc.src.util.notification.RequestId": "请求 ID:", - "odc.components.FormResourceGroupModal.TheResourceGroupNameContains": "资源组名称首尾包含空格", "odc.component.RAMAuthAlertInfo.TheCurrentOperationMayConflict": "当前操作可能会和 RAM 鉴权中指定的权限范围冲突,请注意风险(用户实际权限取权限合集)。", "odc.ImportForm.formitem.CsvFormItem.SkipTheFirstRow": "跳过首行", "odc.component.Login.LoginForm.PleaseEnterAVerificationCode": "请输入验证码", @@ -4545,42 +2524,30 @@ "odc.component.DataTransferModal.MaximumSizeOfASingle": "单个文件上限(MB)", "odc.component.Login.ForAccountSecurityYouNeed": "为了账号安全,需要设置密码激活账号", "odc.component.Login.LoginForm.TheUsernameCannotBeEmpty": "用户名不能为空", - "odc.component.ConnectionPopover.ResourceGroup": "资源组:", "odc.components.SQLResultSet.ExecuteHistory.ItTakesTooMuchTime": "耗时过大,建议在 SQL 窗口设置中关闭获取,关闭后不再查询列注释及可编辑的列信息", "odc.component.Login.LoginForm.ThePasswordCannotBeEmpty": "密码不能为空", "odc.components.SQLResultSet.ExecuteHistory.GetColumnInformation": "获取列信息", "odc.component.AskEventTrackingModal.TutorialWindow": "教程窗口", - "odc.components.FormTaskModal.configForm.TheProcessNameCannotExceed": "流程名称不超过 64 个字符", "odc.component.Login.RegisterForm.TheUsernameAlreadyExists": "用户名已存在", "odc.component.Login.LoginForm.TheVerificationCodeCannotBe": "验证码不能为空", - "odc.component.AddConnectionDrawer.TheMaximumLengthOfThe": "连接名称不超过 128 个字符", "odc.component.AskEventTrackingModal.InOrderToImproveAnd": "为了改进和开发我们的产品,以便给您提供更好的服务,ODC 在运行过程中会收集部分模块的使用频次信息。", "odc.component.AskEventTrackingModal.SessionManagement": "会话管理", "odc.components.FormUserModal.AccountNoMoreThanCharacters": "账号长度为 4~64 个字符", - "odc.components.PLPage.ParametersIncludeComplexTypesOr": "参数包含复杂类型或用户自定义类型,请通过调试窗口自定义参数进行执行或调试", "odc.components.FormRoleModal.component.TheRoleNameCannotExceed.1": "角色名称不超过 64 个字符", "odc.src.constant.label.File": "文件", - "odc.store.helper.pageKeyGenerate.DebuggingWindow": "调试窗口", - "odc.components.FormTaskModal.configForm.TheProcessNameCannotExceed.1": "流程名称不超过 128 个字符", "odc.src.constant.label.Type": "类型", - "odc.components.TaskOrderModal.SaveFailed": "保存失败", "odc.SSO.SSODetailDrawer.Status": "状态", "odc.AlterDdlTask.CreateModal.TaskSettings": "任务设置", "odc.components.SensitiveRule.RuleName": "规则名称", "odc.component.FormModal.CancelModification": "取消修改", "odc.component.FormModal.ProcessName": "流程名称", - "odc.Secure.RiskLevel.Operation": "操作", - "odc.DataArchiveTask.CreateModal.EnterAComment": "请输入备注", "odc.SensitiveColumn.components.EditSensitiveColumnModal.UpdatedSuccessfully": "更新成功", "odc.component.CommonDetailModal.TaskProgress.SourceTableDdl": "源表 DDL", "odc.NewSSODrawerButton.SSOForm.UsernameField": "用户名字段", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.RuleName": "规则名称", - "odc.RiskDetectRules.components.InnerRiskDetectRules.DeletedSuccessfully": "删除成功", "odc.ScriptFile.Item.Download": "下载", "odc.Secure.MaskingAlgorithm.ResultPreview": "结果预览", "odc.NewSSODrawerButton.SSOForm.TheTestConnectionIsSuccessful": "测试连接成功!", "odc.ExternalIntegration.SSO.AreYouSureYouWant": "是否确认删除?", - "odc.SensitiveColumn.components.ManualForm.Table": "表", "odc.ResourceTree.Nodes.package.Package": "程序包", "odc.NewSSODrawerButton.SSOForm.Add": "添加", "odc.TreeNodeMenu.config.function.BatchCompilation": "批量编译", @@ -4589,17 +2556,14 @@ "odc.NewSSODrawerButton.SSOForm.ObtainNestedUserData": "获取嵌套用户数据", "odc.SSO.SSODetailDrawer.ConfigurationName": "配置名称", "odc.component.FormModal.TheDescriptionCannotExceedCharacters": "备注不超过 140 个字符", - "odc.DataClearTask.DetailContent.VariableConfig.TimeFormat": "时间格式", "odc.DataClearTask.CreateModal.CreateDataCleanup": "新建数据清理", "odc.DataArchiveTask.CreateModal.VariableConfig.Day": "日", - "odc.SensitiveColumn.components.FormSensitiveColumnDrawer.AnEmptyFormCannotBe": "不能提交空表单", "odc.component.FormModal.Edit": "编辑", "odc.SensitiveColumn.components.FormSensitiveColumnDrawer.Submit": "提交", "odc.ExternalIntegration.SSO.OperationSucceeded": "操作成功", "odc.SensitiveColumn.components.SacnRule.All": "全部", "odc.PermissionApplication.CreateModal.Custom": "自定义", "odc.SensitiveColumn.components.ScanForm.ScanningTheScanningTimeMay": "正在扫描中。扫描时间可能较长请耐心等待…", - "odc.src.d.ts.environment.Production": "生产", "odc.DataClearTask.DetailContent.TaskType": "任务类型", "odc.Project.User.Edit": "编辑", "odc.component.SelectTransfer.CountItemSelected": "已选 {count} 项", @@ -4607,13 +2571,9 @@ "odc.ExternalIntegration.SSO.Name": "名称", "odc.page.SqlWorkspace.SqlWorkbench": "SQL 工作台", "odc.component.Status.Created": "已创建", - "odc.SensitiveColumn.components.ManualRule.SelectADatabase": "请选择数据库", - "odc.DataClearTask.CreateModal.VariableConfig.Year": "年", - "odc.component.helpDoc.doc.FilterConditionsSuchAsGmt": "过滤条件,如 gmt_create <= \\${bizdate}", "odc.DataClearTask.CreateModal.PeriodicExecution": "周期执行", "odc.page.Datasource.CommandLineWindow": "命令行窗口", "odc.DataArchiveTask.CreateModal.VariableConfig.Year": "年", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.EditRiskIdentificationRules": "编辑风险识别规则", "odc.ResourceTree.Nodes.table.Table": "表", "odc.page.Auth.UserPermissions": "用户权限", "odc.component.DetailContent.NotEnabled": "未启用", @@ -4629,29 +2589,22 @@ "odc.User.AddUserModal.ProjectRole": "项目角色", "odc.component.FormModal.Hours": "小时", "odc.Loading.WorkSpacePageLoading.Connecting": "连接中...", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Edit": "编辑", "odc.component.DetailContent.CreationTime": "创建时间", "odc.Env.components.EditPropertyComponent.EnterLabel": "请输入{label}", "odc.components.SensitiveColumn.DesensitizationAlgorithm": "脱敏算法", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Delete": "删除", "odc.ResourceTree.Nodes.procedure.Variable": "变量", "odc.components.SensitiveColumn.DataSource": "数据源", "odc.PermissionApplication.CreateModal.CreateASensitiveColumnRequest": "新建敏感列申请", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.Cancel": "取消", - "odc.Env.components.EditRuleDrawer.RecommendedImprovement": "建议改进", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.RuleStatus": "规则状态", - "odc.DataClearTask.CreateModal.VariableConfig.Day": "日", "odc.Secure.Approval.UsageQuantity": "使用数量", "odc.Env.components.InnerEnvironment.LabelStyle": "标签样式:", "odc.ExternalIntegration.SqlInterceptor.View": "查看", "odc.SSO.SSODetailDrawer.Type": "类型", - "odc.components.ConditionGroup.condition.SqlCheckResults": "SQL 检查结果", "odc.CommonDetailModal.Nodes.RollbackNode.Handler": "处理人", - "odc.Env.components.EditRuleDrawer.ConfigureExternalSqlCheckIntegration": "配置外部 SQL 检查集成", "odc.DataArchiveTask.CreateModal.AreYouSureYouWant": "是否确认取消此数据归档?", "odc.NewSSODrawerButton.SSOForm.UserInformationDataStructureType": "用户信息数据结构类型", "odc.component.DownloadFileAction.DownloadBackupRollbackSolution": "下载备份回滚方案", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.Grade": "等级", "odc.DataArchiveTask.CreateModal.VariableConfig.Zhou": "周", "odc.DataClearTask.CreateModal.Cancel": "取消", "odc.DataArchiveTask.DetailContent.TargetDatabase": "目标数据库", @@ -4663,7 +2616,6 @@ "odc.component.DetailContent.TitleConfiguration": "{title}配置", "odc.TreeNodeMenu.config.database.OpenTheSqlWindow": "打开 SQL 窗口", "odc.ExternalIntegration.SSO.CreationDate": "创建日期", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.EnvironmentName": "环境名称", "odc.ResourceTree.Nodes.table.Column": "列", "odc.component.FormModal.ExecutionValidityPeriod": "执行有效期", "odc.component.CommonDetailModal.TaskProgress.DataConsistencyCheck": "数据一致性校验:", @@ -4672,41 +2624,31 @@ "odc.ExternalIntegration.SqlInterceptor.Enabled": "启用成功", "odc.SideBar.Task.Ticket": "工单", "odc.component.Task.helper.DataChanges": "数据变更", - "odc.DataArchiveTask.DetailContent.VariableConfig.TimeOperation": "时间运算", "odc.RiskLevel.components.ViewRiskLevelDrawer.ApprovalRole": "审批角色", "odc.User.AddUserModal.CommonMember": "普通成员", "odc.CommonDetailModal.Nodes.RollbackNode.ErrorMessage": "错误信息", "odc.components.SensitiveColumn.Ok": "确定", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.EnterARuleName": "请输入规则名称", "odc.CommonDetailModal.Nodes.RollbackNode.Success": "成功", "odc.DataClearTask.CreateModal.ArchiveRange.Add": "添加", "odc.components.SQLExplain.ViewOnlyTextFormats": "仅查看文本格式", - "odc.SensitiveColumn.components.ScanForm.Table": "表", - "odc.DataClearTask.CreateModal.ArchiveRange.PartialArchive": "部分归档", "odc.DataClearTask.CreateModal.VariableConfig.PleaseEnter": "请输入", "odc.Secure.Approval.ValidityPeriodOfApproval": "审批有效期", "odc.components.SensitiveRule.Disable": "禁用", - "odc.RiskLevel.components.FormRiskLevelDrawer.RiskLevel": "风险等级", "odc.component.RollbackModal.RollbackScheme": "回滚方案", - "odc.components.ConditionGroup.condition.PleaseSelectAnExpression": "请选择表达式", "odc.AlterDdlTask.DetailContent.ExecutionTime": "执行时间", "odc.page.ExternalIntegration.SqlAuditIntegration": "SQL 审核集成", "odc.component.FormModal.SaveFailed": "保存失败", "odc.Project.CreateProject.PleaseSelect": "请选择", - "odc.DataClearTask.CreateModal.VariableConfig.VariablesCanBeReferencedIn": "变量可在归档配置的过滤条件中引用", "odc.ResourceTree.Nodes.table.Constraints": "约束", - "odc.RiskDetectRules.components.InnerRiskDetectRules.FailedToDelete": "删除失败", "odc.components.SensitiveColumn.ManuallyAdd": "手动添加", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.FailedToCreate": "新建失败", "odc.AlterDdlTask.CreateModal.ChangeDefinition": "变更定义", "odc.component.CommonDetailModal.TaskFlow.GenerateABackupRollbackScheme": "生成备份回滚方案", "odc.NewDatasourceDrawer.Form.Environment": "环境", "odc.component.CommonDetailModal.TaskTools.Execute": "执行", - "odc.SideBar.ResourceTree.Container.Refresh": "刷新", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.Enable": "启用", "odc.Database.AddDataBaseButton.AddDatabase": "添加数据库", "odc.DataArchiveTask.CreateModal.Create": "新建", - "odc.Env.components.InnerEnvironment.NoNeedToImprove": "无需改进", "odc.DataArchiveTask.CreateModal.VariableConfig.AddVariables": "添加变量", "odc.component.FormModal.TheNameAlreadyExists": "名称已存在", "odc.component.WindowManager.DefaultPage.OpenTheSqlWindow": "打开 SQL 窗口", @@ -4714,29 +2656,24 @@ "odc.SensitiveColumn.components.ScanForm.Column": "列", "odc.ExternalIntegration.SSO.Delete": "删除", "odc.components.SensitiveColumn.AddSensitiveColumns": "添加敏感列", - "odc.Env.components.EditRuleDrawer.NoNeedToImprove": "无需改进", "odc.DataArchiveTask.DetailContent.TaskNumber": "任务编号", "odc.ExternalIntegration.SqlInterceptor.CreationTime": "创建时间", "odc.Project.Database.DataSource": "所属数据源", "odc.SensitiveColumn.components.SacnRule.Database": "数据库", "odc.ExternalIntegration.SqlInterceptor.Enable": "启用", "odc.component.FormModal.TheNameContainsSpacesAt": "名称首尾包含空格", - "odc.SQLExplain.components.PopoverContent.TimeConsuming": "耗时", "odc.component.CommonDetailModal.TaskProgress.EstimatedNumberOfRows": "预估数据行数:", "odc.component.Status.ExecutionFailed": "执行失败", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.EnterASpecificationName": "请输入规范名称", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.DesensitizationAlgorithm": "脱敏算法", "odc.AlterDdlTask.CreateModal.StopATask": "停止任务", "odc.DataClearTask.CreateModal.ScheduledExecution": "定时执行", "odc.SensitiveRule.components.DetectWay.GroovyScript": "Groovy脚本", "odc.Secure.Approval.AreYouSureYouWant": "是否确认删除审批流程?", - "odc.SideBar.ResourceTree.SearchForLoadedObjects": "搜索已加载对象", "odc.NewSSODrawerButton.SSOForm.CustomFields": "自定义字段", "odc.component.FormModal.PleaseEnterTheConfiguration": "请输入配置", "odc.component.DetailContent.Manageable": "可管理", "odc.component.FormModal.TitleConfiguration": "{title}配置", "odc.DataClearTask.CreateModal.ArchiveRange.TableName": "表名", - "odc.components.SensitiveColumn.Table": "表", "odc.DataArchiveTask.DetailContent.SourceDatabase": "源数据库", "odc.SSO.SSODetailDrawer.SsoConfiguration": "SSO 配置", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.RuleStatus": "规则状态", @@ -4744,7 +2681,6 @@ "odc.component.DatabaseSelect.Database": "数据库", "odc.DataArchiveTask.CreateModal.VariableConfig.Points": "分", "odc.Project.CreateProject.ProjectName": "项目名称", - "odc.List.ConnectionNameItem.TheDataSourceIsNot": "无该数据源权限", "odc.Setting.Info.Description": "描述", "odc.Setting.Info.UpdatedSuccessfully": "更新成功!", "odc.page.Project.MenuItem.1": "菜单项二", @@ -4757,12 +2693,10 @@ "odc.Env.components.InnerEnvironment.Description": "描述", "odc.SensitiveColumn.components.FormSensitiveColumnDrawer.New": "新建成功", "odc.SpaceContainer.Sider.Project": "项目", - "odc.component.DetailContent.Enable": "开启", "odc.SideBar.Manager.SessionManagement": "会话管理", "odc.component.Status.Failed": "失败", "odc.Datasource.NewDatasourceDrawer.ModifiedSuccessfully": "修改成功", "odc.component.FormModal.SetApprovalNode": "设置审批节点", - "odc.DataArchiveTask.CreateModal.Remarks": "备注", "odc.Secure.Approval.CreateAnApprovalProcess": "新建审批流程", "odc.components.SensitiveRule.DeletedSuccessfully": "删除成功", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.ViewIdentificationRules": "查看识别规则", @@ -4774,17 +2708,13 @@ "odc.AlterDdlTask.DetailContent.StopATask": "停止任务", "odc.components.SensitiveRule.Regular": "正则", "odc.AlterDdlTask.DetailContent.RiskLevel": "风险等级", - "odc.Info.NewDataBaseButton.Project": "所属项目", "odc.SpaceContainer.Sider.Ticket": "工单", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.Disable": "停用", "odc.SensitiveColumn.components.ScanForm.PreviewOfScanResults": "扫描结果预览", "odc.components.SensitiveRule.IdentificationRulesCanBeUsed": "识别规则可用于扫描添加敏感列", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.IdentificationMethod": "识别方式", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.CheckResult": "检查结果", "odc.components.SensitiveRule.UpdatedSuccessfully": "更新成功", "odc.component.CommonDetailModal.TaskProgress.NewTableDdl": "新表 DDL", - "odc.DataArchiveTask.CreateModal.ArchiveRange.TableName": "表名", - "odc.SideBar.ResourceTree.Container.AddADataSource": "添加数据源", "odc.components.SensitiveColumn.BatchDeletion": "批量删除", "odc.Project.Database.SortingRules": "排序规则", "odc.SSO.SSODetailDrawer.ObtainNestedUserData": "获取嵌套用户数据", @@ -4801,20 +2731,16 @@ "odc.ResourceTree.Nodes.procedure.StoredProcedure": "存储过程", "odc.page.Datasource.ConfirmToDeleteName": "是否确认删除 {name}", "odc.DataArchiveTask.CreateModal.TargetDatabase": "目标数据库", - "odc.RiskLevel.components.FormRiskLevelDrawer.PleaseSelect": "请选择", "odc.DataArchiveTask.CreateModal.ArchiveRange.ArchiveScope": "归档范围", "odc.Project.CreateProject.Drawer.Ok": "确定", "odc.component.FormModal.ExecutionWaitingPeriod": "执行等待有效期", "odc.SensitiveColumn.components.ScanForm.ScanCompleted": "扫描完成", - "odc.AlterDdlTask.DetailContent.Remarks": "备注", "odc.AlterDdlTask.CreateModal.SqlContent": "SQL 内容", "odc.TreeNodeMenu.config.procedure.CreateAStoredProcedure": "新建存储过程", - "odc.page.Datasource.TheConnectionCannotBeAccessed": "删除后将无法访问该连接", "odc.components.SensitiveRule.EnterARuleName": "请输入规则名称", "odc.components.SensitiveColumn.Column": "列", "odc.component.CommonDetailModal.TaskExecuteRecord.TaskType": "任务类型", "odc.Header.Sorter.SortByDataSourceName.1": "按数据源名(Z-A)排序", - "odc.Env.components.InnerEnvironment.MustBeImproved": "必须改进", "odc.SensitiveColumn.components.SacnRule.IdentificationRules": "识别规则", "odc.component.DetailContent.Founder": "创建人", "odc.component.SelectDatabase.component.DataSource": "数据源", @@ -4824,13 +2750,9 @@ "odc.Secure.MaskingAlgorithm.AlgorithmName": "算法名称", "odc.DataArchiveTask.DetailContent.RiskLevel": "风险等级", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.Exclude": "排除:", - "odc.page.Secure.RiskIdentificationRules": "风险识别规则", "odc.Secure.Approval.ProcessName": "流程名称", "odc.component.CommonDetailModal.TaskTools.Cancel": "取消", "odc.Project.User.Operation": "操作", - "odc.RiskDetectRules.components.InnerRiskDetectRules.CreationTime": "创建时间", - "odc.SensitiveColumn.components.ManualRule.SensitiveColumnAlreadyExists": "敏感列已存在", - "odc.Env.components.InnerEnvironment.SqlCheckSpecification": "SQL 检查规范", "odc.component.SelectTransfer.Clear": "清空", "odc.Env.components.EditRuleDrawer.RuleDescription": "规则描述", "odc.Project.CreateProject.Administrator": "管理员", @@ -4842,7 +2764,6 @@ "odc.page.Datasource.DeletedSuccessfully": "删除成功", "odc.SensitiveColumn.components.EditSensitiveColumnModal.DesensitizationAlgorithm": "脱敏算法", "odc.SessionContextWrap.SessionSelect.modal.Project": "项目", - "odc.SensitiveColumn.components.ManualRule.PleaseSelectAColumn": "请选择列", "odc.component.TaskTable.NewWorkOrder": "新建工单", "odc.component.TaskTable.SqlPlan": "SQL 计划", "odc.page.Auth.Role": "角色", @@ -4871,7 +2792,6 @@ "odc.components.SensitiveColumn.Operation": "操作", "odc.DataArchiveTask.CreateModal.AreYouSureYouWant.1": "是否确认修改此数据归档?", "odc.PermissionApplication.CreateModal.Column": "列", - "odc.DataArchiveTask.CreateModal.TheDescriptionCannotExceedCharacters": "备注不超过 200 个字符", "odc.NewSSODrawerButton.SSOForm.UserFieldMapping": "用户字段映射", "odc.component.ResourceSelector.const.DevelopmentSpecifications": "开发规范", "odc.Secure.RiskLevel.ExternalApprovalExternalapprovalname": "外部审批({externalApprovalName})", @@ -4887,14 +2807,12 @@ "odc.SessionContextWrap.SessionSelect.modal.Project.1": "所属项目", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.TestDataCannotBeEmpty": "测试数据不能为空", "odc.ExternalIntegration.SqlInterceptor.CreateTitle": "新建{title}", - "odc.DataClearTask.CreateModal.Remarks": "备注", "odc.component.RollbackModal.Custom": "自定义", "odc.SSO.SSODetailDrawer.UserInformationDataStructureType": "用户信息数据结构类型", "odc.Setting.Info.OperationSucceeded": "操作成功", "odc.component.TaskTable.DataCleansing": "数据清理", "odc.NewSSODrawerButton.SSOForm.TestConnection": "测试连接", "odc.NewSSODrawerButton.SSOForm.UserNameField": "用户名称字段", - "odc.Secure.RiskLevel.RiskLevel": "风险等级", "odc.component.CommonDetailModal.TaskTools.CanceledSuccessfully": "取消成功", "odc.SpaceContainer.Sider.ExternalIntegration": "外部集成", "odc.ExternalIntegration.SqlInterceptor.Status": "状态", @@ -4914,19 +2832,15 @@ "odc.DataArchiveTask.DetailContent.Yes": "是", "odc.ResourceTree.Nodes.function.Function": "函数", "odc.component.RollbackModal.ReferenceSystemGeneratedSolutions": "引用系统生成的方案", - "odc.DataClearTask.CreateModal.VariableConfig.VariableConfiguration": "变量配置", "odc.Setting.Info.EnterADescription": "请输入描述", - "odc.SQLExplain.Trace.ExecutionTimeline": "执行时间线", "odc.Secure.Approval.Ok": "确定", "odc.SensitiveColumn.components.SacnRule.SelectAnIdentificationRule": "请选择识别规则", "odc.component.Task.helper.DataExport": "数据导出", "odc.Project.Database.Operation": "操作", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.DesensitizationVerification": "脱敏验证", "odc.Project.User.AddMembers": "添加成员", - "odc.Info.ChangeProjectModal.TransferProject": "转移项目", "odc.ExternalIntegration.SSO.Type": "类型", "odc.component.CommonDetailModal.TaskExecuteRecord.Rollback": "回滚", - "odc.Secure.RiskLevel.View": "查看", "odc.components.SensitiveRule.Operation": "操作", "odc.component.DetailContent.ViewOnly": "仅查看", "odc.DataArchiveTask.DetailContent.VariableConfig.TimeFormat": "时间格式", @@ -4940,8 +2854,6 @@ "odc.component.helpDoc.doc.SwitchTheOriginalTableTo": "数据一致后将原表切换为目标表", "odc.page.Auth.User": "用户", "odc.component.StatusSwitch.AreYouSureYouWant": "是否确定关闭?", - "odc.RiskDetectRules.components.InnerRiskDetectRules.EnterARuleNameTo": "请输入规则名称搜索", - "odc.DataClearTask.CreateModal.TheDescriptionCannotExceedCharacters": "备注不超过 200 个字符", "odc.component.CommonDetailModal.TaskExecuteRecord.TaskStatus": "任务状态", "odc.Secure.Approval.ApprovalProcess": "审批流程", "odc.Info.NewDataBaseButton.CreateADatabase": "新建数据库", @@ -4950,7 +2862,6 @@ "odc.component.FormModal.TheNameCannotExceedCharacters": "名称不超过 64 个字符", "odc.Database.AddDataBaseButton.Database": "数据库", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.Enable": "启用", - "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.TestData": "测试数据", "odc.DataArchiveTask.CreateModal.ArchiveRange.PleaseSelect": "请选择", "odc.Script.ScriptFile.SearchScript": "搜索脚本", "odc.PermissionApplication.CreateModal.AreYouSureYouWant": "是否确认取消新建敏感列申请?", @@ -4960,9 +2871,7 @@ "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.NotEnabled": "未启用", "odc.components.SensitiveRule.FailedToDelete": "删除失败", "odc.PermissionApplication.CreateModal.SelectSensitiveColumns": "选择敏感列", - "odc.SensitiveColumn.components.ManualRule.SelectADataSource": "请选择数据源", "odc.Setting.Info.EnterAName": "请输入名称", - "odc.page.Secure.interface.RecommendedImprovement": "建议改进", "odc.component.WindowManager.DefaultPage.QuickStart": "快速开始", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.TableName": "表名", "odc.ResourceTree.Nodes.type.Variable": "变量", @@ -4981,19 +2890,16 @@ "odc.components.SensitiveColumn.Disable": "禁用", "odc.component.CommonDetailModal.TaskTools.Rollback": "回滚", "odc.components.SessionManagementPage.ConfirmToCloseTheSession": "确认关闭会话", - "odc.Secure.RiskLevel.ApprovalProcess": "审批流程", "odc.AlterDdlTask.CreateModal.SelectAChangeDefinition": "请选择变更定义", "odc.DataClearTask.DetailContent.CreationTime": "创建时间", "odc.AlterDdlTask.CreateModal.Cancel": "取消", "odc.TreeNodeMenu.config.function.CreateAFunction": "新建函数", "odc.ExternalIntegration.SqlInterceptor.Ok": "确定", - "odc.components.SQLExplain.FullLinkTrace": "全链路 TRACE", "odc.component.TaskTable.TicketDescription": "工单描述", "odc.PermissionApplication.CreateModal.Export": "导出", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.Close": "关闭", "odc.Secure.Approval.AutomaticApproval": "自动审批", "odc.SideBar.Manager.DatabaseOM": "数据库运维", - "odc.src.d.ts.environment.Development": "开发", "odc.Datasource.Info.TheCurrentDatabaseDoesNot": "当前数据库不存在", "odc.component.FormModal.Save": "保存", "odc.PermissionApplication.CreateModal.Add": "添加", @@ -5012,8 +2918,6 @@ "odc.AlterDdlTask.DetailContent.NumberOfFailedRetries": "失败重试次数", "odc.ExternalIntegration.SSO.Edit": "编辑", "odc.DataArchiveTask.CreateModal.ExecuteNow": "立即执行", - "odc.AlterDdlTask.CreateModal.EnterAComment": "请输入备注", - "odc.RiskLevel.components.FormRiskLevelDrawer.Ok": "确定", "odc.page.Exception.403.LogOnAgain": "重新登录", "odc.Datasource.Datasource.ParamContext.DataSourceName": "数据源名", "odc.component.DetailContent.TitleName": "{title}名称", @@ -5023,22 +2927,15 @@ "odc.Project.CreateProject.CommonMember": "普通成员", "odc.Project.User.DeletedSuccessfully": "删除成功", "odc.SensitiveRule.components.CheckboxInput.PleaseEnter": "请输入", - "odc.DataClearTask.CreateModal.EnterAComment": "请输入备注", - "odc.Env.components.InnerEnvironment.FailedToSubmit": "提交失败", "odc.Secure.Approval.ExecutionValidityPeriod": "执行有效期", - "odc.DataClearTask.DetailContent.VariableConfig.TimeOperation": "时间运算", "odc.AlterDdlTask.CreateModal.LockTableTimeout": "锁表超时时间", "odc.NewSSODrawerButton.SSOForm.ConfigurationName": "配置名称", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.DetailsOfRiskIdentificationRules": "风险识别规则详情", - "odc.Env.components.InnerEnvironment.UpdatedSuccessfully": "更新成功", "odc.Datasource.Info.Delete": "删除", "odc.components.SensitiveColumn.AreYouSureYouWant.1": "确认要删除敏感列吗?", "odc.SideBar.Manager.QueryAndRestoreDeletedDatabase": "查询和还原被删除的数据库对象", - "odc.Env.components.InnerEnvironment.Status": "状态", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.RuleDescription": "规则描述", "odc.DataArchiveTask.DetailContent.CreationTime": "创建时间", "odc.ResourceTree.Nodes.trigger.Trigger": "触发器", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.RiskLevel": "风险等级:", "odc.Secure.Approval.Operation": "操作", "odc.AlterDdlTask.CreateModal.PleaseEnterTheNumberOf": "请输入失败重试次数", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.CreationTime": "创建时间", @@ -5052,8 +2949,6 @@ "odc.Project.Project.ProjectName": "项目名称", "odc.Secure.Approval.Hours": "小时", "odc.SensitiveRule.components.DetectWay.IdentificationMethod": "识别方式", - "odc.Info.ChangeProjectModal.Project": "所属项目", - "odc.components.ConditionGroup.condition.TaskType": "任务类型", "odc.DataClearTask.CreateModal.ArchiveRange.CleaningRange": "清理范围", "odc.ResourceTree.Nodes.sequence.Sequence": "序列", "odc.DataClearTask.DetailContent.VariableConfiguration": "变量配置", @@ -5066,7 +2961,6 @@ "odc.NewSSODrawerButton.SSOForm.Type": "类型", "odc.page.ExternalIntegration.SsoIntegration": "SSO 集成", "odc.component.FormModal.TitleName": "{title}名称", - "odc.DataClearTask.CreateModal.VariableConfig.Points": "分", "odc.ResourceTree.Nodes.package.Subprogram": "子程序", "odc.AlterDdlTask.CreateModal.Seconds": "秒", "odc.Project.Database.CharacterEncoding": "字符编码", @@ -5080,7 +2974,6 @@ "odc.Project.Sensitive.interface.Script": "脚本", "odc.RiskLevel.components.ViewRiskLevelDrawer.ApprovalProcess": "审批流程", "odc.SensitiveColumn.components.EditSensitiveColumnModal.EditSensitiveColumns": "编辑敏感列", - "odc.AlterDdlTask.CreateModal.TheDescriptionCannotExceedCharacters": "备注不超过 200 个字符", "odc.src.d.ts.CoverUp": "掩盖", "odc.component.CommonDetailModal.TaskTools.RetrySucceeded": "重试成功", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.Enable": "启用", @@ -5088,7 +2981,6 @@ "odc.PermissionApplication.CreateModal.OneYear": "一年", "odc.NewSSODrawerButton.SSOForm.AuthorizationMethodOfOauth": "OAUTH2 的授权方式", "odc.DataClearTask.DetailContent.Founder": "创建人", - "odc.Env.components.InnerEnvironment.UpdateFailed": "更新失败", "odc.component.DetailContent.EncryptionAlgorithm": "加密算法", "odc.SideBar.ResourceTree.Container.DataSource": "数据源", "odc.RiskLevel.components.ViewRiskLevelDrawer.Description": "描述", @@ -5096,9 +2988,7 @@ "odc.DataClearTask.DetailContent.ExecutionMethod": "执行方式", "odc.NewSSODrawerButton.SSOForm.AutomaticGeneration": "自动生成", "odc.ExternalIntegration.SqlInterceptor.Cancel": "取消", - "odc.RiskDetectRules.components.InnerRiskDetectRules.CreateARiskIdentificationRule": "新建风险识别规则", "odc.Env.components.EditRuleDrawer.Submit": "提交", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Operation": "操作", "odc.SessionContextWrap.SessionSelect.modal.Category": "类别", "odc.Env.components.InnerEnvironment.RuleName": "规则名称", "odc.User.UpdateUserModal.Administrator": "管理员", @@ -5110,11 +3000,8 @@ "odc.SensitiveRule.components.DetectWay.Script": "脚本", "odc.AlterDdlTask.CreateModal.AreYouSureYouWant": "是否确认取消无锁结构变更?", "odc.AlterDdlTask.DetailContent.LockTableTimeout": "锁表超时时间", - "odc.components.ConditionGroup.condition.DatabaseName": "数据库名称", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Founder": "创建人", "odc.Project.Setting.ProjectInformation": "项目信息", "odc.Project.User.AreYouSureYouWant": "是否确定删除该成员?", - "odc.RiskLevel.components.FormRiskLevelDrawer.UpdateFailed": "更新失败", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.AreYouSureYouWant.1": "是否确认取消新建?", "odc.ScriptFile.Item.CopyPath": "复制路径", "odc.page.Secure.Environment": "环境", @@ -5122,7 +3009,6 @@ "odc.AsyncTask.CreateModal.GenerateABackupRollbackScheme": "生成备份回滚方案", "odc.SensitiveRule.components.CheckboxInput.PleaseSelectTheIdentificationObject": "请先勾选识别对象", "odc.component.FormModal.Create": "新建", - "odc.DataArchiveTask.CreateModal.VariableConfig.TimeOperation": "时间运算", "odc.ExternalIntegration.SqlInterceptor.SqlAuditIntegration": "SQL 审核集成", "odc.Project.Project.ArchiveProject": "归档项目", "odc.Env.components.EditRuleDrawer.ImprovementLevel": "改进等级", @@ -5133,7 +3019,6 @@ "odc.RiskLevel.components.ViewRiskLevelDrawer.AutomaticApproval": "自动审批", "odc.Project.Database.Import": "导入", "odc.component.DetailContent.CanBeCreated": "可新建", - "odc.page.pages.Ticket": "工单", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.PathRecognitionExpression": "路径识别表达式", "odc.RiskLevel.components.ViewRiskLevelDrawer.ExecutionWaitingPeriod": "执行等待有效期", "odc.component.WindowManager.DefaultPage.OpenTheAnonymousBlockWindow": "打开匿名块窗口", @@ -5141,7 +3026,6 @@ "odc.Project.User.Remove": "移除", "odc.SSO.NewSSODrawerButton.Cancel": "取消", "odc.component.FormModal.EditApprovalProcess": "编辑审批流程", - "odc.DataClearTask.CreateModal.VariableConfig.Hours": "小时", "odc.AlterDdlTask.DetailContent.TaskNumber": "任务编号", "odc.page.Datasource.ViewAllDataSources": "查看所有数据源", "odc.SideBar.Script.Script": "脚本", @@ -5149,7 +3033,6 @@ "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.DesensitizationMethod": "脱敏方式", "odc.ResourceTree.Nodes.table.Index": "索引", "odc.DataArchiveTask.DetailContent.CleanUpArchivedDataFrom": "清理源端已归档的数据", - "odc.RiskLevel.components.FormRiskLevelDrawer.Description": "描述", "odc.ResourceTree.Nodes.table.Partition": "分区", "odc.SSO.SSODetailDrawer.Close": "关闭", "odc.Workspace.ActivityBar.type.Database": "数据库", @@ -5167,15 +3050,12 @@ "odc.SideBar.Manager.GlobalVariables": "全局变量", "odc.component.FormModal.ProcessCreationFailed": "流程创建失败", "odc.page.Auth.utils.CanBeCreated": "可新建", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.Create": "新建", "odc.DataClearTask.CreateModal.TheTaskNeedsToBe": "任务需要重新审批,审批通过后此任务将重新执行", "odc.component.DetailContent.DataSource": "数据源", "odc.NewDatasourceDrawer.Form.Type": "类型", "odc.SessionContextWrap.SessionSelect.modal.DataSource.1": "所属数据源", "odc.ExternalIntegration.SqlInterceptor.Close": "关闭", "odc.components.SensitiveColumn.EnterATableNameColumn": "请输入表名/列名", - "odc.component.Task.ExecuteNow": "立即执行", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.New": "新建成功", "odc.Project.CreateProject.Drawer.Cancel": "取消", "odc.AlterDdlTask.DetailContent.Library": "所属库", "odc.component.CommonDetailModal.TaskProgress.View": "查看", @@ -5191,7 +3071,6 @@ "odc.Datasource.Info.CharacterEncoding": "字符编码", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.NotEnabled": "未启用", "odc.AlterDdlTask.CreateModal.SelectTaskErrorHandling": "请选择任务错误处理", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.Submit": "提交", "odc.CommonDetailModal.Nodes.RollbackNode.ProcessingStatus": "处理状态", "odc.Workspace.ActivityBar.type.Script": "脚本", "odc.component.FormModal.FailedToCreate": "创建失败", @@ -5204,11 +3083,9 @@ "odc.ExternalIntegration.SqlInterceptor.EnterAConfigurationName": "请输入配置名称", "odc.Env.components.EditRuleDrawer.RuleType": "规则类型", "odc.components.SensitiveRule.Ok": "确定", - "odc.AlterDdlTask.DetailContent.MaxrisklevelLevel": "{maxRiskLevel}级", "odc.SSO.SSODetailDrawer.BasicInformation": "基本信息", "odc.components.UserPage.component.ExtraProperties": "自定义属性", "odc.component.FormModal.EnterAKey": "请输入密钥", - "odc.Datasource.Info.TransferProject": "转移项目", "odc.SensitiveColumn.components.ScanForm.DesensitizationAlgorithm": "脱敏算法", "odc.SSO.NewSSODrawerButton.Edit.ModifiedSuccessfully": "修改成功", "odc.component.CommonDetailModal.TaskTools.RollbackSucceeded": "回滚成功", @@ -5227,7 +3104,6 @@ "odc.DataArchiveTask.DetailContent.VariableConfig.VariableName": "变量名", "odc.ResourceTree.Project.SearchForProjectName": "搜索项目名称", "odc.page.Datasource.RecycleBin": "回收站", - "odc.components.ConditionGroup.TheConditionIsARule": "条件是通过表达式配置的规则。例如:条件「环境 为 prod」将会匹配在「prod」环境中执行的工单。", "odc.page.Auth.AutomaticAuthorization": "自动授权", "odc.component.AuthNode.AutomaticApproval": "自动审批", "odc.component.Task.helper.DataCleansing": "数据清理", @@ -5235,7 +3111,6 @@ "odc.PermissionApplication.CreateModal.SelectAnEffectiveRange": "选择生效范围", "odc.component.DatabaseSelect.SelectADatabase": "请选择数据库", "odc.SensitiveRule.components.DetectWay.UseAsTheWildcardAnd": "使用「*」作为通配符,使用「,」作为分割符,例如:db*.table.*a,*.*.name", - "odc.SensitiveColumn.components.ManualForm.Database": "数据库", "odc.DataArchiveTask.CreateModal.VariableConfig.TimeFormat": "时间格式", "odc.DataArchiveTask.CreateModal.ArchiveRange.FilterConditions": "过滤条件", "odc.components.SensitiveColumn.Delete": "删除", @@ -5247,11 +3122,8 @@ "odc.page.ExternalIntegration.ApprovalIntegration": "审批集成", "odc.NewSSODrawerButton.SSOForm.PleaseTestTheConnectionFirst": "请先进行测试连接,跳转完成登录后,成功获取测试信息即可保存该配置", "odc.page.Project.Member": "成员", - "odc.DataClearTask.DetailContent.VariableConfig.VariableName": "变量名", "odc.Env.components.InnerEnvironment.ImprovementLevel": "改进等级", "odc.component.FormModal.WhetherToEnableEncryption": "是否启用加密", - "odc.Workspace.ActivityBar.type.Task": "任务", - "odc.components.ConditionGroup.condition.ProjectName": "项目名称", "odc.Env.components.InnerEnvironment.RuleType": "规则类型", "odc.Project.Database.LogOnToTheDatabase": "登录数据库", "odc.Form.DBTypeItem.DataSourceType": "数据源类型", @@ -5283,7 +3155,6 @@ "odc.page.Task.Ticket": "工单", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.Close": "关闭", "odc.component.SelectTransfer.SelectUser": "选择用户", - "odc.Env.components.InnerEnvironment.SqlWindowSpecification": "SQL 窗口规范", "odc.page.Secure.DesensitizationAlgorithm": "脱敏算法", "odc.DataClearTask.DetailContent.ArchiveRange.TableName": "表名", "odc.SensitiveRule.components.DetectWay.MatchingRules": "匹配的规则", @@ -5293,13 +3164,10 @@ "odc.Info.NewDataBaseButton.SortingRules": "排序规则", "odc.NewSSODrawerButton.SSOForm.PleaseEnter": "请输入", "odc.Env.components.EditRuleDrawer.Edit": "编辑", - "odc.SensitiveColumn.components.ManualForm.DataSource": "数据源", "odc.component.FormModal.Disable": "停用", - "odc.DataClearTask.DetailContent.Remarks": "备注", "odc.component.AuthNode.Role": "角色", "odc.page.Gateway.newCloudConnection.PersonalSpaceDoesNotExist": "个人空间不存在!", "odc.component.ResourceSelector.const.DataSource": "数据源", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Cancel": "取消", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.TableName": "表名", "odc.Database.AddDataBaseButton.PleaseSelect": "请选择", "odc.AlterDdlTask.DetailContent.ChangeDefinition": "变更定义", @@ -5312,55 +3180,38 @@ "odc.SpaceContainer.Sider.DataSource": "数据源", "odc.Project.Database.Environment": "环境", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.ColumnName": "列名", - "odc.SensitiveColumn.components.ManualRule.SelectADesensitizationAlgorithm": "请选择脱敏算法", "odc.ExternalIntegration.SqlInterceptor.ConfigurationName": "配置名称", "odc.Env.components.EditRuleDrawer.SupportsDataSources": "支持数据源", - "odc.RiskLevel.components.FormRiskLevelDrawer.SelectAnApprovalProcess": "请选择审批流程", "odc.SensitiveColumn.components.EditSensitiveColumnModal.SelectADesensitizationAlgorithm": "请选择脱敏算法", "odc.page.Project.ViewAllProjects": "查看所有项目", - "odc.DataArchiveTask.CreateModal.VariableConfig.VariableConfiguration": "变量配置", - "odc.TreeNodeMenu.config.type.BatchCompilation": "批量编译", - "odc.SQLExplain.components.PopoverContent.StartTime": "开始时间", "odc.DataClearTask.CreateModal.ExecuteNow": "立即执行", "odc.DataArchiveTask.CreateModal.Cancel": "取消", "odc.component.helpDoc.doc.ManageAllDatabasesAndMembers": "可管理项目所有数据库和成员", "odc.component.helpDoc.doc.ManageAllDatabasesOfA": "可管理项目所有数据库", "odc.AlterDdlTask.CreateModal.IgnoreErrorsToContinueThe": "忽略错误继续任务", - "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.DetailsOfDesensitizationRules": "脱敏规则详情", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.RuleName": "规则名称", "odc.Datasource.NewDatasourceDrawer.Cancel": "取消", "odc.DataClearTask.CreateModal.Save": "保存", "odc.component.CommonDetailModal.TaskTools.AreYouSureYouWant": "是否确定回滚任务?", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.AreYouSureYouWant": "是否确认取消编辑?", "odc.SSO.SSODetailDrawer.CustomFields": "自定义字段", - "odc.DataClearTask.CreateModal.VariableConfig.Month": "月", "odc.SensitiveRule.components.CheckboxInput.EnterARegularExpression": "请填写正则表达式", - "odc.component.helpDoc.doc.YouCanUseSqlWhere": "可通过 SQL where 语句配置过滤条件,如\"create_time > '2023-01-01'\";\n也可通过引用变量进行动态配置,如\" create_time < '\\${archive_date}'\"", - "odc.SideBar.ResourceTree.RefreshTheDatabaseList": "刷新数据库列表", "odc.DataClearTask.DetailContent.CleaningRange": "清理范围", - "odc.RiskLevel.components.FormRiskLevelDrawer.EnterADescription": "请输入描述", - "odc.components.ConditionGroup.condition.EnvironmentName": "环境名称", "odc.component.FormModal.AreYouSureYouWant": "是否确定取消编辑?取消保存后,所编辑的内容将不生效", "odc.DataClearTask.CreateModal.Ok": "确定", "odc.NewSSODrawerButton.SSOForm.AdvancedOptions": "高级选项", "odc.ScriptFile.Item.OkDeleteScript": "确定删除脚本", - "odc.RiskDetectRules.components.InnerRiskDetectRules.AreYouSureYouWant": "是否确定删除?", "odc.SensitiveColumn.components.ScanForm.Delete": "删除", "odc.SideBar.ResourceTree.Container.Project": "项目", "odc.Project.CreateProject.Drawer.CreateAProject.1": "创建项目", "odc.Datasource.Info.Project": "所属项目", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.ConfigurationValue": "配置值", - "odc.SensitiveColumn.components.ManualForm.Column": "列", "odc.components.SensitiveColumn.UpdatedSuccessfully": "更新成功", "odc.Header.Filter.FilterDataSources": "筛选数据源", "odc.AlterDdlTask.CreateModal.NewLockFreeStructureChange": "新建无锁结构变更", - "odc.components.ConditionGroup.condition.PleaseSelect": "请选择", "odc.SSO.NewSSODrawerButton.CreateSsoIntegration": "新建 SSO 集成", - "odc.components.ConditionGroup.Condition": "条件", "odc.SensitiveColumn.components.EditSensitiveColumnModal.PleaseSelect": "请选择", "odc.component.CommonDetailModal.TaskTools.Termination": "终止", "odc.DataArchiveTask.CreateModal.PeriodicExecution": "周期执行", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.ProjectName": "项目名称", "odc.component.CommonDetailModal.TaskProgress.SourceTable": "源表", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.CreateAnIdentificationRule": "新建识别规则", "odc.Setting.Info.ConfirmModification": "确认修改", @@ -5368,32 +3219,22 @@ "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.RuleStatus": "规则状态", "odc.SessionContextWrap.SessionSelect.modal.Environment": "环境", "odc.Database.AddDataBaseButton.AddedSuccessfully": "添加成功", - "odc.RiskLevel.components.FormRiskLevelDrawer.SelectApprovalProcess": "选择审批流程", "odc.page.Datasource.Session": "会话", - "odc.DataClearTask.CreateModal.ArchiveRange.ArchiveTheEntireDatabase": "整库归档", "odc.AlterDdlTask.CreateModal.EnterTheSqlContent": "请填写 SQL 内容", "odc.SSO.NewSSODrawerButton.Edit.ConfirmModification": "确认修改", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.DatabaseName": "数据库名称", "odc.SensitiveColumn.components.ScanForm.Operation": "操作", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.PleaseSelect": "请选择", - "odc.SQLExplain.Trace.Node": "节点", "odc.ResourceTree.Nodes.type.Type": "类型", - "odc.RiskDetectRules.components.InnerRiskDetectRules.View": "查看", - "odc.SensitiveColumn.components.ManualRule.SelectATable": "请选择表", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.Create": "新建", "odc.NewSSODrawerButton.SSOForm.TheConfigurationNameWillBe": "配置名称将会应用于自定义登录名", "odc.ExternalIntegration.SqlInterceptor.Edit": "编辑", "odc.NewDatasourceDrawer.Form.SysForm.ConnectionSuccessful": "连接成功", - "odc.Project.Database.TransferProject": "转移项目", "odc.SensitiveRule.components.DetectWay.EnterAMatchingRule": "请输入匹配的规则", "odc.Project.User.ProjectRole": "项目角色", "odc.DataClearTask.DetailContent.NextExecutionTime": "下一次执行时间", "odc.Info.NewDataBaseButton.DatabaseName": "数据库名称", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.RuleName": "规则名称", "odc.SpaceContainer.Sider.SafetySpecifications": "安全规范", - "odc.Env.components.InnerEnvironment.SubmittedSuccessfully": "提交成功", "odc.NewSSODrawerButton.SSOForm.ObtainTheUserInfoAddress": "授权服务器提供的获取 user-info 地址", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.CreateARiskIdentificationRule": "新建风险识别规则", "odc.AlterDdlTask.DetailContent.DeleteNow": "立即删除", "odc.Project.Database.LastSynchronizationTime": "上一次同步时间", "odc.page.Project.Database": "数据库", @@ -5402,7 +3243,6 @@ "odc.AlterDdlTask.CreateModal.SelectACleanupPolicy": "请选择清理策略", "odc.Datasource.Info.LastSynchronizationTime": "最近一次同步时间", "odc.SensitiveRule.components.CheckboxInput.RegularExpression": "正则表达式", - "odc.AlterDdlTask.CreateModal.Remarks": "备注", "odc.component.AuthNode.ExternalApproval": "外部审批", "odc.component.ResourceSelector.const.RiskLevel": "风险等级", "odc.page.Project.Settings": "设置", @@ -5419,38 +3259,29 @@ "odc.SensitiveColumn.components.SacnRule.PleaseSelect": "请选择", "odc.components.SensitiveRule.Edit": "编辑", "odc.component.DetailContent.Editable": "可编辑", - "odc.DataClearTask.CreateModal.VariableConfig.TimeOperation": "时间运算", "odc.component.FormModal.ProcessSaveFailed": "流程保存失败", "odc.component.DetailContent.Remarks": "备注", "odc.ExternalIntegration.SqlInterceptor.Disable": "停用", "odc.Auth.Role.EnableStatus": "启用状态", "odc.SensitiveRule.components.DetectWay.PleaseEnter": "请输入", - "odc.Project.Sensitive.IdentificationRules": "识别规则", "odc.Project.Database.DatabaseChanges": "数据库变更", "odc.component.FormModal.TheProcessNameAlreadyExists": "流程名称已存在", "odc.DataArchiveTask.DetailContent.VariableConfiguration": "变量配置", - "odc.page.Secure.ApprovalProcess": "审批流程", "odc.components.SensitiveRule.CreateAnIdentificationRule": "新建识别规则", "odc.DataClearTask.CreateModal.AreYouSureYouWant.1": "是否确认修改此数据清理?", "odc.User.UpdateUserModal.EditMember": "编辑成员", "odc.component.FormModal.ProcessCreatedSuccessfully": "流程创建成功", - "odc.SqlInterceptor.constant.ThisIsATemplateFor": "# This is a template for integrating a custom approval system.\n# You must fill in all required fields according to the regulation to adapt to your approval system.\n\n\n# Approval timeout in seconds\n# ODC will actively terminate the external process instance if this time is exceeded\napprovalTimeoutSeconds: 86400\n\n# HTTP configurations\nhttp:\n # HTTP connection timeout in second\n connectTimeoutSeconds: 5\n # HTTP socket timeout in second\n socketTimeoutSeconds: 30\n\n# API configurations\napi:\n # API configurations used to start a process instance\n start:\n # Request method, supported values: GET | POST | PUT | PATCH\n method: ~\n # Request URI\n url: ~\n # Request headers, the format is: \n headers:\n # Sample of headers\n Content-Type: application/json;charset=UTF-8\n Accept: application/json\n # Request query parameters, the format is: \n queryParameters: ~\n # Request body\n body:\n # Type of request body, supported values: FORM_DATA | RAW\n type: RAW\n # Content of request body, the format is: for RAW type or for FORM_DATA type\n # Sample of request content in type of RAW\n content: |-\n {\n \"userId\": \"\\${user.id}\",\n \"userName\": \"\\${user.name}\",\n \"taskType\": \"\\${task.type}\",\n \"connection\": \"\\${connection.name}\",\n \"tenant\": \"\\${connection.tenant}\"\n }\n # Mark whether the request body is encrypted\n requestEncrypted: false\n # Expression to judge whether the request is successful based on the response body analysis, using the SPEL syntax\n requestSuccessExpression: '[success] == true'\n # Mark whether the response body is encrypted\n responseEncrypted: false\n # Expression to extract ID of process instance created by the external system based on the response body analysis, using the SPEL syntax\n extractInstanceIdExpression: '[content].[processInstanceId]'\n # API configurations used to query the status of a process instance\n # Usage of the parameter with the same name is consistent with that described above\n status:\n method: ~\n url: ~\n headers: ~\n queryParameters: ~\n body:\n type: FORM_DATA\n # Sample of request content in type of FORM_DATA\n content:\n processInstanceId: \\${process.instance.id}\n authKey: this-is-an-example\n requestEncrypted: false\n requestSuccessExpression: '[success] == true'\n responseEncrypted: false\n # Expression to judge that the process instance is waiting for approval based on the response body analysis, using the SPEL syntax\n processPendingExpression: '[content][processInstanceStatus] == \"RUNNING\"'\n # Expression to judge that the process instance is approved based on the response body analysis, using the SPEL syntax\n processApprovedExpression: '[content][outResult] == \"APPROVED\"'\n # Expression to judge that the process instance is rejected based on the response body analysis, using the SPEL syntax\n processRejectedExpression: '[content][outResult] == \"REJECTED\"'\n # Expression to judge that the process instance is terminated based on the response body analysis, using the SPEL syntax\n processTerminatedExpression: '[content][processInstanceStatus]==\"TERMINATED\"'\n # API configurations used to cancel a process instance\n # Usage of the parameter with the same name is consistent with that described above\n cancel:\n method: ~\n url: ~\n headers: ~\n queryParameters: ~\n body:\n type: RAW\n # Sample of request content in type of RAW\n content: |-\n {\n \"processInstanceId\": \"\\${processInstanceId}\"\n }\n requestEncrypted: false\n requestSuccessExpression: '[success] == true'\n responseEncrypted: false\n\n# Advanced parameters\nadvanced:\n # Expression to build URL for jumping to external system to view ticket details\n hyperlinkExpression: http://localhost:5678/instanceDetails/?procInsId=\\${process.instance.id}", "odc.Secure.Approval.DeletedSuccessfully": "删除成功", - "odc.RiskDetectRules.components.InnerRiskDetectRules.Ok": "确定", - "odc.RiskLevel.components.FormRiskLevelDrawer.Cancel": "取消", "odc.component.ResourceSelector.const.Project": "项目", "odc.component.CommonDetailModal.RollbackTicket": "回滚工单", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.SelectARuleStatus": "请选择规则状态", "odc.Project.CreateProject.Drawer.New": "新建成功", - "odc.RiskLevel.components.FormRiskLevelDrawer.EditRiskLevel": "编辑风险等级", "odc.NewSSODrawerButton.SSOForm.ASeparateCallbackWhitelistIs": "测试连接需要单独的回调白名单,请手动添加 {redirectUrl}", "odc.component.Task.helper.DataArchiving": "数据归档", "odc.component.StatusSwitch.Cancel": "取消", - "odc.components.ConditionGroup.condition.Include": "包含", "odc.SideBar.Manager.ManageAllSessionInformationIn": "管理数据源下所有会话信息", "odc.components.SensitiveColumn.Edit": "编辑", "odc.RiskLevel.components.ViewRiskLevelDrawer.ViewRiskLevels": "查看风险等级", - "odc.page.Project.SensitiveData": "敏感数据", "odc.ResourceTree.Nodes.synonym.CommonSynonyms": "公共同义词", "odc.component.ResourceSelector.IncludingDataSourcesProjectsRoles": "包括数据源、项目、角色、用户的管理权限(新建/管理/编辑/查看)", "odc.Database.AddDataBaseButton.SelectAnUnassignedDatabase": "请选择未分配项目的数据库", @@ -5462,30 +3293,23 @@ "odc.AlterDdlTask.CreateModal.Create": "新建", "odc.SpaceContainer.Sider.UserPermissions": "用户权限", "odc.components.SensitiveColumn.Cancel": "取消", - "odc.RiskLevel.components.FormRiskLevelDrawer.UpdatedSuccessfully": "更新成功", "odc.CommonDetailModal.Nodes.RollbackNode.Failed": "失败", "odc.Project.Database.Export": "导出", "odc.component.FormModal.CreateAnApprovalProcess": "新建审批流程", "odc.MaskingAlgorithm.components.ViewMaskingAlgorithmDrawer.PleaseEnter": "请输入", - "odc.Env.components.EditRuleDrawer.MustBeImproved": "必须改进", "odc.component.DetailContent.Disable": "停用", "odc.component.TaskTable.Status": "状态", "odc.DataClearTask.CreateModal.VariableConfig.AddVariables": "添加变量", "odc.SessionContextWrap.SessionSelect.modal.SwitchDatabases": "切换数据库", - "odc.RiskLevel.components.FormRiskLevelDrawer.CreateAnApprovalProcess": "新建审批流程", "odc.Secure.Approval.Delete": "删除", - "odc.SensitiveColumn.components.ManualForm.Add": "添加", "odc.component.SelectDatabase.component.PleaseSelect": "请选择", "odc.AsyncTask.CreateModal.TheRollbackSchemeCanBe": "可针对 Update、Delete 语句自动生成回滚方案,并以附件形式提供下载,该方案仅供参考", "odc.component.FormModal.AreYouSureYouWant.1": "确定要取消新建吗?", "odc.SensitiveColumn.components.SacnRule.DataSource": "数据源", - "odc.components.ConditionGroup.condition.SelectAValue": "请选择值", "odc.Info.NewDataBaseButton.New": "新建成功", - "odc.Project.Sensitive.SensitiveColumn": "敏感列", "odc.Script.Snippet.Edit": "编辑", "odc.AlterDdlTask.CreateModal.SwitchTableSettings": "切换表设置", "odc.component.FormModal.TitleStatus": "{title}状态", - "odc.Env.components.InnerEnvironment.RecommendedImprovement": "建议改进", "odc.Datasource.NewDatasourceDrawer.EnterADataSourceName": "请输入数据源名称", "odc.DataClearTask.CreateModal.AreYouSureYouWant": "是否确认取消此数据清理?", "odc.component.FormModal.TheProcessNameContainsSpaces": "流程名称首尾包含空格", @@ -5494,9 +3318,7 @@ "odc.SSO.NewSSODrawerButton.Edit.Cancel": "取消", "odc.AlterDdlTask.DetailContent.CreationTime": "创建时间", "odc.SSO.NewSSODrawerButton.PleaseTestTheConnectionFirst": "请先进行测试连接", - "odc.RiskDetectRules.components.InnerRiskDetectRules.DefaultCreator": "默认创建人", "odc.SensitiveRule.components.DetectWay.PleaseEnterGroovyScript": "请输入Groovy脚本", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.Include": "包含", "odc.Auth.User.EnableStatus": "启用状态", "odc.SensitiveRule.components.ViewSensitiveRuleDrawer.IdentificationRules": "识别规则", "odc.Script.Snippet.Delete": "删除", @@ -5505,13 +3327,10 @@ "odc.SensitiveColumn.components.ScanForm.Database": "数据库", "odc.Secure.RiskLevel.AutomaticApproval": "自动审批", "odc.component.helpDoc.doc.SetOffsetInformationBasedOn": "以系统默认变量“archive_date”时间点为基准设置偏移信息", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.TaskType": "任务类型", "odc.component.NodeSelector.SelectTitle": "请选择{title}", "odc.AlterDdlTask.DetailContent.RenameNotProcessed": "重命名不处理", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.Submit": "提交", - "odc.RiskDetectRules.components.InnerRiskDetectRules.RuleName": "规则名称", "odc.ResourceTree.Nodes.package.Variable": "变量", - "odc.src.d.ts.environment.Test": "测试", "odc.User.UpdateUserModal.CommonMember": "普通成员", "odc.Workspace.ActivityBar.type.OMManagement": "运维管理", "odc.TreeNodeMenu.config.package.BatchCompilation": "批量编译", @@ -5520,8 +3339,6 @@ "odc.SideBar.Script.Refresh": "刷新", "odc.component.CommonDetailModal.TaskTools.Confirm": "确认", "odc.component.DetailContent.TitleStatus": "{title}状态", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.SaveFailed": "保存失败", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.Cancel": "取消", "odc.DataClearTask.DetailContent.DataCleansing": "数据清理", "odc.page.Secure.interface.NoNeedToImprove": "无需改进", "odc.PermissionApplication.CreateModal.DatabaseChanges": "数据库变更", @@ -5531,13 +3348,11 @@ "odc.AlterDdlTask.CreateModal.NumberOfFailedRetries": "失败重试次数", "odc.Env.components.InnerEnvironment.ConfigurationValue": "配置值", "odc.Script.Snippet.Copy": "复制", - "odc.RiskDetectRules.components.ViewRiskDetectDrawer.Condition": "条件", "odc.DataArchiveTask.CreateModal.Ok": "确定", "odc.NewSSODrawerButton.SSOForm.ThePublicKeyAddressProvided": "授权服务器提供的公钥地址,使用公钥进行鉴权", "odc.Project.Sensitive.interface.Path": "路径", "odc.Env.components.EditRuleDrawer.RuleName": "规则名称", "odc.ExternalIntegration.SqlInterceptor.Operation": "操作", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.FailedToCreate": "新建失败", "odc.ResourceTree.Nodes.type.Subprogram": "子程序", "odc.components.SensitiveColumn.Enable": "启用", "odc.DataArchiveTask.CreateModal.ArchiveRange.ArchiveTheEntireDatabase": "整库归档", @@ -5551,21 +3366,17 @@ "odc.DataClearTask.CreateModal.VariableConfig.TimeFormat": "时间格式", "odc.Datasource.NewDatasourceDrawer.TheNameAlreadyExists": "名称已存在", "odc.SensitiveColumn.components.ScanForm.IdentificationRules": "识别规则", - "odc.components.ConditionGroup.condition.SelectAnOperator": "请选择操作符", "odc.components.SensitiveColumn.AreYouSureYouWant": "是否确认取消新建?", "odc.DataArchiveTask.CreateModal.VariableConfig.Month": "月", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.ColumnRemarks": "列备注", "odc.page.Project.MenuItem": "菜单项一", "odc.component.DetailContent.UpdateTime": "更新时间", "odc.SessionContextWrap.SessionSelect.modal.DataSource": "数据源", - "odc.SensitiveColumn.components.ManualRule.PleaseSelect": "请选择", - "odc.SensitiveColumn.components.ManualForm.DesensitizationAlgorithm": "脱敏算法", "odc.AlterDdlTask.DetailContent.TaskType": "任务类型", "odc.AlterDdlTask.DetailContent.Founder": "创建人", "odc.AlterDdlTask.CreateModal.UpToSeconds": "最大不超过 3600 秒", "odc.Env.components.InnerEnvironment.SupportsDataSources": "支持数据源", "odc.AlterDdlTask.DetailContent.ExecutionMethod": "执行方式", - "odc.DataArchiveTask.CreateModal.VariableConfig.VariablesCanBeReferencedIn": "变量可在归档配置的过滤条件中引用", "odc.User.UpdateUserModal.ProjectRole": "项目角色", "odc.Info.NewDataBaseButton.PleaseEnter": "请输入", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.New": "新建成功", @@ -5575,7 +3386,6 @@ "odc.DataClearTask.DetailContent.TaskNumber": "任务编号", "odc.ResourceTree.Nodes.synonym.Synonym": "同义词", "odc.AlterDdlTask.DetailContent.TaskErrorHandling": "任务错误处理", - "odc.Secure.RiskLevel.Edit": "编辑", "odc.SensitiveColumn.components.FormSensitiveColumnDrawer.Cancel": "取消", "odc.component.FormModal.SelectAStatus": "请选择状态", "odc.AlterDdlTask.DetailContent.LockFreeStructureChange": "无锁结构变更", @@ -5584,17 +3394,14 @@ "odc.page.Secure.interface.DefaultRisk": "默认风险", "odc.DataArchiveTask.CreateModal.VariableConfig.PleaseSelect": "请选择", "odc.Secure.Approval.ExecutionWaitingPeriod": "执行等待有效期", - "odc.Env.components.EditRuleDrawer.PleaseSelect": "请选择", "odc.Datasource.NewDatasourceDrawer.Ok": "确定", "odc.DataArchiveTask.CreateModal.ArchiveRange.Add": "添加", "odc.component.FormModal.ChangePassword": "修改密码", "odc.components.SensitiveColumn.DatabaseSchema": "数据库/schema", "odc.SideBar.Script.CodeSnippet": "代码片段", "odc.Datasource.Info.DatabaseName": "数据库名称", - "odc.RiskDetectRules.components.FormRiskDetectDrawer.SavedSuccessfully": "保存成功", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.DesensitizationAlgorithm": "脱敏算法", "odc.page.Datasource.Database": "数据库", - "odc.SQLExplain.components.PopoverContent.EndTime": "结束时间", "odc.SqlInterceptor.constant.ThisIsATemplateFor.1": "# This is a template for integrating a custom SQL interceptor system.\n# You must fill in the required fields according to the regulation to adapt to your SQL interceptor system.\n\n\n# HTTP configurations\nhttp:\n # HTTP connection timeout period in seconds\n connectTimeoutSeconds: 5\n # HTTP socket timeout period in seconds\n socketTimeoutSeconds: 30\n\n# API configurations\napi:\n # API configurations used to check the SQL content\n check:\n # Request method. Valid values: GET, POST, PUT, and PATCH\n method: ~\n # Request URI\n url: ~\n # Request header. The format is: \n headers:\n # Sample of request header\n Content-Type: application/json;charset=UTF-8\n Accept: application/json\n # Request query parameters. The format is: \n queryParameters: ~\n # Request body\n body:\n # Type of request body. Valid values: FORM_DATA and RAW\n type: RAW\n # Content of request body. The format is: for RAW type or for FORM_DATA type\n # Sample of request content for the RAW type\n content: |-\n {\n \"sqlStatement\":\"\\${sql.content}\"\n }\n # Indicate whether the request body is encrypted\n requestEncrypted: false\n # Expression to judge whether the request is successful based on the response body analysis, using the SPEL syntax\n requestSuccessExpression: '[resultCode] == 0'\n # Indicate whether the response body is encrypted\n responseEncrypted: false\n # Expression to judge whether the SQL to be executed is in the white list based on the response body analysis, using the SPEL syntax\n inWhiteListExpression: '[checkResult] == 1'\n # Expression to judge whether the SQL to be executed is in the black list based on the response body analysis, using the SPEL syntax\n inBlackListExpression: '[checkResult] == 2'\n # Expression to judge whether the SQL to be executed need review based on the response body analysis, using the SPEL syntax\n needReviewExpression: '[checkResult] == 3'", "odc.DataArchiveTask.CreateModal.ExecutionMethod": "执行方式", "odc.page.Secure.interface.MediumRisk": "中风险", @@ -5606,10 +3413,8 @@ "odc.DataArchiveTask.CreateModal.Save": "保存", "odc.Database.AddDataBaseButton.BoundProject": "- 已绑定项目:", "odc.component.EditPLParamsModal.StatementCannotBeEmpty": "语句不能为空", - "odc.component.TaskTable.CreateTasklabelinfolabel": "新建{taskLabelInfoLabel}", "odc.component.FormModal.TheProcessNameCannotExceed": "流程名称不超过 128 个字符", "odc.component.helpDoc.doc.AfterTheTableLockTime": "超过锁表时间后,未切换完成可自动重试", - "odc.DataClearTask.CreateModal.VariableConfig.Zhou": "周", "odc.SensitiveRule.components.FormSensitiveRuleDrawer.UpdateFailed": "更新失败", "odc.ExternalIntegration.SqlInterceptor.FollowTheSecuritySpecificationSql": "请按照 安全规范 - SQL 开发规范 - SQL 窗口规则 路径,使用您已配置并开启的 SQL 拦截集成", "odc.Env.components.EditRuleDrawer.ExecutionIsProhibitedAndApproval": "禁止执行,无法发起审批", @@ -5618,7 +3423,6 @@ "odc.components.RecordPage.interface.CreateADataSource": "创建数据源", "odc.components.RecordPage.column.EnterADataSource": "请输入所属数据源", "odc.component.VersionModal.config.OdcProvidesASeriesOf": "ODC 提供了一系列功能、设计理念来帮助提升您的效率。", - "odc.network.sql.executeSQL.ThisOperationHasBeenBlocked": "该操作已被以下规则拦截", "odc.components.SQLResultSet.DBTimeline.SqlPostCheck": "SQL 后置检查", "odc.components.RecordPage.interface.TransferProject": "转移项目", "odc.Datasource.Info.SearchDatabase": "搜索数据库", @@ -5648,7 +3452,6 @@ "odc.Record.RecordPage.interface.AddDatabase": "增加数据库", "odc.components.RecordPage.interface.ProjectManagement": "项目管理", "odc.Record.RecordPage.column.EnterADataSource": "请输入所属数据源", - "odc.DataArchiveTask.CreateModal.VariableConfig.AddTimeOperation": "添加时间运算", "odc.Record.RecordPage.interface.CreateAPermissionRequestTask": "创建权限申请任务", "odc.component.VersionModal.config.OdcHasBuiltInPerfect": "ODC 内置了完善的脱敏算法和灵活的识别规则,可以保证您在 SQL\n 窗口访问、数据出库等场景下敏感数据的安全,满足隐私数据安全合规的诉求。", "odc.components.RecordPage.interface.DatabaseManagement": "数据库管理", @@ -5683,7 +3486,6 @@ "odc.Record.RecordPage.interface.UpdateDataSource": "更新数据源", "odc.Record.RecordPage.interface.DeleteADatabase": "删除数据库", "odc.component.VersionModal.config.EfficientDevelopment": "高效开发", - "odc.component.CommonDetailModal.TaskFlow.ExternalApproval": "外部审批", "odc.component.VersionModal.config.OdcSupportsSingleSignOn": "ODC 支持单点登录、工单审批集成、SQL 审核集成及数据库堡垒机集成。", "odc.component.VersionModal.config.OpenIntegration": "开放集成", "odc.components.RecordPage.interface.PermissionRequestTask": "同意权限申请任务", @@ -5691,12 +3493,9 @@ "odc.component.VersionModal.config.SqlAuditAllowsYouTo": "SQL 审核支持您使用企业已有的 SQL 审核平台对 ODC 内执行的 SQL 语句进行审核。", "odc.ResourceTree.Datasource.Delete": "删除", "odc.component.VersionModal.config.TicketApprovalSupportsBpmsAnd": "工单审批支持 BPMS 和自定义审批系统。", - "odc.DataArchiveTask.CreateModal.VariableConfig.DeleteTimeOperation": "删除时间运算", - "odc.AsyncTask.CreateModal.ThisOperationHasBeenBlocked": "该操作已被以下规则拦截,请发起审批", "odc.Info.ChangeProjectModal.ProjectSelect.DoNotAssignProjects": "不分配项目", "odc.components.RecordPage.interface.DataSourceManagement": "数据源管理", "odc.ShadowSyncTask.DetailContent.Description": "描述", - "odc.DataClearTask.CreateModal.VariableConfig.VariablesCanBeReferencedIn.1": "变量可在清理范围的过滤条件中引用", "odc.component.RecordPopover.column.EnterADataSource": "请输入所属数据源", "odc.components.RecordPage.interface.CreateAPermissionRequestTask": "创建权限申请任务", "odc.components.RecordPage.column.DataSource": "数据源", @@ -5765,7 +3564,6 @@ "odc.src.common.network.sql.UnprofessionalAccessDbnames": "无权限访问 {dbNames} 数据库", "odc.src.page.Secure.RiskLevel.components.NoRule": "暂无规则", "odc.src.page.Secure.RiskLevel.components.PeriodicPeriod": "执行有效期", - "odc.src.component.Task.component.CommonDetailModal.Nodes.ProcessResult": "处理结果:", "odc.src.component.Task.ResultSetExportTask.DetailContent.FileEncoding": "文件编码", "odc.src.page.Secure.RiskLevel.components.PleaseSelectTheApprovalProcess.1": "请选择审批流程", "odc.src.page.Secure.RiskLevel.components.UsageAmount": "使用数量", @@ -5914,13 +3712,10 @@ "odc.src.component.Task.component.TaskTable.NewActiveTasklabel": "新建{activeTaskLabel}", "odc.src.page.Secure.Record.RecordPage.ExecutionResultsSetTask": "执行结果集任务", "odc.src.page.Secure.components.RecordPage.RejectTheExportResultsSet": "拒绝导出结果集任务", - "odc.src.component.Task.AlterDdlTask.CreateModal.3ItIsRecommended": "\n 3. 创建工单时建议选择保留原表;\n ", "odc.src.page.Secure.Record.RecordPage.RejectTheExportResultsSet": "拒绝导出结果集任务", "odc.src.component.Task.PartitionTask.CreateModal.TheCurrentDatabaseAlreadyHas": "当前数据库已存在一个分区计划,任务审批通过后,原分区计划将终止", "odc.src.component.Task.AlterDdlTask.CreateModal.Notice": "注意", - "odc.src.component.Task.AlterDdlTask.CreateModal.1TheMySQLMode": "\n 1. MySQL 模式 OB 版本小于 4.3 及 Oracle 模式 OB 版本小于\n 4.0,表名切换之前会锁定数据库账号,并 kill 该账号对应的\n session。表名切换期间,锁定账号涉及应用将无法访问数据库,请勿在业务高峰期执行;\n ", "odc.src.page.Secure.components.RecordPage.ExecutionResultsSetTask": "执行结果集任务", - "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.PleaseChooseTheType": "请选择类型", "odc.src.page.Secure.Record.RecordPage.ExportResultSet": "导出结果集", "odc.src.component.Task.component.CommonDetailModal.ExternalApproval": "外部审批", "odc.src.page.Secure.components.RecordPage.ExportResultSet": "导出结果集", @@ -5933,7 +3728,6 @@ "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.HostIPDomainName": "主机 IP/域名", "odc.src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.TheConfigurationNameDoesNot": "配置名称不超过 64 个字符", "odc.src.page.Auth.Role.component.DetailContent.Environment": "环境", - "odc.src.component.Task.AlterDdlTask.CreateModal.2BeforePerformingThe": "\n 2. 执行无锁结构变更前请确保数据库服务器磁盘空间充足;\n ", "odc.src.page.Secure.Record.RecordPage.StopExportResultsSetTask": "停止导出结果集任务", "odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.Project": "按项目", "odc.src.component.ProcedureParam.DataOption": "数据选项", @@ -5954,7 +3748,6 @@ "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.ExtraConfig.AdvancedSettings": "高级设置", "odc.src.component.Task.component.DataTransferModal.DataSource": "所属数据源", "odc.src.page.Workspace.components.CreateTable.TableIndex.IndexIsNotAvailable": "索引不可用", - "odc.src.page.Project.Sensitive.components.SensitiveColumn.components.DataSourceOptiontatasourcename": "数据源:{optionDataSourceName}", "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.DataSourceType": "数据源类型:", "odc.src.page.Project.Sensitive.components.SensitiveColumn.TestData": "测试数据", "odc.src.page.Project.Sensitive.components.SensitiveColumn.components.ManagementRecognitionRules.1": "\n 管理识别规则\n ", @@ -6012,7 +3805,6 @@ "odc.src.page.Project.Sensitive.components.SensitiveRule.components.TestData": "测试数据", "odc.src.page.Workspace.SideBar.ResourceTree.SelectPanel.PleaseSelectTheDataSource": "请选择数据源或项目", "odc.src.component.Task.component.ThrottleEditableCell.CanNotBeEmpty": "不能为空!", - "odc.src.component.helpDoc.CanConfigureTheFilteringConditions.1": "可使用常量或引用上文中定义的变量来配置过滤条件。样例 1:gmt_create <= '2023-01-01' ,样例 2:gmt_create <= '${bizdate}',其中 bizdate 为变量配置中的变量名,gmt_create 为清理表中的字段。", "odc.src.component.Task.component.ThrottleFormItem.DataSizeLimit": "数据大小限流", "odc.src.component.Task.DataClearTask.DetailContent.DataSizeLimit": "数据大小限流", "odc.src.component.Task.DataArchiveTask.DetailContent.DataSizeLimit": "数据大小限流", @@ -6038,7 +3830,6 @@ "odc.src.page.Project.Sensitive.components.SensitiveColumn.components.YouCanUseThePath": "可通过路径、正则或 Groovy 任意一种识别方式,进行脚本批量选择列", "odc.src.component.Task.component.ThrottleFormItem.RestrictedFlow": "行限流", "odc.src.component.helpDoc.TheTotalSizeLimitOf": "每秒操作数据总大小限制", - "odc.src.component.helpDoc.CanConfigureTheFilteringConditions": "可使用常量或引用上文中定义的变量来配置过滤条件。样例 1:gmt_create <= '2023-01-01' ,样例 2:gmt_create <= '${bizdate}',其中 bizdate 为变量配置中的变量名,gmt_create 为归档表中的字段。", "odc.src.component.Task.DataClearTask.DetailContent.RestrictedFlow": "行限流", "odc.src.component.Task.DataClearTask.CreateModal.TaskSetting": "任务设置", "odc.src.component.Task.DataArchiveTask.DetailContent.RestrictedFlow": "行限流", @@ -6054,7 +3845,6 @@ "odc.src.page.Workspace.components.Trace.ListView": "列表视图", "odc.src.page.Workspace.components.SQLResultSet.NoNeedToImprove": "无需改进", "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.ProjectItem.AfterModifyingTheProject": "修改项目后,此数据源下的所有数据库将绑定新的项目", - "odc.src.page.Workspace.components.Trace.Replication.3": "复制成功", "odc.src.page.Workspace.components.Trace.Replication.1": "复制成功", "odc.src.page.Workspace.components.Trace.Replication.2": "复制成功", "odc.src.component.Task.AlterDdlTask.CreateModal.AutomaticSwitch": "自动切换", @@ -6076,7 +3866,6 @@ "odc.src.page.Workspace.components.TaskPage.WorkOrderAllWorkOrders": "工单-所有工单", "odc.src.component.Task.component.CommonDetailModal.ViewLog": "查看日志", "odc.src.page.Workspace.components.Trace.FullLinkTraceDetails": "全链路 Trace 详情", - "odc.src.component.Task.AlterDdlTask.CreateModal.LockUsers": "锁定用户", "odc.src.page.Workspace.components.Trace.Duration": "持续时间: ", "odc.src.page.Workspace.components.Trace.TimeConsuming": "耗时", "odc.src.page.Project.User.Participant": "参与者", @@ -6087,7 +3876,6 @@ "odc.src.page.Secure.Record.RecordPage.ApplicationProjectPermissions": "申请项目权限", "odc.src.page.Project.Database.TheDataSourceHasBeen": "所属的数据源已关联当前项目,无法修改。可通过编辑数据源修改所属项目", "odc.src.page.Secure.MaskingAlgorithm.components.TheMaximumLength": "长度不超过 128 个字符", - "odc.src.page.Workspace.components.Trace.Node.3": "节点", "odc.src.component.Task.ApplyPermission.CreateModal.Participant": "参与者", "odc.src.page.Workspace.components.Trace.Node.1": "节点", "odc.src.page.Workspace.components.Trace.Node.2": "节点", @@ -6104,12 +3892,10 @@ "odc.src.page.Secure.Record.RecordPage.ApplicationProjectPermissions.1": "申请项目权限", "odc.src.page.Datasource.Info.TheCurrentDataSourceProject": "当前数据源所属项目 {bindProjectName},无法修改。可通过编辑数据源修改所属项目", "odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.ProjectItem.NonProjectAdministratorsOr": "非项目管理员或 DBA,无法将数据源加入此项目", - "odc.src.page.Workspace.components.Trace.TimeConsuming.3": "耗时", "odc.src.page.Workspace.components.Trace.TimeConsuming.2": "耗时", "odc.src.page.Workspace.components.Trace.TimeConsuming.1": "耗时", "odc.src.page.Workspace.components.Trace.Replication": "复制成功", "odc.src.page.Datasource.Info.NewDataBaseButton.Project": "项目", - "odc.src.component.Task.ApplyPermission.CreateModal.PleaseChoose": "请选择", "odc.src.page.Project.Project.ApplicationProjectPermissions": "申请项目权限", "odc.src.page.Project.Database.ModifyTheProject": "\n 修改所属项目\n ", "odc.src.component.Task.ApplyPermission.CreateModal.AllowingLoginDatabaseExecution": "允许登录数据库、执行 SQL、提交工单等,通常是开发人员", @@ -6121,7 +3907,6 @@ "odc.src.component.Task.AsyncTask.CreateModal.ThePreExaminationIs": "预检查完成,{lintResultSetLength} 处语句违反 SQL 开发规范。", "odc.src.page.Workspace.components.Trace.EndTime": "结束时间", "odc.src.page.Workspace.components.Trace.EndTime.1": "结束时间", - "odc.src.page.Workspace.components.Trace.EndTime.2": "结束时间", "odc.src.page.Workspace.components.SQLResultSet.NeedApproval": "需要审批", "odc.src.component.Task.DataArchiveTask.CreateModal.Shift": "\n 时间偏移\n ", "odc.src.page.Datasource.Info.UnpabledItems": "未分配项目", @@ -6129,7 +3914,6 @@ "odc.src.component.Task.AlterDdlTask.DetailContent.LockUsers": "锁定用户", "odc.src.component.Task.component.TaskTable.ApplicationProjectPermissions": "申请项目权限", "odc.src.component.Task.ApplyPermission.CreateModal.HavingOwnershipInTheProject": "拥有项目内的所有权限", - "odc.src.component.Task.component.ArchiveRangeTip.FilterConditionCreateTime": "过滤条件:create_time<‘${bizdate}’", "odc.src.page.Workspace.components.Trace.Node": "节点", "odc.src.component.Task.component.ArchiveRangeTip.VariableNameBizdate": "变量名称:bizdate", "odc.src.component.Task.ApplyPermission.CreateModal.Cause": "申请原因", @@ -6174,7 +3958,6 @@ "odc.src.page.Workspace.components.Trace.StartingTime.3": "开始时间", "odc.src.page.Workspace.components.Trace.StartingTime.2": "开始时间", "odc.src.component.Task.DataArchiveTask.CreateModal.AddTimeOffset": "添加时间偏移", - "odc.src.page.Workspace.components.Trace.StartingTime.4": "开始时间", "odc.src.component.Task.ExportTask.CreateModal.ExportSuccess": "导出成功!", "odc.src.page.Workspace.components.Trace.ExportTheJSONFileThat": "导出符合 OpenTracing 规范的 Json 文件,可导入 Jaeger 查看", "odc.src.page.Secure.Record.RecordPage.CreateApplicationProjectPermissions": "创建申请项目权限", @@ -6201,7 +3984,6 @@ "odc.src.component.Task.ApplyPermission.DetailContent.ApplicationProjectRole": "申请项目角色", "odc.src.component.Task.ApplyPermission.CreateModal.PleaseEnterTheReasonDescription": "请输入原因描述", "odc.src.component.Task.AccessRequest": "权限申请", - "odc.src.page.Secure.components.RecordPage.SQLSecurityRulesManagement": "SQL 安全规则管理", "odc.src.component.Task.ApplyPermission.CreateModal.PleaseSelectTheProjectRole": "请选择项目角色", "odc.src.layout.InspectionServiceStatus": "正在检查服务状态", "odc.src.component.Task.ApplyPermission.CreateModal.PleaseChoose.1": "请选择", @@ -6214,7 +3996,6 @@ "odc.src.page.Workspace.components.DDLResultSet.FullLinkTrace": "全链路 Trace", "odc.src.component.Task.ApplyPermission.DetailContent.Type": "任务类型", "odc.src.component.Task.ApplyPermission.CreateModal.OnTheBasisOfParticipants": "在参与者的基础上,同时可以管理敏感列", - "odc.src.component.Task.ApplyPermission.CreateModal.AccessRequest": "是否确定取消权限申请?", "odc.src.component.Task.PartitionTask.DetailContent.Founder": "创建人", "odc.src.page.Project.Project.CreateProject.Participant": "参与者", "odc.src.page.Secure.components.RecordPage.ApplicationProjectPermissions": "申请项目权限", @@ -6258,4 +4039,4 @@ "odc.src.component.Task.AlterDdlTask.CreateModal.2WhenCreatingA": "2. 创建工单选择源表清理策略时建议选择保留源表;", "odc.src.component.Task.PartitionTask.DetailContent.ImplementationModalities": "执行方式", "odc.src.component.Task.AlterDdlTask.CreateModal.3IfTheOB": "3. 若 OceanBase Oracle 模式版本小于 4.0.0 或 OceanBase MySQL 模式版本小于 4.3.0,表名切换之前会锁定您指定的数据库账号,并关闭该账号对应的会话。表名切换期间,锁定账号涉及应用将无法访问数据库,请勿在业务高峰期执行;" -} \ No newline at end of file +} From c590f298ee53150e68538d5edfd3c2231ee977e4 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Mon, 8 Jan 2024 15:38:57 +0800 Subject: [PATCH 015/231] remove warning code --- src/common/network/script.ts | 2 +- .../component/OperationContent.tsx | 4 +- src/component/CommonTable/interface.ts | 3 +- src/component/Crontab/index.tsx | 2 +- src/component/DropdownMenu/index.tsx | 8 +- .../EditPLParamsModal/ValueInput.tsx | 68 +++++----- src/component/EditPLParamsModal/index.tsx | 2 +- src/component/EditorToolBar/actions/pl.tsx | 10 +- src/component/EditorToolBar/index.tsx | 19 ++- .../component/SnippetCard/index.tsx | 32 ++--- src/component/GrammerHelpSider/index.tsx | 16 ++- src/component/HelpMenus/index.tsx | 20 +-- src/component/LocalMenus/index.tsx | 26 ++-- src/component/Login/index.tsx | 4 +- .../LoginMenus/ChangeLockPwdModal.tsx | 2 +- src/component/LoginMenus/index.tsx | 120 ++++++++++-------- src/component/Manage/DetailModal/index.tsx | 6 +- src/component/Manage/RoleList/index.tsx | 4 +- src/component/Table/MiniTable/index.tsx | 1 - .../Task/AsyncTask/CreateModal/index.tsx | 2 +- .../Task/DataMockerTask/CreateModal/form.tsx | 10 +- .../Task/DataMockerTask/CreateModal/index.tsx | 2 +- .../CreateModal/ExportForm/index.tsx | 15 +-- .../ImportForm/FileSelecterPanel/index.tsx | 2 +- .../CreateModal/ImportForm/index.tsx | 2 +- .../Task/ImportTask/CreateModal/index.tsx | 2 +- .../CreateModal/CsvFormItemPanel.tsx | 8 +- .../Task/SQLPlanTask/CreateModal/index.tsx | 2 +- .../CreateModal/SelectPanel/index.tsx | 2 +- .../Task/component/ActionBar/index.tsx | 15 ++- .../component/CommonDetailModal/index.tsx | 24 ++-- .../Task/component/TaskTable/index.tsx | 48 ++++--- src/component/ThemeBtn/index.tsx | 47 ++++--- src/component/Toolbar/index.tsx | 6 +- src/component/TreeNode/index.less | 3 - src/component/TreeNode/index.tsx | 66 ---------- src/component/VersionModal/index.tsx | 10 +- src/component/WorkspaceSideTip/index.tsx | 2 +- .../SpaceContainer/Sider/HelpItem/index.tsx | 15 ++- .../SpaceContainer/Sider/MineItem/Locale.tsx | 32 +++-- .../SpaceContainer/Sider/MineItem/Theme.tsx | 33 +++-- src/page/Auth/Role/index.tsx | 3 + src/page/Auth/User/index.tsx | 3 + .../Datasource/Content/List/IconBtn/index.tsx | 2 +- .../Datasource/Header/Sorter/index.tsx | 77 ++++++----- .../Datasource/NewDatasourceDrawer/index.tsx | 8 +- .../components/SensitiveColumn/index.tsx | 63 ++++----- src/page/Project/Setting/index.tsx | 13 +- src/page/Project/User/index.tsx | 5 +- .../components/CreateViewPage/index.tsx | 4 +- .../Workspace/components/SQLPage/index.tsx | 8 +- .../components/SQLResultSet/index.tsx | 43 ++++--- .../components/SessionContextWrap/index.tsx | 2 +- .../components/TablePage/TableData/index.tsx | 6 +- .../components/TreeNodeFunction/index.tsx | 85 ------------- .../components/TreeNodeProcedure/index.tsx | 85 ------------- src/page/Workspace/index.tsx | 2 +- src/store/helper/page/openPage.ts | 2 +- 58 files changed, 439 insertions(+), 669 deletions(-) delete mode 100644 src/component/TreeNode/index.less delete mode 100644 src/component/TreeNode/index.tsx delete mode 100644 src/page/Workspace/components/TreeNodeFunction/index.tsx delete mode 100644 src/page/Workspace/components/TreeNodeProcedure/index.tsx diff --git a/src/common/network/script.ts b/src/common/network/script.ts index ad3516fc8..56ce4e00a 100644 --- a/src/common/network/script.ts +++ b/src/common/network/script.ts @@ -69,7 +69,7 @@ export async function downloadScript(scriptIds: ScriptId | ScriptId[]): Promise< const MAX_DOWNLOAD_COUNT = 10; scriptIds = isArray(scriptIds) ? scriptIds : [scriptIds]; if (scriptIds.length > MAX_DOWNLOAD_COUNT) { - message.warn( + message.warning( formatMessage( { id: 'odc.common.network.script.YouCannotDownloadMoreThan', diff --git a/src/component/CommonTable/component/OperationContent.tsx b/src/component/CommonTable/component/OperationContent.tsx index 1186b6c16..f06dc962a 100644 --- a/src/component/CommonTable/component/OperationContent.tsx +++ b/src/component/CommonTable/component/OperationContent.tsx @@ -25,7 +25,7 @@ interface IOperationItemProps { onClick: (fn: (args?: ITableLoadOptions) => void) => void; } const OperationItem: React.FC = ({ option, onClick }) => { - const { type, content, icon = null, isPrimary, overlay, disabled = false } = option; + const { type, content, icon = null, isPrimary, menu, disabled = false } = option; let operation = null; switch (type) { case IOperationOptionType.icon: @@ -42,7 +42,7 @@ const OperationItem: React.FC = ({ option, onClick }) => { break; case IOperationOptionType.dropdown: operation = ( - + {content} ); diff --git a/src/component/CommonTable/interface.ts b/src/component/CommonTable/interface.ts index 11606b4bb..c7fd5f44e 100644 --- a/src/component/CommonTable/interface.ts +++ b/src/component/CommonTable/interface.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { MenuProps } from 'antd'; import type { TablePaginationConfig, TableProps } from 'antd/es/table'; import type { TableRowSelection } from 'antd/es/table/interface'; import type { FixedType } from 'rc-table/es/interface'; @@ -81,7 +82,7 @@ export interface IOperationOption { isPrimary?: boolean; visible?: boolean; disabled?: boolean; - overlay?: React.ReactElement | (() => React.ReactElement); + menu?: MenuProps; onClick?: (args?: ITableLoadOptions) => void; } export interface IOperationContent { diff --git a/src/component/Crontab/index.tsx b/src/component/Crontab/index.tsx index d86af539b..52883fbb2 100644 --- a/src/component/Crontab/index.tsx +++ b/src/component/Crontab/index.tsx @@ -273,7 +273,7 @@ const Crontab = (props, ref) => { { if (error) return null; return isActive ? : ; diff --git a/src/component/DropdownMenu/index.tsx b/src/component/DropdownMenu/index.tsx index 859c9069f..3b85e089e 100644 --- a/src/component/DropdownMenu/index.tsx +++ b/src/component/DropdownMenu/index.tsx @@ -14,13 +14,13 @@ * limitations under the License. */ -import { Dropdown } from 'antd'; +import { Dropdown, MenuProps } from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; import React from 'react'; import HeaderBtn from '../HeaderBtn'; interface IProps { - overlay: React.ReactElement; + menu: MenuProps; placement?: DropDownProps['placement']; className?: string; } @@ -29,9 +29,9 @@ class DropdownMenu extends React.PureComponent { public menuRef: React.RefObject = React.createRef(); render() { - const { overlay, children, className } = this.props; + const { menu, children, className } = this.props; return ( - this.menuRef?.current}> + this.menuRef?.current}> {children} diff --git a/src/component/EditPLParamsModal/ValueInput.tsx b/src/component/EditPLParamsModal/ValueInput.tsx index 8ae1aa49f..f15f46c6f 100644 --- a/src/component/EditPLParamsModal/ValueInput.tsx +++ b/src/component/EditPLParamsModal/ValueInput.tsx @@ -56,44 +56,36 @@ const ValueInput: React.FC = function ({ value, connectionMode, onChange /> { - if (info.key === 'empty') { - onChange(''); - } else { - onChange(info.key); - } - }} - > - {isOracle && ( - - { - formatMessage({ - id: 'odc.component.EditPLParamsModal.ValueInput.SetToDefault', - }) /*设置为 DEFAULT*/ - } - - )} - - { - formatMessage({ - id: 'odc.component.EditPLParamsModal.ValueInput.SetToNull', - }) /*设置为 NULL*/ - } - - {!isOracle && ( - - { - formatMessage({ - id: 'odc.component.EditPLParamsModal.ValueInput.SetToAnEmptyString', - }) /*设置为空字符串*/ - } - - )} - - } + menu={{ + accessKey: menuValue, + onClick: (info) => { + if (info.key === 'empty') { + onChange(''); + } else { + onChange(info.key); + } + }, + items: [ + isOracle && { + key: ValueList.DEFAULT, + label: formatMessage({ + id: 'odc.component.EditPLParamsModal.ValueInput.SetToNull', + }), + }, + { + key: ValueList.NULL, + label: formatMessage({ + id: 'odc.component.EditPLParamsModal.ValueInput.SetToNull', + }), + }, + !isOracle && { + key: 'empty', + label: formatMessage({ + id: 'odc.component.EditPLParamsModal.ValueInput.SetToAnEmptyString', + }), + }, + ].filter(Boolean), + }} > { status={status} icon={icon} text={name} - menu={ - - {menu?.map((menuItem, menuIndex) => { - return ( - - {getActionButton(menuItem, menuIndex, true)} - - ); - })} - - } + menu={{ + items: menu?.map((menuItem, menuIndex) => { + return { + key: menuItem, + label: getActionButton(menuItem, menuIndex, true), + }; + }), + }} /> ); } else if (isCommonAction(actionItem)) { diff --git a/src/component/GrammerHelpSider/component/SnippetCard/index.tsx b/src/component/GrammerHelpSider/component/SnippetCard/index.tsx index ca7279724..f398432dd 100644 --- a/src/component/GrammerHelpSider/component/SnippetCard/index.tsx +++ b/src/component/GrammerHelpSider/component/SnippetCard/index.tsx @@ -78,22 +78,22 @@ export default ({ snippet, handleSnippetMenuClick }, {}) => { return ( { - handleSnippetMenuClick(item.key, snippet); - }} - > - {SNIPPET_ACTIONS.filter((action) => action.key !== EnumSnippetAction.CREATE).map( - (action) => { - return {action.name}; - }, - )} - - } + menu={{ + style: { + width: '100px', + }, + onClick: (item) => { + handleSnippetMenuClick(item.key, snippet); + }, + items: SNIPPET_ACTIONS.filter((action) => action.key !== EnumSnippetAction.CREATE).map( + (action) => { + return { + key: action.key, + label: action.name, + }; + }, + ), + }} placement="bottomRight" > diff --git a/src/component/GrammerHelpSider/index.tsx b/src/component/GrammerHelpSider/index.tsx index 82774f675..95147edfb 100644 --- a/src/component/GrammerHelpSider/index.tsx +++ b/src/component/GrammerHelpSider/index.tsx @@ -101,13 +101,15 @@ class GrammerHelpSider extends Component<
- {SNIPPET_TYPES.map((snippetType) => ( - {snippetType.name} - ))} - - } + menu={{ + onClick: this.handleTypeChange, + items: SNIPPET_TYPES.map((snippetType) => { + return { + key: snippetType.key, + label: snippetType.name, + }; + }), + }} > e.preventDefault()}> {targetSnippetType.name} diff --git a/src/component/HelpMenus/index.tsx b/src/component/HelpMenus/index.tsx index 1a6a32f70..bd7ec30c8 100644 --- a/src/component/HelpMenus/index.tsx +++ b/src/component/HelpMenus/index.tsx @@ -92,15 +92,15 @@ export default class HelpMenus extends React.Component< ].filter(Boolean); public getHelpMenus = () => { - return ( - - {this.HELP_MENUS.map((item) => ( - - {item.title} - - ))} - - ); + return { + items: this.HELP_MENUS.map((item) => { + return { + key: item.key, + label: item.title, + onClick: this.handleClickHelpMenu, + }; + }), + }; }; public handleClickHelpMenu = (item) => { @@ -113,7 +113,7 @@ export default class HelpMenus extends React.Component< const { size, placement } = this.props; return ( <> - +
{formatMessage({ id: 'odc.component.HelpMenus.Help' }) /* 帮助 */}
diff --git a/src/component/LocalMenus/index.tsx b/src/component/LocalMenus/index.tsx index 46121cee8..391aa50d5 100644 --- a/src/component/LocalMenus/index.tsx +++ b/src/component/LocalMenus/index.tsx @@ -33,21 +33,19 @@ const LocalMenus: React.FC = (props) => { const localeObj = localeList.find((item) => item.value.toLowerCase() === locale?.toLowerCase()) || localeList.find((item) => item.value?.toLowerCase() === defaultLocale?.toLowerCase()); - const localeMenu = ( - { - window._forceRefresh = true; - setLocale(key as string); - window._forceRefresh = false; - }} - > - {localeList.map((item) => ( - {item.label} - ))} - - ); + const localeMenu = { + onClick: ({ key }) => { + window._forceRefresh = true; + setLocale(key as string); + window._forceRefresh = false; + }, + items: localeList.map((item) => ({ + key: item.value, + label: item.label, + })), + }; return ( - + {showIcon ? : null} {localeObj?.label} diff --git a/src/component/Login/index.tsx b/src/component/Login/index.tsx index dc4f3b426..8cc7f1d25 100644 --- a/src/component/Login/index.tsx +++ b/src/component/Login/index.tsx @@ -119,7 +119,7 @@ const Login: React.FC = (props) => { const switchForm = useCallback(() => { if (isLoading) { - message.warn( + message.warning( formatMessage({ id: 'odc.component.Login.Running' }), //正在执行中 ); } @@ -128,7 +128,7 @@ const Login: React.FC = (props) => { const goBack = useCallback(() => { if (isLoading) { - message.warn( + message.warning( formatMessage({ id: 'odc.component.Login.Running' }), //正在执行中 ); } diff --git a/src/component/LoginMenus/ChangeLockPwdModal.tsx b/src/component/LoginMenus/ChangeLockPwdModal.tsx index f4f341795..20945be6e 100644 --- a/src/component/LoginMenus/ChangeLockPwdModal.tsx +++ b/src/component/LoginMenus/ChangeLockPwdModal.tsx @@ -107,7 +107,7 @@ const ChangeLockPwd: React.FC = function (props: IProps) { onClick={async () => { const values = await form.validateFields(); if (values.password !== values.confirmPassword) { - message.warn( + message.warning( formatMessage({ id: 'odc.component.LoginMenus.ChangeLockPwdModal.TheTwoPasswordsAreInconsistent', diff --git a/src/component/LoginMenus/index.tsx b/src/component/LoginMenus/index.tsx index 0b27091b2..e8ab87496 100644 --- a/src/component/LoginMenus/index.tsx +++ b/src/component/LoginMenus/index.tsx @@ -22,7 +22,7 @@ import type { ModalStore } from '@/store/modal'; import { SettingStore } from '@/store/setting'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; -import { Divider, Menu, message, Tooltip } from 'antd'; +import { Divider, Menu, MenuProps, message, Tooltip } from 'antd'; import { inject, observer } from 'mobx-react'; import React from 'react'; import ChangeLockPwdModal from './ChangeLockPwdModal'; @@ -96,67 +96,75 @@ class LoginMenus extends React.PureComponent { ?.join(' | ') : '-'; const userName = `${user?.name}(${user?.accountName})`; - return ( - - {!isClient() && ( - <> - - {userName} - - - {RoleNames} - - - - )} - { - this.props.modalStore.changeUserConfigModal(true); - }} - > + let items: MenuProps['items'] = !isClient() + ? [ { - formatMessage({ - id: 'odc.component.LoginMenus.PersonalSettings', - }) /* 个人设置 */ - } - - {!isClient() && !isThridPartyLogin ? ( - { - this.handleChangeModalState('changePasswordModalVisible', true); - }} - > - { - formatMessage({ + key: 'userName', + className: styles.userName, + label: {userName}, + }, + { + key: 'userRoles', + className: styles.userRoles, + label: {RoleNames}, + }, + { + type: 'divider', + }, + ] + : []; + items = items + .concat({ + onClick: () => { + this.props.modalStore.changeUserConfigModal(true); + }, + label: formatMessage({ + id: 'odc.component.LoginMenus.PersonalSettings', + }), + key: 'personalSettings', + }) + .concat( + !isClient() && !isThridPartyLogin + ? { + key: 'changePassword', + onClick: () => { + this.handleChangeModalState('changePasswordModalVisible', true); + }, + label: formatMessage({ id: 'odc.component.GlobalHeader.ChangePassword', - }) /* 修改密码 */ + }), } - - ) : null} - {isClient() ? ( - { - this.handleChangeModalState('changeLockPwdModalVisible', true); - }} - > - { - formatMessage({ + : null, + ) + .concat( + isClient() + ? { + key: 'changeLockPwd', + onClick: () => { + this.handleChangeModalState('changeLockPwdModalVisible', true); + }, + label: formatMessage({ id: 'odc.component.LoginMenus.ApplicationPassword', - }) /* 应用密码 */ + }), } - - ) : null} - {!isClient() ? ( - - { - formatMessage({ + : null, + ) + .concat( + !isClient() + ? { + key: 'logout', + onClick: this.handleLogout, + label: formatMessage({ id: 'odc.component.GlobalHeader.LogOut', - }) /* 退出登录 */ + }), } - - ) : null} - - ); + : null, + ) + .filter(Boolean); + return { + className: !isClient() ? styles.userMenu : '', + items, + }; }; render() { @@ -173,7 +181,7 @@ class LoginMenus extends React.PureComponent { const isThridPartyLogin = !!settingStore.serverSystemInfo?.ssoLoginEnabled; return ( <> - + { !isClient() ? user?.accountName diff --git a/src/component/Manage/DetailModal/index.tsx b/src/component/Manage/DetailModal/index.tsx index dce0104b6..c01eb8c32 100644 --- a/src/component/Manage/DetailModal/index.tsx +++ b/src/component/Manage/DetailModal/index.tsx @@ -84,7 +84,11 @@ const CommonDetailModal: React.FC = (props) => {
{filteredTabs.map((item) => { - return {item.title}; + return ( + + {item.title} + + ); })} diff --git a/src/component/Manage/RoleList/index.tsx b/src/component/Manage/RoleList/index.tsx index d88213b07..2234d7d24 100644 --- a/src/component/Manage/RoleList/index.tsx +++ b/src/component/Manage/RoleList/index.tsx @@ -43,8 +43,8 @@ const RoleList: React.FC<{
item.name)?.join(' | ')}> {roles?.length ? ( - roles?.map(({ name, enabled }) => ( - + roles?.map(({ name, enabled }, index) => ( + {name} {!enabled && isShowIcon && ( ({ loadData, ...restProps }: pageSize: pageSize, showSizeChanger: false, }; - cloneProps.onChange = function (page, filters, s, e) { loadData(page, filters); }; diff --git a/src/component/Task/AsyncTask/CreateModal/index.tsx b/src/component/Task/AsyncTask/CreateModal/index.tsx index 40fb79127..dd72f9184 100644 --- a/src/component/Task/AsyncTask/CreateModal/index.tsx +++ b/src/component/Task/AsyncTask/CreateModal/index.tsx @@ -190,7 +190,7 @@ const CreateModal: React.FC = (props) => { /** * 校验文件总大小 */ - message.warn( + message.warning( formatMessage({ id: 'odc.components.CreateAsyncTaskModal.TheMaximumSizeOfThe', }), diff --git a/src/component/Task/DataMockerTask/CreateModal/form.tsx b/src/component/Task/DataMockerTask/CreateModal/form.tsx index dbed663e1..b6be4df95 100644 --- a/src/component/Task/DataMockerTask/CreateModal/form.tsx +++ b/src/component/Task/DataMockerTask/CreateModal/form.tsx @@ -290,7 +290,7 @@ const DataMockerForm: React.FC = inject('settingStore')( /* 插入模拟数据清空表 */ > - + { formatMessage({ id: 'odc.component.DataMockerDrawer.form.No', @@ -299,7 +299,7 @@ const DataMockerForm: React.FC = inject('settingStore')( /* 否 */ } - + { formatMessage({ id: 'odc.component.DataMockerDrawer.form.Is', @@ -324,7 +324,11 @@ const DataMockerForm: React.FC = inject('settingStore')( {[MockStrategy.IGNORE, MockStrategy.OVERWRITE, MockStrategy.TERMINATE].map( (strategy) => { - return {MockStrategyTextMap[strategy]}; + return ( + + {MockStrategyTextMap[strategy]} + + ); }, )} diff --git a/src/component/Task/DataMockerTask/CreateModal/index.tsx b/src/component/Task/DataMockerTask/CreateModal/index.tsx index 956eb598f..35ecfa64e 100644 --- a/src/component/Task/DataMockerTask/CreateModal/index.tsx +++ b/src/component/Task/DataMockerTask/CreateModal/index.tsx @@ -89,7 +89,7 @@ const CreateModal: React.FC = inject('modalStore')( return c.typeConfig?._isEditing; }); if (editingColumn) { - message.warn( + message.warning( formatMessage( { id: diff --git a/src/component/Task/ExportTask/CreateModal/ExportForm/index.tsx b/src/component/Task/ExportTask/CreateModal/ExportForm/index.tsx index fb6b5eda8..fc6c7fd08 100644 --- a/src/component/Task/ExportTask/CreateModal/ExportForm/index.tsx +++ b/src/component/Task/ExportTask/CreateModal/ExportForm/index.tsx @@ -51,14 +51,13 @@ const ExportForm: React.FC = inject('modalStore')( const [form] = useForm(); const databaseId = Form.useWatch('databaseId', form); const { data, run } = useRequest(getDatabase, { - manual: true - }) + manual: true, + }); const database = data?.data; const connection = database?.dataSource; const connectionId = connection?.id; const isReadonlyPublicConn = isReadonlyPublicConnection(connection); - useEffect(() => { if (databaseId) { run(databaseId); @@ -75,7 +74,7 @@ const ExportForm: React.FC = inject('modalStore')( formType === FormType.ObjSelecter && !values.exportAllObjects ) { - message.warn( + message.warning( formatMessage({ id: 'odc.ExportDrawer.ExportForm.SelectExportObjects', }), @@ -96,13 +95,7 @@ const ExportForm: React.FC = inject('modalStore')( function renderFormItem() { switch (formType) { case FormType.ObjSelecter: { - return ( - - ); + return ; } case FormType.Config: { return ( diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx b/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx index 36d5c87d3..59cfa1e18 100644 --- a/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx +++ b/src/component/Task/ImportTask/CreateModal/ImportForm/FileSelecterPanel/index.tsx @@ -91,7 +91,7 @@ const FileSelecterPanel: React.FC = function ({ isSingleImport, form }) if (messageRef.current) { return Upload.LIST_IGNORE; } - message.warn({ + message.warning({ content: formatMessage({ id: 'odc.ImportDrawer.ImportForm.TooManyFilesAreUploaded', }), diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/index.tsx b/src/component/Task/ImportTask/CreateModal/ImportForm/index.tsx index 886b4f1af..ec34c9144 100644 --- a/src/component/Task/ImportTask/CreateModal/ImportForm/index.tsx +++ b/src/component/Task/ImportTask/CreateModal/ImportForm/index.tsx @@ -69,7 +69,7 @@ const ImportForm: React.FC = inject('modalStore')( return file?.status === 'uploading'; }) ) { - message.warn( + message.warning( formatMessage({ id: 'odc.ImportDrawer.ImportForm.FileUploading' }), //文件上传中 ); return; diff --git a/src/component/Task/ImportTask/CreateModal/index.tsx b/src/component/Task/ImportTask/CreateModal/index.tsx index 1bb14389a..7b68f240b 100644 --- a/src/component/Task/ImportTask/CreateModal/index.tsx +++ b/src/component/Task/ImportTask/CreateModal/index.tsx @@ -273,7 +273,7 @@ class CreateModal extends React.Component { fileName: importFileName?.[0].response.data?.fileName, }); if (!fileInfo) { - message.warn( + message.warning( formatMessage({ id: 'odc.components.ImportDrawer.AnErrorOccurredWhileParsing', }), diff --git a/src/component/Task/ResultSetExportTask/CreateModal/CsvFormItemPanel.tsx b/src/component/Task/ResultSetExportTask/CreateModal/CsvFormItemPanel.tsx index 1a96b79a1..9eb82db48 100644 --- a/src/component/Task/ResultSetExportTask/CreateModal/CsvFormItemPanel.tsx +++ b/src/component/Task/ResultSetExportTask/CreateModal/CsvFormItemPanel.tsx @@ -93,11 +93,9 @@ export const CsvFormItemPanel: React.FC = (props) => { { required: true, message: formatMessage({ - id: formatMessage({ - id: - 'odc.src.component.Task.ResultSetExportTask.CreateModal.PleaseFillInTheField', - }), //'请填写字段分隔符' - }), + id: + 'odc.src.component.Task.ResultSetExportTask.CreateModal.PleaseFillInTheField', + }), //'请填写字段分隔符' }, { max: 1, diff --git a/src/component/Task/SQLPlanTask/CreateModal/index.tsx b/src/component/Task/SQLPlanTask/CreateModal/index.tsx index 06dd54f0e..cf99c3ae9 100644 --- a/src/component/Task/SQLPlanTask/CreateModal/index.tsx +++ b/src/component/Task/SQLPlanTask/CreateModal/index.tsx @@ -202,7 +202,7 @@ const CreateModal: React.FC = (props) => { /** * 校验文件总大小 */ - message.warn( + message.warning( formatMessage({ id: 'odc.components.CreateSQLPlanTaskModal.UpToMbOfFiles', }), diff --git a/src/component/Task/ShadowSyncTask/CreateModal/SelectPanel/index.tsx b/src/component/Task/ShadowSyncTask/CreateModal/SelectPanel/index.tsx index 16c665cd8..2131613d2 100644 --- a/src/component/Task/ShadowSyncTask/CreateModal/SelectPanel/index.tsx +++ b/src/component/Task/ShadowSyncTask/CreateModal/SelectPanel/index.tsx @@ -96,7 +96,7 @@ const SelectPanel = forwardRef(function ( originTableNames = tables?.map((table) => table.tableName); } if (!originTableNames?.length) { - message.warn( + message.warning( formatMessage({ id: 'odc.CreateShadowSyncModal.SelectPanel.SelectASynchronizationObject', }), diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 7d7b40ec3..8a16d5905 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -715,20 +715,22 @@ const ActionBar: React.FC = inject( ? getTools(task).filter((item) => item?.type === 'button') : getTools(task); - const renderTool = (tool) => { + const renderTool = (tool, index) => { const ActionButton = isDetailModal ? Action.Button : Action.Link; const disabled = activeBtnKey === tool?.key || tool?.disabled; if (tool.confirmText) { return ( - - {tool.text} + + + {tool.text} + ); } if (tool.download) { return ( - + {tool.text} ); @@ -736,6 +738,7 @@ const ActionBar: React.FC = inject( return ( = inject( return ( <> - {btnTools?.map((tool) => { - return renderTool(tool); + {btnTools?.map((tool, index) => { + return renderTool(tool, index); })} {isDetailModal && ( diff --git a/src/component/Task/component/CommonDetailModal/index.tsx b/src/component/Task/component/CommonDetailModal/index.tsx index c3800bbd6..feea516b7 100644 --- a/src/component/Task/component/CommonDetailModal/index.tsx +++ b/src/component/Task/component/CommonDetailModal/index.tsx @@ -184,7 +184,7 @@ const CommonTaskDetailModal: React.FC = function (p }} > {hasInfo && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.TaskInformation', @@ -196,7 +196,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {hasFlow && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.TaskFlow', @@ -208,7 +208,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {task?.type === TaskType.PARTITION_PLAN && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.AssociatedRecords', @@ -220,14 +220,20 @@ const CommonTaskDetailModal: React.FC = function (p {isCycleTask(task?.type) && ( <> - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.ExecutionRecord', }) /*执行记录*/ } - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.OperationRecord', @@ -238,7 +244,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {task?.type === TaskType.ONLINE_SCHEMA_CHANGE && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.ExecutionRecord', @@ -248,7 +254,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {task?.type === TaskType.ASYNC && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.ExecutionResult', @@ -260,7 +266,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {task?.type === TaskType.ASYNC && ( - + { formatMessage({ id: 'odc.component.CommonDetailModal.RollbackTicket', @@ -270,7 +276,7 @@ const CommonTaskDetailModal: React.FC = function (p )} {hasLog && ( - + { formatMessage({ id: 'odc.component.CommonTaskDetailModal.TaskLog', diff --git a/src/component/Task/component/TaskTable/index.tsx b/src/component/Task/component/TaskTable/index.tsx index ac333c67c..665e87b6f 100644 --- a/src/component/Task/component/TaskTable/index.tsx +++ b/src/component/Task/component/TaskTable/index.tsx @@ -44,7 +44,7 @@ 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, Divider, Menu } from 'antd'; +import { Button, DatePicker, Divider, Menu, MenuProps } from 'antd'; import { inject, observer } from 'mobx-react'; import type { Moment } from 'moment'; import moment from 'moment'; @@ -53,6 +53,8 @@ import React, { useEffect, useRef, useState } from 'react'; import { getTaskGroupLabels, getTaskLabelByType, isCycleTaskPage } from '../../helper'; import styles from '../../index.less'; import TaskTools from '../ActionBar'; +import { flatten } from 'lodash'; +import { MenuDividerType } from 'antd/lib/menu/hooks/useItems'; const { RangePicker } = DatePicker; export const getCronCycle = (triggerConfig: ICycleTaskTriggerConfig) => { const { triggerStrategy, days, hours, cronExpression } = triggerConfig; @@ -442,31 +444,27 @@ const TaskTable: React.FC = inject( ), disabled: disabledOpt, - overlay: ( - { - props.onMenuClick(key as TaskPageType); - }} - > - {menus?.map(({ group }, index) => { + menu: { + onClick: ({ key }) => { + props.onMenuClick(key as TaskPageType); + }, + items: flatten( + menus?.map(({ group }, index) => { const tasks = group?.filter((task) => task.enabled); - return ( - <> - {tasks?.map((item) => ( - {item.label} - ))} - {index !== menus?.length - 1 && ( - - )} - - ); - })} - - ), + let items: MenuProps['items']; + let divider: MenuDividerType = { + type: 'divider', + }; + items = tasks?.map((item) => { + return { + key: item.value, + label: item.label, + }; + }); + return index !== menus?.length - 1 ? [...items, divider] : items; + }), + ), + }, } : { type: IOperationOptionType.button, diff --git a/src/component/ThemeBtn/index.tsx b/src/component/ThemeBtn/index.tsx index 30350007c..121476312 100644 --- a/src/component/ThemeBtn/index.tsx +++ b/src/component/ThemeBtn/index.tsx @@ -29,31 +29,28 @@ const ThemeBtn: React.FC = function ({ settingStore }) { const currentTheme = settingStore.theme?.key; return ( { - if (key != currentTheme) { - settingStore.setTheme(key); - } - }} - > - - { - formatMessage({ - id: 'odc.component.ThemeBtn.DefaultTheme', - }) /*默认主题*/ - } - - - { - formatMessage({ - id: 'odc.component.ThemeBtn.DarkTheme', - }) /*暗黑主题*/ - } - - - } + menu={{ + selectedKeys: [currentTheme], + onClick: ({ key }) => { + if (key != currentTheme) { + settingStore.setTheme(key); + } + }, + items: [ + { + key: 'odc-white', + label: formatMessage({ + id: 'odc.component.ThemeBtn.DefaultTheme', + }) /*默认主题*/, + }, + { + key: 'odc-dark', + label: formatMessage({ + id: 'odc.component.ThemeBtn.DarkTheme', + }) /*暗黑主题*/, + }, + ], + }} > {formatMessage({ id: 'odc.component.ThemeBtn.Theme' }) /*主题*/} diff --git a/src/component/Toolbar/index.tsx b/src/component/Toolbar/index.tsx index 0e4df3acc..f5939cb90 100644 --- a/src/component/Toolbar/index.tsx +++ b/src/component/Toolbar/index.tsx @@ -16,7 +16,7 @@ import { formatMessage } from '@/util/intl'; import Icon, { CaretDownOutlined } from '@ant-design/icons'; -import { Button, Divider, Dropdown, message, Popconfirm, Popover, Tooltip } from 'antd'; +import { Button, Divider, Dropdown, MenuProps, message, Popconfirm, Popover, Tooltip } from 'antd'; import { PopconfirmProps } from 'antd/lib/popconfirm'; import classNames from 'classnames'; // @ts-ignore import { ComponentType } from 'react'; @@ -160,13 +160,13 @@ function TDivider() { function ButtonMenu(props: { icon: string | ComponentType; - menu: any; + menu: MenuProps; text: string; status: IConStatus; }) { const { icon, menu, text, status = IConStatus.INIT } = props; return ( - + ); diff --git a/src/component/TreeNode/index.less b/src/component/TreeNode/index.less deleted file mode 100644 index 14a8f449b..000000000 --- a/src/component/TreeNode/index.less +++ /dev/null @@ -1,3 +0,0 @@ -.title { - padding-left: 4px; -} diff --git a/src/component/TreeNode/index.tsx b/src/component/TreeNode/index.tsx deleted file mode 100644 index e58f66527..000000000 --- a/src/component/TreeNode/index.tsx +++ /dev/null @@ -1,66 +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 { Dropdown, Menu } from 'antd'; -import { MenuInfo } from 'rc-menu/lib/interface'; -import { PureComponent, ReactNode } from 'react'; - -import styles from './index.less'; - -export default class TreeNode extends PureComponent<{ - icon: string | ReactNode; - title: string; - style?: any; - onMenuClick: (param: MenuInfo) => void; - onDoubleClick: () => void; - disabled: boolean; -}> { - public render() { - const { title, style, icon, disabled, onMenuClick, onDoubleClick, children } = this.props; - const menu = ( - { - e.domEvent.preventDefault(); - e.domEvent.stopPropagation(); - onMenuClick(e); - }} - > - {children} - - ); - return ( - - - - - {icon} - - - {title} - - - ); - } -} diff --git a/src/component/VersionModal/index.tsx b/src/component/VersionModal/index.tsx index 04f8b6de5..c8704c391 100644 --- a/src/component/VersionModal/index.tsx +++ b/src/component/VersionModal/index.tsx @@ -101,11 +101,11 @@ const VersionModal: React.FC = (props) => { setActiveKey(parseInt(key as string)); }} className={styles.menuContent} - > - {menuList.map((menu, index) => { - return {menu.title}; - })} - + items={menuList.map((menu, index) => ({ + key: index.toString(), + label: menu.title, + }))} + /> ), - overlay: ( - - { + menu: { + items: [ + { + key: AddSensitiveColumnType.Manual, + label: formatMessage({ + id: 'odc.components.SensitiveColumn.ManuallyAdd', + }), + onClick: () => { setAddSensitiveColumnType(AddSensitiveColumnType.Manual); // handleOpenEditSensitiveColumnDrawer(); setModalOpen(true); tracert.click('a3112.b64002.c330861.d367388'); - }} - > - { - formatMessage({ - id: 'odc.components.SensitiveColumn.ManuallyAdd', - }) /*手动添加*/ - } - - { + }, + }, + { + key: AddSensitiveColumnType.Scan, + label: formatMessage({ + id: 'odc.components.SensitiveColumn.ScanAdd', + }), + onClick: () => { setAddSensitiveColumnType(AddSensitiveColumnType.Scan); handleOpenEditSensitiveColumnDrawer(); tracert.click('a3112.b64002.c330861.d367389'); - }} - > - { - formatMessage({ - id: 'odc.components.SensitiveColumn.ScanAdd', - }) /*扫描添加*/ - } - - - ), + }, + }, + ], + }, onClick: () => {}, }); return ( @@ -580,7 +580,8 @@ const SensitiveColumn = ({ cascaderContent={{ options: cascaderOptions, placeholder: formatMessage({ - id: 'odc.src.page.Project.Sensitive.components.SensitiveColumn.PleaseSelectTheDataSource', + id: + 'odc.src.page.Project.Sensitive.components.SensitiveColumn.PleaseSelectTheDataSource', }), //'请选择数据源和库' }} operationContent={{ diff --git a/src/page/Project/Setting/index.tsx b/src/page/Project/Setting/index.tsx index a5c0c48c7..b7cbbec58 100644 --- a/src/page/Project/Setting/index.tsx +++ b/src/page/Project/Setting/index.tsx @@ -51,12 +51,13 @@ const Setting: React.FC = (props) => { setmenuKey(e.key as MenuKey); }} mode="vertical" - > - - {formatMessage({ id: 'odc.Project.Setting.ProjectInformation' }) /*项目信息*/} - - {/* 通知设置 */} - + items={[ + { + key: MenuKey.INFO, + label: formatMessage({ id: 'odc.Project.Setting.ProjectInformation' }), + }, + ]} + />
diff --git a/src/page/Project/User/index.tsx b/src/page/Project/User/index.tsx index 3871eec40..cb342b598 100644 --- a/src/page/Project/User/index.tsx +++ b/src/page/Project/User/index.tsx @@ -115,7 +115,7 @@ const User: React.FC = ({ id }) => { } > - rowKey={'id'} + rowKey={'accountName'} columns={[ { title: formatMessage({ @@ -169,6 +169,7 @@ const User: React.FC = ({ id }) => { } = ({ id }) => { ]} dataSource={dataSource} pagination={{ - total: dataSource?.length, + total: dataSource?.length || 0, }} loadData={(page) => {}} /> diff --git a/src/page/Workspace/components/CreateViewPage/index.tsx b/src/page/Workspace/components/CreateViewPage/index.tsx index 63d53a703..82f8af598 100644 --- a/src/page/Workspace/components/CreateViewPage/index.tsx +++ b/src/page/Workspace/components/CreateViewPage/index.tsx @@ -217,7 +217,7 @@ class CreateViewPage extends Component< viewUnitsMap[uid] = true; } else { const _t = `${viewName || tableName}(${dbName})`; - message.warn( + message.warning( formatMessage( { id: 'odc.components.CreateViewPage.MultipleTExistYouNeed', @@ -304,7 +304,7 @@ class CreateViewPage extends Component< required: false, onShow() { if (!viewUnits.length) { - message.warn( + message.warning( formatMessage({ id: 'odc.components.CreateViewPage.SelectABaseTableFirst', }), diff --git a/src/page/Workspace/components/SQLPage/index.tsx b/src/page/Workspace/components/SQLPage/index.tsx index 80624595c..cc2d41df2 100644 --- a/src/page/Workspace/components/SQLPage/index.tsx +++ b/src/page/Workspace/components/SQLPage/index.tsx @@ -720,7 +720,7 @@ export class SQLPage extends Component { } }); if (isEmpty) { - message.warn( + message.warning( formatMessage({ id: 'odc.TablePage.TableData.DoNotSubmitBlankLines', }), @@ -752,7 +752,7 @@ export class SQLPage extends Component { }) .filter(Boolean); if (!editRows?.length) { - message.warn( + message.warning( formatMessage({ id: 'odc.TablePage.TableData.NoContentToSubmit' }), // 无内容可提交 ); return; @@ -778,7 +778,7 @@ export class SQLPage extends Component { } if (!sql) { - message.warn( + message.warning( formatMessage({ id: 'odc.TablePage.TableData.NoContentToSubmit' }), // 无内容可提交 ); return; @@ -977,7 +977,7 @@ export class SQLPage extends Component { return; } else if (value?.length > MAX_LIMIT) { !this.outOfLimitTipHaveShow && - message.warn( + message.warning( formatMessage({ id: 'odc.components.SQLPage.BecauseTheSqlIsToo' }), //由于 SQL 过长,编辑器将只支持预览 ); this.outOfLimitTipHaveShow = true; diff --git a/src/page/Workspace/components/SQLResultSet/index.tsx b/src/page/Workspace/components/SQLResultSet/index.tsx index 4674cfaa2..e97559aac 100644 --- a/src/page/Workspace/components/SQLResultSet/index.tsx +++ b/src/page/Workspace/components/SQLResultSet/index.tsx @@ -16,7 +16,7 @@ import { formatMessage } from '@/util/intl'; import { CloseOutlined, LockOutlined } from '@ant-design/icons'; -import { Badge, Dropdown, Menu, Tabs, Tooltip } from 'antd'; +import { Badge, Dropdown, Menu, MenuProps, Tabs, Tooltip } from 'antd'; import Cookie from 'js-cookie'; import type { ReactNode } from 'react'; import React, { useCallback, useEffect, useState } from 'react'; @@ -151,25 +151,26 @@ const SQLResultSet: React.FC = function (props) { locked: boolean, resultSetKey: string, ): ReactNode { - const menu = ( - { - e.domEvent.preventDefault(); - e.domEvent.stopPropagation(); - handleMenuClick(e, resultSetKey); - }} - > - - {formatMessage({ id: 'workspace.window.sql.record.column.lock' })} - - - {formatMessage({ id: 'workspace.window.sql.record.column.unlock' })} - - - ); + const menu: MenuProps = { + style: { + width: '160px', + }, + onClick: (e) => { + e.domEvent.preventDefault(); + e.domEvent.stopPropagation(); + handleMenuClick(e, resultSetKey); + }, + items: [ + { + key: MenuKey.LOCK, + label: formatMessage({ id: 'workspace.window.sql.record.column.lock' }), + }, + { + key: MenuKey.UNLOCK, + label: formatMessage({ id: 'workspace.window.sql.record.column.unlock' }), + }, + ], + }; return ( <> @@ -179,7 +180,7 @@ const SQLResultSet: React.FC = function (props) {
)} - + void; // 双击节点默认行为 - onCreateFunction: () => void; - onDeleteFunction: (funName: string) => void; -}> { - public handleMenuClick = (param: MenuInfo) => { - const { title, onBrowserSchema, onCreateFunction, onDeleteFunction } = this.props; - switch (param.key) { - case MenuKey.BROWSER_SCHEMA: - onBrowserSchema(); - break; - case MenuKey.CREATE_FUNCTION: - onCreateFunction(); - break; - case MenuKey.DELETE_FUNCTION: - onDeleteFunction(title); - break; - default: - } - }; - - public render() { - const { title, onBrowserSchema } = this.props; - return ( - - } - onDoubleClick={onBrowserSchema} - onMenuClick={this.handleMenuClick} - > - - {formatMessage({ id: 'workspace.tree.function.browserSchema' })} - - - - {formatMessage({ id: 'workspace.tree.function.create' })} - - - - {formatMessage({ id: 'workspace.tree.table.delete' })} - - - ); - } -} diff --git a/src/page/Workspace/components/TreeNodeProcedure/index.tsx b/src/page/Workspace/components/TreeNodeProcedure/index.tsx deleted file mode 100644 index dee7d276b..000000000 --- a/src/page/Workspace/components/TreeNodeProcedure/index.tsx +++ /dev/null @@ -1,85 +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 Node from '@/component/TreeNode'; -import Icon from '@ant-design/icons'; -import { Menu } from 'antd'; -import { MenuInfo } from 'rc-menu/lib/interface'; -import { PureComponent } from 'react'; -// @ts-ignore -import { ReactComponent as ProcedureSvg } from '@/svgr/Stored-procedure.svg'; -import { formatMessage } from '@/util/intl'; - -enum MenuKey { - BROWSER_SCHEMA = 'BROWSER_SCHEMA', - CREATE_PROCEDURE = 'CREATE_PROCEDURE', - DELETE_TABLE = 'DELETE_TABLE', -} - -export default class ProcedureTreeNode extends PureComponent<{ - title: string; - onBrowserSchema: () => void; // 双击节点默认行为 - onCreateProcedure: () => void; - onDeleteFunction: (funName: string) => void; -}> { - public handleMenuClick = (param: MenuInfo) => { - const { title, onBrowserSchema, onCreateProcedure, onDeleteFunction } = this.props; - switch (param.key) { - case MenuKey.BROWSER_SCHEMA: - onBrowserSchema(); - break; - case MenuKey.CREATE_PROCEDURE: - onCreateProcedure(); - break; - case MenuKey.DELETE_TABLE: - onDeleteFunction(title); - break; - default: - } - }; - - public render() { - const { title, onBrowserSchema } = this.props; - return ( - - } - onDoubleClick={onBrowserSchema} - onMenuClick={this.handleMenuClick} - > - - {formatMessage({ id: 'workspace.tree.procedure.browserSchema' })} - - - - {formatMessage({ id: 'workspace.tree.procedure.create' })} - - - - {formatMessage({ id: 'workspace.tree.table.delete' })} - - - ); - } -} diff --git a/src/page/Workspace/index.tsx b/src/page/Workspace/index.tsx index a05473113..9ee7bff27 100644 --- a/src/page/Workspace/index.tsx +++ b/src/page/Workspace/index.tsx @@ -157,7 +157,7 @@ const Workspace: React.FC = (props: WorkspaceProps) => { } }); if (dockedPage) { - message.warn( + message.warning( formatMessage( { id: 'odc.page.Workspace.DockedpagetitleIsBeingDebuggedAnd', diff --git a/src/store/helper/page/openPage.ts b/src/store/helper/page/openPage.ts index 525446a57..565ad87a2 100644 --- a/src/store/helper/page/openPage.ts +++ b/src/store/helper/page/openPage.ts @@ -430,7 +430,7 @@ export async function openOBClientPage(cid: number, dbId: number) { return p.type === PageType.OB_CLIENT; })?.length; if (clientPageCounts >= MAX_CLIENT_PAGE) { - message.warn( + message.warning( formatMessage( { id: 'odc.helper.page.openPage.YouCannotOpenMoreThan', From 31f696d1f407b6a54edba4f0d0e7f69368dad0cc Mon Sep 17 00:00:00 2001 From: xiaokang Date: Mon, 8 Jan 2024 15:43:01 +0800 Subject: [PATCH 016/231] remove log --- src/component/WindowManager/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/component/WindowManager/index.tsx b/src/component/WindowManager/index.tsx index 90efebacc..3b0db3808 100644 --- a/src/component/WindowManager/index.tsx +++ b/src/component/WindowManager/index.tsx @@ -371,7 +371,6 @@ const WindowManager: React.FC = function (props) { if (!Page) { return null; } - console.log('page', page.type, Page); return { key: page.key, label: getPageTitle(page), From d3c2992df7542b09d0ba4c7b2bbbdf390830d87f Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 9 Jan 2024 13:40:21 +0800 Subject: [PATCH 017/231] add new task database select --- .../Task/component/DatabaseSelect/index.tsx | 189 +++------ .../SessionSelect/SelectItem.tsx | 85 ++++ .../SessionSelect/SessionDropdown/index.tsx | 57 ++- .../SessionSelect/index.tsx | 30 +- .../SessionSelect/modal.tsx | 372 ------------------ 5 files changed, 191 insertions(+), 542 deletions(-) create mode 100644 src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx delete mode 100644 src/page/Workspace/components/SessionContextWrap/SessionSelect/modal.tsx diff --git a/src/component/Task/component/DatabaseSelect/index.tsx b/src/component/Task/component/DatabaseSelect/index.tsx index f76c7c973..cac5500c2 100644 --- a/src/component/Task/component/DatabaseSelect/index.tsx +++ b/src/component/Task/component/DatabaseSelect/index.tsx @@ -14,18 +14,12 @@ * limitations under the License. */ -import { getDataSourceModeConfig } from '@/common/datasource'; -import { listDatabases } from '@/common/network/database'; -import RiskLevelLabel from '@/component/RiskLevelLabel'; import { TaskType } from '@/d.ts'; import { IDatabase } from '@/d.ts/database'; -import login from '@/store/login'; import { formatMessage } from '@/util/intl'; -import { useParams } from '@umijs/max'; -import { Form, Popover, Select, Space, Typography } from 'antd'; -import { toInteger } from 'lodash'; -import React, { useEffect, useMemo, useState } from 'react'; -import styles from './index.less'; +import { Form } from 'antd'; +import React from 'react'; +import SessionSelect from '@/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem'; interface IProps { type: TaskType; label?: string; @@ -34,9 +28,8 @@ interface IProps { projectId?: number; extra?: string; width?: string; - onChange?: (v: number, database?: IDatabase) => void; + onChange?: (v: number) => void; } -const { Text } = Typography; const DatabaseSelect: React.FC = (props) => { const { type, @@ -46,111 +39,66 @@ const DatabaseSelect: React.FC = (props) => { //数据库 name = 'databaseId', projectId, - extra = '', - width = '320px', - disabled = false, onChange, } = props; - const [databases, setDatabases] = useState([]); - const { datasourceId } = useParams<{ datasourceId: string }>(); - const form = Form.useFormInstance(); - const databaseId = Form.useWatch(name, form); - const databaseOptions = databases - ?.filter((item) => - getDataSourceModeConfig(item.dataSource?.type)?.features?.task?.includes(type), - ) - ?.map(({ name, id, environment, dataSource, project }) => ({ - label: ( - - - - {name} - - - { - formatMessage({ - id: 'odc.src.component.Task.component.DatabaseSelect.DataSource', - }) /* 所属数据源: */ - } - {dataSource?.name ?? '-'} - - - { - formatMessage({ - id: 'odc.src.component.Task.component.DatabaseSelect.ItSNotPlayed', - }) /* 所属项目: */ - } - {project?.name ?? '-'} - - - } - > - - - {name} - - - ), - value: id, - })); - const loadDatabase = async (projectId: number, datasourceId: number) => { - const res = await listDatabases( - projectId, - datasourceId, - null, - null, - null, - null, - !!login.isPrivateSpace(), - true, - type === TaskType.ONLINE_SCHEMA_CHANGE ? type : null, - ); - setDatabases(res?.contents); - }; - const handleDatabaseChange = (value) => { - const database = databases?.find(({ id }) => id === value); - onChange?.(value, database); - }; - const project = useMemo(() => { - return databases?.find((item) => item.id === databaseId)?.project; - }, [databases, databaseId]); - useEffect(() => { - loadDatabase(projectId, datasourceId ? toInteger(datasourceId) : null); - }, []); + const fetchType = type === TaskType.ONLINE_SCHEMA_CHANGE ? type : null; + + // const databaseOptions = databases + // ?.filter((item) => + // getDataSourceModeConfig(item.dataSource?.type)?.features?.task?.includes(type), + // ) + // ?.map(({ name, id, environment, dataSource, project }) => ({ + // label: ( + // + // + // + // {name} + // + // + // { + // formatMessage({ + // id: 'odc.src.component.Task.component.DatabaseSelect.DataSource', + // }) /* 所属数据源: */ + // } + // {dataSource?.name ?? '-'} + // + // + // { + // formatMessage({ + // id: 'odc.src.component.Task.component.DatabaseSelect.ItSNotPlayed', + // }) /* 所属项目: */ + // } + // {project?.name ?? '-'} + // + // + // } + // > + // + // + // {name} + // + // + // ), + // value: id, + // })); + return ( - { - !login.isPrivateSpace() && - !!project && - formatMessage( - { - id: 'odc.component.DatabaseSelect.CurrentProjectProjectname', - }, - { - projectName: project.name, - }, - ) //`当前项目: ${project.name}` - } - {extra && {extra}} - - } rules={[ { required: true, @@ -160,24 +108,11 @@ const DatabaseSelect: React.FC = (props) => { }, ]} > - + {database?.data ? ( + <> + + + + ) : null} + {database?.data?.name} + + } + style={{ width: 400 }} + open={false} + /> + + {database?.data ? ( + } + style={{ color: 'var(--text-color-hint)' }} + > + 项目:{database?.data?.project?.name} + 数据源:{database?.data?.dataSource?.name} + + ) : null} + + + ); +}; + +export default SelectItem; diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index 0e50bee2e..109bc0945 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -14,21 +14,22 @@ * limitations under the License. */ import { formatMessage } from '@/util/intl'; -import { Badge, Input, Popover, Select, Space, Spin, Tooltip, Tree } from 'antd'; -import React, { Key, useContext, useEffect, useMemo, useRef, useState } from 'react'; +import { Badge, Input, Popover, Select, Space, Spin, Tree } from 'antd'; +import React, { Key, useContext, useEffect, useMemo, useState } from 'react'; import styles from './index.less'; import Icon, { SearchOutlined } from '@ant-design/icons'; -import { ReactComponent as ProjectSvg } from '@/svgr/project_space.svg'; import tracert from '@/util/tracert'; -import { ConnectionMode } from '@/d.ts'; +import { ConnectionMode, TaskType } from '@/d.ts'; import SessionContext from '../../context'; -import { useRequest, useUpdate } from 'ahooks'; -import { listProjects } from '@/common/network/project'; -import { getConnectionList, getDataSourceGroupByProject } from '@/common/network/connection'; +import { useRequest } from 'ahooks'; import { listDatabases } from '@/common/network/database'; import login from '@/store/login'; -import { DataNode, EventDataNode } from 'antd/lib/tree'; -import { getDataSourceStyleByConnectType } from '@/common/datasource'; +import { DataNode } from 'antd/lib/tree'; +import { + getDataSourceModeConfig, + getDataSourceModeConfigByConnectionMode, + getDataSourceStyleByConnectType, +} from '@/common/datasource'; import { ReactComponent as PjSvg } from '@/svgr/project_space.svg'; import { IDatabase } from '@/d.ts/database'; import { toInteger } from 'lodash'; @@ -37,12 +38,23 @@ import { EnvColorMap } from '@/constant'; import ConnectionPopover from '@/component/ConnectionPopover'; import { IProject } from '@/d.ts/project'; import { IDatasource } from '@/d.ts/datasource'; -import logger from '@/util/logger'; + interface IProps { dialectTypes?: ConnectionMode[]; containsUnassigned?: boolean; + width?: number; + taskType?: TaskType; + fetchType?: TaskType; + projectId?: number; } -const SessionDropdown: React.FC = function ({ children, containsUnassigned = false }) { +const SessionDropdown: React.FC = function ({ + children, + width, + projectId, + taskType, + fetchType, + containsUnassigned = false, +}) { const context = useContext(SessionContext); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -53,10 +65,19 @@ const SessionDropdown: React.FC = function ({ children, containsUnassign const [from, setFrom] = useState<'project' | 'datasource'>('project'); const [expandedKeys, setExpandedKeys] = useState([]); - const update = useUpdate(); - const { run: fetchDatabase, refresh, data } = useRequest(listDatabases, { + const { data } = useRequest(listDatabases, { manual: false, - defaultParams: [null, null, 1, 99999, null, null, containsUnassigned, true, null], + defaultParams: [ + projectId, + datasourceId, + 1, + 99999, + null, + null, + containsUnassigned, + true, + fetchType, + ], }); const dataGroup = useMemo(() => { const datasources: Map = new Map(); @@ -65,6 +86,12 @@ const SessionDropdown: React.FC = function ({ children, containsUnassign allDatasources: IDatasource[] = []; data?.contents?.forEach((db) => { const { project, dataSource } = db; + const support = + !taskType || + getDataSourceModeConfig(db.dataSource?.type)?.features?.task?.includes(taskType); + if (!support) { + return; + } if (project) { const projectDatabases = projects.get(project?.id) || { project: project, @@ -298,7 +325,7 @@ const SessionDropdown: React.FC = function ({ children, containsUnassign overlayStyle={{ paddingTop: 2 }} content={ -
+
{context?.datasourceMode || login.isPrivateSpace() ? null : ( { - fetchDatabase(null, value, 1, 9999, null, null, null, true); - form.setFieldsValue({ - database: null, - }); - }} - optionFilterProp="children" - style={{ width: '320px' }} - > - {allDatasourceList?.contents - ?.map((item) => { - if (dialectTypes?.length && !dialectTypes.includes(item.dialectType)) { - return null; - } - return ( - - {item.name} - - ); - }) - .filter(Boolean)} - - - - ) : ( -
- - { - reset(); - form.setFieldsValue({ - database: null, - }); - if (e.target.value === 'project') { - fetchProjects(null, 1, 9999, false); - - form.getFieldValue('project') && - fetchDatabase( - form.getFieldValue('project'), - null, - 1, - 9999, - null, - null, - null, - true, - ); - } else { - fetchDatasource(login.isPrivateSpace()); - form.getFieldValue('datasource') && - fetchDatabase( - null, - form.getFieldValue('datasource'), - 1, - 9999, - null, - null, - null, - true, - ); - } - }} - optionType="button" - options={[ - isPersonal - ? null - : { - label: formatMessage({ - id: 'odc.SessionContextWrap.SessionSelect.modal.Project', - }), //项目 - value: 'project', - }, - { - label: formatMessage({ - id: 'odc.SessionContextWrap.SessionSelect.modal.DataSource', - }), //数据源 - value: 'datasource', - }, - ].filter(Boolean)} - /> - - - {({ getFieldValue }) => { - const databaseFrom = getFieldValue('databaseFrom'); - if (databaseFrom === 'project') { - return ( - <> - - - - - - - - ); - } else { - return ( - <> - - - - - - - - - {({ getFieldValue }) => { - const dsId = getFieldValue('datasource'); - const ds = datasourceList?.contents?.find((item) => item.id == dsId); - if (!ds) { - return '-'; - } - return ( - - {ds?.environmentName} - - ); - }} - - - - - - - - ); - } - }} - -
- )} - - ); - }), -); From e2ca8e3afad442c3f84dd9b2586bcc1cce925bec Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 9 Jan 2024 14:50:20 +0800 Subject: [PATCH 018/231] add status --- .../Task/DataMockerTask/CreateModal/form.tsx | 2 +- .../Task/component/DatabaseSelect/index.tsx | 53 +------------------ .../SessionSelect/SelectItem.tsx | 18 +++++-- .../SessionSelect/SessionDropdown/index.less | 15 ++++++ .../SessionSelect/SessionDropdown/index.tsx | 25 +++++++-- 5 files changed, 51 insertions(+), 62 deletions(-) diff --git a/src/component/Task/DataMockerTask/CreateModal/form.tsx b/src/component/Task/DataMockerTask/CreateModal/form.tsx index b6be4df95..5076c5971 100644 --- a/src/component/Task/DataMockerTask/CreateModal/form.tsx +++ b/src/component/Task/DataMockerTask/CreateModal/form.tsx @@ -177,7 +177,7 @@ const DataMockerForm: React.FC = inject('settingStore')( form.resetFields(['tableName', 'columns'])} projectId={projectId} - width="100%" + width={'441px'} type={TaskType.DATAMOCK} /> diff --git a/src/component/Task/component/DatabaseSelect/index.tsx b/src/component/Task/component/DatabaseSelect/index.tsx index cac5500c2..6ad8166ee 100644 --- a/src/component/Task/component/DatabaseSelect/index.tsx +++ b/src/component/Task/component/DatabaseSelect/index.tsx @@ -39,61 +39,11 @@ const DatabaseSelect: React.FC = (props) => { //数据库 name = 'databaseId', projectId, + width, onChange, } = props; const fetchType = type === TaskType.ONLINE_SCHEMA_CHANGE ? type : null; - // const databaseOptions = databases - // ?.filter((item) => - // getDataSourceModeConfig(item.dataSource?.type)?.features?.task?.includes(type), - // ) - // ?.map(({ name, id, environment, dataSource, project }) => ({ - // label: ( - // - // - // - // {name} - // - // - // { - // formatMessage({ - // id: 'odc.src.component.Task.component.DatabaseSelect.DataSource', - // }) /* 所属数据源: */ - // } - // {dataSource?.name ?? '-'} - // - // - // { - // formatMessage({ - // id: 'odc.src.component.Task.component.DatabaseSelect.ItSNotPlayed', - // }) /* 所属项目: */ - // } - // {project?.name ?? '-'} - // - // - // } - // > - // - // - // {name} - // - // - // ), - // value: id, - // })); - return ( = (props) => { projectId={projectId} taskType={type} fetchType={fetchType} + width={width} onChange={onChange} /> diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx index fe9dea563..6136d6846 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx @@ -13,11 +13,19 @@ interface IProps { value?: number; taskType?: TaskType; fetchType?: TaskType; + width?: number | string; projectId?: number; onChange?: (value: number) => void; } -const SelectItem: React.FC = ({ value, taskType, projectId, fetchType, onChange }) => { +const SelectItem: React.FC = ({ + value, + taskType, + projectId, + width, + fetchType, + onChange, +}) => { const { data: database, run } = useRequest(getDatabase, { manual: true, }); @@ -38,16 +46,16 @@ const SelectItem: React.FC = ({ value, taskType, projectId, fetchType, o }, }} > - + diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index 69debf6ec..96b2333c4 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -43,16 +43,9 @@ interface IProps { dialectTypes?: ConnectionMode[]; width?: number | string; taskType?: TaskType; - fetchType?: TaskType; projectId?: number; } -const SessionDropdown: React.FC = function ({ - children, - width, - projectId, - taskType, - fetchType, -}) { +const SessionDropdown: React.FC = function ({ children, width, projectId, taskType }) { const context = useContext(SessionContext); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -65,17 +58,7 @@ const SessionDropdown: React.FC = function ({ const { data } = useRequest(listDatabases, { manual: false, - defaultParams: [ - projectId, - datasourceId, - 1, - 99999, - null, - null, - login.isPrivateSpace(), - true, - fetchType, - ], + defaultParams: [projectId, datasourceId, 1, 99999, null, null, login.isPrivateSpace(), true], }); const dataGroup = useMemo(() => { const datasources: Map = new Map(); From 2b27edc8cc9bd1f1f00b791041537cddd8da9b27 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 11 Jan 2024 14:54:20 +0800 Subject: [PATCH 027/231] add status store --- src/store/datasourceStatus.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/store/datasourceStatus.ts diff --git a/src/store/datasourceStatus.ts b/src/store/datasourceStatus.ts new file mode 100644 index 000000000..f5f6de163 --- /dev/null +++ b/src/store/datasourceStatus.ts @@ -0,0 +1,26 @@ +/* + * 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 { IDatasource } from '@/d.ts/datasource'; +import { generateUniqKey } from '@/util/utils'; +import { action, observable } from 'mobx'; + +export class DataSourceStatusStore { + @observable + public status: IDatasource['status']; // sidebar +} + +export default new DataSourceStatusStore(); From 1fef6326dc5ec1b91a435213e609b285d34df808 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 16 Jan 2024 10:27:55 +0800 Subject: [PATCH 028/231] disable oracle url parser --- src/common/datasource/interface.ts | 1 + src/common/datasource/oracle/index.tsx | 1 + .../Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/datasource/interface.ts b/src/common/datasource/interface.ts index 0f2874e73..b38be573c 100644 --- a/src/common/datasource/interface.ts +++ b/src/common/datasource/interface.ts @@ -119,6 +119,7 @@ export interface IDataSourceModeConfig { ssl: boolean; defaultSchema?: boolean; jdbcDoc?: string; + disableURLParse?: boolean; }; features: { task: TaskType[]; diff --git a/src/common/datasource/oracle/index.tsx b/src/common/datasource/oracle/index.tsx index 48f022445..9345489b7 100644 --- a/src/common/datasource/oracle/index.tsx +++ b/src/common/datasource/oracle/index.tsx @@ -61,6 +61,7 @@ const items: Record = { ssl: false, jdbcDoc: 'https://docs.oracle.com/en/database/oracle/oracle-database/21/jajdb/oracle/jdbc/OracleConnection.html', + disableURLParse: true, }, features: { task: Object.values(TaskType).filter( diff --git a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx index b62b68da3..1288d9d72 100644 --- a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx +++ b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx @@ -263,7 +263,7 @@ export default forwardRef(function DatasourceForm( } return ( <> - {!haveOCP() && } + {!haveOCP() && !dsc?.disableURLParse && } {dsc?.defaultSchema ? ( Date: Tue, 16 Jan 2024 14:29:45 +0800 Subject: [PATCH 029/231] support global datasource status --- .../StatusIcon/DataSourceIcon.tsx} | 6 +- src/component/StatusIcon/DatabaseIcon.tsx | 100 +++ src/layout/StoreProvider.tsx | 2 + .../Datasource/Content/List/index.tsx | 43 +- .../ResourceTree/DatabaseTree/index.tsx | 10 + .../SideBar/ResourceTree/Nodes/database.tsx | 6 +- .../SelectPanel/Datasource/index.tsx | 667 +++++++++--------- .../SessionSelect/SessionDropdown/index.tsx | 84 ++- src/page/Workspace/context/WorkspaceStore.tsx | 2 + src/store/datasourceStatus.ts | 77 +- src/store/login.ts | 6 +- 11 files changed, 584 insertions(+), 419 deletions(-) rename src/{page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/StatusIcon.tsx => component/StatusIcon/DataSourceIcon.tsx} (92%) create mode 100644 src/component/StatusIcon/DatabaseIcon.tsx diff --git a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/StatusIcon.tsx b/src/component/StatusIcon/DataSourceIcon.tsx similarity index 92% rename from src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/StatusIcon.tsx rename to src/component/StatusIcon/DataSourceIcon.tsx index fe0304091..802328405 100644 --- a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/StatusIcon.tsx +++ b/src/component/StatusIcon/DataSourceIcon.tsx @@ -20,9 +20,11 @@ import Icon, { Loading3QuartersOutlined, MinusCircleFilled } from '@ant-design/i import { formatMessage } from '@/util/intl'; import { getDataSourceStyleByConnectType } from '@/common/datasource'; +import datasourceStatus from '@/store/datasourceStatus'; export default function StatusIcon({ item }: { item: IConnection }) { - let status = item?.status?.status; + const statusInfo = datasourceStatus.statusMap.get(item.id) || item.status; + let status = statusInfo?.status; const icon = getDataSourceStyleByConnectType(item.type)?.icon; switch (status) { case IConnectionStatus.TESTING: { @@ -87,7 +89,7 @@ export default function StatusIcon({ item }: { item: IConnection }) { case IConnectionStatus.INACTIVE: default: { return ( - + + + + ); + } + case IConnectionStatus.ACTIVE: { + return ( + + + + ); + } + case IConnectionStatus.NOPASSWORD: { + return ( + + + + ); + } + case IConnectionStatus.DISABLED: { + return ( + + + + ); + } + case IConnectionStatus.INACTIVE: + default: { + return ( + + + + ); + } + } +} diff --git a/src/layout/StoreProvider.tsx b/src/layout/StoreProvider.tsx index bae35fe89..a85e9e4d3 100644 --- a/src/layout/StoreProvider.tsx +++ b/src/layout/StoreProvider.tsx @@ -28,6 +28,7 @@ import settingStore from '@/store/setting'; import snippetStore from '@/store/snippet'; import sqlStore from '@/store/sql'; import taskStore from '@/store/task'; +import datasourceStatus from '@/store/datasourceStatus'; export default function (props) { return ( @@ -44,6 +45,7 @@ export default function (props) { debugStore={debugStore} clusterStore={clusterStore} sessionManagerStore={sessionManagerStore} + dataSourceStatusStore={datasourceStatus} > {props.children} diff --git a/src/page/Datasource/Datasource/Content/List/index.tsx b/src/page/Datasource/Datasource/Content/List/index.tsx index b689a266c..dd6c58362 100644 --- a/src/page/Datasource/Datasource/Content/List/index.tsx +++ b/src/page/Datasource/Datasource/Content/List/index.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { batchTest, getConnectionList } from '@/common/network/connection'; +import { getConnectionList } from '@/common/network/connection'; import { IConnection, IConnectionStatus } from '@/d.ts'; import { Result, Space, Spin, Tag } from 'antd'; import React, { @@ -45,6 +45,7 @@ import { inject, observer } from 'mobx-react'; import { history } from '@umijs/max'; import TitleButton from '../TitleButton'; import RiskLevelLabel from '@/component/RiskLevelLabel'; +import datasourceStatus, { DataSourceStatusStore } from '@/store/datasourceStatus'; interface IProps { width: number; @@ -52,16 +53,14 @@ interface IProps { commonStore?: CommonStore; pageStore?: PageStore; clusterStore?: ClusterStore; + dataSourceStatusStore?: DataSourceStatusStore; } const List: React.FC = forwardRef(function ( - { width, height, commonStore, pageStore, clusterStore }, + { width, height, dataSourceStatusStore, clusterStore }, ref, ) { const [_connectionList, setConnectionList] = useState([]); - const [connectionStatus, setConnectionStatus] = useState>( - new Map(), - ); /** * 用来控制列表的刷新,不通过依赖筛选项来控制,因为筛选项之间也有依赖关系,会导致同一个改动导致列表请求两次。 @@ -82,10 +81,10 @@ const List: React.FC = forwardRef(function ( return _connectionList.map((c) => { return { ...c, - status: connectionStatus[c.id] || c.status, + status: dataSourceStatusStore.statusMap.get(c.id) || c.status, }; }); - }, [_connectionList, connectionStatus]); + }, [_connectionList, dataSourceStatusStore.statusMap]); useEffect(() => { clusterStore.loadClusterList(); @@ -100,33 +99,9 @@ const List: React.FC = forwardRef(function ( } async function refreshConnectionStatus(connectionList: IConnection[]) { - const ids = connectionList - ?.filter((a) => a.status?.status === IConnectionStatus.TESTING) - ?.map((a) => a.id); - if (ids?.length) { - const result = await batchTest(ids); - if (result) { - let newStatus = clone(connectionStatus); - ids?.forEach((id) => { - const status = result[id]; - if (status) { - newStatus[id] = status; - } - }); - setConnectionStatus(newStatus); - } - } + dataSourceStatusStore.asyncUpdateStatus(connectionList.map((a) => a.id)); } - useEffect(() => { - const timer = setInterval(() => { - refreshConnectionStatus(connectionList); - }, 5000); - return () => { - clearInterval(timer); - }; - }, [connectionList, connectionStatus]); - async function _fetchNextConnectList(isRefresh?: boolean) { const currentVersion = versionRef.current; if (height <= 0) { @@ -181,6 +156,7 @@ const List: React.FC = forwardRef(function ( } if (result) { setTotal(result.page?.totalElements); + refreshConnectionStatus(result?.contents); if (!isRefresh) { let newConnections = [...connectionList]; let existMap = {}; @@ -197,11 +173,9 @@ const List: React.FC = forwardRef(function ( }); setOffset(newConnections?.length); setConnectionList(newConnections); - refreshConnectionStatus(newConnections); } else { setConnectionList(result?.contents); setOffset(result?.contents?.length); - refreshConnectionStatus(result?.contents); } } } catch (e) { @@ -388,4 +362,5 @@ export default inject( 'commonStore', 'pageStore', 'clusterStore', + 'dataSourceStatusStore', )(observer(forwardRef(AutoSizerWrap))); diff --git a/src/page/Workspace/SideBar/ResourceTree/DatabaseTree/index.tsx b/src/page/Workspace/SideBar/ResourceTree/DatabaseTree/index.tsx index 0db7212a2..54657a635 100644 --- a/src/page/Workspace/SideBar/ResourceTree/DatabaseTree/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/DatabaseTree/index.tsx @@ -20,6 +20,7 @@ import ResourceTreeContext from '@/page/Workspace/context/ResourceTreeContext'; import { useRequest } from 'ahooks'; import { listDatabases } from '@/common/network/database'; import TreeTitle from './Title'; +import datasourceStatus from '@/store/datasourceStatus'; interface IProps { openSelectPanel?: () => void; @@ -52,6 +53,15 @@ const DatabaseTree: React.FC = function ({ openSelectPanel }) { initDatabase(selectProjectId, selectDatasourceId); } }, [selectDatasourceId, selectProjectId]); + useEffect(() => { + if (db?.contents) { + const ids: Set = new Set(); + db.contents.forEach((d) => { + ids.add(d.dataSource?.id); + }); + datasourceStatus.asyncUpdateStatus(Array.from(ids)); + } + }, [db?.contents]); function ProjectRender() { return ( + ) : ( ), diff --git a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.tsx b/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.tsx index f820b87c7..bbf3b2996 100644 --- a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.tsx @@ -30,8 +30,7 @@ import { TreeDataNode, } from 'antd'; import ResourceLayout from '../../Layout'; -import { batchTest, deleteConnection } from '@/common/network/connection'; -import { useUnmountedRef, useUpdate } from 'ahooks'; +import { deleteConnection } from '@/common/network/connection'; import { forwardRef, useContext, @@ -51,353 +50,361 @@ import login from '@/store/login'; import { toInteger, toNumber, throttle } from 'lodash'; import { ConnectType, IConnectionStatus } from '@/d.ts'; import { PlusOutlined } from '@ant-design/icons'; -import StatusIcon from './StatusIcon'; +import StatusIcon from '@/component/StatusIcon/DataSourceIcon'; import classNames from 'classnames'; import NewDatasourceButton from '@/page/Datasource/Datasource/NewDatasourceDrawer/NewButton'; import { EnvColorMap } from '@/constant'; -import { useDataSourceStatus } from './useDataSourceStatus'; +import { inject, observer } from 'mobx-react'; +import { DataSourceStatusStore } from '@/store/datasourceStatus'; interface IProps { filters: { envs: number[]; connectTypes: ConnectType[]; }; + dataSourceStatusStore?: DataSourceStatusStore; closeSelectPanel: () => void; } -export default forwardRef(function DatasourceTree({ filters, closeSelectPanel }: IProps, ref) { - const [editDatasourceId, setEditDatasourceId] = useState(null); - const [copyDatasourceId, setCopyDatasourceId] = useState(null); - const [addDSVisiable, setAddDSVisiable] = useState(false); - const [searchKey, setSearchKey] = useState(''); - const [wrapperHeight, setWrapperHeight] = useState(0); - console.log('wrapperHeight', wrapperHeight); - const treeWrapperRef = useRef(); - const { fetchStatus, statusMap, reload } = useDataSourceStatus(); - const context = useContext(ResourceTreeContext); - let { datasourceList } = context; - datasourceList = useMemo(() => { - return datasourceList?.filter((item) => !item.temp); - }, [datasourceList]); - const selectKeys = [context.selectDatasourceId].filter(Boolean); - function setSelectKeys(keys) { - return context.setSelectDatasourceId(keys?.[0]); - } - useEffect(() => { - const resizeHeight = throttle(() => { - setWrapperHeight(treeWrapperRef?.current?.offsetHeight); - }, 500); - setWrapperHeight(treeWrapperRef.current?.clientHeight); - window.addEventListener('resize', resizeHeight); - return () => { - window.removeEventListener('resize', resizeHeight); - }; - }, []); - useEffect(() => { - /** - * 获取数据源状态 - */ - if (datasourceList?.length) { - reload(); - } - }, [datasourceList]); - useImperativeHandle( - ref, - () => { - return { - async reload() { - await context?.reloadDatasourceList(); - }, - }; - }, - [context], - ); - const datasource: TreeDataNode[] = useMemo(() => { - return datasourceList - ?.map((item) => { - if (searchKey && !item.name?.toLowerCase()?.includes(searchKey?.toLowerCase())) { - return null; - } - if (filters?.envs?.length && !filters?.envs.includes(item.environmentId)) { - /** - * env filter - */ - return null; - } - if (filters?.connectTypes?.length && !filters?.connectTypes.includes(item.type)) { - /** - * connectType filter - */ - return null; - } - const status = statusMap?.[item.id]; - item = status - ? { - ...item, - status, - } - : item; - return { - title: item.name, - selectable: item.status?.status === IConnectionStatus.ACTIVE, - key: item.id, - icon: , +export default inject('dataSourceStatusStore')( + observer( + forwardRef<{ reload: () => void }, IProps>(function DatasourceTree( + { filters, closeSelectPanel, dataSourceStatusStore }: IProps, + ref, + ) { + const [editDatasourceId, setEditDatasourceId] = useState(null); + const [copyDatasourceId, setCopyDatasourceId] = useState(null); + const [addDSVisiable, setAddDSVisiable] = useState(false); + const [searchKey, setSearchKey] = useState(''); + const [wrapperHeight, setWrapperHeight] = useState(0); + console.log('wrapperHeight', wrapperHeight); + const treeWrapperRef = useRef(); + const context = useContext(ResourceTreeContext); + let { datasourceList } = context; + datasourceList = useMemo(() => { + return datasourceList?.filter((item) => !item.temp); + }, [datasourceList]); + const selectKeys = [context.selectDatasourceId].filter(Boolean); + function setSelectKeys(keys) { + return context.setSelectDatasourceId(keys?.[0]); + } + useEffect(() => { + const resizeHeight = throttle(() => { + setWrapperHeight(treeWrapperRef?.current?.offsetHeight); + }, 500); + setWrapperHeight(treeWrapperRef.current?.clientHeight); + window.addEventListener('resize', resizeHeight); + return () => { + window.removeEventListener('resize', resizeHeight); }; - }) - .filter(Boolean); - }, [datasourceList, searchKey, statusMap, filters?.envs, filters?.connectTypes]); - const datasourceMap = useMemo(() => { - const map = new Map(); - datasourceList?.forEach((c) => { - map.set(c.id, c); - }); - return map; - }, [datasourceList]); - function deleteDataSource(name: string, key: string) { - Modal.confirm({ - title: formatMessage( - { - id: 'odc.ResourceTree.Datasource.AreYouSureYouWant', + }, []); + useImperativeHandle( + ref, + () => { + return { + async reload() { + await context?.reloadDatasourceList(); + }, + }; }, - { - name: name, - }, - ), - //`确认删除数据源 ${name}?` - async onOk() { - const isSuccess = await deleteConnection(key as any); - if (isSuccess) { - message.success( - formatMessage({ - id: 'odc.ResourceTree.Datasource.DeletedSuccessfully', - }), //删除成功 - ); + [context], + ); + const datasource: TreeDataNode[] = useMemo(() => { + return datasourceList + ?.map((item) => { + if (searchKey && !item.name?.toLowerCase()?.includes(searchKey?.toLowerCase())) { + return null; + } + if (filters?.envs?.length && !filters?.envs.includes(item.environmentId)) { + /** + * env filter + */ + return null; + } + if (filters?.connectTypes?.length && !filters?.connectTypes.includes(item.type)) { + /** + * connectType filter + */ + return null; + } + const status = dataSourceStatusStore.statusMap.get(item.id); + item = status + ? { + ...item, + status, + } + : item; + return { + title: item.name, + selectable: item.status?.status === IConnectionStatus.ACTIVE, + key: item.id, + icon: , + }; + }) + .filter(Boolean); + }, [ + datasourceList, + searchKey, + dataSourceStatusStore.statusMap, + filters?.envs, + filters?.connectTypes, + ]); + const datasourceMap = useMemo(() => { + const map = new Map(); + datasourceList?.forEach((c) => { + map.set(c.id, c); + }); + return map; + }, [datasourceList]); + function deleteDataSource(name: string, key: string) { + Modal.confirm({ + title: formatMessage( + { + id: 'odc.ResourceTree.Datasource.AreYouSureYouWant', + }, + { + name: name, + }, + ), + //`确认删除数据源 ${name}?` + async onOk() { + const isSuccess = await deleteConnection(key as any); + if (isSuccess) { + message.success( + formatMessage({ + id: 'odc.ResourceTree.Datasource.DeletedSuccessfully', + }), //删除成功 + ); - if (selectKeys.includes(toInteger(key))) { - setSelectKeys([]); - } - context?.reloadDatasourceList(); - } - }, - }); - } - return ( - -
- { - setSearchKey(v); - }} - allowClear - placeholder={formatMessage({ - id: 'odc.ResourceTree.Datasource.SearchForDataSources', - })} - /*搜索数据源*/ style={{ - width: '100%', - flexGrow: 1, - flexShrink: 1, - }} - size="small" - /> - {login.isPrivateSpace() ? ( - context?.reloadDatasourceList()}> -
+
+ {datasource?.length ? ( + { + const dataSource = datasourceList?.find((d) => d.id == node.key); + return ( + <> + + } > - {node.title} - -
- -
- {login.isPrivateSpace() && ( -
- - { - setCopyDatasourceId(toInteger(node.key)); - }} - key={'clone'} - > - { - formatMessage({ - id: - 'odc.src.page.Workspace.SideBar.ResourceTree.SelectPanel.Datasource.Clone.1', - }) /* - 克隆 - */ - } - - { - setEditDatasourceId(node.key); - setAddDSVisiable(true); - }} - key={'edit'} - > - {formatMessage({ - id: 'odc.ResourceTree.Datasource.Edit', - })} - - - deleteDataSource(node.title as string, node.key as string) +
+ { + e.domEvent?.stopPropagation(); + setCopyDatasourceId(toInteger(node.key)); + }, + }, + { + label: formatMessage({ + id: 'odc.ResourceTree.Datasource.Edit', + }), + //编辑 + key: 'edit', + onClick: (e) => { + e.domEvent?.stopPropagation(); + setEditDatasourceId(node.key); + setAddDSVisiable(true); + }, + }, + { + label: formatMessage({ + id: 'odc.ResourceTree.Datasource.Delete', + }), + //删除 + key: 'delete', + onClick: (e) => { + e.domEvent?.stopPropagation(); + const name = node.title; + deleteDataSource(name as string, node.key as string); + }, + }, + ], + }} + > + {node.title} + +
+ - {formatMessage({ - id: 'odc.ResourceTree.Datasource.Delete', - })} - - + /> +
+ {login.isPrivateSpace() && ( +
+ + { + setCopyDatasourceId(toInteger(node.key)); + }} + key={'clone'} + > + { + formatMessage({ + id: + 'odc.src.page.Workspace.SideBar.ResourceTree.SelectPanel.Datasource.Clone.1', + }) /* + 克隆 + */ + } + + { + setEditDatasourceId(node.key); + setAddDSVisiable(true); + }} + key={'edit'} + > + {formatMessage({ + id: 'odc.ResourceTree.Datasource.Edit', + })} + + + deleteDataSource(node.title as string, node.key as string) + } + key={'delete'} + > + {formatMessage({ + id: 'odc.ResourceTree.Datasource.Delete', + })} + + +
+ )}
- )} -
-
- - ); + + + ); + }} + selectedKeys={selectKeys} + onSelect={(keys, info) => { + if (!info.selected) { + /** + * disable unselect + */ + closeSelectPanel(); + return; + } + setSelectKeys(keys); + }} + showIcon + selectable + multiple={false} + treeData={datasource} + /> + ) : ( + context?.reloadDatasourceList()} /> + ) : null + } + /> + )} +
+ { + setEditDatasourceId(null); + setAddDSVisiable(false); }} - selectedKeys={selectKeys} - onSelect={(keys, info) => { - if (!info.selected) { - /** - * disable unselect - */ - closeSelectPanel(); - return; - } - setSelectKeys(keys); + onSuccess={() => { + context?.reloadDatasourceList(); }} - showIcon - selectable - multiple={false} - treeData={datasource} /> - ) : ( - context?.reloadDatasourceList()} /> - ) : null - } + { + setCopyDatasourceId(null); + }} + onSuccess={() => { + context?.reloadDatasourceList(); + }} /> - )} -
- { - setEditDatasourceId(null); - setAddDSVisiable(false); - }} - onSuccess={() => { - context?.reloadDatasourceList(); - }} - /> - { - setCopyDatasourceId(null); - }} - onSuccess={() => { - context?.reloadDatasourceList(); - }} - /> -
- } - bottomLoading={false} - bottom={null} - /> - ); -}); +
+ } + bottomLoading={false} + bottom={null} + /> + ); + }), + ), +); diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index 96b2333c4..303df9cc4 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -38,14 +38,25 @@ import { EnvColorMap } from '@/constant'; import ConnectionPopover from '@/component/ConnectionPopover'; import { IProject } from '@/d.ts/project'; import { IDatasource } from '@/d.ts/datasource'; +import { inject, observer } from 'mobx-react'; +import { DataSourceStatusStore } from '@/store/datasourceStatus'; +import StatusIcon from '@/component/StatusIcon/DataSourceIcon'; +import DataBaseStatusIcon from '@/component/StatusIcon/DatabaseIcon'; interface IProps { dialectTypes?: ConnectionMode[]; width?: number | string; taskType?: TaskType; projectId?: number; + dataSourceStatusStore?: DataSourceStatusStore; } -const SessionDropdown: React.FC = function ({ children, width, projectId, taskType }) { +const SessionDropdown: React.FC = function ({ + children, + width, + projectId, + taskType, + dataSourceStatusStore, +}) { const context = useContext(SessionContext); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -56,10 +67,23 @@ const SessionDropdown: React.FC = function ({ children, width, projectId const [from, setFrom] = useState<'project' | 'datasource'>('project'); const [expandedKeys, setExpandedKeys] = useState([]); - const { data } = useRequest(listDatabases, { - manual: false, - defaultParams: [projectId, datasourceId, 1, 99999, null, null, login.isPrivateSpace(), true], + const { data, run, loading: fetchLoading } = useRequest(listDatabases, { + manual: true, }); + useEffect(() => { + if (isOpen) { + run( + projectId, + datasourceId && toInteger(datasourceId), + 1, + 99999, + null, + null, + login.isPrivateSpace(), + true, + ); + } + }, [isOpen]); const dataGroup = useMemo(() => { const datasources: Map = new Map(); const projects: Map = new Map(); @@ -105,6 +129,12 @@ const SessionDropdown: React.FC = function ({ children, width, projectId }; }, [data?.contents]); + useEffect(() => { + if (dataGroup?.allDatasources) { + dataSourceStatusStore.asyncUpdateStatus(dataGroup?.allDatasources?.map((a) => a.id)); + } + }, [dataGroup?.allDatasources]); + function onOpen(open: boolean) { if (!open) { setIsOpen(open); @@ -144,15 +174,7 @@ const SessionDropdown: React.FC = function ({ children, width, projectId
{item.name}
), - icon: ( - - ), + icon: , key: item.id, selectable: true, isLeaf: true, @@ -201,15 +223,7 @@ const SessionDropdown: React.FC = function ({ children, width, projectId key: `db:${db.id}`, selectable: true, isLeaf: true, - icon: ( - - ), + icon: , }; }) .filter(Boolean); @@ -221,15 +235,7 @@ const SessionDropdown: React.FC = function ({ children, width, projectId } return { title: item.name, - icon: ( - - ), + icon: , key: item.id, selectable: false, isLeaf: false, @@ -269,17 +275,7 @@ const SessionDropdown: React.FC = function ({ children, width, projectId key: `db:${db.id}`, selectable: true, isLeaf: true, - icon: ( - - ), + icon: , }; }) .filter(Boolean); @@ -319,7 +315,7 @@ const SessionDropdown: React.FC = function ({ children, width, projectId onOpenChange={onOpen} overlayStyle={{ paddingTop: 2 }} content={ - +
{context?.datasourceMode || login.isPrivateSpace() ? null : ( @@ -410,4 +406,4 @@ const SessionDropdown: React.FC = function ({ children, width, projectId ); }; -export default SessionDropdown; +export default inject('dataSourceStatusStore')(observer(SessionDropdown)); diff --git a/src/page/Workspace/context/WorkspaceStore.tsx b/src/page/Workspace/context/WorkspaceStore.tsx index 728398fe7..05ca470a6 100644 --- a/src/page/Workspace/context/WorkspaceStore.tsx +++ b/src/page/Workspace/context/WorkspaceStore.tsx @@ -27,6 +27,7 @@ import { getDataSourceGroupByProject } from '@/common/network/connection'; import { listProjects } from '@/common/network/project'; import { useParams } from '@umijs/max'; import { toInteger } from 'lodash'; +import datasourceStatus from '@/store/datasourceStatus'; export default function WorkspaceStore({ children }) { const [activityBarKey, setActivityBarKey] = useState(ActivityBarItemType.Database); @@ -71,6 +72,7 @@ export default function WorkspaceStore({ children }) { const reloadDatasourceList = useCallback(async () => { const data = await fetchDatasource(); setDatasourceList(data?.contents || []); + datasourceStatus.asyncUpdateStatus(data?.contents?.map((a) => a.id)); }, []); const reloadProjectList = useCallback(async () => { diff --git a/src/store/datasourceStatus.ts b/src/store/datasourceStatus.ts index f5f6de163..70c486bec 100644 --- a/src/store/datasourceStatus.ts +++ b/src/store/datasourceStatus.ts @@ -14,13 +14,84 @@ * limitations under the License. */ +import { batchTest } from '@/common/network/connection'; +import { IConnectionStatus } from '@/d.ts'; import { IDatasource } from '@/d.ts/datasource'; import { generateUniqKey } from '@/util/utils'; -import { action, observable } from 'mobx'; +import { action, observable, runInAction } from 'mobx'; +const INTERVAL_TIME = 2000; export class DataSourceStatusStore { - @observable - public status: IDatasource['status']; // sidebar + @observable.shallow + public statusMap: Map< + IDatasource['id'], + { + errorCode: string; + errorMessage: string; + status: any; + type: any; + } + > = new Map(); + + private queue: Set = new Set(); + + private _timer: any = null; + + private status: 'running' | 'stop' = 'stop'; + + private async fetchStatus() { + if (!this.queue.size || this.status === 'stop') { + this.status = 'stop'; + return; + } + const data = await batchTest(Array.from(this.queue)); + if (!data) { + this.status = 'stop'; + return; + } + runInAction(() => { + Object.entries(data).forEach(([key, value]) => { + const id = parseInt(key); + this.statusMap.set(id, value); + if (value.status !== IConnectionStatus.TESTING) { + this.queue.delete(id); + } + this.statusMap = new Map(this.statusMap); + }); + }); + if (this.queue.size) { + this._timer = setTimeout(() => { + this.fetchStatus(); + }, INTERVAL_TIME); + } else { + this.status = 'stop'; + } + } + + public asyncUpdateStatus(ids: IDatasource['id'][]) { + ids.forEach((id) => { + this.queue.add(id); + }); + if (this.status === 'stop') { + this.status = 'running'; + this.fetchStatus(); + } + } + + public reset() { + this.status = 'stop'; + this.statusMap = new Map(); + this.queue = new Set(); + if (this._timer) { + clearTimeout(this._timer); + } + this._timer = null; + } + + public refresh() { + const ids = Array.from(this.statusMap.keys()); + this.asyncUpdateStatus(ids); + } } export default new DataSourceStatusStore(); diff --git a/src/store/login.ts b/src/store/login.ts index eb666c34d..81b1b9746 100644 --- a/src/store/login.ts +++ b/src/store/login.ts @@ -29,6 +29,7 @@ import { history } from '@umijs/max'; import authStore from './auth'; import setting from './setting'; import sessionManager from './sessionManager'; +import datasourceStatus from './datasourceStatus'; class ScriptStore { @observable @@ -295,14 +296,14 @@ export class UserStore { } else { const searchParamsObj = new URLSearchParams(); const query = history.location.search || ''; - if (query.includes("redirectTo") || history.location.pathname === '/login') { + if (query.includes('redirectTo') || history.location.pathname === '/login') { history.push({ pathname: '/login', search: query, }); return; } - searchParamsObj.append('redirectTo', encodeURIComponent(history.location.pathname)+query); + searchParamsObj.append('redirectTo', encodeURIComponent(history.location.pathname) + query); history.push({ pathname: '/login', search: searchParamsObj.toString(), @@ -326,6 +327,7 @@ export class UserStore { public async gotoLogoutPage() { this.user = null; tracert.setUser(null); + datasourceStatus.reset(); if ( !setting.serverSystemInfo?.passwordLoginEnabled && setting.serverSystemInfo?.ssoLoginEnabled From 612c4ef4cb001d144941c71680d471b9a37e59ea Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 16 Jan 2024 16:02:56 +0800 Subject: [PATCH 030/231] Interactive adjustment --- .../Task/ExportTask/CreateModal/index.tsx | 15 ++++++++--- .../Task/ImportTask/CreateModal/index.tsx | 25 +++++++++++++------ .../SpaceContainer/Sider/MineItem/index.tsx | 2 +- .../ResourceTree/DatasourceFilter/index.tsx | 2 +- .../ResourceTree/SelectPanel/index.tsx | 14 ++--------- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/component/Task/ExportTask/CreateModal/index.tsx b/src/component/Task/ExportTask/CreateModal/index.tsx index 54601af64..dd9182957 100644 --- a/src/component/Task/ExportTask/CreateModal/index.tsx +++ b/src/component/Task/ExportTask/CreateModal/index.tsx @@ -336,9 +336,18 @@ class CreateModal extends React.Component { type="info" showIcon message={ - formatMessage({ - id: 'odc.components.ExportDrawer.TheMaximumDataSizeCannot', - }) + <> + {formatMessage({ + id: 'odc.components.ExportDrawer.TheMaximumDataSizeCannot', + })} + + 详情 + + //数据最大不能超过2GB,如需导出大量数据,请使用导数工具obdumper } diff --git a/src/component/Task/ImportTask/CreateModal/index.tsx b/src/component/Task/ImportTask/CreateModal/index.tsx index 7b68f240b..2e59dc866 100644 --- a/src/component/Task/ImportTask/CreateModal/index.tsx +++ b/src/component/Task/ImportTask/CreateModal/index.tsx @@ -467,14 +467,23 @@ class CreateModal extends React.Component { type="info" showIcon message={ - formatMessage( - { - id: 'odc.components.ImportDrawer.TheMaximumSizeOfData', - }, - { - size, - }, - ) + <> + {formatMessage( + { + id: 'odc.components.ImportDrawer.TheMaximumSizeOfData', + }, + { + size, + }, + )} + + 详情 + + // `数据最大不能超过 ${size},如需导入大量数据,请使用导数工具 OBLOADER` } diff --git a/src/layout/SpaceContainer/Sider/MineItem/index.tsx b/src/layout/SpaceContainer/Sider/MineItem/index.tsx index bc941a531..d570b40a5 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/index.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/index.tsx @@ -111,7 +111,7 @@ const MineItem: React.FC = function ({ - {RoleNames} + 角色:{RoleNames} diff --git a/src/page/Workspace/SideBar/ResourceTree/DatasourceFilter/index.tsx b/src/page/Workspace/SideBar/ResourceTree/DatasourceFilter/index.tsx index c13dd65d5..5c16ea95c 100644 --- a/src/page/Workspace/SideBar/ResourceTree/DatasourceFilter/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/DatasourceFilter/index.tsx @@ -47,7 +47,7 @@ const DatasourceFilter: React.FC = function ({ const isFiltered = !!envs?.length || !!types?.length; return ( = function ({ userStore, onClose }) { }} tabs={isPersonal ? [datasource] : [datasource, project]} leftAction={ - + !isSelected ? null : ( onClose()} /> - + ) } /> From b008e50a645568f5154361cd492fef8a99beeab5 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 16 Jan 2024 17:01:49 +0800 Subject: [PATCH 031/231] disable newer time --- src/component/Task/component/TaskTable/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/component/Task/component/TaskTable/index.tsx b/src/component/Task/component/TaskTable/index.tsx index 665e87b6f..5c402b1bc 100644 --- a/src/component/Task/component/TaskTable/index.tsx +++ b/src/component/Task/component/TaskTable/index.tsx @@ -512,6 +512,9 @@ const TaskTable: React.FC = inject( showTime={{ format: 'HH:mm:ss', }} + disabledDate={(current) => { + return current > moment(); + }} format="YYYY-MM-DD HH:mm:ss" onChange={(value) => { setExecuteDate(value); From 56599de3c0c35efec2ae2214413d23fd25499fb2 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 16 Jan 2024 17:35:43 +0800 Subject: [PATCH 032/231] remove old menu --- .../SpaceContainer/Sider/MineItem/Locale.tsx | 2 +- .../SpaceContainer/Sider/MineItem/Theme.tsx | 2 +- .../SpaceContainer/Sider/MineItem/index.tsx | 176 ++++++++++-------- 3 files changed, 101 insertions(+), 79 deletions(-) diff --git a/src/layout/SpaceContainer/Sider/MineItem/Locale.tsx b/src/layout/SpaceContainer/Sider/MineItem/Locale.tsx index 418687d2a..1483aa17a 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/Locale.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/Locale.tsx @@ -54,7 +54,7 @@ const Locale: React.FC = function () { /> } > - {formatMessage({ id: 'odc.Sider.MineItem.Locale.Language' }) /*语言*/} +
{formatMessage({ id: 'odc.Sider.MineItem.Locale.Language' })}
); }; diff --git a/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx b/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx index f86b3eafe..8d29a3346 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx @@ -62,7 +62,7 @@ const ThemeBtn: React.FC = function ({ settingStore }) { /> } > - {formatMessage({ id: 'odc.Sider.MineItem.Theme.Theme' }) /*主题*/} +
{formatMessage({ id: 'odc.Sider.MineItem.Theme.Theme' }) /*主题*/}
); }; diff --git a/src/layout/SpaceContainer/Sider/MineItem/index.tsx b/src/layout/SpaceContainer/Sider/MineItem/index.tsx index d570b40a5..a2450a9d9 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/index.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/index.tsx @@ -32,6 +32,7 @@ import styles from './index.less'; import Locale from './Locale'; import Theme from './Theme'; import tracert from '@/util/tracert'; +import { ItemType } from 'antd/es/menu/hooks/useItems'; interface IProps { userStore?: UserStore; @@ -91,6 +92,98 @@ const MineItem: React.FC = function ({ userStore.gotoLogoutPage(); } catch (e) {} }; + function getMenu() { + let menu: ItemType[] = []; + if (showUserInfo) { + menu = menu.concat([ + { + label: ( + + {userName} + + ), + key: 'username', + }, + { + key: 'user-role', + label: ( + + 角色:{RoleNames} + + ), + }, + { + type: 'divider', + }, + ]); + } + if (allowEditUser && havePasswordLogin) { + menu.push({ + key: 'change-password', + label: formatMessage({ + id: 'odc.component.GlobalHeader.ChangePassword', + }), + onClick: () => { + setChangePasswordModalVisible(true); + }, + }); + } + + if (isClient()) { + menu.push({ + key: 'change-lock-password', + label: formatMessage({ + id: 'odc.component.LoginMenus.ApplicationPassword', + }), + onClick: () => { + setChangeLockPwdModalVisible(true); + }, + }); + } + menu.push({ + label: , + key: 'locale', + }); + + if (enableTheme) { + menu.push({ + label: , + key: 'theme', + }); + } + menu.push({ + key: 'config', + label: formatMessage({ + id: 'odc.Sider.MineItem.Preferences', + }), + onClick: onConfigClick, + }); + if (settingStore.enablePersonalRecord) { + menu.push({ + key: 'record', + label: formatMessage({ + id: 'odc.Sider.MineItem.OperationRecord', + }), + onClick: () => { + tracert.click('a3112.b46782.c330850.d367366'); + recordRef.current?.handleOpenDrawer(); + }, + }); + } + menu.push({ + type: 'divider', + }); + if (allowEditUser) { + menu.push({ + key: 'exit', + label: formatMessage({ + id: 'odc.Sider.MineItem.Exit', + }), + onClick: handleLogout, + }); + } + return menu; + } return ( <> @@ -101,83 +194,12 @@ const MineItem: React.FC = function ({ } }} menu={ - - {showUserInfo && ( - <> - - - {userName} - - - - - 角色:{RoleNames} - - - - - )} - - {allowEditUser && havePasswordLogin ? ( - { - setChangePasswordModalVisible(true); - }} - > - { - formatMessage({ - id: 'odc.component.GlobalHeader.ChangePassword', - }) - /* 修改密码 */ - } - - ) : null} - {isClient() ? ( - { - setChangeLockPwdModalVisible(true); - }} - > - { - formatMessage({ - id: 'odc.component.LoginMenus.ApplicationPassword', - }) - /* 应用密码 */ - } - - ) : null} - - {enableTheme ? : null} - - { - formatMessage({ - id: 'odc.Sider.MineItem.Preferences', - }) /*偏好设置*/ - } - - {settingStore.enablePersonalRecord && ( - { - tracert.click('a3112.b46782.c330850.d367366'); - recordRef.current?.handleOpenDrawer(); - }} - key={'record'} - > - { - formatMessage({ - id: 'odc.Sider.MineItem.OperationRecord', - }) /*操作记录*/ - } - - )} - - - {allowEditUser && ( - - {formatMessage({ id: 'odc.Sider.MineItem.Exit' }) /*退出*/} - - )} - + } > {children} From aa89ee8d69c9dd86882e786d66c47c4ba1eb94b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Tue, 16 Jan 2024 19:00:09 +0800 Subject: [PATCH 033/231] PullRequest: 301 Fixes oceanbase/odc#812 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-odc-812 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/301 Signed-off-by: 晓康 * wip: waiting for doc review * wip: waiting for api debug * wip: api debug * Fixes oceanbase/odc#812 * fix: delete unused import and modify some copywiritings content * style: modify filename --- src/common/network/projectNotification.ts | 224 +++++++ src/component/CommonTable/index.tsx | 16 +- src/component/FormItemPanel/index.tsx | 4 +- src/component/OSSDragger2/index.tsx | 7 +- src/d.ts/_index.ts | 3 +- src/d.ts/projectNotification.ts | 140 ++++ .../Notification/components/Channel.tsx | 628 ++++++++++++++++++ .../Notification/components/Message.tsx | 156 +++++ .../Notification/components/MessageStatus.tsx | 88 +++ .../Notification/components/Policy.tsx | 288 ++++++++ .../Notification/components/columns.tsx | 320 +++++++++ .../Notification/components/index.less | 39 ++ .../Notification/components/interface.ts | 29 + src/page/Project/Notification/index.tsx | 73 ++ .../Project/components/SCLayout/index.less | 55 ++ .../Project/components/SCLayout/index.tsx | 65 ++ src/page/Project/index.tsx | 28 +- .../Secure/RiskLevel/components/Condition.tsx | 4 - src/util/aliyun.ts | 35 +- 19 files changed, 2172 insertions(+), 30 deletions(-) create mode 100644 src/common/network/projectNotification.ts create mode 100644 src/d.ts/projectNotification.ts create mode 100644 src/page/Project/Notification/components/Channel.tsx create mode 100644 src/page/Project/Notification/components/Message.tsx create mode 100644 src/page/Project/Notification/components/MessageStatus.tsx create mode 100644 src/page/Project/Notification/components/Policy.tsx create mode 100644 src/page/Project/Notification/components/columns.tsx create mode 100644 src/page/Project/Notification/components/index.less create mode 100644 src/page/Project/Notification/components/interface.ts create mode 100644 src/page/Project/Notification/index.tsx create mode 100644 src/page/Project/components/SCLayout/index.less create mode 100644 src/page/Project/components/SCLayout/index.tsx diff --git a/src/common/network/projectNotification.ts b/src/common/network/projectNotification.ts new file mode 100644 index 000000000..7fc783d5b --- /dev/null +++ b/src/common/network/projectNotification.ts @@ -0,0 +1,224 @@ +import { IResponseData } from '@/d.ts'; +import { + IChannel, + ITestChannelResult, + IPolicy, + IMessage, + TBatchUpdatePolicy, + EMessageStatus, +} from '@/d.ts/projectNotification'; +import request from '@/util/request'; + +// #region ------------------------- notification channel ------------------------- +/** + * 1. 根据项目ID获取消息通道列表 + * @param projectId 项目ID + * @returns `data: IChannel[]` 消息通道列表 + */ +export async function getChannelsList( + projectId: number, + params?: Partial<{ + title?: string; + status?: EMessageStatus; + sort?: string; + page?: number; + size?: number; + }>, +): Promise>> { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/channels`, + { + params, + }, + ); + return res?.data; +} +/** + * 2. 根据通道ID获取通道详情 + * @param projectId 项目ID + * @param channelId 通道ID + * @return `data: IChannel` 通道详情 + */ +export async function detailChannel(projectId: number, channelId: number): Promise { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/channels/${channelId}`, + ); + return res?.data; +} + +/** + * 3. 测试消息通道配置是否可用 + * @param projectId + * @param data + * @returns `result: ITestChannelResult` 通道配置测试结果 + */ +export async function testChannel( + projectId: number, + data: Pick, +): Promise { + const res = await request.post( + `/api/v2/collaboration/projects/${projectId}/notification/channels/test`, + { + data, + }, + ); + return res?.data; +} + +/** + * 4. 创建通道 + * @param projectId 项目ID + * @param data 通道 + * @returns `result: IChannel` 通道 + */ +export async function createChannel(projectId: number, data: IChannel): Promise { + const res = await request.post( + `/api/v2/collaboration/projects/${projectId}/notification/channels`, + { + data, + }, + ); + return res?.data; +} + +/** + * 5. 编辑通道 + * @param projectId 项目ID + * @param channelId 通道ID + * @param data 通道属性 + * @returns `result: IChannel` 编辑成功后的通道 + */ +export async function editChannel( + projectId: number, + channelId: number, + data: IChannel, +): Promise { + const res = await request.put( + `/api/v2/collaboration/projects/${projectId}/notification/channels/${channelId}`, + { + data, + }, + ); + return res?.data; +} + +/** + * 6. 删除通道 + * @param projectId 项目ID + * @param channelId 通道ID + * @returns `result: IChannel` 被删除的通道 + */ +export async function deleteChannel(projectId: number, channelId: number): Promise { + const res = await request.delete( + `/api/v2/collaboration/projects/${projectId}/notification/channels/${channelId}`, + ); + return res?.data; +} +/** + * 7. 判断通道名称是否已经存在 + * @param projectId 项目ID + * @param channelName 通道名称 + * @returns `result: boolean` 通道名称是否已经存在 + */ +export async function existsChannel( + projectId: number, + channelName: string, +): Promise<{ + result: boolean; +}> { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/channels/exists?name=${channelName}`, + ); + return res?.data; +} +// #endregion + +// #region ------------------------- notification policy ------------------------- +/** + * 返回消息规则列表数据 + * @param projectId 项目ID + * @returns + */ +export async function getPoliciesList( + projectId: number, + params?: Partial<{ + fuzzyTableColumn: string; + datasource: number[]; + database: number[]; + table: string[]; + column: string[]; + maskingAlgorithm: number[]; + enabled: boolean[]; + }>, +): Promise> { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/policies`, + { + params, + }, + ); + return res?.data; +} +/** + * 查看消息规则详情 + * @param projectId + * @param policyId + * @returns + */ +export async function detailPolicy(projectId: number, policyId: number): Promise { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/policies/${policyId}`, + ); + return res?.data; +} +/** + * 批量编辑消息规则 + * @param projectId + * @param policies + * @returns + */ +export async function batchUpdatePolicy( + projectId: number, + policies: TBatchUpdatePolicy[], +): Promise> { + const res = await request.put( + `/api/v2/collaboration/projects/${projectId}/notification/policies`, + { + data: policies, + }, + ); + return res?.data; +} +// #endregion + +// #region ------------------------- notification messages ------------------------- +/** + * 根据项目ID获取推送记录列表 + * @param projectId + * @returns + */ +export async function getMessagesList( + projectId: number, + params: Partial<{ + title?: string; + status?: EMessageStatus; + sort?: string; + page?: number; + size?: number; + }>, +): Promise> { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/messages`, + { + params, + }, + ); + return res?.data; +} +export async function detailMessage(projectId: number, messageId: number): Promise { + const res = await request.get( + `/api/v2/collaboration/projects/${projectId}/notification/messages/${messageId}`, + ); + return res?.data; +} +// #endregion diff --git a/src/component/CommonTable/index.tsx b/src/component/CommonTable/index.tsx index 74955b8c8..050e180d1 100644 --- a/src/component/CommonTable/index.tsx +++ b/src/component/CommonTable/index.tsx @@ -60,9 +60,9 @@ interface IProps { alertInfoContent?: { message: React.ReactNode; }; - // 是否展示表头 操作栏 + /** @description 是否展示表头 操作栏 */ showToolbar?: boolean; - // 表头操作栏 标题区配置 + /** @description 表头操作栏 标题区配置 */ titleContent: ITitleContent; // 表头操作栏 筛选区配置 filterContent?: IFilterContent; @@ -106,7 +106,9 @@ const CommonTable: ( rowSelecter, rowSelectedCallback = (selectedRowKeys: any[]) => {}, rowHeight = mode === CommonTableMode.BIG ? DEFAULT_BIG_ROW_HEIGHT : DEFAULT_SMALL_ROW_HEIGHT, - tableProps, + tableProps = { + rowKey: 'id', + }, enableResize = false, onLoad, onChange, @@ -285,16 +287,16 @@ const CommonTable: ( } function handleRowKeySelect(record, selected) { - handleRowKeyChange(selected, [record.id]); + handleRowKeyChange(selected, [record?.[tableProps?.rowKey as string]]); } function handleSelectAll(selected, selectedRows, changeRows) { - const changeKeys = changeRows?.map((item) => item.id); + const changeKeys = changeRows?.map((item) => item[tableProps?.rowKey as string]); handleRowKeyChange(selected, changeKeys); } function handleSelectAllRows() { - const changeKeys = dataSource?.map((item) => item[tableProps.rowKey as string]); + const changeKeys = dataSource?.map((item) => item[tableProps?.rowKey as string]); setSelectedRowKeys(changeKeys); } @@ -415,7 +417,7 @@ const CommonTable: ( /> )} { - + void; } const FormItemPanel: React.FC = function (props) { - const { overview, label, children, expandText, keepExpand } = props; + const { overview, label, children, expandText, keepExpand, noPaddingBottom = false } = props; const [expand, setExpand] = useControllableValue(props, { defaultValue: false, valuePropName: 'expand', @@ -70,6 +71,7 @@ const FormItemPanel: React.FC = function (props) { style={{ background: 'var(--background-tertraiy-color)', padding: '11px 12px 8px 12px', + paddingBottom: noPaddingBottom ? '0px' : '8px', margin: '0px 0px 16px 0px', }} > diff --git a/src/component/OSSDragger2/index.tsx b/src/component/OSSDragger2/index.tsx index 4b3425651..b892ee296 100644 --- a/src/component/OSSDragger2/index.tsx +++ b/src/component/OSSDragger2/index.tsx @@ -144,7 +144,12 @@ const ODCDragger: React.FC = React.memo((props) => { try { if (setting.isUploadCloudStore) { - const fileName = await uploadFileToOSS(task.file, task.uploadFileOpenAPIName, sessionId, task.onProgress); + const fileName = await uploadFileToOSS( + task.file, + task.uploadFileOpenAPIName, + sessionId, + task.onProgress, + ); task.onSuccess( { data: fileName, diff --git a/src/d.ts/_index.ts b/src/d.ts/_index.ts index df0138dcf..bf6988998 100644 --- a/src/d.ts/_index.ts +++ b/src/d.ts/_index.ts @@ -32,6 +32,7 @@ export enum IPageType { Project_User = 'user', Project_Setting = 'setting', Project_Task = 'task', + Project_Notification = 'notification', Datasource = 'datasource', Datasource_info = 'info', Datasource_session = 'session', @@ -48,7 +49,7 @@ export enum IPageType { Secure_Record = 'record', RiskDetectRules = 'riskDetectRules', RiskLevel = 'riskLevel', - Sensitive = 'sensitive', + Project_Sensitive = 'sensitive', MaskingAlgorithm = 'maskingAlgorithm', ExternalIntegration = 'externalIntegration', ExternalIntegration_Approval = 'approval', diff --git a/src/d.ts/projectNotification.ts b/src/d.ts/projectNotification.ts new file mode 100644 index 000000000..450b9f090 --- /dev/null +++ b/src/d.ts/projectNotification.ts @@ -0,0 +1,140 @@ +// 事件状态 +export enum EEventType { + CREATED = 'CREATED', + CONVERTING = 'CONVERTING', + THROWN = 'THROWN', + CONVERTED = 'CONVERTED', +} +// 消息发送状态 +export enum EMessageStatus { + // 待发送 + CREATED = 'CREATED', + // 发送成功 + SENT_SUCCESSFULLY = 'SENT_SUCCESSFULLY', + // 发送失败 + SENT_FAILED = 'SENT_FAILED', + // 忽略 + THROWN = 'THROWN', + // 发送中 + SENDING = 'SENDING', +} +// 限流时间单位 +export enum ETimeUnit { + MINUTES = 'MINUTES', + HOURS = 'HOURS', + DAYS = 'DAYS', +} +// #region ------------------------- notification channel ------------------------- +// 通道类型 +export enum EChannelType { + // 钉钉 + DING_TALK = 'DingTalk', + // 飞书 + FEI_SHU = 'Feishu', + // 微信 + WE_COM = 'WeCom', + // 自定义webhook + WEBHOOK = 'webhook', +} +// 限流策略 +export enum EOverLimitStrategy { + // 丢弃, UI中文本为忽略 + THROWN = 'THROWN', + // 重发 + RESEND = 'RESEND', +} +export interface IRateLimitConfig { + timeUnit: ETimeUnit; + limit: number; + overLimitStrategy: EOverLimitStrategy; +} +export enum ELanguage { + ZH_CN = 'zh-CN', + ZH_TW = 'zh-TW', + EN_US = 'en-US', +} +export interface IChannelConfig { + /** @description 通道 webhook地址 */ + webhook: string; + /** @description 通道 webhook指定用户手机号 */ + atMobiles?: string[]; + /** @description 通道 签名密钥 */ + sign?: string; + /** @description 通道 标题模版 */ + titleTemplate?: string; + /** @description 通道 内容模版 */ + contentTemplate: string; + /** @description 通道 限流配置 */ + rateLimitConfig: IRateLimitConfig; + /** @description 通道 模版语言 */ + language: ELanguage; +} +export interface IChannel { + /** @description 通道 通道ID */ + id?: number; + /** @description 通道名称 */ + name: string; + /** @description 通道创建时间 */ + createTime?: number; + /** @description 通道更新时间 */ + updateTime?: number; + /** @description 通道创建者ID */ + creatorId: number; + /** @description 通道创建者用户名 */ + creatorName: string; + /** @description 通道创建者所属组织ID */ + organizationId: number; + /** @description 通道所属项目ID */ + projectId: number; + /** @description 通道 类型 */ + type: EChannelType; + /** @description 通道 属性 */ + channelConfig: IChannelConfig; + /** @description 通道 描述 */ + description?: string; +} + +export interface ITestChannelResult { + active: boolean; + errorMessage: string; +} +// #endregion + +// #region ------------------------- notification policy ------------------------- +export interface IPolicy { + id?: number; + createTime?: number; + updateTime?: number; + creatorId: number; + organizationId: number; + projectId: number; + policyMetadataId?: number; + matchExpression: string; + enabled: boolean; + channels: IChannel[]; + eventName: string; +} +export type TBatchUpdatePolicy = { + id?: number; + policyMetadataId?: number; + enabled: boolean; + channels: Pick[]; +}; +// #endregion + +// #region ------------------------- notification message ------------------------- +export interface IMessage { + id?: number; + createTime?: number; + creatorId: number; + organizationId: number; + projectId: number; + status: EMessageStatus; + retryTimes: number; + errorMessage: string; + channel: IChannel; + lastSentTime?: number; + title: string; + content: string; +} +// #endregion diff --git a/src/page/Project/Notification/components/Channel.tsx b/src/page/Project/Notification/components/Channel.tsx new file mode 100644 index 000000000..757149cc7 --- /dev/null +++ b/src/page/Project/Notification/components/Channel.tsx @@ -0,0 +1,628 @@ +import classNames from 'classnames'; +import { useForm } from 'antd/lib/form/Form'; +import { useEffect, useRef, useState } from 'react'; +import { + Button, + Drawer, + Space, + Form, + Input, + Radio, + Tabs, + Checkbox, + Descriptions, + Modal, + message, + Select, + InputNumber, + Alert, +} from 'antd'; +import CommonTable from '@/component/CommonTable'; +import { IOperationOptionType, ITableLoadOptions } from '@/component/CommonTable/interface'; +import FormItemPanel from '@/component/FormItemPanel'; +import { + editChannel, + createChannel, + deleteChannel, + detailChannel, + existsChannel, + getChannelsList, + testChannel, +} from '@/common/network/projectNotification'; +import { + EChannelType, + ELanguage, + EOverLimitStrategy, + ETimeUnit, + IChannel, + IRateLimitConfig, +} from '@/d.ts/projectNotification'; +import { IResponseData } from '@/d.ts'; +import styles from './index.less'; +import { formatMessage } from '@/util/intl'; +import HelpDoc from '@/component/helpDoc'; +import { getChannelColumns } from './columns'; +import { EChannelTypeMap, TimeUnitMap } from './interface'; + +const Channel: React.FC<{ + projectId: number; +}> = ({ projectId }) => { + const tableRef = useRef(); + + const [selectedChannelId, setSelectedChannelId] = useState(null); + const [detailDrawerOpen, setDetailDrawerOpen] = useState(false); + const [formDrawerOpen, setFormDrawerOpen] = useState(false); + const [channelsList, setChannelsList] = useState< + IResponseData> + >(); + const loadChannels = async (args: ITableLoadOptions) => { + const { filters, sorter, pagination, pageSize } = args ?? {}; + const { name, type } = filters ?? {}; + const { column, order } = sorter ?? {}; + const { current = 1 } = pagination ?? {}; + const data = { + name, + type, + sort: column?.dataIndex, + page: current, + size: pageSize, + }; + data.sort = column ? `${column.dataIndex},${order === 'ascend' ? 'asc' : 'desc'}` : undefined; + const rawChannelsList = await getChannelsList(projectId, data); + if (rawChannelsList) { + setChannelsList(rawChannelsList); + } + }; + const handleDelete = (channelId: number) => { + return Modal.confirm({ + title: '确认要删除此通道吗?', + content: '删除后,关联工单事件的消息推送将不再生效。', + onOk: async () => { + const result = await deleteChannel(projectId, channelId); + if (result) { + message.success('删除成功!'); + tableRef?.current?.reload?.(); + } else { + message.error('删除失败'); + } + }, + onCancel: () => {}, + }); + }; + const handleChannelEdit = (channelId: number) => { + setSelectedChannelId(channelId); + setFormDrawerOpen(true); + }; + const closedCallback = () => { + selectedChannelId && setSelectedChannelId(null); + tableRef?.current?.reload(); + }; + + const hanleOpenChannelDetailDrawer = (channel: Omit) => { + setSelectedChannelId(channel?.id); + setDetailDrawerOpen(true); + }; + const operationOptions = [ + { + type: IOperationOptionType.button, + content: 新建通道, + isPrimary: true, + onClick: () => { + setFormDrawerOpen(true); + }, + }, + ]; + + const columns = getChannelColumns({ + handleDelete, + handleChannelEdit, + hanleOpenChannelDetailDrawer, + }); + return ( +
+ + + + +
+ ); +}; + +export const FromChannelDrawer: React.FC<{ + projectId: number; + channelId?: number; + formDrawerOpen: boolean; + setFormDrawerOpen: (formDrawerOpen: boolean) => void; + closedCallback?: () => void; +}> = ({ projectId, channelId, formDrawerOpen, setFormDrawerOpen, closedCallback }) => { + const [formRef] = useForm(); + const [currentChannel, setCurrentChannel] = useState(); + const [hasEdit, setHasEdit] = useState(false); + const [testChannelSuccess, setTestChannelSuccess] = useState(false); + const [testChannelErrorMessage, setTestChannelErrorMessage] = useState(null); + const [testLoading, setTestLoading] = useState(false); + const loadChannelDetail = async (channelId) => { + const channel = await detailChannel(projectId, channelId); + if (channel) { + setCurrentChannel(channel); + formRef?.setFieldsValue(channel); + return; + } + message.error('加载通道数据失败'); + }; + const handleTestChannel = async () => { + setTestChannelErrorMessage(null); + const channel = await formRef.validateFields().catch(); + setTestLoading(true); + const result = await testChannel(projectId, channel); + if (result?.active) { + setTestChannelSuccess(true); + message.success('测试消息发送成功!'); + } else { + setTestChannelSuccess(false); + message.success('测试消息发送失败!'); + setTestChannelErrorMessage(result?.errorMessage); + } + setTestLoading(false); + }; + const handleFormDrawerClose = () => { + if (hasEdit) { + return Modal.confirm({ + centered: true, + title: channelId ? '确认关闭编辑通道?' : '确认关闭新建通道?', + onOk: () => { + setFormDrawerOpen(false); + }, + onCancel: () => {}, + }); + } + setFormDrawerOpen(false); + }; + const handleFormDrawerSubmit = async () => { + const result = await formRef.validateFields().catch(); + result.id ??= channelId; + let data; + if (channelId) { + data = await editChannel(projectId, channelId, result); + } else { + data = await createChannel(projectId, result); + } + if (data) { + message.success(channelId ? '保存成功' : '新建成功'); + setFormDrawerOpen(false); + closedCallback?.(); + return; + } + message.success(channelId ? '保存失败' : '新建失败'); + }; + const handleFieldsChange = () => { + setHasEdit(true); + setTestChannelSuccess(false); + }; + + const checkNameRepeat = async (ruler, value) => { + const name = value?.trim(); + if (!name || (channelId && currentChannel?.name === name)) { + return; + } + const isRepeat = await existsChannel(projectId, name); + if (isRepeat) { + throw new Error(); + } + }; + + useEffect(() => { + if (formDrawerOpen && channelId) { + loadChannelDetail(channelId); + } else { + // 关闭后统一处理数据 + formRef?.resetFields(); + setCurrentChannel(null); + setHasEdit(false); + setTestChannelErrorMessage(null); + setTestChannelSuccess(false); + setTestLoading(false); + } + }, [formDrawerOpen, channelId]); + return ( + + + + + + + + } + > + {testChannelErrorMessage && ( + + )} +
+ + + + + + + {EChannelTypeMap[EChannelType.DING_TALK]} + + + {EChannelTypeMap[EChannelType.FEI_SHU]} + + + {EChannelTypeMap[EChannelType.WE_COM]} + + + {EChannelTypeMap[EChannelType.WEBHOOK]} + + + + + + + + + + + + + + + + + + + + + + + + 忽略 + + + + + 重发 + + + + + + ) : null} + + ); + }} + + + ); +}; +const LangagueTab: React.FC<{ + value?: ELanguage; + onChange?: (v: any) => void; +}> = ({ value, onChange }) => { + const [tabKey, setTabKey] = useState(value); + const handleTabActiveKeyOnChange = (activeKey: ELanguage) => { + setTabKey(activeKey); + onChange(activeKey); + }; + useEffect(() => { + setTabKey(value); + }, [value]); + const items = [ + { + label: '中文', + key: ELanguage.ZH_CN, + children: null, + }, + { + label: '繁体中文', + key: ELanguage.ZH_TW, + children: null, + }, + { + label: '英文', + key: ELanguage.EN_US, + children: null, + }, + ]; + return ( + handleTabActiveKeyOnChange(key as ELanguage)} + type="card" + size="small" + items={items} + className={styles.langagueTab} + /> + ); +}; +export default Channel; diff --git a/src/page/Project/Notification/components/Message.tsx b/src/page/Project/Notification/components/Message.tsx new file mode 100644 index 000000000..96185ce6b --- /dev/null +++ b/src/page/Project/Notification/components/Message.tsx @@ -0,0 +1,156 @@ +import { + detailMessage, + getChannelsList, + getMessagesList, +} from '@/common/network/projectNotification'; +import CommonTable from '@/component/CommonTable'; +import { Descriptions, Drawer } from 'antd'; +import { useEffect, useRef, useState } from 'react'; +import { IResponseData } from '@/d.ts'; +import { EMessageStatus, IMessage } from '@/d.ts/projectNotification'; +import { getMessageColumns } from './columns'; +import styles from './index.less'; +import { getLocalFormatDateTime } from '@/util/utils'; +import { ITableInstance, ITableLoadOptions } from '@/component/CommonTable/interface'; +import { EMessageStatusMap } from './interface'; +import { useLoop } from '@/util/hooks/useLoop'; + +const Message: React.FC<{ + projectId: number; +}> = ({ projectId }) => { + const tableRef = useRef(); + const [formDrawerOpen, setFormDrawerOpen] = useState(false); + const [messagesList, setMessagesList] = useState>(); + const [selectedMessageId, setSelectedMessageId] = useState(null); + const [channelFilter, setChannelFilter] = useState<{ text: string; value: number }[]>([]); + + const { loop: loadMessages, destory } = useLoop((count) => { + return async (args: ITableLoadOptions) => { + const { filters, sorter, pagination, pageSize } = args ?? {}; + const { title, channel, status } = filters ?? {}; + const { column, order } = sorter ?? {}; + const { current = 1 } = pagination ?? {}; + const data = { + title, + channelId: channel, + status, + sort: column?.dataIndex, + page: current, + size: pageSize, + }; + data.sort = column ? `${column.dataIndex},${order === 'ascend' ? 'asc' : 'desc'}` : undefined; + const messages = await getMessagesList(projectId, data); + if (messages) { + setMessagesList(messages as IResponseData); + } + }; + }, 6000); + const handleOpenMessageDetailDrawer = (messageId: number) => { + setSelectedMessageId(messageId); + setFormDrawerOpen(true); + }; + const handleCloseMessageDetailDrawer = () => { + setFormDrawerOpen(false); + setSelectedMessageId(null); + }; + async function loadChannleFilter() { + const channels = await getChannelsList(projectId); + const newOptions = channels?.contents?.map((channel) => ({ + text: channel?.name, + value: channel?.id, + })); + setChannelFilter(newOptions); + } + useEffect(() => { + loadChannleFilter(); + return () => { + destory(); + }; + }, []); + const columns = getMessageColumns({ + channelFilter, + handleOpenMessageDetailDrawer, + }); + return ( +
+ + +
+ ); +}; +const DetailDrawer: React.FC<{ + projectId: number; + messageId: number; + formDrawerOpen: boolean; + handleCloseMessageDetailDrawer: () => void; +}> = ({ projectId, messageId, formDrawerOpen, handleCloseMessageDetailDrawer }) => { + const [message, setMessage] = useState(); + async function loadMessageDetail(messageId: number) { + const result = await detailMessage(projectId, messageId); + if (result) { + setMessage(result); + } + } + useEffect(() => { + if (formDrawerOpen && messageId) { + loadMessageDetail(messageId); + } else { + setMessage(null); + } + }, [formDrawerOpen, messageId]); + return ( + + + {message?.title || '-'} + {message?.channel?.name || '-'} + + {message?.createTime ? getLocalFormatDateTime(message?.createTime) : '-'} + + + {message?.lastSentTime ? getLocalFormatDateTime(message?.lastSentTime) : '-'} + + + {EMessageStatusMap?.[message?.status] || '-'} + + {null} +
+ {message?.content || '-'} +
+
+
+ ); +}; +export default Message; diff --git a/src/page/Project/Notification/components/MessageStatus.tsx b/src/page/Project/Notification/components/MessageStatus.tsx new file mode 100644 index 000000000..8df390f56 --- /dev/null +++ b/src/page/Project/Notification/components/MessageStatus.tsx @@ -0,0 +1,88 @@ +import { IMessage, EMessageStatus } from '@/d.ts/projectNotification'; +import { + CheckCircleFilled, + CloseCircleFilled, + EllipsisOutlined, + ExclamationCircleFilled, + LoadingOutlined, + StopFilled, +} from '@ant-design/icons'; +import { Space, Tooltip } from 'antd'; +import { EMessageStatusMap } from './interface'; + +export const MessageStatus: React.FC<{ + message: IMessage; +}> = ({ message }) => { + const StatusIconMap = { + [EMessageStatus.CREATED]: { + icon: ( + + ), + }, + [EMessageStatus.SENDING]: { + icon: ( + + ), + }, + [EMessageStatus.SENT_SUCCESSFULLY]: { + icon: ( + + ), + }, + [EMessageStatus.SENT_FAILED]: { + icon: ( + + ), + }, + [EMessageStatus.THROWN]: { + icon: ( + + ), + }, + }; + return ( + +
{StatusIconMap?.[message?.status]?.icon}
+
{EMessageStatusMap?.[message?.status]}
+ {![EMessageStatus.CREATED, EMessageStatus.SENDING, EMessageStatus.SENT_SUCCESSFULLY].includes( + message?.status, + ) && + message?.errorMessage && ( +
+ + + +
+ )} +
+ ); +}; diff --git a/src/page/Project/Notification/components/Policy.tsx b/src/page/Project/Notification/components/Policy.tsx new file mode 100644 index 000000000..7315aa11e --- /dev/null +++ b/src/page/Project/Notification/components/Policy.tsx @@ -0,0 +1,288 @@ +import CommonTable from '@/component/CommonTable'; +import { Button, Divider, Form, Modal, Select, message } from 'antd'; +import { useForm } from 'antd/lib/form/Form'; +import { useEffect, useRef, useState } from 'react'; +import { DetailChannelDrawer, FromChannelDrawer } from './Channel'; +import { + batchUpdatePolicy, + getChannelsList, + getPoliciesList, +} from '@/common/network/projectNotification'; +import { + IRowSelecter, + ITableFilter, + ITableInstance, + ITableLoadOptions, + ITablePagination, +} from '@/component/CommonTable/interface'; +import { IChannel, IPolicy, TBatchUpdatePolicy } from '@/d.ts/projectNotification'; +import { useSetState } from 'ahooks'; +import { getPolicyColumns } from './columns'; +import { EPolicyFormMode, TPolicyForm } from './interface'; +import styles from './index.less'; + +const Policy: React.FC<{ + projectId: number; +}> = ({ projectId }) => { + const tableRef = useRef(); + const argsRef = useRef(); + const originPoliciesRef = useRef(); + const [selectedChannelId, setSelectedChannelId] = useState(null); + const [detailDrawerOpen, setDetailDrawerOpen] = useState(false); + const [formModalOpen, setFormModalOpen] = useState(false); + const [policies, setPolicies] = useState([]); + const [pagination, setPagination] = useState(null); + const [policyForm, setPolicyForm] = useSetState({ + mode: EPolicyFormMode.SINGLE, + projectId: projectId, + policies: [], + }); + + const loadPolicies = async (args: ITableLoadOptions) => { + const { eventName, channels } = argsRef.current?.filters ?? {}; + const results = await getPoliciesList(projectId, {}); + originPoliciesRef.current = results.contents; + let filterPolicies: IPolicy[] = originPoliciesRef.current; + + if (eventName && eventName?.length === 1) { + filterPolicies = filterPolicies?.filter((policy) => + policy?.eventName?.toLocaleLowerCase()?.includes(eventName?.[0]?.toLocaleLowerCase()), + ); + } + if (channels && channels?.length === 1) { + filterPolicies = filterPolicies?.filter((policy) => + policy?.channels?.some((channel) => + channel?.name?.toLocaleLowerCase()?.includes(channels?.[0]?.toLocaleLowerCase()), + ), + ); + } + setPolicies(filterPolicies); + if (pagination) { + setPagination(pagination); + } + }; + const loadLocalPolicies = async (args: ITableLoadOptions) => { + const { pageSize = 0, pagination = null, filters = null } = args; + const { eventName, channels } = filters ?? {}; + let filterPolicies: IPolicy[] = originPoliciesRef.current; + argsRef.current = { + filters, + }; + if (eventName && eventName?.length === 1) { + filterPolicies = filterPolicies?.filter((policy) => + policy?.eventName?.toLocaleLowerCase()?.includes(eventName?.[0]?.toLocaleLowerCase()), + ); + } + if (channels && channels?.length === 1) { + filterPolicies = filterPolicies?.filter((policy) => + policy?.channels?.some((channel) => + channel?.name?.toLocaleLowerCase()?.includes(channels?.[0]?.toLocaleLowerCase()), + ), + ); + } + setPolicies(filterPolicies); + if (pagination) { + setPagination(pagination); + } + }; + const handleUpdatePolicies = (formType: TPolicyForm) => { + setPolicyForm(formType); + setFormModalOpen(true); + }; + const handleSwitchPolicyStatus = async (policy: IPolicy) => { + const result = await batchUpdatePolicy(policyForm?.projectId, [ + { + ...policy, + enabled: !policy.enabled, + } as TBatchUpdatePolicy, + ]); + if (result) { + message.success('操作成功'); + setFormModalOpen(false); + tableRef.current?.reload(); + return; + } + message.error('操作失败'); + }; + + const hanleOpenChannelDetailDrawer = (channel: Omit) => { + setSelectedChannelId(channel?.id); + setDetailDrawerOpen(true); + }; + const columns = getPolicyColumns({ + projectId, + handleUpdatePolicies, + handleSwitchPolicyStatus, + hanleOpenChannelDetailDrawer, + }); + + const rowSelector: IRowSelecter = { + options: [ + { + okText: '批量添加通道', + onOk: (keys) => { + handleUpdatePolicies({ + mode: EPolicyFormMode.BATCH, + projectId: projectId, + policies: originPoliciesRef?.current?.filter((policy) => + keys?.includes(policy?.policyMetadataId), + ), + }); + }, + }, + ], + }; + return ( +
+ { + tableRef.current?.reload(argsRef.current); + }} + /> + + +
+ ); +}; +const FormPolicyModal: React.FC<{ + policyForm: TPolicyForm; + formModalOpen: boolean; + setFormModalOpen: (open: boolean) => void; + callback: () => void; +}> = ({ policyForm, formModalOpen, setFormModalOpen, callback }) => { + const [formRef] = useForm<{ + channelIds: number[]; + }>(); + const isSingle = policyForm.mode === EPolicyFormMode.SINGLE; + const [options, setOptions] = useState<{ label: string; value: React.Key }[]>([]); + const [channelFormDrawerOpen, setChannelFormDrawerOpen] = useState(false); + function onCancel() { + setFormModalOpen(false); + formRef.resetFields(); + } + async function onSubmit() { + const formData = await formRef.validateFields().catch(); + let policies: TBatchUpdatePolicy[]; + const channels = formData?.channelIds?.map((channelId) => ({ + id: channelId, + })); + if (isSingle) { + policies = [ + { + [policyForm?.policies?.[0]?.id ? 'id' : 'policyMetadataId']: + policyForm?.policies?.[0]?.id || policyForm?.policies?.[0]?.policyMetadataId, + enabled: true, + channels, + }, + ]; + } else { + policies = policyForm?.policies?.map((policy) => ({ + [policy?.id ? 'id' : 'policyMetadataId']: policy?.id || policy?.policyMetadataId, + enabled: true, + channels, + })); + } + const result = await batchUpdatePolicy(policyForm?.projectId, policies); + if (result) { + message.success(isSingle ? '操作成功' : '批量操作成功'); + setFormModalOpen(false); + callback?.(); + return; + } + message.error(isSingle ? '操作失败' : '批量操作失败'); + } + async function loadOptions() { + const channels = await getChannelsList(policyForm?.projectId); + const newOptions = channels?.contents?.map((channel) => ({ + label: channel?.name, + value: channel?.id, + })); + setOptions(newOptions); + } + useEffect(() => { + if (formModalOpen) { + loadOptions(); + if (isSingle) { + formRef.setFieldsValue({ + channelIds: policyForm?.policies?.[0]?.channels?.map((channel) => channel?.id), + }); + } + } else { + formRef?.resetFields(); + setOptions([]); + } + }, [formModalOpen, policyForm]); + return ( + <> + + + + + + + + + + Auth URL + + } + messageVariables={{ + label: 'Auth URL', + }} + > + + + + User Info URL + + } + messageVariables={{ + label: 'User Info URL', + }} + > + + + + Token URL + + } + messageVariables={{ + label: 'Token URL', + }} + > + + + + Redirect URL + + } + messageVariables={{ + label: 'Redirect URL', + }} + > + + + + Scope + + } + messageVariables={{ + label: 'Scope', + }} + > + + + + userNameAttribute + + } + > + + + + Client Authentication Method + + } + > + { + return { + label: item, + value: item, + }; + })} + /> + + + User Info Authentication Method + + } + > + + + + + 用户 DN + + } + rules={[requiredRule]} + > + + + {!isEdit ? ( + + 访问密码 + + } + rules={[requiredRule]} + > + + + ) : null} + + userSearchFilter + + } + > + + + + userSearchBase + + } + > + + + + groupSearchBase + + } + > + + + + groupSearchFilter + + } + > + + + + groupSearchSubtree + + } + rules={[requiredRule]} + initialValue={false} + > + + + + + + + Scope + + } + > + + + + Redirect URL + + } + > + + + + ); +}; diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx index 529dd4758..f467160c2 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx @@ -20,6 +20,8 @@ import { IClientAuthenticationMethod, ISSOConfig, ISSOType, + ISSO_LDAP_CONFIG, + ISSO_MAPPINGRULE, IUserInfoAuthenticationMethod, } from '@/d.ts'; import { UserStore } from '@/store/login'; @@ -35,7 +37,6 @@ import { Radio, Select, Space, - Switch, Typography, } from 'antd'; import md5 from 'blueimp-md5'; @@ -43,7 +44,12 @@ import { inject, observer } from 'mobx-react'; import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; import HelpDoc from '@/component/helpDoc'; import { encrypt } from '@/util/utils'; -const requiredRule = { +import { cloneDeep } from 'lodash'; +import channel, { ChannelMap } from '@/util/broadcastChannel'; +import logger from '@/util/logger'; +import { OAUTH2PartForm, LDAPPartForm, OIDCPartForm } from './PartForm'; + +export const requiredRule = { required: true, }; interface IProps { @@ -52,6 +58,10 @@ interface IProps { editData?: ISSOConfig; onTestInfoChanged: (testInfo: string) => void; } +export enum ELDAPMode { + LOGIN = 'LOGIN', + TEST = 'TEST', +} export interface IFormRef { form: FormInstance; registrationId: string; @@ -66,10 +76,12 @@ export default inject('userStore')( }>, ) { const loginWindow = useRef(); - const testListener = useRef<(e) => void>(); + const channelStatusRef = useRef(false); + const timer = useRef(); const [showExtraConfig, setShowExtraConfig] = useState(!!isEdit); const [registrationId, setRegistrationId] = useState(''); const [testInfo, _setTestInfo] = useState(); + function setTestInfo(v: string) { _setTestInfo(v); onTestInfoChanged(v); @@ -97,29 +109,64 @@ export default inject('userStore')( } setTestInfo(text); } - function removeTestListener() { - if (testListener.current) { - window.removeEventListener('odcssotest', testListener.current); - testListener.current = null; + // 重复发送消息,直到确认接收方正确接收到了数据。 + function sendDataUntilComfirmedReceive( + value: { + mode: ELDAPMode; + data: { + name: string; + type: ISSOType.LDAP; + ssoParameter: ISSO_LDAP_CONFIG; + mappingRule: Omit; + }; + }, + time: number = 1, + ) { + if (loginWindow.current?.closed && !channelStatusRef?.current) { + message.error('窗口异常关闭,请等待窗口创建,输入账号密码点击登录后完成连接测试!'); + channel.close([ChannelMap.LDAP_MAIN, ChannelMap.LDAP_TEST]); + clearTimeout(timer.current); + timer.current = null; + return; } + if (channelStatusRef?.current) { + logger.log( + `[${ChannelMap.LDAP_MAIN}] LDAPModal received the message from current component, stop recurse.`, + ); + clearTimeout(timer.current); + timer.current = null; + return; + } + // 确保测试窗口能够正确接收到测试连接所需的相关数据。 + timer.current = setTimeout(() => { + logger.log( + `[${ChannelMap.LDAP_MAIN}] try to send message to component LDAPModal, accept success ? ${channelStatusRef?.current}, retry send ${time} times`, + ); + channel.send(ChannelMap.LDAP_MAIN, value); + sendDataUntilComfirmedReceive(value, time + 1); + }, 1000); } useEffect(() => { - removeTestListener(); - }, []); - function addTestListener(testId: string) { - removeTestListener(); - testListener.current = (e) => { - message.success( - formatMessage({ - id: 'odc.NewSSODrawerButton.SSOForm.TheTestConnectionIsSuccessful', - }), //测试连接成功! - ); - - fetchTestInfo(testId); + return () => { + clearTimeout(timer.current); + timer.current = null; + // 当前组件可能使用到的频道都需要关闭,释放内存。 + channel.close([ChannelMap.LDAP_MAIN, ChannelMap.LDAP_TEST, ChannelMap.ODC_SSO_TEST]); loginWindow.current?.close(); - loginWindow.current = null; }; - window.addEventListener('odcssotest', testListener.current); + }, []); + async function testByType(type: ISSOType) { + switch (type) { + case ISSOType.LDAP: { + testLDAP(); + break; + } + case ISSOType.OIDC: + case ISSOType.OAUTH2: { + test(); + break; + } + } } async function test() { setTestInfo(''); @@ -145,6 +192,7 @@ export default inject('userStore')( if (!value) { return; } + if (value.type === ISSOType.LDAP) return; const clone = { ...value, }; @@ -164,20 +212,95 @@ export default inject('userStore')( loginWindow.current = window.open( res?.testLoginUrl, 'testlogin', - ` - toolbar=no, - location=no, - status=no, - menubar=no, - scrollbars=yes, - resizable=yes, - width=1024, - height=600 - `, + `toolbar=no, + location=no, + status=no, + menubar=no, + scrollbars=yes, + resizable=yes, + width=1024, + height=600`, + ); + channel.add(ChannelMap.ODC_SSO_TEST).listen( + ChannelMap.ODC_SSO_TEST, + (data) => { + if (data?.isSuccess && !loginWindow.current?.closed) { + message.success('测试登录成功!'); + loginWindow.current?.close(); + fetchTestInfo(res?.testId); + } + }, + true, ); - addTestListener(res?.testId); } } + async function testLDAP() { + channelStatusRef.current = false; + setTestInfo(''); + const data = await form.validateFields([ + 'name', + 'type', + ['ssoParameter', 'server'], + ['ssoParameter', 'managerDn'], + ['ssoParameter', 'managerPassword'], + ['ssoParameter', 'userSearchBase'], + ['ssoParameter', 'userSearchFilter'], + ['ssoParameter', 'groupSearchBase'], + ['ssoParameter', 'groupSearchFilter'], + ['ssoParameter', 'groupSearchSubtree'], + ['mappingRule', 'userProfileViewType'], + ['mappingRule', 'nestedAttributeField'], + ]); + const copyData = cloneDeep(data); + if (copyData.type !== ISSOType.LDAP) return; + if (!isEdit) { + copyData.ssoParameter.managerPassword = encrypt(copyData.ssoParameter.managerPassword); + copyData.ssoParameter.registrationId = registrationId; + } else { + copyData.ssoParameter.registrationId = editData?.ssoParameter?.registrationId; + } + + channel.reset(); + channel.add([ChannelMap.LDAP_TEST, ChannelMap.LDAP_MAIN]); + if (!loginWindow.current?.closed) { + loginWindow.current?.close(); + } + loginWindow.current = window.open( + location.origin + '/#/' + 'testLDAP', + 'testLDAPLogin', + `popup = yes, + toolbar = no, + location = no, + status = no, + menubar = no, + scrollbars = no, + resizable = no, + width = 460, + innerWidth = 460, + height = 640`, + ); + // 监听要早于发送,确保正确接收数据。 + channel.listen(ChannelMap.LDAP_TEST, (data) => { + channelStatusRef.current = true; + if (data?.isSuccess) { + channel.send(ChannelMap.LDAP_TEST, { + receiveSuccess: true, + }); + logger.log( + `[${ChannelMap.LDAP_MAIN}]: current component received the message from LDAPModal`, + data, + ); + message.success('测试登录成功!'); + !loginWindow.current?.closed && loginWindow.current?.close(); + fetchTestInfo(data?.testId); + } + }); + + sendDataUntilComfirmedReceive({ + mode: ELDAPMode.TEST, + data: copyData, + }); + } function updateRegistrationId(name) { var md5Hex = md5(`${name || ''}`); const id = `${userStore?.organizationId}-${md5Hex}`; @@ -269,479 +392,63 @@ export default inject('userStore')( label: 'OIDC', value: ISSOType.OIDC, }, + { + label: 'LDAP', + value: ISSOType.LDAP, + }, ]} /> - - { - formatMessage({ - id: 'odc.NewSSODrawerButton.SSOForm.OauthInformation', - }) /*OAUTH 信息*/ - } - {({ getFieldValue }) => { const type = getFieldValue(['type']); if (type === ISSOType.OAUTH2) { return ( - <> - - - - - - - - Auth URL - - } - messageVariables={{ - label: 'Auth URL', - }} - > - - - - User Info URL - - } - messageVariables={{ - label: 'User Info URL', - }} - > - - - - Token URL - - } - messageVariables={{ - label: 'Token URL', - }} - > - - - - Redirect URL - - } - messageVariables={{ - label: 'Redirect URL', - }} - > - - - - Scope - - } - messageVariables={{ - label: 'Scope', - }} - > - - - - userNameAttribute - - } - > - - - - Client Authentication Method - - } - > - { - return { - label: item, - value: item, - }; - })} - /> - - - User Info Authentication Method - - } - > - - - - - - - Scope - - } - > - - - - Redirect URL - - } - > - - - - ); + return ; } }} - - + + ) : null; + }} {({ getFieldValue }) => { @@ -768,28 +475,36 @@ export default inject('userStore')( } }} - - - - { - formatMessage({ - id: 'odc.NewSSODrawerButton.SSOForm.TestConnection', - }) /*测试连接*/ - } - - + + + {({ getFieldValue }) => { + const type = getFieldValue(['type']); + return ( + + + testByType(type)}> + { + formatMessage({ + id: 'odc.NewSSODrawerButton.SSOForm.TestConnection', + }) /*测试连接*/ + } + + + + ); + }} {testInfo ? ( - - + + {({ getFieldValue }) => { + const type = getFieldValue('type'); + if (type !== ISSOType.LDAP) { + return ( + + + + ); + } + }} - - + + ); + }} + + + {({ getFieldValue }) => { + const type = getFieldValue(['type']); + return type === ISSOType.LDAP ? ( + + } + placeholder={'请输入 LDAP 账号'} + onFocus={() => { + setFocusInput('username'); + }} + onBlur={() => { + setFocusInput(''); + }} + className={classNames({ + [`${prefix}-focus-input`]: focusInput === 'username', + })} + /> + + + } + placeholder={'请输入 LDAP 密码'} + onFocus={() => { + setFocusInput('password'); + }} + onBlur={() => { + setFocusInput(''); + }} + className={focusInput === 'password' ? `${prefix}-focus-input` : ''} + /> + + + {switchSSOLoginType ? ( + + ) : null} + + + + ); +}; diff --git a/src/page/Login/index.tsx b/src/page/Login/index.tsx index cd7b0324d..b264674b7 100644 --- a/src/page/Login/index.tsx +++ b/src/page/Login/index.tsx @@ -17,7 +17,7 @@ import { clearModalConfirm } from '@/component/ErrorConfirmModal'; import OBLogin from '@/component/Login'; import { SPACE_REGEX } from '@/constant'; -import { ODCErrorsCode } from '@/d.ts'; +import { ESSOLgoinType, ODCErrorsCode } from '@/d.ts'; import type { UserStore } from '@/store/login'; import loginStore from '@/store/login'; import type { SettingStore } from '@/store/setting'; @@ -171,14 +171,15 @@ const Login: React.FC<{ setLoginLoading(false); } }; - - return !settingStore.serverSystemInfo?.passwordLoginEnabled ? /** + /** * 第三方自动登录配置开启的时候,不能出现登录页面 - */ null : ( + */ + return !settingStore.serverSystemInfo?.passwordLoginEnabled ? null : ( = new Map(); + /** + * 重置消息通道 + */ + reset() { + if (this.channelMap.size) { + this.destory(); + } + } + /** + * 根据通道名称添加通道 + * @param channelName + */ + private addSingle(channelName: ChannelMap) { + if (!this.isExists(channelName)) { + this.channelMap.set(channelName, new BroadcastChannel(channelName)); + logger.log(`[Channel] ${channelName} is active.`); + return this; + } + logger.log(`[Channel] ${channelName} has existsed.`); + return this; + } + /** + * 根据通道名称添加通道 + * @param channelName: `ChannelMap | ChannelMap[]` + * @returns channel 当前channelMap实例 + */ + add(channelName: ChannelMap | ChannelMap[]) { + if (Array.isArray(channelName)) { + channelName.forEach(this.addSingle); + return this; + } + return this.addSingle(channelName); + } + /** + * 向某个通道发送数据 + * @param channelName 发送数据的目的通道名称 + * @param data + * @returns + */ + send(channelName: ChannelMap, data: any) { + if (this.isExists(channelName)) { + this.channelMap.get(channelName)?.postMessage(data); + return true; + } else { + logger.log( + `[Channel] ${channelName} is not existsed, if you want to send message to this channel, please add this channel firstly.`, + ); + return false; + } + } + /** + * 判断通道是否已存在 + * @param channelName + */ + isExists(channelName: ChannelMap) { + return this.channelMap?.has(channelName); + } + /** + * 监听通道,并执行回调函数 + * @param channelName 要监听的通道名称 + * @param callback 要监听的通道事件触发时执行的回调函数 + * @param callbackedClose 执行回调后是否关闭当前频道, 默认为false,简单的单方面传递消息的情况下可以设置为true。 + */ + listen( + channelName: ChannelMap, + callback: (data?: any) => void, + callbackedClose: boolean = false, + ) { + if (this.channelMap.has(channelName)) { + this.channelMap.get(channelName).addEventListener('message', ({ data }) => { + callback?.(data); + callbackedClose && this.close(channelName); + }); + } + } + /** + * 关闭通道 + * @param channelName 要关闭的通道的名称 + */ + close(channelName: ChannelMap | ChannelMap[]) { + if (Array.isArray(channelName)) { + channelName.forEach((item) => { + logger.log(`[Channel] try to close ${channelName}`); + this.channelMap.get(item)?.close(); + this.channelMap.delete(item); + logger.log(`[Channel] channel ${channelName?.join(', ')} is closed successfully`); + }); + return; + } + logger.log(`[Channel] try to close ${channelName}`); + this.channelMap.get(channelName)?.close(); + this.channelMap.delete(channelName); + logger.log(`[Channel] channel ${channelName} is closed successfully`); + } + destory() { + this.channelMap.forEach((channel) => { + channel?.close(); + }); + this.channelMap.clear(); + logger.log('[Channel] all channel is destoryed'); + } +} +const channel = new Channel(); +export default channel; From 4dd434ea43edee940701ebed6e9be58fbafbf792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Thu, 18 Jan 2024 17:29:08 +0800 Subject: [PATCH 035/231] PullRequest: 303 fix: add some batch function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-odc-812-bugfix of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/303 Signed-off-by: 晓康 * fix: add some batch function * fix: modify then property asscess way of getPoliciesList' retrun value --- src/d.ts/projectNotification.ts | 2 +- .../Notification/components/Channel.tsx | 81 +++++++++++++---- .../Notification/components/Message.tsx | 2 +- .../Notification/components/Policy.tsx | 90 ++++++++++++------- .../Notification/components/columns.tsx | 18 ++-- .../Notification/components/interface.ts | 14 ++- 6 files changed, 152 insertions(+), 55 deletions(-) diff --git a/src/d.ts/projectNotification.ts b/src/d.ts/projectNotification.ts index 450b9f090..e6c156bb7 100644 --- a/src/d.ts/projectNotification.ts +++ b/src/d.ts/projectNotification.ts @@ -117,7 +117,7 @@ export interface IPolicy { export type TBatchUpdatePolicy = { id?: number; policyMetadataId?: number; - enabled: boolean; + enabled?: boolean; channels: Pick[]; }; // #endregion diff --git a/src/page/Project/Notification/components/Channel.tsx b/src/page/Project/Notification/components/Channel.tsx index 757149cc7..b90126ee1 100644 --- a/src/page/Project/Notification/components/Channel.tsx +++ b/src/page/Project/Notification/components/Channel.tsx @@ -39,10 +39,11 @@ import { } from '@/d.ts/projectNotification'; import { IResponseData } from '@/d.ts'; import styles from './index.less'; -import { formatMessage } from '@/util/intl'; +import { formatMessage, getLocalDocs } from '@/util/intl'; import HelpDoc from '@/component/helpDoc'; import { getChannelColumns } from './columns'; -import { EChannelTypeMap, TimeUnitMap } from './interface'; +import { EChannelTypeMap, ELanguageMap, TimeUnitMap } from './interface'; +import odc from '@/plugins/odc'; const Channel: React.FC<{ projectId: number; @@ -93,9 +94,9 @@ const Channel: React.FC<{ setSelectedChannelId(channelId); setFormDrawerOpen(true); }; - const closedCallback = () => { - selectedChannelId && setSelectedChannelId(null); - tableRef?.current?.reload(); + const closedCallback = (needReload?: boolean) => { + setSelectedChannelId(null); + needReload && tableRef?.current?.reload(); }; const hanleOpenChannelDetailDrawer = (channel: Omit) => { @@ -160,7 +161,7 @@ export const FromChannelDrawer: React.FC<{ channelId?: number; formDrawerOpen: boolean; setFormDrawerOpen: (formDrawerOpen: boolean) => void; - closedCallback?: () => void; + closedCallback?: (needReload?: boolean) => void; }> = ({ projectId, channelId, formDrawerOpen, setFormDrawerOpen, closedCallback }) => { const [formRef] = useForm(); const [currentChannel, setCurrentChannel] = useState(); @@ -217,7 +218,7 @@ export const FromChannelDrawer: React.FC<{ if (data) { message.success(channelId ? '保存成功' : '新建成功'); setFormDrawerOpen(false); - closedCallback?.(); + closedCallback?.(true); return; } message.success(channelId ? '保存失败' : '新建失败'); @@ -249,8 +250,9 @@ export const FromChannelDrawer: React.FC<{ setTestChannelErrorMessage(null); setTestChannelSuccess(false); setTestLoading(false); + closedCallback?.(); } - }, [formDrawerOpen, channelId]); + }, [formDrawerOpen]); return ( +
Webhook 地址
+ { + e.stopPropagation(); + }} + rel="noreferrer" + > + 如何配置 + + + } name={['channelConfig', 'webhook']} requiredMark="optional" validateTrigger="onBlur" @@ -362,7 +378,12 @@ export const FromChannelDrawer: React.FC<{
void; - handleSwitchPolicyStatus: (policy: IPolicy) => void; + handleSwitchPoliciesStatus: (formType: TPolicyForm, enabled?: boolean) => Promise; hanleOpenChannelDetailDrawer; }) => ColumnType[]; export const getPolicyColumns: GetPolicyColumns = function ({ projectId, handleUpdatePolicies, - handleSwitchPolicyStatus, + handleSwitchPoliciesStatus, hanleOpenChannelDetailDrawer, }) { return [ @@ -153,7 +153,16 @@ export const getPolicyColumns: GetPolicyColumns = function ({ width: 122, key: 'enabled', render: (status, policy) => ( - handleSwitchPolicyStatus(policy)} /> + + handleSwitchPoliciesStatus({ + mode: EPolicyFormMode.SINGLE, + policies: [policy], + }) + } + /> ), }, { @@ -219,7 +228,6 @@ export const getPolicyColumns: GetPolicyColumns = function ({ onClick={() => handleUpdatePolicies({ mode: EPolicyFormMode.SINGLE, - projectId: projectId, policies: [proxy], }) } diff --git a/src/page/Project/Notification/components/interface.ts b/src/page/Project/Notification/components/interface.ts index 3f97ef436..8b613566c 100644 --- a/src/page/Project/Notification/components/interface.ts +++ b/src/page/Project/Notification/components/interface.ts @@ -1,4 +1,10 @@ -import { EChannelType, EMessageStatus, ETimeUnit, IPolicy } from '@/d.ts/projectNotification'; +import { + EChannelType, + ELanguage, + EMessageStatus, + ETimeUnit, + IPolicy, +} from '@/d.ts/projectNotification'; export const TimeUnitMap = { [ETimeUnit.MINUTES]: '每分钟', @@ -11,6 +17,11 @@ export const EChannelTypeMap = { [EChannelType.WE_COM]: '微信', [EChannelType.WEBHOOK]: '自定义webhook', }; +export const ELanguageMap = { + [ELanguage.ZH_CN]: '中文', + [ELanguage.ZH_TW]: '繁体中文', + [ELanguage.EN_US]: '英文', +}; export const EMessageStatusMap = { [EMessageStatus.CREATED]: '待发送', [EMessageStatus.SENDING]: '发送中', @@ -24,6 +35,5 @@ export enum EPolicyFormMode { } export type TPolicyForm = { mode: EPolicyFormMode; - projectId: number; policies: IPolicy[]; }; From fa9562bfd0e120e6fae6be0cdd57177628318847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Thu, 18 Jan 2024 17:29:33 +0800 Subject: [PATCH 036/231] PullRequest: 305 Fixes oceanbase/odc#511 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch feat/dev-4.2.4-odc-511 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/305 Signed-off-by: 晓康 * Fixes oceanbase/odc#511 * fix: modify expired day from 15 to 14 --- src/component/Action/Item.tsx | 5 ++++- src/component/Task/component/ActionBar/index.tsx | 13 ++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/component/Action/Item.tsx b/src/component/Action/Item.tsx index fe58b90fb..9b17101bb 100644 --- a/src/component/Action/Item.tsx +++ b/src/component/Action/Item.tsx @@ -16,6 +16,7 @@ import { LoadingOutlined } from '@ant-design/icons'; import { Button, Tooltip, Typography } from 'antd'; +import { TooltipPlacement } from 'antd/lib/tooltip'; import React from 'react'; export interface BaseProps { @@ -28,6 +29,7 @@ export interface BaseProps { className?: string; enableLoading?: boolean; tooltip?: string; + placement?: TooltipPlacement; loading?: boolean; /** loading的时候覆盖children,用于icon的场景 */ replaceLoading?: boolean; @@ -50,11 +52,12 @@ export class ActionButton extends React.PureComponent { enableLoading = true, className, tooltip, + placement = null, loading, danger, } = this.props; return ( - + + ); + } + case IConnectionStatus.ACTIVE: { + return {item?.name}; + } + default: { + const errorMsg = status.errorMessage || 'datasource disconnected'; + return ( + + {item?.name} + + ); + } + } +}); From 34e003b46680e7e14d6609b5acbf8a587d96fc73 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 23 Jan 2024 15:18:12 +0800 Subject: [PATCH 044/231] fix click bug --- src/page/Project/Database/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/page/Project/Database/index.tsx b/src/page/Project/Database/index.tsx index 880e4a337..374b4107d 100644 --- a/src/page/Project/Database/index.tsx +++ b/src/page/Project/Database/index.tsx @@ -172,6 +172,7 @@ const Database: React.FC = ({ id }) => { item={record} onClick={() => { tracert.click('a3112.b64002.c330858.d367382'); + gotoSQLWorkspace(toInteger(id), null, record.id); }} /> ); From 20f07b6d2bd3ae636e00d617b0b1b21acc8ad8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Wed, 24 Jan 2024 09:32:13 +0800 Subject: [PATCH 045/231] PullRequest: 308 feat/dev-4.2.4-applyDatabasePermissionTask-0123 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-applyDatabasePermissionTask-0123 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/308 Signed-off-by: 晓康 * feat: add applyDatabasePermission task (initialize create and detail pages) * feat: Task (loadProjects -> useProjects) * feat: ApplyDatabasePermissionTask (add DatabaseSelecter) * feat: ApplyDatabasePermissionTask (DatabaseSelecter) * feat: add applyDatabasePermission task (CreateModal) * feat: add applyDatabasePermission task (DetailModal) * feat: add applyDatabasePermission task (User ManageModal) * feat: add applyDatabasePermission task (create & detail scene api adaptation) * feat: add applyDatabasePermission task (user manage) * feat: add applyDatabasePermission task (text change) * feat: applyDatabasePermission task (task detail & list) * feat: applyDatabasePermission task (api name change) * feat: applyDatabasePermission task (create action) * feat: applyDatabasePermission task (user manage page - list) * feat: applyDatabasePermission task (project/database page - list permission) * feat: applyDatabasePermission task (project/database page - list) * feat: applyDatabasePermission task (create ui change) * feat: applyDatabasePermission task (create & list) * feat: applyDatabasePermission task (text change) * feat: applyDatabasePermission task (DatabaseSelecter ui change) * feat: applyDatabasePermission task (record) * feat: applyDatabasePermission task (DatabaseSelect permission) * feat: applyDatabasePermission task (sql page) * feat: applyDatabasePermission task (global database select) * feat: applyDatabasePermission task (project - user ManageModal) * feat: applyDatabasePermission task (sql page) * feat: applyDatabasePermission task (bug fix) * feat: applyDatabasePermission task (task detail - SQLCheckNode) * feat: applyDatabasePermission task (project-user ManageModal) * feat: applyDatabasePermission task (doc & style) * feat: applyDatabasePermission task (fix reTry task) * feat: applyDatabasePermission task (style) * chore: fix ci error --- src/common/network/database.ts | 2 + src/common/network/project.ts | 63 ++- src/common/network/sql/executeSQL.tsx | 28 +- .../ApplyDatabasePermission/CreateButton.tsx | 48 +++ .../CreateModal/index.less | 8 + .../CreateModal/index.tsx | 362 ++++++++++++++++++ .../DetailContent/index.tsx | 100 +++++ .../Task/ApplyDatabasePermission/index.tsx | 19 + .../ApplyPermission/CreateModal/index.tsx | 43 +-- src/component/Task/Content.tsx | 23 +- src/component/Task/CreateModals.tsx | 2 + src/component/Task/DetailModal.tsx | 3 + .../Task/component/ActionBar/index.tsx | 14 +- .../CommonDetailModal/Nodes/SQLCheckNode.tsx | 35 +- .../component/CommonDetailModal/index.tsx | 2 + .../component/DatabaseSelecter/index.less | 73 ++++ .../Task/component/DatabaseSelecter/index.tsx | 237 ++++++++++++ .../Task/component/TaskTable/index.tsx | 29 +- src/component/Task/helper.tsx | 22 ++ src/component/Task/hooks/useProjects.tsx | 22 ++ src/component/Task/index.tsx | 1 - src/component/helpDoc/doc.tsx | 50 +-- src/d.ts/database.ts | 18 + src/d.ts/index.ts | 33 +- src/d.ts/project.ts | 34 ++ src/page/Project/Database/index.tsx | 41 +- .../Project/Project/CreateProject/index.tsx | 6 +- .../User/ManageModal/CreateAuth/index.less | 8 + .../User/ManageModal/CreateAuth/index.tsx | 199 ++++++++++ .../User/ManageModal/DetailModal/index.less | 35 ++ .../User/ManageModal/DetailModal/index.tsx | 65 ++++ .../Project/User/ManageModal/Status/index.tsx | 96 +++++ .../User/ManageModal/TaskApplyList/index.tsx | 229 +++++++++++ .../User/ManageModal/UserAuthList/index.tsx | 206 ++++++++++ src/page/Project/User/ManageModal/index.less | 38 ++ src/page/Project/User/ManageModal/index.tsx | 209 ++++++++++ .../Project/User/UpdateUserModal/index.tsx | 2 +- src/page/Project/User/index.tsx | 60 ++- src/page/Project/index.tsx | 23 +- .../Secure/Record/RecordPage/interface.ts | 12 + .../Secure/RiskLevel/components/options.ts | 4 + .../ResourceTree/DatabaseTree/index.tsx | 7 +- .../Workspace/components/SQLPage/index.tsx | 20 +- .../SQLResultSet/DBPermissionTable.tsx | 145 +++++++ .../SQLResultSet/DBPermissionTableDrawer.tsx | 52 +++ .../components/SQLResultSet/SQLResultLog.tsx | 1 - .../components/SQLResultSet/index.tsx | 19 +- .../SessionSelect/SessionDropdown/index.tsx | 71 ++-- src/store/modal.ts | 19 + 49 files changed, 2628 insertions(+), 210 deletions(-) create mode 100644 src/component/Task/ApplyDatabasePermission/CreateButton.tsx create mode 100644 src/component/Task/ApplyDatabasePermission/CreateModal/index.less create mode 100644 src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx create mode 100644 src/component/Task/ApplyDatabasePermission/DetailContent/index.tsx create mode 100644 src/component/Task/ApplyDatabasePermission/index.tsx create mode 100644 src/component/Task/component/DatabaseSelecter/index.less create mode 100644 src/component/Task/component/DatabaseSelecter/index.tsx create mode 100644 src/component/Task/hooks/useProjects.tsx create mode 100644 src/page/Project/User/ManageModal/CreateAuth/index.less create mode 100644 src/page/Project/User/ManageModal/CreateAuth/index.tsx create mode 100644 src/page/Project/User/ManageModal/DetailModal/index.less create mode 100644 src/page/Project/User/ManageModal/DetailModal/index.tsx create mode 100644 src/page/Project/User/ManageModal/Status/index.tsx create mode 100644 src/page/Project/User/ManageModal/TaskApplyList/index.tsx create mode 100644 src/page/Project/User/ManageModal/UserAuthList/index.tsx create mode 100644 src/page/Project/User/ManageModal/index.less create mode 100644 src/page/Project/User/ManageModal/index.tsx create mode 100644 src/page/Workspace/components/SQLResultSet/DBPermissionTable.tsx create mode 100644 src/page/Workspace/components/SQLResultSet/DBPermissionTableDrawer.tsx diff --git a/src/common/network/database.ts b/src/common/network/database.ts index fd17fe877..10f611fd8 100644 --- a/src/common/network/database.ts +++ b/src/common/network/database.ts @@ -36,6 +36,7 @@ export async function listDatabases( */ containsUnassigned?: boolean, existed?: boolean, + includesPermittedAction?: boolean ): Promise> { const res = await request.get(`/api/v2/database/databases`, { params: { @@ -47,6 +48,7 @@ export async function listDatabases( environmentId, containsUnassigned, existed, + includesPermittedAction }, }); diff --git a/src/common/network/project.ts b/src/common/network/project.ts index b6536f09a..0733d0db0 100644 --- a/src/common/network/project.ts +++ b/src/common/network/project.ts @@ -15,7 +15,13 @@ */ import { IResponseData, IUserSummary } from '@/d.ts'; -import { IProject, ProjectRole } from '@/d.ts/project'; +import { + IProject, + ProjectRole, + PermissionSourceType, + IDatabasePermission, +} from '@/d.ts/project'; +import { DatabasePermissionType } from '@/d.ts/database'; import request from '@/util/request'; export async function listProjects( @@ -135,3 +141,58 @@ export async function getUserSummaryList(): Promise> return res?.data; } + +/** + * 查询权限列表 + */ +export async function getDatabasePermissions(params: { + projectId?: number; + userId?: number; + fuzzyDatabaseName?: string; + fuzzyDatasourceName?: string; + environmentIds?: number[]; + permissionTypes?: DatabasePermissionType; + authorizationType?: PermissionSourceType; + expiredList?: boolean[]; + expireSoon?: boolean; + endTime?: number; + createdByCurrentUser?: boolean; + approveByCurrentUser?: boolean; + parentInstanceId?: number; + connectionId?: string; + schema?: string; + creator?: string; + sort?: string; + page?: number; + size?: number; +}): Promise> { + const { projectId } = params; + const res = await request.get(`api/v2/collaboration/projects/${projectId}/databasePermissions/`, { + params, + }); + return res?.data; +} + +// 回收权限 +export async function reclaimPermission(projectId: number, ids: number[]): Promise { + const res = await request.delete( + `api/v2/collaboration/projects/${projectId}/databasePermissions/batchRevoke`, + { + data: ids + }, + ); + return !!res?.data; +} + +export async function addDatabasePermissions(params: { + projectId: number; + databaseIds: number[]; + types: DatabasePermissionType[]; + expireTime: number; + userId: number; +}): Promise { + const res = await request.post(`/api/v2/collaboration/projects/${params?.projectId}/databasePermissions/batchCreate`, { + data: params, + }); + return !!res?.data; +} \ No newline at end of file diff --git a/src/common/network/sql/executeSQL.tsx b/src/common/network/sql/executeSQL.tsx index 9131b967f..1278c3277 100644 --- a/src/common/network/sql/executeSQL.tsx +++ b/src/common/network/sql/executeSQL.tsx @@ -17,12 +17,11 @@ import { ISQLLintReuslt } from '@/component/SQLLintResult/type'; import type { ISqlExecuteResult } from '@/d.ts'; import { EStatus, ISqlExecuteResultStatus } from '@/d.ts'; +import { IUnauthorizedDatabase } from '@/d.ts/database'; import { IRule } from '@/d.ts/rule'; import modal from '@/store/modal'; import sessionManager from '@/store/sessionManager'; -import { formatMessage } from '@/util/intl'; import request from '@/util/request'; -import { message } from 'antd'; import { generateDatabaseSid, generateSessionSid } from '../pathUtil'; export interface IExecuteSQLParams { @@ -47,7 +46,7 @@ export interface ISQLExecuteTask { requestId: string; sqls: ISQLExecuteTaskSQL[]; violatedRules: IRule[]; - unauthorizedDatabaseNames: string[]; + unauthorizedDatabases: IUnauthorizedDatabase[]; } /** @@ -61,6 +60,8 @@ export interface IExecuteTaskResult { executeResult: ISqlExecuteResult[]; lintResultSet?: ISQLLintReuslt[]; status?: EStatus; + unauthorizedDatabases?: IUnauthorizedDatabase[]; + unauthorizedSql?: string; } class Task { public result: ISqlExecuteResult[] = []; @@ -185,28 +186,17 @@ export default async function executeSQL( } return pre; }, []); - const unauthorizedDatabaseNames = taskInfo?.unauthorizedDatabaseNames; + const unauthorizedDatabases = taskInfo?.unauthorizedDatabases; const violatedRules = rootViolatedRules.concat(taskInfo?.sqls); - if (unauthorizedDatabaseNames?.length) { - /** - * 无权限库 - */ - const dbNames = unauthorizedDatabaseNames.join(', '); - message.error( - formatMessage( - { - id: 'odc.src.common.network.sql.UnprofessionalAccessDbnames', - }, - { - dbNames: dbNames, - }, - ), //`无权限访问 ${dbNames} 数据库` - ); + if (unauthorizedDatabases?.length) { + // 无权限库 return { invalid: true, executeSuccess: false, executeResult: [], violatedRules: [], + unauthorizedDatabases, + unauthorizedSql: (params as IExecuteSQLParams)?.sql || (params as string), }; } const lintResultSet = violatedRules?.reduce((pre, cur) => { diff --git a/src/component/Task/ApplyDatabasePermission/CreateButton.tsx b/src/component/Task/ApplyDatabasePermission/CreateButton.tsx new file mode 100644 index 000000000..51ac32541 --- /dev/null +++ b/src/component/Task/ApplyDatabasePermission/CreateButton.tsx @@ -0,0 +1,48 @@ +/* + * 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 { ModalStore } from '@/store/modal'; +import React from 'react'; +import { Button, Space } from 'antd'; +import type { ButtonProps } from 'antd/lib/button'; +import { inject, observer } from 'mobx-react'; +import ApplyDatabasePermissionCreateModal from './CreateModal'; + +interface IProps extends ButtonProps { + label: React.ReactNode; + modalStore?: ModalStore; +} + +const ApplyDatabasePermissionButton: React.FC = inject('modalStore')( + observer((props) => { + const { label, modalStore, ...rest } = props; + + const handleApplyDatabasePermission = () => { + modalStore.changeApplyDatabasePermissionModal(true); + }; + + return ( + <> + + + + ); + }), +); + +export default ApplyDatabasePermissionButton; diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.less b/src/component/Task/ApplyDatabasePermission/CreateModal/index.less new file mode 100644 index 000000000..57822bef5 --- /dev/null +++ b/src/component/Task/ApplyDatabasePermission/CreateModal/index.less @@ -0,0 +1,8 @@ +.createModal { + :global { + .ant-drawer-footer { + display: flex; + justify-content: flex-end; + } + } +} diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx new file mode 100644 index 000000000..f29a9bee5 --- /dev/null +++ b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx @@ -0,0 +1,362 @@ +/* + * 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 { createTask } from '@/common/network/task'; +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 { + Button, + Drawer, + Form, + Modal, + Select, + Space, + Input, + message, + DatePicker, + Checkbox +} from 'antd'; +import { inject, observer } from 'mobx-react'; +import React, { useEffect, useState } from 'react'; +import moment from 'moment'; +import { useRequest } from 'ahooks'; +import { listProjects } from '@/common/network/project'; +import DatabaseSelecter from '@/component/Task/component/DatabaseSelecter'; +import HelpDoc from '@/component/helpDoc'; +import styles from './index.less'; + +const CheckboxGroup = Checkbox.Group; + +const MAX_DATE = '9999-12-31 23:59:59'; +const MAX_DATE_LABEL = '9999-12-31'; + +export const getExpireTime = (expireTime, customExpireTime, isCustomExpireTime) =>{ + if(isCustomExpireTime){ + return customExpireTime?.valueOf(); + }else{ + const [offset, unit] = expireTime.split(',') ?? []; + return offset === 'never' ? moment(MAX_DATE)?.valueOf() : moment().add(offset, unit)?.valueOf(); + } +} + +export const getExpireTimeLabel = (expireTime) =>{ + const label = moment(expireTime).format('YYYY-MM-DD'); + return label === MAX_DATE_LABEL ? '永不过期' : label; +} + +const Label: React.FC<{ + text: string; + docKey: string; +}> = ({ text, docKey }) =>( + + {text} + +) + +export const permissionOptionsMap = { + [DatabasePermissionType.QUERY]: { + text: '查询', + docKey: 'ApplyDatabasePermissionQueryTip', + value: DatabasePermissionType.QUERY, + }, + [DatabasePermissionType.EXPORT]: { + text: '导出', + docKey: 'ApplyDatabasePermissionExportTip', + value: DatabasePermissionType.EXPORT + }, + [DatabasePermissionType.CHANGE]: { + text: '变更', + docKey: 'ApplyDatabasePermissionChangeTip', + value: DatabasePermissionType.CHANGE + }, +}; + +export const permissionOptions = Object.values(permissionOptionsMap)?.map(({ text, docKey, ...rest }) =>( + { + ...rest, + label:
); }; -export default inject('sqlStore', 'taskStore', 'modalStore')(observer(CreateModal)); +export default inject('modalStore')(observer(CreateModal)); diff --git a/src/component/Task/Content.tsx b/src/component/Task/Content.tsx index 1f22a6c2c..6d653a611 100644 --- a/src/component/Task/Content.tsx +++ b/src/component/Task/Content.tsx @@ -60,7 +60,6 @@ interface IState { detailVisible: boolean; partitionPlan: IConnectionPartitionPlan; status: TaskStatus; - disabledOpt: boolean; tasks: IResponseData>; cycleTasks: IResponseData>; } @@ -73,7 +72,6 @@ class TaskManaerContent extends React.Component { detailId: props.taskStore?.defaultOpenTaskId, detailType: props.taskStore?.defauleOpenTaskType, detailVisible: !!props.taskStore?.defaultOpenTaskId, - disabledOpt: null, partitionPlan: null, tasks: null, cycleTasks: null, @@ -256,25 +254,14 @@ class TaskManaerContent extends React.Component { case TaskPageType.APPLY_PROJECT_PERMISSION: modalStore.changeApplyPermissionModal(true); break; + case TaskPageType.APPLY_DATABASE_PERMISSION: + modalStore.changeApplyDatabasePermissionModal(true); + break; default: } }; - async fetchProject(projectId: number) { - const data = await getProject(projectId); - const currentUserResourceRoles = data?.currentUserResourceRoles || []; - const disabled = - currentUserResourceRoles?.filter((roles) => - [ProjectRole.DBA, ProjectRole.OWNER, ProjectRole.DEVELOPER]?.includes(roles), - )?.length === 0; - this.setState({ - disabledOpt: disabled, - }); - } + componentDidMount(): void { - const { inProject, projectId } = this.props; - if (inProject && projectId) { - this.fetchProject(projectId); - } this.openDefaultTask(); } private openDefaultTask = async () => { @@ -309,7 +296,6 @@ class TaskManaerContent extends React.Component { partitionPlan, cycleTasks, tasks, - disabledOpt, } = this.state; const taskTabType = pageKey || taskStore?.taskPageType; const taskList = isCycleTaskPage(taskTabType) ? cycleTasks : tasks; @@ -317,7 +303,6 @@ class TaskManaerContent extends React.Component { <>
= (props) => { + ); }; diff --git a/src/component/Task/DetailModal.tsx b/src/component/Task/DetailModal.tsx index 82edd2095..67ee6cf54 100644 --- a/src/component/Task/DetailModal.tsx +++ b/src/component/Task/DetailModal.tsx @@ -63,6 +63,7 @@ import { getItems as getResultSetExportTaskContentItems } from './ResultSetExpor import { getItems as getShadowSyncItems } from './ShadowSyncTask'; import { SqlPlanTaskContent } from './SQLPlanTask'; import { ApplyPermissionTaskContent } from './ApplyPermission'; +import { ApplyDatabasePermissionTaskContent } from './ApplyDatabasePermission'; interface IProps { type: TaskType; @@ -373,6 +374,8 @@ const DetailModal: React.FC = React.memo((props) => { taskContent = ; } else if (task?.type === TaskType.APPLY_PROJECT_PERMISSION) { taskContent = ; + } else if (task?.type === TaskType.APPLY_DATABASE_PERMISSION) { + taskContent = ; } else { getItems = taskContentMap[task?.type]?.getItems; } diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 975682496..c34e7be7d 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -193,6 +193,18 @@ const ActionBar: React.FC = inject( } }; + const handleApplyReTry = async () => { + const { parameters } = task; + const data = { + taskType: TaskType.APPLY_DATABASE_PERMISSION, + parameters, + }; + const res = await createTask(data); + if (res) { + message.success('再次发起成功'); + } + }; + const editCycleTask = async () => { props?.onClose?.(); if (task?.type === TaskType.DATA_ARCHIVE) { @@ -434,7 +446,7 @@ const ActionBar: React.FC = inject( //再次发起 type: 'button', - action: handleReTry, + action: task?.type === TaskType.APPLY_DATABASE_PERMISSION ? handleApplyReTry : handleReTry, }; const downloadBtn = { diff --git a/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx b/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx index 000582498..f71933d7a 100644 --- a/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx +++ b/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx @@ -16,6 +16,7 @@ import { getFlowSQLLintResult } from '@/common/network/task'; import LintDrawer from '@/component/SQLLintResult/Drawer'; +import DBPermissionTableDrawer from '@/page/Workspace/components/SQLResultSet/DBPermissionTableDrawer'; import { ISQLLintReuslt } from '@/component/SQLLintResult/type'; import { ITaskFlowNode } from '@/d.ts'; import { Descriptions, Tag } from 'antd'; @@ -29,12 +30,13 @@ interface IProps { flowId: number; } const SQLCheckNode: React.FC = function ({ node, flowId }) { - const { status, nodeType, issueCount, unauthorizedDatabaseNames, id, preCheckOverLimit } = node; + const { status, nodeType, issueCount, unauthorizedDatabases, id, preCheckOverLimit } = node; const [isLoading, setIsLoading] = useState(false); const [visible, setVisible] = useState(false); + const [permissionResultVisible, setPermissionResultVisible] = useState(false); const [data, setData] = useState([]); const showCount = typeof issueCount === 'number'; - const showUnauthorized = unauthorizedDatabaseNames?.length > 0; + const showUnauthorized = unauthorizedDatabases?.length > 0; const showReslut = showCount || showUnauthorized || preCheckOverLimit; async function viewLintResult() { if (isLoading) { @@ -51,6 +53,10 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { setIsLoading(false); } } + + function viewPermissionResult() { + setPermissionResultVisible(true); + } return ( <> @@ -148,15 +154,15 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { }) /* 权限检查结果 */ } > - { - formatMessage({ - id: - 'odc.src.component.Task.component.CommonDetailModal.Nodes.UnpredictableAccessToTheDatabase', - }) /* - 无权限访问数据库: - */ - } - {unauthorizedDatabaseNames?.join(', ')} + 存在 {unauthorizedDatabases?.length} 个问题 + + 查看 + ) : null} @@ -171,6 +177,13 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { setVisible(false)} data={data} /> + { + setPermissionResultVisible(false); + }} + /> ); }; diff --git a/src/component/Task/component/CommonDetailModal/index.tsx b/src/component/Task/component/CommonDetailModal/index.tsx index feea516b7..963ef6344 100644 --- a/src/component/Task/component/CommonDetailModal/index.tsx +++ b/src/component/Task/component/CommonDetailModal/index.tsx @@ -123,6 +123,7 @@ const CommonTaskDetailModal: React.FC = function (p TaskType.DATA_DELETE, TaskType.EXPORT_RESULT_SET, TaskType.APPLY_PROJECT_PERMISSION, + TaskType.APPLY_DATABASE_PERMISSION, ].includes(task?.type); const hasLog = [ TaskType.ASYNC, @@ -135,6 +136,7 @@ const CommonTaskDetailModal: React.FC = function (p TaskType.ONLINE_SCHEMA_CHANGE, TaskType.EXPORT_RESULT_SET, TaskType.APPLY_PROJECT_PERMISSION, + TaskType.APPLY_DATABASE_PERMISSION, ].includes(task?.type); function onShare() { const url = diff --git a/src/component/Task/component/DatabaseSelecter/index.less b/src/component/Task/component/DatabaseSelecter/index.less new file mode 100644 index 000000000..208ecd77f --- /dev/null +++ b/src/component/Task/component/DatabaseSelecter/index.less @@ -0,0 +1,73 @@ +.selecter { + display: flex; + align-items: stretch; + height: 400px; +} +.content { + width: 50%; + border: 1px solid var(--odc-border-color); + border-right: 0; + & + & { + border-right: 1px; + } + :global { + .ant-tree-list { + padding-right: 12px; + } + .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected { + background-color: unset; + } + .ant-tree-treenode { + .ant-tree-checkbox { + margin-right: 0; + } + .ant-tree-iconEle { + color: var(--icon-color-disable); + font-size: 14px; + } + } + } +} +.node { + display: flex; + justify-content: space-between; +} +.delete { + :global { + .anticon { + color: var(--icon-color-normal); + } + } + flex-grow: 0; + + flex-shrink: 0; +} +.nodeName { + overflow: hidden; + text-overflow: ellipsis; +} + +.hasIconTree { + :global { + .ant-tree-treenode { + align-self: stretch; + .ant-tree-node-content-wrapper { + display: flex; + flex: 1; + word-break: break-all; + .ant-tree-title { + flex: 1; + } + } + } + } +} + +.allTree, +.selectedTree{ + :global { + .ant-tree-switcher-noop{ + display: none; + } + } +} \ No newline at end of file diff --git a/src/component/Task/component/DatabaseSelecter/index.tsx b/src/component/Task/component/DatabaseSelecter/index.tsx new file mode 100644 index 000000000..12f34e249 --- /dev/null +++ b/src/component/Task/component/DatabaseSelecter/index.tsx @@ -0,0 +1,237 @@ +/* + * 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 { listDatabases } from '@/common/network/database'; +import ExportCard from '@/component/ExportCard'; +import { ReactComponent as DatabaseSvg } from '@/svgr/database.svg'; +import Icon, { DeleteOutlined } from '@ant-design/icons'; +import { Empty, Popconfirm, Space, Spin, Tree, Typography, Checkbox } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { DataNode } from 'antd/lib/tree'; +import classnames from 'classnames'; +import styles from './index.less'; + +const { Text } = Typography; + +interface IProps { + projectId: number; + value?: any[]; + onChange?: (newValue: any[]) => void; +} + +const DatabaseSelecter: React.FC = function ({ projectId, onChange }) { + const [isLoading, setIsLoading] = useState(false); + const [sourceSearchValue, setSourceSearchValue] = useState(null); + const [targetSearchValue, setTargetSearchValue] = useState(null); + const [databaseList, setDatabaseList] = useState([]); + const [checkedKeys, setCheckedKeys] = useState([]); + + const loadExportObjects = async () => { + setIsLoading(true); + try { + const res = await listDatabases(projectId, null, null, null, null, null, null, true, null); + if (res?.contents) { + setDatabaseList(res?.contents); + } + } catch (e) { + console.trace(e); + } finally { + setIsLoading(false); + } + }; + + const handleReset = () => { + setSourceSearchValue(null); + setTargetSearchValue(null); + setCheckedKeys([]); + }; + + useEffect(() => { + if (projectId) { + handleReset(); + loadExportObjects(); + } + }, [projectId]); + + useEffect(() =>{ + const value = checkedKeys?.map((id) =>({ id })); + onChange(value); + }, [checkedKeys]); + + const getCheckedTreeData = () => { + const validDatabaseList = + databaseList + ?.filter((item) => + checkedKeys?.includes(item.id) + ) + ?.filter((item) => { + return !targetSearchValue?.length + ? true + : item?.name?.toLowerCase().indexOf(targetSearchValue?.toLowerCase()) !== -1; + }) ?? []; + return getTreeData(validDatabaseList); + }; + + const getAllTreeData = () => { + const validDatabaseList = databaseList?.filter((item) => { + return !sourceSearchValue?.length + ? true + : item?.name?.toLowerCase().indexOf(sourceSearchValue?.toLowerCase()) !== -1; + }); + return getTreeData(validDatabaseList); + }; + + const handleDelete = ({ key }: DataNode) => { + const nodeKey = key as string; + setCheckedKeys( + checkedKeys.filter((key) => key !== nodeKey), + ); + }; + + function getTreeData(validDatabaseList: any[]) { + const allTreeData = validDatabaseList?.map((item) => { + return { + title: ( + + {item?.name} + {item?.dataSource?.name} + + ), + key: item?.id, + icon: , + }; + }); + return allTreeData; + } + + function getAllTreeDataKeys() { + const keys = []; + const allTreeData = getAllTreeData() ?? []; + const getKeys = (nodes: DataNode[]) => { + nodes?.forEach((node) => { + keys?.push(node.key); + if (node.children) { + getKeys(node.children); + } + }); + return keys; + }; + getKeys(allTreeData); + return keys; + } + + const handleSwitchSelectAll = () => { + setCheckedKeys(checkAll ? [] : allTreeDataKeys); + }; + + const handleSearch = (value) => { + setSourceSearchValue(value); + }; + + const allTreeDataKeys = getAllTreeDataKeys(); + const checkAll = allTreeDataKeys.length && allTreeDataKeys.length === checkedKeys.length; + const allTreeData = getAllTreeData(); + const selectedTreeData = getCheckedTreeData(); + const allTreeDataCount = allTreeDataKeys?.length; + const selectedTreeDataCount = checkedKeys?.length; + const indeterminate = selectedTreeDataCount && selectedTreeDataCount < allTreeDataCount; + + return ( +
+
+ + + + 全部 + ({allTreeDataCount}) + + } + onSearch={handleSearch} + > + { + setCheckedKeys(_checkedKeys as string[]); + }} + /> + + +
+
+ setTargetSearchValue(v)} + extra={ + { + setCheckedKeys([]); + }} + placement="left" + title="确定要清空已选对象吗?" + > + 清空 + + } + disabled + > + {selectedTreeData?.length ? ( + { + return ( + + ); + }} + /> + ) : ( + + )} + +
+
+ ); +}; + +export default DatabaseSelecter; diff --git a/src/component/Task/component/TaskTable/index.tsx b/src/component/Task/component/TaskTable/index.tsx index 5c402b1bc..d57c4c95f 100644 --- a/src/component/Task/component/TaskTable/index.tsx +++ b/src/component/Task/component/TaskTable/index.tsx @@ -121,6 +121,7 @@ export const TaskTypeMap = { [TaskType.APPLY_PROJECT_PERMISSION]: formatMessage({ id: 'odc.src.component.Task.component.TaskTable.ApplicationProjectPermissions', }), //'申请项目权限' + [TaskType.APPLY_DATABASE_PERMISSION]: '申请库权限', }; export const getStatusFilters = (status: { [key: string]: { @@ -148,7 +149,6 @@ interface IProps { | ICycleTaskRecord >; isMultiPage?: boolean; - disabledOpt?: boolean; getTaskList: (args: ITableLoadOptions, executeDate: [Moment, Moment]) => Promise; onReloadList: () => void; onDetailVisible: (task: TaskRecord, visible: boolean) => void; @@ -167,7 +167,6 @@ const TaskTable: React.FC = inject( tableRef, taskList, isMultiPage, - disabledOpt, } = props; const { taskPageScope } = taskStore; const taskStatusFilters = getStatusFilters(isCycleTaskPage(taskTabType) ? cycleStatus : status); @@ -443,7 +442,6 @@ const TaskTable: React.FC = inject( ), - disabled: disabledOpt, menu: { onClick: ({ key }) => { props.onMenuClick(key as TaskPageType); @@ -468,19 +466,20 @@ const TaskTable: React.FC = inject( } : { type: IOperationOptionType.button, - content: - taskTabType === TaskPageType.APPLY_PROJECT_PERMISSION - ? activeTaskLabel - : formatMessage( - { - id: 'odc.src.component.Task.component.TaskTable.NewActiveTasklabel', - }, - { - activeTaskLabel: activeTaskLabel, - }, - ), + content: [ + TaskPageType.APPLY_PROJECT_PERMISSION, + TaskPageType.APPLY_DATABASE_PERMISSION, + ].includes(taskTabType) + ? activeTaskLabel + : formatMessage( + { + id: 'odc.src.component.Task.component.TaskTable.NewActiveTasklabel', + }, + { + activeTaskLabel: activeTaskLabel, + }, + ), //`新建${activeTaskLabel}` - disabled: disabledOpt, isPrimary: true, onClick: () => { props.onMenuClick(taskTabType); diff --git a/src/component/Task/helper.tsx b/src/component/Task/helper.tsx index 120c6167d..3bc07439f 100644 --- a/src/component/Task/helper.tsx +++ b/src/component/Task/helper.tsx @@ -15,15 +15,32 @@ */ import { SubTaskType, TaskExecStrategy, TaskPageType, TaskType } from '@/d.ts'; +import { DatabasePermissionType } from '@/d.ts/database'; import login from '@/store/login'; import settingStore from '@/store/setting'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; import { flatten } from 'lodash'; +export { TaskTypeMap } from '@/component/Task/component/TaskTable'; // 423 屏蔽 SysFormItem 配置 export const ENABLED_SYS_FROM_ITEM = false; +export const hasPermission = (taskType: TaskType, permissions: DatabasePermissionType[]) =>{ + let _permissions = null; + switch(taskType){ + case TaskType.EXPORT: + _permissions = [DatabasePermissionType.EXPORT]; + break; + case TaskType.EXPORT_RESULT_SET: + _permissions = [DatabasePermissionType.EXPORT, DatabasePermissionType.QUERY]; + break; + default: + _permissions = [DatabasePermissionType.CHANGE]; + } + return permissions?.some(item => _permissions.includes(item)); +} + export const isCycleTask = (type: TaskType) => { return [TaskType.SQL_PLAN, TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(type); }; @@ -209,6 +226,11 @@ export const getTaskGroupLabels: () => ITaskGroupLabel[] = () => { }), //'申请项目权限' enabled: !isClient() && !isPersonal, }, + { + value: TaskPageType.APPLY_DATABASE_PERMISSION, + label: '申请库权限', + enabled: !isClient() && !isPersonal, + }, ], }, // { diff --git a/src/component/Task/hooks/useProjects.tsx b/src/component/Task/hooks/useProjects.tsx new file mode 100644 index 000000000..6f762a3be --- /dev/null +++ b/src/component/Task/hooks/useProjects.tsx @@ -0,0 +1,22 @@ +import { useState } from 'react'; +import { getProjectList } from '@/common/network/task'; + +export const useProjects = () => { + const [projects, setProjects] = useState([]); + + const projectOptions = projects?.map(({ name, id }) => ({ + label: name, + value: id, + })); + + const loadProjects = async () => { + const res = await getProjectList(false); + setProjects(res?.contents); + }; + + return { + projects, + projectOptions, + loadProjects, + }; +}; diff --git a/src/component/Task/index.tsx b/src/component/Task/index.tsx index 388dda88a..c294923a8 100644 --- a/src/component/Task/index.tsx +++ b/src/component/Task/index.tsx @@ -21,7 +21,6 @@ import styles from './index.less'; import Sider from './Sider'; import CreateModals from './CreateModals'; import { useSearchParams } from '@umijs/max'; -import { useEffect } from 'react'; import login from '@/store/login'; import { toInteger } from 'lodash'; export const getTaskExecStrategyMap = (type: TaskType) => { diff --git a/src/component/helpDoc/doc.tsx b/src/component/helpDoc/doc.tsx index 26d2a9d9d..c0791cd0e 100644 --- a/src/component/helpDoc/doc.tsx +++ b/src/component/helpDoc/doc.tsx @@ -453,47 +453,27 @@ export default { ), projectOwner: (

- { - formatMessage({ - id: 'odc.component.helpDoc.doc.ManageAllDatabasesAndMembers', - }) /*可管理项目所有数据库和成员*/ - } + 拥有项目内的所有权限

), projectDBA: (

- { - formatMessage({ - id: 'odc.component.helpDoc.doc.ManageAllDatabasesOfA', - }) /*可管理项目所有数据库*/ - } + 拥有项目内除添加/移除成员和归档项目以外的所有权限

), projectDev: (

- { - formatMessage({ - id: 'odc.component.helpDoc.doc.AccessAllDatabasesOfThe', - }) /*可访问项目所有数据库*/ - } + 允许登录所有数据库、执行 SQL、提交工单,通常是开发人员

), projectSA: (

- { - formatMessage({ - id: 'odc.src.component.helpDoc.OnlyAllowTheSensitiveColumns', - }) /* 只允许管理项目的敏感列和参与审批 */ - } + 在参与者的基础上还可以管理敏感列

), participant: (

- { - formatMessage({ - id: 'odc.src.component.helpDoc.OnlyAllowParticipationInApproval', - }) /* 只允许参与审批 */ - } + 允许查看项目基本信息,并自助申请库权限和提交工单

), dataArchiveTimeDoc: ( @@ -558,4 +538,24 @@ export default { 将不会进行任何账号锁定及kill session 操作,切换期间数据的一致性将需要由您来保障

), + ApplyDatabasePermissionQueryTip: ( +

+ 执行查询语句的权限 +

+ ), + ApplyDatabasePermissionExportTip: ( +

+ 新建导出和导出结果集工单的权限 +

+ ), + ApplyDatabasePermissionChangeTip: ( +

+ 新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL 计划、分区计划、数据归档和数据清理)的权限和执行变更语句的权限(SQL窗口可否执行变更受安全规范配置约束) +

+ ), + ApplyDatabasePermissionExpiringTip: ( +

+ 该权限将在7天内过期 +

+ ), }; diff --git a/src/d.ts/database.ts b/src/d.ts/database.ts index 192489a0d..f67074764 100644 --- a/src/d.ts/database.ts +++ b/src/d.ts/database.ts @@ -24,6 +24,12 @@ export enum DatabaseSyncStatus { PENDING = 'PENDING', } +export enum DatabasePermissionType { + QUERY = 'QUERY', + CHANGE = 'CHANGE', + EXPORT = 'EXPORT', +} + export interface IDatabase { id: number; databaseId?: string; @@ -39,4 +45,16 @@ export interface IDatabase { tableCount: number; environment: IEnvironment; existed: boolean; + authorizedPermissionTypes?: DatabasePermissionType[]; } + +export interface IUnauthorizedDatabase { + unauthorizedPermissionTypes: DatabasePermissionType[]; + // 数据库ID + id: number; + // 数据库名称 + name: string; + project: IProject; + dataSource: IDatasource; + environment: IEnvironment; +} \ No newline at end of file diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index 92b5bc207..7bcd70442 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -18,7 +18,7 @@ import { PLType } from '@/constant/plType'; import { IRiskLevel } from '@/d.ts/riskLevel'; import { ButtonType } from 'antd/lib/button'; // ODCUser import { ReactNode } from 'react'; -import { IDatabase } from './database'; +import { IDatabase, DatabasePermissionType, IUnauthorizedDatabase } from './database'; export interface IUser { email: string; @@ -564,6 +564,16 @@ export enum AuditEventActionType { STOP_APPLY_PROJECT_PERMISSION_TASK = 'STOP_APPLY_PROJECT_PERMISSION_TASK', // SQL 安全规则管理 UPDATE_SQL_SECURITY_RULE = 'UPDATE_SQL_SECURITY_RULE', + // 数据库权限申请 + APPLY_DATABASE_PERMISSION = 'APPLY_DATABASE_PERMISSION', + CREATE_APPLY_DATABASE_PERMISSION_TASK = 'CREATE_APPLY_DATABASE_PERMISSION_TASK', + APPROVE_APPLY_DATABASE_PERMISSION_TASK = 'APPROVE_APPLY_DATABASE_PERMISSION_TASK', + REJECT_APPLY_DATABASE_PERMISSION_TASK = 'REJECT_APPLY_DATABASE_PERMISSION_TASK', + STOP_APPLY_DATABASE_PERMISSION_TASK = 'STOP_APPLY_DATABASE_PERMISSION_TASK', + // 数据库权限管理 + DATABASE_PERMISSION_MANAGEMENT = 'DATABASE_PERMISSION_MANAGEMENT', + GRANT_DATABASE_PERMISSION = 'GRANT_DATABASE_PERMISSION', + REVOKE_DATABASE_PERMISSION = 'REVOKE_DATABASE_PERMISSION', } export enum AuditEventDialectType { @@ -1801,6 +1811,7 @@ export enum TaskPageType { DATA_DELETE = 'DATA_DELETE', EXPORT_RESULT_SET = 'EXPORT_RESULT_SET', APPLY_PROJECT_PERMISSION = 'APPLY_PROJECT_PERMISSION', + APPLY_DATABASE_PERMISSION = 'APPLY_DATABASE_PERMISSION', } export enum TaskType { @@ -1820,6 +1831,7 @@ export enum TaskType { DATA_DELETE = 'DATA_DELETE', EXPORT_RESULT_SET = 'EXPORT_RESULT_SET', APPLY_PROJECT_PERMISSION = 'APPLY_PROJECT_PERMISSION', + APPLY_DATABASE_PERMISSION = 'APPLY_DATABASE_PERMISSION', } export enum TaskJobType { @@ -2200,7 +2212,8 @@ export type TaskRecordParameters = | ISQLPlanTaskParams | IAlterScheduleTaskParams | IResultSetExportTaskParams - | IApplyPermissionTaskParams; + | IApplyPermissionTaskParams + | IApplyDatabasePermissionTaskParams; export interface ITaskResult { containQuery: boolean; @@ -2427,6 +2440,20 @@ export interface IApplyPermissionTaskParams { }[]; } +export interface IApplyDatabasePermissionTaskParams { + project: { + id: number; + name?: string; + }; + databases: { + id: number; + name?: string; + }[]; + types: DatabasePermissionType[]; + expireTime: number; + applyReason: string; +} + export interface IResultSetExportTaskParams { sql: string; fileFormat: IExportResultSetFileType; @@ -2588,7 +2615,7 @@ export interface ITaskFlowNode { comment: string; deadlineTime: number; issueCount: number; - unauthorizedDatabaseNames: string[]; + unauthorizedDatabases: IUnauthorizedDatabase[]; id?: number; candidates: { id: number; diff --git a/src/d.ts/project.ts b/src/d.ts/project.ts index d2d5fa452..a05493609 100644 --- a/src/d.ts/project.ts +++ b/src/d.ts/project.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { DatabasePermissionType } from './database'; + export enum ProjectRole { DEVELOPER = 'DEVELOPER', DBA = 'DBA', @@ -48,3 +50,35 @@ export interface IProject { creator: ProjectUser; lastModifier: ProjectUser; } + +export enum PermissionSourceType { + // 用户授权 + USER_AUTHORIZATION = 'USER_AUTHORIZATION', + // 工单申请 + TICKET_APPLICATION = 'TICKET_APPLICATION', +} + +export enum DatabasePermissionStatus { + EXPIRED = 'EXPIRED', + EXPIRING = 'EXPIRING', + NOT_EXPIRED = 'NOT_EXPIRED', +} + +export interface IDatabasePermission { + id: number; + userId: number; + permissionType: DatabasePermissionType; + sourceType: PermissionSourceType; + ticketId: number; + createTime: number; + expireTime: number; + creatorId: number; + organizationId: number; + projectId: number; + databaseId: number; + databaseName: string; + datasourceId: number; + datasourceName: string; + environmentId: number; + environmentName: string; +} diff --git a/src/page/Project/Database/index.tsx b/src/page/Project/Database/index.tsx index 374b4107d..b9645b17f 100644 --- a/src/page/Project/Database/index.tsx +++ b/src/page/Project/Database/index.tsx @@ -26,26 +26,21 @@ import TableCard from '@/component/Table/TableCard'; import AsyncTaskCreateModal from '@/component/Task/AsyncTask'; import ExportTaskCreateModal from '@/component/Task/ExportTask'; import ImportTaskCreateModal from '@/component/Task/ImportTask'; -import { IConnectionStatus, TaskPageType, TaskType } from '@/d.ts'; -import { IDatabase } from '@/d.ts/database'; +import { TaskPageType, TaskType } from '@/d.ts'; +import { IDatabase, DatabasePermissionType } from '@/d.ts/database'; import ChangeProjectModal from '@/page/Datasource/Info/ChangeProjectModal'; import modalStore from '@/store/modal'; import { formatMessage } from '@/util/intl'; import { gotoSQLWorkspace } from '@/util/route'; import { getLocalFormatDateTime } from '@/util/utils'; import { useRequest } from 'ahooks'; -import { Input, Space, Tag, Tooltip, Typography } from 'antd'; +import { Input, Space, Tooltip } from 'antd'; import { toInteger } from 'lodash'; import React, { useContext, useEffect, useRef, useState } from 'react'; import AddDataBaseButton from './AddDataBaseButton'; import tracert from '@/util/tracert'; import RiskLevelLabel from '@/component/RiskLevelLabel'; -import { - getDataSourceModeConfig, - getDataSourceModeConfigByConnectionMode, - getDataSourceStyleByConnectType, -} from '@/common/datasource'; -import { ProjectRole } from '@/d.ts/project'; +import { getDataSourceModeConfig, getDataSourceStyleByConnectType } from '@/common/datasource'; import ProjectContext from '../ProjectContext'; import styles from './index.less'; import setting from '@/store/setting'; @@ -75,7 +70,8 @@ const Database: React.FC = ({ id }) => { params.current.pageSize = pageSize; params.current.current = current; params.current.environmentId = environmentId; - const res = await listDatabases(parseInt(id), null, current, pageSize, name, environmentId); + const res = await listDatabases( + parseInt(id), null, current, pageSize, name, environmentId, null, null, true); if (res) { datasourceStatus.asyncUpdateStatus(res?.contents?.map((item) => item?.dataSource?.id)); setData(res?.contents); @@ -145,11 +141,9 @@ const Database: React.FC = ({ id }) => { fixed: 'left', ellipsis: true, render: (name, record) => { - const currentUserResourceRoles = project?.currentUserResourceRoles || []; - const disabled = - currentUserResourceRoles?.filter((roles) => - [ProjectRole.DBA, ProjectRole.OWNER, ProjectRole.DEVELOPER]?.includes(roles), - )?.length === 0; + const hasChangeAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); + const hasQueryAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.QUERY); + const disabled = !hasChangeAuth && !hasQueryAuth; if (!record.existed) { return disabled ? (
{name}
@@ -269,13 +263,12 @@ const Database: React.FC = ({ id }) => { return '-'; } const config = getDataSourceModeConfig(record?.dataSource?.type); - const disabled = - project?.currentUserResourceRoles?.filter((roles) => - [ProjectRole.DBA, ProjectRole.OWNER]?.includes(roles), - )?.length === 0; const disableTransfer = !!record?.dataSource?.projectId && !config?.schema?.innerSchema?.includes(record?.name); + const hasExportAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.EXPORT); + const hasChangeAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); + const hasQueryAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.QUERY); return ( {config?.features?.task?.includes(TaskType.EXPORT) && setting.enableDBExport && ( @@ -285,7 +278,7 @@ const Database: React.FC = ({ id }) => { tracert.click('a3112.b64002.c330858.d367383'); handleMenuClick(TaskPageType.EXPORT, record.id); }} - disabled={disabled} + disabled={!hasExportAuth} > { formatMessage({ @@ -301,7 +294,7 @@ const Database: React.FC = ({ id }) => { tracert.click('a3112.b64002.c330858.d367384'); handleMenuClick(TaskPageType.IMPORT, record.id); }} - disabled={disabled} + disabled={!hasChangeAuth} > { formatMessage({ @@ -316,7 +309,7 @@ const Database: React.FC = ({ id }) => { tracert.click('a3112.b64002.c330858.d367385'); handleMenuClick(TaskPageType.ASYNC, record.id); }} - disabled={disabled} + disabled={!hasChangeAuth} > { formatMessage({ @@ -330,7 +323,7 @@ const Database: React.FC = ({ id }) => { tracert.click('a3112.b64002.c330858.d367381'); gotoSQLWorkspace(parseInt(id), record?.dataSource?.id, record?.id); }} - disabled={disabled} + disabled={!hasQueryAuth} > { formatMessage({ @@ -345,7 +338,7 @@ const Database: React.FC = ({ id }) => { setVisible(true); setDatabase(record); }} - disabled={disabled || disableTransfer} + disabled={!hasChangeAuth || disableTransfer} > - { - formatMessage({ - id: 'odc.Project.CreateProject.CommonMember', - }) /*普通成员*/ - } + 开发者 } > diff --git a/src/page/Project/User/ManageModal/CreateAuth/index.less b/src/page/Project/User/ManageModal/CreateAuth/index.less new file mode 100644 index 000000000..57822bef5 --- /dev/null +++ b/src/page/Project/User/ManageModal/CreateAuth/index.less @@ -0,0 +1,8 @@ +.createModal { + :global { + .ant-drawer-footer { + display: flex; + justify-content: flex-end; + } + } +} diff --git a/src/page/Project/User/ManageModal/CreateAuth/index.tsx b/src/page/Project/User/ManageModal/CreateAuth/index.tsx new file mode 100644 index 000000000..698101ceb --- /dev/null +++ b/src/page/Project/User/ManageModal/CreateAuth/index.tsx @@ -0,0 +1,199 @@ +/* + * 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 { addDatabasePermissions } from '@/common/network/project'; +import { + Button, + Drawer, + Form, + Modal, + Select, + Space, + message, + DatePicker, + Checkbox +} from 'antd'; +import React, { useState } from 'react'; +import DatabaseSelecter from '@/component/Task/component/DatabaseSelecter'; +import { permissionOptions, expireTimeOptions, getExpireTime } from '@/component/Task/ApplyDatabasePermission/CreateModal'; +import styles from './index.less'; + +const CheckboxGroup = Checkbox.Group; + +interface IProps { + projectId: number; + userId: number; + onSwitchUserTab: () => void; +} +const CreateModal: React.FC = (props) => { + const { projectId, userId, onSwitchUserTab } = props; + const [visible, setVisible] = useState(false); + const [form] = Form.useForm(); + const [hasEdit, setHasEdit] = useState(false); + const [confirmLoading, setConfirmLoading] = useState(false); + + const handleFieldsChange = () => { + setHasEdit(true); + }; + const hadleReset = () => { + form.resetFields(null); + setHasEdit(false); + }; + const handleCancel = (hasEdit: boolean) => { + if (hasEdit) { + Modal.confirm({ + title: '确认取消新增授权吗?', + centered: true, + onOk: () => { + handleModalVisizble(false); + hadleReset(); + }, + }); + } else { + handleModalVisizble(false); + hadleReset(); + } + }; + + const handleSubmit = () => { + form + .validateFields() + .then(async (values) => { + const { databases, types, expireTime, isCustomExpireTime, customExpireTime } = values; + const databaseIds = databases?.map(item => item?.id); + const data = { + projectId, + databaseIds, + types, + expireTime: getExpireTime(expireTime, customExpireTime, isCustomExpireTime), + userId + }; + setConfirmLoading(true); + const res = await addDatabasePermissions(data); + handleCancel(false); + setConfirmLoading(false); + if (res) { + message.success('新增授权成功!'); + onSwitchUserTab(); + } + }) + .catch((errorInfo) => { + console.error(JSON.stringify(errorInfo)); + }); + }; + + const handleModalVisizble = (visible: boolean = true) => { + setVisible(visible); + }; + + return ( + <> + + + + + + } + open={visible} + onClose={() => { + handleCancel(hasEdit); + }} + > +
+ + + + + + + + + {!login.isPrivateSpace() && } diff --git a/src/page/Secure/Env/EnvironmentContext.ts b/src/page/Secure/Env/EnvironmentContext.ts deleted file mode 100644 index 713bddfdc..000000000 --- a/src/page/Secure/Env/EnvironmentContext.ts +++ /dev/null @@ -1,31 +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 { IManagerIntegration } from '@/d.ts'; -import { IEnvironment } from '@/d.ts/environment'; -import React from 'react'; - -export interface IEnvironmentContext { - currentEnvironment: IEnvironment; - integrations: IManagerIntegration[]; - integrationsIdMap: { [key in number | string]: string }; -} - -export const EnvironmentContext = React.createContext({ - currentEnvironment: null, - integrations: [], - integrationsIdMap: {}, -}); diff --git a/src/page/Secure/Env/components/EnvironmentInfo.tsx b/src/page/Secure/Env/components/EnvironmentInfo.tsx index 13831b406..5b27a3be4 100644 --- a/src/page/Secure/Env/components/EnvironmentInfo.tsx +++ b/src/page/Secure/Env/components/EnvironmentInfo.tsx @@ -16,18 +16,69 @@ import RiskLevelLabel from '@/component/RiskLevelLabel'; import { formatMessage } from '@/util/intl'; -import { Descriptions, Space } from 'antd'; +import { Button, Descriptions, Dropdown, Space } from 'antd'; import styles from './index.less'; +import { MenuClickEventHandler, MenuInfo } from 'rc-menu/lib/interface'; +import { IEnvironment } from '@/d.ts/environment'; -const EnvironmentInfo = ({ label, style, description }) => { +const EnvironmentInfo: React.FC<{ + loading: boolean; + currentEnvironment: IEnvironment; + handleSwitchEnvEnabled: () => void; + handleDeleteEnvironment: () => void; + handleUpdateEnvironment: () => void; +}> = ({ + loading, + currentEnvironment, + handleSwitchEnvEnabled = () => {}, + handleDeleteEnvironment = () => {}, + handleUpdateEnvironment = () => {}, +}) => { + const { name, style, builtIn = true, enabled, description } = currentEnvironment ?? {}; + const handleMenuOnClick: MenuClickEventHandler = (info: MenuInfo) => { + console.log(info); + switch (info.key) { + case 'edit': { + handleUpdateEnvironment(); + return; + } + case 'delete': { + handleDeleteEnvironment(); + return; + } + default: { + return; + } + } + }; return ( <> - -
- {formatMessage({ id: 'odc.Env.components.InnerEnvironment.LabelStyle' }) /*标签样式:*/} -
- -
+
+ +
+ {formatMessage({ id: 'odc.Env.components.InnerEnvironment.LabelStyle' }) /*标签样式:*/} +
+ +
+ + + {builtIn ? null : ( + + + + )} + +
{ formatMessage({ id: 'odc.Env.components.InnerEnvironment.Description' }) //描述 } > - {description} + {description || '-'} diff --git a/src/page/Secure/Env/components/EnvironmentTable.tsx b/src/page/Secure/Env/components/EnvironmentTable.tsx index 2da9e887b..710626c90 100644 --- a/src/page/Secure/Env/components/EnvironmentTable.tsx +++ b/src/page/Secure/Env/components/EnvironmentTable.tsx @@ -25,14 +25,26 @@ import { } from '@/component/CommonTable/interface'; import { IRule, RuleType } from '@/d.ts/rule'; import { message, Spin } from 'antd'; -import { useContext, useRef, useState } from 'react'; -import { EnvironmentContext } from '../EnvironmentContext'; +import React, { useEffect, useRef, useState } from 'react'; import { getColumns } from './column'; import EditRuleDrawer from './EditRuleDrawer'; import styles from './index.less'; import tracert from '@/util/tracert'; -const EnvironmentTable = ({ ruleType }) => { - const environmentContext = useContext(EnvironmentContext); +import { IEnvironment } from '@/d.ts/environment'; +import { IManagerIntegration } from '@/d.ts'; + +interface IEnvironmentProps { + currentEnvironment: IEnvironment; + integrations: IManagerIntegration[]; + integrationsIdMap: Record; + ruleType: RuleType; +} +const EnvironmentTable: React.FC = ({ + currentEnvironment, + integrations, + integrationsIdMap, + ruleType, +}) => { const tableRef = useRef(); const argsRef = useRef(); const originRules = useRef(null); @@ -48,8 +60,11 @@ const EnvironmentTable = ({ ruleType }) => { const [pagination, setPagination] = useState(null); const [loading, setLoading] = useState(false); const [editRuleDrawerVisible, setEditRuleDrawerVisible] = useState(false); + /** + * 获取不同规范规则类型以及支持的数据源类型,用于筛选。 + */ const handleStatsRule = async () => { - const rawData = await statsRules(environmentContext?.currentEnvironment?.id, ruleType); + const rawData = await statsRules(currentEnvironment?.id, ruleType); setSubTypeFilters( rawData?.subTypes?.distinct?.map((d) => ({ text: d, @@ -63,12 +78,15 @@ const EnvironmentTable = ({ ruleType }) => { })), ); }; - const getRules = async (args: ITableLoadOptions) => { + const getRules = async (args?: ITableLoadOptions) => { + if (!currentEnvironment?.id) { + return; + } setLoading(true); - const { pageSize = 0, pagination = null, filters = null } = args; + const { pagination = null, filters = null } = args ?? {}; const { subTypes, supportedDialectTypes, level, name } = filters ?? {}; handleStatsRule(); - const rulesets = await listRules(environmentContext?.currentEnvironment?.id, { + const rulesets = await listRules(currentEnvironment?.id, { types: ruleType, }); let filteredRules: IRule[] = rulesets?.contents; @@ -141,11 +159,7 @@ const EnvironmentTable = ({ ruleType }) => { setEditRuleDrawerVisible(false); }; const handleUpdateEnvironment = async (rule: IRule, fn?: () => void) => { - const flag = await updateRule( - environmentContext?.currentEnvironment?.rulesetId, - selectedRule?.id, - rule, - ); + const flag = await updateRule(currentEnvironment?.rulesetId, selectedRule?.id, rule); if (flag) { message.success( formatMessage({ @@ -189,7 +203,7 @@ const EnvironmentTable = ({ ruleType }) => { const rawColumns = getColumns({ subTypeFilters, supportedDialectTypeFilters, - integrationsIdMap: environmentContext?.integrationsIdMap, + integrationsIdMap: integrationsIdMap, handleSwtichRuleStatus, handleOpenEditModal, }); @@ -197,6 +211,11 @@ const EnvironmentTable = ({ ruleType }) => { ruleType === RuleType.SQL_CHECK ? rawColumns : rawColumns.filter((column) => column?.key !== 'level'); + useEffect(() => { + if (ruleType) { + getRules(); + } + }, [ruleType]); return ( <>
@@ -221,7 +240,7 @@ const EnvironmentTable = ({ ruleType }) => { rule={selectedRule} ruleType={ruleType} editRuleDrawerVisible={editRuleDrawerVisible} - integrations={environmentContext?.integrations} + integrations={integrations} handleCloseModal={handleCloseModal} handleUpdateEnvironment={handleUpdateEnvironment} /> diff --git a/src/page/Secure/Env/components/FormEnvironmentModal.tsx b/src/page/Secure/Env/components/FormEnvironmentModal.tsx new file mode 100644 index 000000000..5d5c8fa3e --- /dev/null +++ b/src/page/Secure/Env/components/FormEnvironmentModal.tsx @@ -0,0 +1,193 @@ +import { updateEnvironment, createEnvironment } from '@/common/network/env'; +import { EnvColorMap } from '@/constant'; +import { IEnvironment } from '@/d.ts/environment'; +import { message, Modal, Button, Form, Input, Tag, Select, SelectProps } from 'antd'; +import { useForm } from 'antd/lib/form/Form'; +import { useState, useEffect } from 'react'; +import styles from './index.less'; +import { CheckOutlined } from '@ant-design/icons'; +import HelpDoc from '@/component/helpDoc'; + +export const FormEnvironmentModal: React.FC<{ + isEdit?: boolean; + currentEnvironment: IEnvironment; + formEnvironmentModalOpen: boolean; + options: SelectProps['options']; + handleCancelFormModal: () => void; + callback: () => void; +}> = ({ + isEdit = false, + currentEnvironment = null, + formEnvironmentModalOpen, + options = [], + handleCancelFormModal, + callback, +}) => { + const [formRef] = useForm(); + const [loading, setLoading] = useState(false); + const handleSubmit = async () => { + if (isEdit && currentEnvironment?.builtIn) { + return; + } + const formData = await formRef.validateFields()?.catch(); + let successful; + setLoading(true); + if (isEdit) { + successful = await updateEnvironment(currentEnvironment?.id, formData); + } else { + formData.enabled = true; + successful = await createEnvironment(formData); + } + setLoading(false); + if (successful) { + message.success(currentEnvironment ? '保存成功' : '新建成功'); + currentEnvironment && (await callback?.()); + return; + } + message.error(currentEnvironment ? '保存失败' : '新建失败'); + }; + useEffect(() => { + if (formEnvironmentModalOpen) { + if (isEdit) { + formRef.setFieldsValue({ + name: currentEnvironment?.name, + style: currentEnvironment?.style, + description: currentEnvironment?.description, + }); + } else { + formRef.setFieldsValue({ + copiedRulesetId: options?.[0]?.value, + }); + } + } else { + formRef.resetFields(); + } + }, [formEnvironmentModalOpen]); + return ( + + + +
+ } + > + + + + + + + + {isEdit ? null : ( + + 引用环境 + + } + name="copiedRulesetId" + rules={[ + { + required: true, + message: '请选择引用环境', + }, + ]} + > + - {database?.data ? ( - <> - - - - ) : null} - {database?.data?.name} -
+ database?.data ? ( + + {database?.data ? ( + <> + + + + ) : null} + {database?.data?.name} + + ) : ( + placeholder + ) } style={{ width: width || 320 }} open={false} diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index 9ddc59efd..3ce0da351 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -50,16 +50,18 @@ interface IDatabasesTitleProps { disabled: boolean; } -const DatabasesTitle: React.FC = (props) =>{ +const DatabasesTitle: React.FC = (props) => { const { taskType, db, disabled } = props; return ( <> - { - disabled ? - + {disabled ? ( +
{db.name}
- : + ) : ( = (props) =>{ >
{db.name}
- } + )} - ) + ); +}; +export interface ISessionDropdownFiltersProps { + projectId?: number; + dialectTypes?: ConnectionMode[]; + dataSourceId?: number; } - interface IProps { dialectTypes?: ConnectionMode[]; width?: number | string; taskType?: TaskType; projectId?: number; + filters?: ISessionDropdownFiltersProps; dataSourceStatusStore?: DataSourceStatusStore; } const SessionDropdown: React.FC = function ({ children, width, projectId, + filters = null, + dialectTypes, taskType, dataSourceStatusStore, }) { @@ -97,7 +106,14 @@ const SessionDropdown: React.FC = function ({ const [from, setFrom] = useState<'project' | 'datasource'>('project'); const [expandedKeys, setExpandedKeys] = useState([]); - const { data, run, loading: fetchLoading } = useRequest(listDatabases, { + const hasDialectTypesFilter = + filters?.dialectTypes && Array.isArray(filters?.dialectTypes) && filters?.dialectTypes?.length; + const hasProjectIdFilter = !!filters?.projectId; + const { + data, + run, + loading: fetchLoading, + } = useRequest(listDatabases, { manual: true, }); useEffect(() => { @@ -111,7 +127,7 @@ const SessionDropdown: React.FC = function ({ null, login.isPrivateSpace(), true, - true + true, ); } }, [isOpen]); @@ -122,6 +138,8 @@ const SessionDropdown: React.FC = function ({ allDatasources: IDatasource[] = []; data?.contents?.forEach((db) => { const { project, dataSource } = db; + // 插入项目ID用于下方筛选 + dataSource.projectId = project?.id; const support = !taskType || getDataSourceModeConfig(db.dataSource?.type)?.features?.task?.includes(taskType); @@ -151,12 +169,24 @@ const SessionDropdown: React.FC = function ({ datasources.set(dataSource?.id, datasourceDatabases); } }); - + let filterDataSources: IDatasource[]; + let filterProjects: IProject[]; + if (hasProjectIdFilter) { + filterProjects = allProjects?.filter((project) => filters?.projectId === project?.id); + filterDataSources = allDatasources?.filter( + (datasource) => datasource?.projectId === filters?.projectId, + ); + } + if (hasDialectTypesFilter) { + filterDataSources = allDatasources?.filter((datasource) => + filters?.dialectTypes?.includes(datasource?.dialectType), + ); + } return { datasources, projects, - allDatasources, - allProjects, + allDatasources: hasDialectTypesFilter ? filterDataSources : allDatasources, + allProjects: hasProjectIdFilter ? filterProjects : allProjects, }; }, [data?.contents]); @@ -227,7 +257,10 @@ const SessionDropdown: React.FC = function ({ !searchValue || item.name?.toLowerCase().includes(searchValue?.toLowerCase()); const dbList = datasources .get(item.id) - ?.databases?.map((db) => { + ?.databases?.filter((database) => + hasProjectIdFilter ? filters?.projectId === database?.project?.id : true, + ) + ?.map((db) => { /** * 父节点没匹配到,变更为搜索数据库 */ @@ -238,14 +271,16 @@ const SessionDropdown: React.FC = function ({ ) { return null; } - const disabled = taskType ? !hasPermission(taskType, db.authorizedPermissionTypes) : !db.authorizedPermissionTypes?.length; + const disabled = taskType + ? !hasPermission(taskType, db.authorizedPermissionTypes) + : !db.authorizedPermissionTypes?.length; return { title: , key: `db:${db.id}`, selectable: true, isLeaf: true, icon: , - disabled + disabled, }; }) .sort((a, b) => { @@ -277,7 +312,12 @@ const SessionDropdown: React.FC = function ({ !searchValue || item.name?.toLowerCase().includes(searchValue?.toLowerCase()); const dbList = projects .get(item.id) - ?.databases?.map((db) => { + ?.databases?.filter((database) => + hasDialectTypesFilter + ? filters?.dialectTypes?.includes(database?.dataSource?.dialectType) + : true, + ) + ?.map((db) => { if ( !isNameMatched && searchValue && @@ -285,14 +325,16 @@ const SessionDropdown: React.FC = function ({ ) { return null; } - const disabled = taskType ? !hasPermission(taskType, db.authorizedPermissionTypes) : !db.authorizedPermissionTypes?.length; + const disabled = taskType + ? !hasPermission(taskType, db.authorizedPermissionTypes) + : !db.authorizedPermissionTypes?.length; return { title: , key: `db:${db.id}`, selectable: true, isLeaf: true, icon: , - disabled + disabled, }; }) .sort((a, b) => { @@ -326,7 +368,6 @@ const SessionDropdown: React.FC = function ({ } } } - return ( = function ({ options={[ { label: formatMessage({ - id: - 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.Project', + id: 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.Project', }), //'按项目' value: 'project', }, { label: formatMessage({ - id: - 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.DataSource', + id: 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.DataSource', }), //'按数据源' value: 'datasource', }, @@ -371,8 +410,7 @@ const SessionDropdown: React.FC = function ({ suffix={} placeholder={ formatMessage({ - id: - 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.SearchForTheKeyword', + id: 'odc.src.page.Workspace.components.SessionContextWrap.SessionSelect.SessionDropdown.SearchForTheKeyword', }) /* 搜索关键字 */ } onChange={(v) => setSearchValue(v.target.value)} diff --git a/src/store/modal.ts b/src/store/modal.ts index f7962a551..e2cf00d42 100644 --- a/src/store/modal.ts +++ b/src/store/modal.ts @@ -16,6 +16,7 @@ import { ISQLLintReuslt } from '@/component/SQLLintResult/type'; import { DbObjectType, EStatus, IAsyncTaskParams, ITable, RollbackType, TaskDetail } from '@/d.ts'; +import { IDatabase } from '@/d.ts/database'; import tracert from '@/util/tracert'; import { action, observable } from 'mobx'; @@ -136,6 +137,26 @@ export class ModalStore { @observable public dataArchiveEditId: number = null; + @observable + public structureComparisonVisible: boolean = false; + + @observable + public structureComparisonDataMap: Map< + number, + { + database: IDatabase; + storageObjectId: number; + totalChangeScript: string; + } + > = new Map< + number, + { + database: IDatabase; + storageObjectId: number; + totalChangeScript: string; + } + >(); + @observable public dataClearVisible: boolean = false; @@ -379,6 +400,29 @@ export class ModalStore { this.dataArchiveEditId = isShow ? id : null; } + @action + public changeStructureComparisonModal(isShow: boolean = true) { + this.structureComparisonVisible = isShow; + isShow && this.structureComparisonDataMap.clear(); + } + + @action + public updateStructureComparisonDataMap( + taskId?: number, + structureComparisonData?: { + database: IDatabase; + storageObjectId: number; + totalChangeScript: string; + }, + clear: boolean = false, + ) { + if (clear) { + this.structureComparisonDataMap.clear(); + return; + } + this.structureComparisonDataMap.set(taskId, structureComparisonData); + } + @action public changeDataClearModal(isShow: boolean = true) { this.dataClearVisible = isShow; diff --git a/src/style/theme/white.less b/src/style/theme/white.less index 401bee03c..d16368c72 100644 --- a/src/style/theme/white.less +++ b/src/style/theme/white.less @@ -131,4 +131,5 @@ --blue-color: #3471f9; --green-color: #30bf78; --default-border-color: #f0f0f0; + --empty-background-color: rgba(0, 0, 0, 0.02); } From d6e8205d6c38f9b6a38a3079d10281f5c11ca6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 31 Jan 2024 10:20:57 +0800 Subject: [PATCH 055/231] PullRequest: 313 fix: custom environment's UI problme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-1484-someUIProblem of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/313 Signed-off-by: 晓康 * fix: custom environment's UI problme --- .../Secure/Env/components/EnvironmentInfo.tsx | 29 +++++++++++++++---- .../Env/components/FormEnvironmentModal.tsx | 1 + 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/page/Secure/Env/components/EnvironmentInfo.tsx b/src/page/Secure/Env/components/EnvironmentInfo.tsx index 5b27a3be4..3d180b690 100644 --- a/src/page/Secure/Env/components/EnvironmentInfo.tsx +++ b/src/page/Secure/Env/components/EnvironmentInfo.tsx @@ -16,10 +16,11 @@ import RiskLevelLabel from '@/component/RiskLevelLabel'; import { formatMessage } from '@/util/intl'; -import { Button, Descriptions, Dropdown, Space } from 'antd'; +import { Button, Descriptions, Dropdown, Space, Tooltip } from 'antd'; import styles from './index.less'; import { MenuClickEventHandler, MenuInfo } from 'rc-menu/lib/interface'; import { IEnvironment } from '@/d.ts/environment'; +import Icon, { EllipsisOutlined, ExclamationCircleFilled } from '@ant-design/icons'; const EnvironmentInfo: React.FC<{ loading: boolean; @@ -36,7 +37,6 @@ const EnvironmentInfo: React.FC<{ }) => { const { name, style, builtIn = true, enabled, description } = currentEnvironment ?? {}; const handleMenuOnClick: MenuClickEventHandler = (info: MenuInfo) => { - console.log(info); switch (info.key) { case 'edit': { handleUpdateEnvironment(); @@ -58,10 +58,27 @@ const EnvironmentInfo: React.FC<{
{formatMessage({ id: 'odc.Env.components.InnerEnvironment.LabelStyle' }) /*标签样式:*/}
- + + + {!enabled && ( + + + + )} + - {builtIn ? null : ( @@ -74,7 +91,9 @@ const EnvironmentInfo: React.FC<{ onClick: handleMenuOnClick, }} > - + )} diff --git a/src/page/Secure/Env/components/FormEnvironmentModal.tsx b/src/page/Secure/Env/components/FormEnvironmentModal.tsx index 5d5c8fa3e..d72f4ab97 100644 --- a/src/page/Secure/Env/components/FormEnvironmentModal.tsx +++ b/src/page/Secure/Env/components/FormEnvironmentModal.tsx @@ -56,6 +56,7 @@ export const FormEnvironmentModal: React.FC<{ }); } else { formRef.setFieldsValue({ + style: items?.[0], copiedRulesetId: options?.[0]?.value, }); } From e3f84c716465d0a43da6ae2f77d920bdc840a203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 31 Jan 2024 15:48:42 +0800 Subject: [PATCH 056/231] PullRequest: 314 fix: modify the sqlContentPreview's height MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-816-uiModify of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/314 Signed-off-by: 晓康 * fix: modify the sqlContentPreview's height --- .../DetailContent/index.less | 15 +++++++++ .../DetailContent/index.tsx | 32 ++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/component/Task/StructureComparisonTask/DetailContent/index.less b/src/component/Task/StructureComparisonTask/DetailContent/index.less index c16adcfbe..cb1ad065f 100644 --- a/src/component/Task/StructureComparisonTask/DetailContent/index.less +++ b/src/component/Task/StructureComparisonTask/DetailContent/index.less @@ -60,3 +60,18 @@ } } } +.sqlContent { + position: relative; + box-sizing: border-box; + height: 316px; + padding-top: 8px; + background: var(--background-tertraiy-color); + :global { + .monaco-editor { + .margin, + .monaco-editor-background { + background: var(--background-tertraiy-color); + } + } + } +} diff --git a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx index 9b87ee360..bfbc75461 100644 --- a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx +++ b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx @@ -50,7 +50,12 @@ import { IComparisonResultData, } from '@/d.ts/task'; import CommonTable from '@/component/CommonTable'; -import { ITableInstance, ITableLoadOptions } from '@/component/CommonTable/interface'; +import { + CommonTableMode, + ITableInstance, + ITableLoadOptions, +} from '@/component/CommonTable/interface'; +import MonacoEditor from '@/component/MonacoEditor'; interface IStructureComparisonTaskContentProps { modalStore?: ModalStore; task: TaskDetail; @@ -160,11 +165,12 @@ const CompareTable: React.FC<{ } }, [currentTaskResult]); return ( -
+
{comparisonResult?.totalChangeScript ? ( - +
+ +
) : (
(null); const loadStructureComparisonResults = async (args?: ITableLoadOptions) => { + if (!(currentResult as any)?.taskId) { + return; + } const { filters, sorter, pagination, pageSize } = args ?? {}; const { current = 1 } = pagination ?? {}; const { dbObjectName, operationType } = filters ?? {}; @@ -251,14 +259,14 @@ const StructureComparisonTaskContent: React.FC Date: Wed, 31 Jan 2024 17:46:50 +0800 Subject: [PATCH 057/231] feat: config code --- src/component/ODCSetting/Item/InputItem.tsx | 26 ++ src/component/ODCSetting/Item/SelectItem.tsx | 28 ++ src/component/ODCSetting/Item/TextItem.tsx | 28 ++ src/component/ODCSetting/config.tsx | 150 +---------- src/component/ODCSetting/config/account.tsx | 71 ++++++ src/component/ODCSetting/config/database.tsx | 240 ++++++++++++++++++ src/component/ODCSetting/config/editor.tsx | 95 +++++++ .../ODCSetting/config/performance.tsx | 38 +++ .../ODCSetting/config/preference.tsx | 55 ++++ src/component/ODCSetting/index.less | 3 +- src/component/ODCSetting/index.tsx | 50 ++-- 11 files changed, 623 insertions(+), 161 deletions(-) create mode 100644 src/component/ODCSetting/Item/InputItem.tsx create mode 100644 src/component/ODCSetting/Item/SelectItem.tsx create mode 100644 src/component/ODCSetting/Item/TextItem.tsx create mode 100644 src/component/ODCSetting/config/account.tsx create mode 100644 src/component/ODCSetting/config/database.tsx create mode 100644 src/component/ODCSetting/config/editor.tsx create mode 100644 src/component/ODCSetting/config/performance.tsx create mode 100644 src/component/ODCSetting/config/preference.tsx diff --git a/src/component/ODCSetting/Item/InputItem.tsx b/src/component/ODCSetting/Item/InputItem.tsx new file mode 100644 index 000000000..76fa89d0f --- /dev/null +++ b/src/component/ODCSetting/Item/InputItem.tsx @@ -0,0 +1,26 @@ +import { Input, Radio, RadioGroupProps } from 'antd'; +import { useState } from 'react'; + +export default function InputItem(props: { + value: string; + onChange: (value: string) => Promise; +}) { + const [loading, setLoading] = useState(false); + return ( + { + const value = e.target.value; + setLoading(true); + try { + await props.onChange(value); + } finally { + setLoading(false); + } + }} + /> + ); +} diff --git a/src/component/ODCSetting/Item/SelectItem.tsx b/src/component/ODCSetting/Item/SelectItem.tsx new file mode 100644 index 000000000..a4e18ae70 --- /dev/null +++ b/src/component/ODCSetting/Item/SelectItem.tsx @@ -0,0 +1,28 @@ +import { Radio, RadioGroupProps, Select, SelectProps } from 'antd'; +import { useState } from 'react'; + +export default function SelectItem(props: { + options: SelectProps['options']; + value: string; + onChange: (value: string) => Promise; +}) { + const [loading, setLoading] = useState(false); + return ( + { + const start = e.target.selectionStart, + end = e.target.selectionEnd; + 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?.setSelectionRange(start, end); + }); + } + if (typeof onChangeValue !== 'string') { + onChange?.(onChangeValue as any); + } + }} + /> + ); +} + +type ICaseTextAreaProps = TextAreaProps & WrapProps; +const CaseTextArea = forwardRef(function CaseTextArea( + props: ICaseTextAreaProps, + ref, +) { + const { value, caseSensitive, escapes, onChange, ...rest } = props; + const [innerValue, setInnerValue] = useState(); + const [onChangeValue, setOnChangeValue] = useState(); + useEffect(() => { + if (onChangeValue !== value) { + console.log('changed', onChangeValue, value); + /** + * value changed by other + */ + if (value?.toUpperCase() !== value && value && !caseSensitive) { + /** + * 推测是否需要双引号 + */ + setInnerValue(`${escapes}${value}${escapes}`); + setOnChangeValue(value); + } else { + setInnerValue(value); + setOnChangeValue(value); + } + } + }, [value]); + const inputRef = useRef(); + const handleChange = useMemo( + () => onChangeCaseWrap({ caseSensitive, escapes }), + [caseSensitive, escapes], + ); + return ( + { + inputRef.current = _ref; + if (typeof ref === 'function') { + ref(_ref); + } else if (ref) { + ref.current = _ref; + } + }} + value={innerValue} + {...rest} + onChange={(e) => { + const start = e.target.selectionStart, + end = e.target.selectionEnd; + 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); + } + }} + /> + ); +}); + +export { onChangeCaseWrap, CaseTextArea }; diff --git a/src/page/Workspace/components/CreateTable/BaseInfo/index.tsx b/src/page/Workspace/components/CreateTable/BaseInfo/index.tsx index e11161c19..83713a3ae 100644 --- a/src/page/Workspace/components/CreateTable/BaseInfo/index.tsx +++ b/src/page/Workspace/components/CreateTable/BaseInfo/index.tsx @@ -18,10 +18,12 @@ import { formatMessage } from '@/util/intl'; import { Col, Form, Input, Row, Select } from 'antd'; import { FormInstance } from 'antd/es/form/Form'; import React, { useContext, useEffect, useImperativeHandle } from 'react'; -import { useTableConfig } from '../config'; +import { useDataSourceConfig, useTableConfig } from '../config'; import { getDefaultCollation } from '../helper'; import TableContext from '../TableContext'; import styles from './index.less'; +import { CaseInput } from '@/component/Input/Case'; +import { getDataSourceModeConfig } from '@/common/datasource'; interface IProps { isEdit?: boolean; @@ -39,6 +41,7 @@ const CreateTableBaseInfoForm: React.FC = (props) => { const session = tableContext.session; const { collations, charsets } = session; const config = useTableConfig(session.connection?.dialectType); + const datasourceConfig = useDataSourceConfig(session.connection.type); useEffect(() => { form.setFieldsValue(model); @@ -82,7 +85,9 @@ const CreateTableBaseInfoForm: React.FC = (props) => { }, ]} > - { return function (props) { @@ -73,8 +75,10 @@ export function useColumns({ session }: IColumnParams, originColumns: TableColum return function (props) { const { onRowChange, ...rest } = props; return ( - { if (!submit) { onRowChange(newRow, submit); diff --git a/src/page/Workspace/components/CreateTable/config/index.tsx b/src/page/Workspace/components/CreateTable/config/index.tsx index a8ff00c4d..c6090878e 100644 --- a/src/page/Workspace/components/CreateTable/config/index.tsx +++ b/src/page/Workspace/components/CreateTable/config/index.tsx @@ -14,9 +14,16 @@ * limitations under the License. */ -import { ConnectionMode } from '@/d.ts'; -import { getDataSourceModeConfigByConnectionMode } from '@/common/datasource'; +import { ConnectType, ConnectionMode } from '@/d.ts'; +import { + getDataSourceModeConfig, + getDataSourceModeConfigByConnectionMode, +} from '@/common/datasource'; export function useTableConfig(dialectType: ConnectionMode) { return getDataSourceModeConfigByConnectionMode(dialectType)?.schema?.table || {}; } + +export function useDataSourceConfig(type: ConnectType) { + return getDataSourceModeConfig(type); +} diff --git a/src/page/Workspace/components/EditableTable/Editors/CaseTextEditor.tsx b/src/page/Workspace/components/EditableTable/Editors/CaseTextEditor.tsx new file mode 100644 index 000000000..b70da0c3f --- /dev/null +++ b/src/page/Workspace/components/EditableTable/Editors/CaseTextEditor.tsx @@ -0,0 +1,129 @@ +/* + * 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 { EditOutlined } from '@ant-design/icons'; +import type { EditorProps } from '@oceanbase-odc/ob-react-data-grid'; +import { Input, Modal } from 'antd'; +import type { ChangeEvent } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; + +import type { TextAreaRef } from 'antd/lib/input/TextArea'; +import AntdEditorWrap from './AntdEditorWrap'; +import { CaseTextArea } from '@/component/Input/Case'; + +interface CaseOptions { + caseSensitive: boolean; + escapes: string; +} + +export function CaseTextEditor({ + row, + onRowChange, + column, + width, + caseSensitive, + escapes, +}: EditorProps & CaseOptions) { + const { key, name } = column; + const value = row[key]; + const editorRef = useRef(null); + const [modalTextValue, setModalTextValue] = useState(null); + const [isShowTextModal, setIsShowTextModal] = useState(false); + + useEffect(() => { + if (editorRef.current) { + setTimeout(() => { + editorRef.current?.focus(); + editorRef.current?.resizableTextArea.textArea.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER, + ); + }, 100); + } + }, [editorRef]); + + const innerOnChange = useCallback( + (e: ChangeEvent) => { + onRowChange({ ...row, [key]: e.target.value }); + }, + [onRowChange], + ); + + return ( + +
+ { + if (e.key === 'Tab') { + onRowChange(row, true); + e.preventDefault(); + } + }} + style={{ width: Math.max(width, 200), height: 68 }} + value={value} + onChange={innerOnChange} + autoSize={false} + /> + + + { + setModalTextValue(value); + setIsShowTextModal(true); + }} + style={{ position: 'absolute', bottom: 10, right: 18 }} + /> + +
+ {isShowTextModal ? ( + { + setIsShowTextModal(false); + setModalTextValue(null); + }} + onOk={() => { + onRowChange({ ...row, [key]: modalTextValue }, true); + }} + > + { + if (e.key === 'Enter') { + e.stopPropagation(); + } + }} + onChange={(e) => { + setModalTextValue(e.target.value); + }} + /> + + ) : null} +
+ ); +} diff --git a/src/page/Workspace/components/TablePage/index.tsx b/src/page/Workspace/components/TablePage/index.tsx index 797fd97e3..e05d1f14e 100644 --- a/src/page/Workspace/components/TablePage/index.tsx +++ b/src/page/Workspace/components/TablePage/index.tsx @@ -44,6 +44,7 @@ import { SessionManagerStore } from '@/store/sessionManager'; import SessionContext from '../SessionContextWrap/context'; import WrapSessionPage from '../SessionContextWrap/SessionPageWrap'; import styles from './index.less'; +import { getQuoteTableName } from '@/util/utils'; interface IProps { pageKey: string; @@ -100,7 +101,11 @@ const TablePage: React.FC = function ({ params, pageStore, pageKey, sett * 加一个校验的逻辑,避免名字不同步 */ const newTableName = newTable?.info?.tableName; - if (newTableName && newTableName !== params.tableName) { + if ( + newTableName && + newTableName !== + getQuoteTableName(params.tableName, session?.odcDatabase?.dataSource?.dialectType) + ) { setTable({ ...newTable, info: Object.assign({}, newTable?.info, { tableName: newTableName }), diff --git a/src/util/sql.ts b/src/util/sql.ts index 9838f7787..8910901f1 100644 --- a/src/util/sql.ts +++ b/src/util/sql.ts @@ -191,11 +191,13 @@ export function removeComment(text = '') { /** * 去除表名的引号,oracle中,表名可以用引号包裹来输入含大小写的字符,显示的时候我们需要去掉 */ -export function removeTableQuote(tableName: string) { +export function removeTableQuote(tableName: string, quote?: string) { if (!tableName || !tableName.trim()) { return ''; } - const tbReg = /^\"([^"]+)\"$/.exec(tableName) || /^\`([^"]+)\`$/.exec(tableName); + const tbReg = quote + ? new RegExp(`^${quote}([^${quote}]+)${quote}$`).exec(tableName) + : /^\"([^"]+)\"$/.exec(tableName) || /^\`([^"]+)\`$/.exec(tableName); return tbReg ? tbReg[1] : tableName; } From af070a82f46ea87788fb499e70891db2fd5f1816 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Mon, 5 Feb 2024 14:41:47 +0800 Subject: [PATCH 067/231] resolve oceanbase/odc#654 --- .../Datasource/NewDatasourceDrawer/Form/index.tsx | 2 +- src/page/Datasource/Info/NewDataBaseButton/index.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx index 097ee5f7b..118997185 100644 --- a/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx +++ b/src/page/Datasource/Datasource/NewDatasourceDrawer/Form/index.tsx @@ -303,7 +303,7 @@ export default forwardRef(function DatasourceForm( }} > {environments - ?.filter((env) => env?.enabled) + // ?.filter((env) => env?.enabled) ?.map((env) => { return (
+ {set.label}} + label={ + + {set.label} + {!!set.tip && ( + + {set.tip} + + )} + + } name={set.key} key={set.key} > @@ -135,10 +164,10 @@ const ODCSetting: React.FC = () => { {groupData?.secondGroup.size == index + 1 ? (
) : null} - + ); })} - + ); })} diff --git a/src/store/setting.ts b/src/store/setting.ts index 40cf50783..3a9d3bf0d 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -323,6 +323,7 @@ export class SettingStore { try { console.log('server buildTime:', new Date(info.buildTime)); console.log('server version:', info.version); + console.log('odc version:', ODC_VERSION); } catch (e) {} this.serverSystemInfo = info; } From 3fd1cbddf92c6eda84b23c0cea1577c90ab7ff33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Mon, 19 Feb 2024 17:01:45 +0800 Subject: [PATCH 074/231] PullRequest: 319 feat: filter datasource and add a tip when task's type is structureComparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-odc-816-UIAndFilterDatasource of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/319 Signed-off-by: 晓康 * feat: filter datasource and add a tip when task's type is structureComparison --- .../CreateModal/index.tsx | 9 +++- src/component/Task/component/Status/index.tsx | 54 +++++++++++-------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/component/Task/StructureComparisonTask/CreateModal/index.tsx b/src/component/Task/StructureComparisonTask/CreateModal/index.tsx index 0ba095565..56b0966f5 100644 --- a/src/component/Task/StructureComparisonTask/CreateModal/index.tsx +++ b/src/component/Task/StructureComparisonTask/CreateModal/index.tsx @@ -5,6 +5,7 @@ import FormItemPanel from '@/component/FormItemPanel'; import { ModalStore } from '@/store/modal'; import { inject, observer } from 'mobx-react'; import { + ConnectionMode, CreateStructureComparisonTaskRecord, TaskExecStrategy, TaskPageType, @@ -55,7 +56,6 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => }; const handleReset = () => { form?.resetFields(); - // crontabRef.current?.resetFields(); setHasEdit(false); }; @@ -119,6 +119,13 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => type={TaskType.STRUCTURE_COMPARISON} label="源端数据库" projectId={projectId} + filters={{ + dialectTypes: [ + ConnectionMode.MYSQL, + ConnectionMode.OB_MYSQL, + ConnectionMode.OB_ORACLE, + ], + }} placeholder={'请选择'} /> = (props) => { } const statusObj = statusInfo[_status]; return ( - - {statusObj ? ( - <> - {statusObj.icon} - - {statusObj.text} - - {!isNil(progress) && _status === TaskStatus.EXECUTING ? ` (${progress}%) ` : null} - - ) : null} - + + {statusObj ? ( + <> + {statusObj.icon} + + {statusObj.text} + + {!isNil(progress) && _status === TaskStatus.EXECUTING ? ` (${progress}%) ` : null} + + ) : null} + + ); }; export default StatusLabel; From f8eef63320d2673614971d14f83f768eab8bc5e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Mon, 19 Feb 2024 17:37:10 +0800 Subject: [PATCH 075/231] PullRequest: 320 Fixes oceanbase/odc#1552, Fixes oceanbase/odc#1553, Fixes oceanbase/odc#1554 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-odc-1552-1553-1554 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/320 Signed-off-by: 晓康 * Fixes oceanbase/odc#1552, Fixes oceanbase/odc#1553, Fixes oceanbase/odc#1554 --- .../SSO/NewSSODrawerButton/SSOForm/PartForm.tsx | 2 +- src/util/broadcastChannel.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx index 6da91fbf6..404d9e40d 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx @@ -377,7 +377,7 @@ export const LDAPPartForm: React.FC<{ } rules={[requiredRule]} > - + this.addSingle(_channelName)); return this; } return this.addSingle(channelName); @@ -75,7 +75,7 @@ class Channel { callback: (data?: any) => void, callbackedClose: boolean = false, ) { - if (this.channelMap.has(channelName)) { + if (this.isExists(channelName)) { this.channelMap.get(channelName).addEventListener('message', ({ data }) => { callback?.(data); callbackedClose && this.close(channelName); From 1a77cde63b268135fee01bb0d93a6f7edd1df55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Tue, 20 Feb 2024 11:22:08 +0800 Subject: [PATCH 076/231] PullRequest: 318 task editable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-dataArchiveTask-editable-0206 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/318 Signed-off-by: 晓康 * feat: DataArchiveTask (editable) * feat: DataClearTask (editable) * feat: DataMockerTask (editable) * feat: ApplyDatabasePermission (editable) * chore: ApplyDatabasePermission (clear invalid parameters) --- .../CreateModal/index.tsx | 52 ++++++--- .../DataArchiveTask/CreateModal/index.tsx | 30 +++-- .../Task/DataClearTask/CreateModal/index.tsx | 104 +++++++++++++----- .../Task/DataMockerTask/CreateModal/index.tsx | 42 ++++++- .../Task/component/ActionBar/index.tsx | 85 +++++++++----- .../Task/component/DatabaseSelecter/index.tsx | 19 +--- src/store/modal.ts | 24 +++- 7 files changed, 252 insertions(+), 104 deletions(-) diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx index f29a9bee5..87cecc8f4 100644 --- a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx +++ b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx @@ -178,15 +178,6 @@ const CreateModal: React.FC = (props) => { hadleReset(); } }; - - - - useEffect(() =>{ - if(applyDatabasePermissionVisible){ - form.setFieldValue('projectId', props?.projectId); - } - }, [applyDatabasePermissionVisible, props?.projectId]) - const handleSubmit = () => { form .validateFields() @@ -223,12 +214,40 @@ const CreateModal: React.FC = (props) => { }); }; - useEffect(() => { - const { projectId, databaseId } = applyDatabasePermissionData ?? {}; - form.setFieldsValue({ + const loadEditData = async () => { + const { task } = applyDatabasePermissionData; + const { + parameters: { + project: { id: projectId }, + databases, + types, + applyReason + }, + executionStrategy, + } = task; + const formData = { projectId, - databaseId - }); + executionStrategy, + databases: databases?.map(item => item.id), + types, + applyReason + }; + form.setFieldsValue(formData); + }; + + const handleResetDatabase = () =>{ + form.setFieldValue('databases', []); + } + + useEffect(() => { + const { projectId } = applyDatabasePermissionData ?? {}; + if (applyDatabasePermissionData?.task) { + loadEditData(); + }else{ + form.setFieldsValue({ + projectId: projectId || props?.projectId + }); + } }, [applyDatabasePermissionData]); return ( @@ -258,7 +277,9 @@ const CreateModal: React.FC = (props) => { >
= (props) => { filterOption={(input, option) => (option?.label ?? '').toLowerCase().includes(input.toLowerCase()) } + onChange={handleResetDatabase} />
diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.tsx b/src/component/Task/DataArchiveTask/CreateModal/index.tsx index 8091642f6..25a60775e 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/index.tsx @@ -117,7 +117,7 @@ const getVariables = ( }); }; -const getVariableValue = ( +export const getVariableValue = ( value: { name: string; pattern: string; @@ -167,8 +167,9 @@ const CreateModal: React.FC = (props) => { setValue: (value: ICrontab) => void; resetFields: () => void; }>(); - const { dataArchiveVisible, dataArchiveEditId } = modalStore; - const isEdit = !!dataArchiveEditId; + const { dataArchiveVisible, dataArchiveTaskData } = modalStore; + const dataArchiveEditId = dataArchiveTaskData?.id; + const isEdit = !!dataArchiveEditId && dataArchiveTaskData?.type === 'EDIT'; const loadEditData = async (editId: number) => { const data = await getCycleTaskDetail(editId); const { @@ -375,6 +376,19 @@ const CreateModal: React.FC = (props) => { setCrontab(null); setHasEdit(false); }; + + const getDrawerTitle = () =>{ + let title = '新建数据归档'; + if(dataArchiveEditId){ + if(isEdit){ + title = '编辑数据归档'; + }else{ + title = '再次发起数据归档'; + } + } + return title; + } + useEffect(() => { if (!dataArchiveVisible) { handleReset(); @@ -400,15 +414,7 @@ const CreateModal: React.FC = (props) => { destroyOnClose className={styles['data-archive']} width={760} - title={ - isEdit - ? formatMessage({ - id: 'odc.DataArchiveTask.CreateModal.EditDataArchive', - }) //编辑数据归档 - : formatMessage({ - id: 'odc.DataArchiveTask.CreateModal.CreateADataArchive', - }) //新建数据归档 - } + title={getDrawerTitle()} footer={ - - } - onClose={() => { - onClose(); - }} - > -
- 权限详情 -
- - ); -}; - -export default DetailModal; diff --git a/src/page/Project/User/ManageModal/TaskApplyList/index.tsx b/src/page/Project/User/ManageModal/TaskApplyList/index.tsx index 22a1dff98..9452ec765 100644 --- a/src/page/Project/User/ManageModal/TaskApplyList/index.tsx +++ b/src/page/Project/User/ManageModal/TaskApplyList/index.tsx @@ -19,7 +19,8 @@ import { CommonTableMode, ITableLoadOptions, ITableInstance } from '@/component/ import { getExpireTimeLabel } from '@/component/Task/ApplyDatabasePermission'; import { DatabasePermissionStatus, IDatabasePermission } from '@/d.ts/project'; import type { IResponseData } from '@/d.ts'; -import DetailModal from '../DetailModal'; +import { TaskType } from '@/d.ts'; +import TaskDetailModal from '@/component/Task/DetailModal'; import { databasePermissionTypeFilters, databasePermissionTypeMap, databasePermissionStatusFilters } from '../'; import StatusLabel from '../Status'; @@ -30,7 +31,7 @@ import React, { useState } from 'react'; const getColumns = (params: { paramOptions: ITableLoadOptions; - onOpenDetail: (id: number, visible: boolean) => void; + onOpenDetail: (task: { id: number; }, visible: boolean) => void; onReclaim: (id: number[]) => void; }) => { const { filters, sorter } = params.paramOptions ?? {}; @@ -104,6 +105,17 @@ const getColumns = (params: { ), filteredValue: filters?.ticketId || null, filters: [], + render: (ticketId) => { + return ( + { + params?.onOpenDetail({ id: ticketId}, true); + }} + > + {ticketId} + + ) + } }, { dataIndex: 'type', @@ -137,7 +149,7 @@ const getColumns = (params: { return ( { + onClick={() => { params?.onReclaim([record.id]); }} > @@ -166,16 +178,12 @@ const TaskApplyList: React.FC = (props) => { const [detailId, setDetailId] = useState(null); const [detailVisible, setDetailVisible] = useState(false); - const handleDetailVisible = (id: number, visible: boolean = false) => { + const handleDetailVisible = (task: { id: number }, visible: boolean = false) => { + const { id } = task ?? {}; setDetailId(id); setDetailVisible(visible); }; - const handleDetailClose = () => { - setDetailId(null); - setDetailVisible(false); - }; - const columns = getColumns({ paramOptions: params, onOpenDetail: handleDetailVisible, @@ -221,7 +229,13 @@ const TaskApplyList: React.FC = (props) => { }, }} /> - + ); }; diff --git a/src/page/Project/User/ManageModal/UserAuthList/index.tsx b/src/page/Project/User/ManageModal/UserAuthList/index.tsx index 565a1d341..44d3a1259 100644 --- a/src/page/Project/User/ManageModal/UserAuthList/index.tsx +++ b/src/page/Project/User/ManageModal/UserAuthList/index.tsx @@ -19,7 +19,6 @@ import { CommonTableMode, ITableLoadOptions, ITableInstance } from '@/component/ import { getExpireTimeLabel } from '@/component/Task/ApplyDatabasePermission'; import { DatabasePermissionStatus, IDatabasePermission } from '@/d.ts/project'; import type { IResponseData } from '@/d.ts'; -import DetailModal from '../DetailModal'; import { databasePermissionTypeFilters, databasePermissionTypeMap, databasePermissionStatusFilters } from '../'; import StatusLabel from '../Status'; @@ -30,7 +29,6 @@ import React, { useState } from 'react'; const getColumns = (params: { paramOptions: ITableLoadOptions; - onOpenDetail: (id: number, visible: boolean) => void; onReclaim: (id: number[]) => void; }) => { const { filters, sorter } = params.paramOptions ?? {}; @@ -140,22 +138,8 @@ interface IProps { const UserAuthList: React.FC = (props) => { const { projectId, isOwner, dataSource, params, description, tableRef, onReclaim, onLoad, onChange } = props; - const [detailId, setDetailId] = useState(null); - const [detailVisible, setDetailVisible] = useState(false); - - const handleDetailVisible = (id: number, visible: boolean = false) => { - setDetailId(id); - setDetailVisible(visible); - }; - - const handleDetailClose = () => { - setDetailId(null); - setDetailVisible(false); - }; - const columns = getColumns({ paramOptions: params, - onOpenDetail: handleDetailVisible, onReclaim: onReclaim, }) @@ -198,7 +182,6 @@ const UserAuthList: React.FC = (props) => { }, }} /> - ); }; From eebd375f97b0b8ed23851a55cb33493d1619b615 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 21 Feb 2024 16:48:07 +0800 Subject: [PATCH 085/231] remove old components --- src/component/GlobalHeader/index.less | 102 -------- src/component/GlobalHeader/index.tsx | 96 -------- src/component/LoginMenus/UserConfig.tsx | 145 ------------ src/component/LoginMenus/index.less | 39 ---- src/component/LoginMenus/index.tsx | 221 ------------------ src/component/TemplateInsertModal/index.tsx | 2 +- src/component/ThemeBtn/index.tsx | 60 ----- src/layout/Header.less | 8 - src/layout/Header.tsx | 33 --- .../SpaceContainer/Sider/MineItem/Theme.tsx | 1 - .../SpaceContainer/Sider/MineItem/index.tsx | 40 +--- src/page/Workspace/ActivityBar/ index.tsx | 2 +- src/store/modal.ts | 10 +- 13 files changed, 4 insertions(+), 755 deletions(-) delete mode 100644 src/component/GlobalHeader/index.less delete mode 100644 src/component/GlobalHeader/index.tsx delete mode 100644 src/component/LoginMenus/UserConfig.tsx delete mode 100644 src/component/LoginMenus/index.less delete mode 100644 src/component/LoginMenus/index.tsx delete mode 100644 src/component/ThemeBtn/index.tsx delete mode 100644 src/layout/Header.less delete mode 100644 src/layout/Header.tsx diff --git a/src/component/GlobalHeader/index.less b/src/component/GlobalHeader/index.less deleted file mode 100644 index dc496d4c1..000000000 --- a/src/component/GlobalHeader/index.less +++ /dev/null @@ -1,102 +0,0 @@ -@font-face { - font-family: 'DIN-Bold'; - src: url('../../../public/DIN-Alternate-Bold.woff'); -} - -@font-face { - font-family: 'Alibaba-puhui-title'; - src: url('../../../public/alibaba-puhui-title.woff'); -} - -@pro-header-hover-bg: rgba(0, 0, 0, 0.025); - -.header { - position: relative; - display: flex; - align-items: center; - justify-content: space-between; - height: 40px; - padding: 10px 16px 10px 16px; - line-height: 32px; - background: transparent; -} - -:global(.ant-layout-header) { - background: transparent; -} - -.leftContent { - display: flex; - align-items: center; - - .logo { - display: flex; - align-items: center; - height: 20px; - .buttonIcon { - margin-right: 5px; - color: rgba(255, 255, 255); - font-size: 32px; - } - .title { - color: #fff; - font-size: 18px; - font-family: DIN-Bold, Alibaba-puhui-title, PingFangSC-Medium, Microsoft YaHei; - } - img { - display: block; - height: 100%; - } - } - - .divider { - width: 1px; - height: 24px; - margin: 0 18px; - border-left: 1px solid var(--divider-color); - } - - .title { - color: rgba(255, 255, 255, 0.85); - font-size: 14px; - // padding - font-family: PingFangSC-Regular; - } -} - -.rightContent { - display: flex; - align-items: center; - color: var(--text-color-primary); - - > div:last-child { - margin-right: 0; - } - - .logout { - &:hover { - cursor: pointer; - } - } - - .divider { - width: 1px; - height: 20px; - margin: 0 8px; - border-left: 1px solid var(--divider-color); - } -} -.locale { - padding: 0 8px; - font-family: PingFangSC-Regular; - cursor: pointer; -} -.userInfo { - padding: 0 8px; -} -.locale, -.userInfo { - &:hover { - background: #f4f4f4; - } -} diff --git a/src/component/GlobalHeader/index.tsx b/src/component/GlobalHeader/index.tsx deleted file mode 100644 index a6fec561b..000000000 --- a/src/component/GlobalHeader/index.tsx +++ /dev/null @@ -1,96 +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 HelpMenus from '@/component/HelpMenus'; -import LocalMenus from '@/component/LocalMenus'; -import LoginMenus from '@/component/LoginMenus'; -import RecordPopover from '@/component/RecordPopover'; -import TaskPopover from '@/component/TaskPopover'; -import odc from '@/plugins/odc'; -import { UserStore } from '@/store/login'; -import { ModalStore } from '@/store/modal'; -import { SettingStore } from '@/store/setting'; -import { ReactComponent as ODCBlackSvg } from '@/svgr/odc_black.svg'; -import { formatMessage } from '@/util/intl'; -import Icon from '@ant-design/icons'; -import { inject, observer } from 'mobx-react'; -import { PureComponent } from 'react'; -import HeaderBtn from '../HeaderBtn'; -import UserConfig from '../LoginMenus/UserConfig'; -import ThemeBtn from '../ThemeBtn'; -import styles from './index.less'; - -@inject('userStore', 'settingStore', 'modalStore') -@observer -export default class GlobalHeader extends PureComponent<{ - userStore?: UserStore; - settingStore?: SettingStore; - modalStore?: ModalStore; -}> { - public render() { - return ( -
-
-
- - - { - this.props.settingStore?.serverSystemInfo?.odcTitle || - formatMessage({ - id: 'odc.component.GlobalHeader.OceanbaseDeveloperCenter', - }) //OceanBase 开发者中心 - } - -
-
-
- - {this.props.settingStore.enablePersonalRecord ? : null} -
- - - {odc.appConfig.locale.menu ? : null} - {odc.appConfig.login.menu ? ( - <> -
- - - ) : ( - <> - { - this.props.modalStore.changeUserConfigModal(true); - }} - > - { - formatMessage({ - id: 'odc.component.LoginMenus.PersonalSettings', - }) /* 个人设置 */ - } - - { - this.props.modalStore.changeUserConfigModal(false); - }} - /> - - )} -
-
- ); - } -} diff --git a/src/component/LoginMenus/UserConfig.tsx b/src/component/LoginMenus/UserConfig.tsx deleted file mode 100644 index b2c04d0c3..000000000 --- a/src/component/LoginMenus/UserConfig.tsx +++ /dev/null @@ -1,145 +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 UserConfigForm from '@/component/UserConfigForm'; -import { SettingStore } from '@/store/setting'; -import { formatMessage } from '@/util/intl'; -import { Button, Drawer, message, Modal, Space } from 'antd'; -import type { FormInstance } from 'antd/lib/form'; -import { inject, observer } from 'mobx-react'; -import React from 'react'; -import styles from './index.less'; - -interface IProps { - visible: boolean; - onCloseModal: () => void; - settingStore?: SettingStore; -} - -interface IState { - hasEdit: boolean; -} - -@inject('settingStore') -@observer -class UserConfig extends React.PureComponent { - public formRef = React.createRef(); - - readonly state = { - hasEdit: false, - }; - - componentDidMount() {} - - private handlePost = async (data) => { - const res = await this.props.settingStore.updateUserConfig(data); - if (res) { - message.success( - formatMessage({ - id: 'odc.component.LoginMenus.UserConfig.PersonalSettingsSaved', - }), // 个人设置保存成功 - ); - this.closeModal(); - } - }; - - private handleSave = async () => { - this.formRef.current - .validateFields() - .then((data) => { - this.handlePost(data); - }) - .catch((error) => { - throw new Error(JSON.stringify(error)); - }); - }; - - private handleCancel = () => { - const { hasEdit } = this.state; - if (hasEdit) { - Modal.confirm({ - title: formatMessage({ - id: 'odc.component.LoginMenus.UserConfig.AreYouSureYouWant', - }), // 确认取消修改个人配置吗 - centered: true, - onOk: () => { - this.formRef.current.resetFields(); - this.closeModal(); - }, - }); - } else { - this.closeModal(); - } - }; - - private closeModal = () => { - this.setState({ - hasEdit: false, - }); - - this.props.onCloseModal(); - }; - - private handleValueChange = () => { - this.setState({ - hasEdit: true, - }); - }; - - render() { - const { - visible, - settingStore: { configurations }, - } = this.props; - return ( - - - - - } - onClose={this.handleCancel} - > - - - ); - } -} - -export default UserConfig; diff --git a/src/component/LoginMenus/index.less b/src/component/LoginMenus/index.less deleted file mode 100644 index f1c8bc075..000000000 --- a/src/component/LoginMenus/index.less +++ /dev/null @@ -1,39 +0,0 @@ -.login { - padding: 0 8px; - line-height: 32px; - &:hover { - background: #f4f4f4; - cursor: pointer; - } -} -.userConfig { - :global { - .ant-drawer-footer { - display: flex; - justify-content: flex-end; - } - } -} - -.userMenu { - width: 160px; - .userName { - font-weight: bold; - } - .userName, - .userRoles { - :global { - .ant-dropdown-menu-title-content { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - word-break: keep-all; - } - } - } - :global { - .ant-divider-horizontal { - margin: 0; - } - } -} diff --git a/src/component/LoginMenus/index.tsx b/src/component/LoginMenus/index.tsx deleted file mode 100644 index e8ab87496..000000000 --- a/src/component/LoginMenus/index.tsx +++ /dev/null @@ -1,221 +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 ChangePasswordModal from '@/component/ChangePasswordModal'; -import DropdownMenu from '@/component/DropdownMenu'; -import { IUser } from '@/d.ts'; -import type { UserStore } from '@/store/login'; -import type { ModalStore } from '@/store/modal'; -import { SettingStore } from '@/store/setting'; -import { isClient } from '@/util/env'; -import { formatMessage } from '@/util/intl'; -import { Divider, Menu, MenuProps, message, Tooltip } from 'antd'; -import { inject, observer } from 'mobx-react'; -import React from 'react'; -import ChangeLockPwdModal from './ChangeLockPwdModal'; -import styles from './index.less'; -import UserConfig from './UserConfig'; - -interface IProps { - userStore?: UserStore; - settingStore?: SettingStore; - modalStore?: ModalStore; -} - -interface IState { - changePasswordModalVisible: boolean; - changeLockPwdModalVisible: boolean; - changePasswordLoading: boolean; -} - -@inject('userStore', 'settingStore', 'modalStore') -@observer -class LoginMenus extends React.PureComponent { - public readonly state = { - changePasswordModalVisible: false, - changeLockPwdModalVisible: false, - changePasswordLoading: false, - }; - - public handleLogout = async () => { - const { userStore } = this.props; - try { - await userStore.logout(); - message.success(formatMessage({ id: 'login.logout.success' })); - // 专有云 - 重新获取登录定向地址 - userStore.gotoLogoutPage(); - } catch (e) {} - }; - - public onChangePassword = async (data: { currentPassword: string; newPassword: string }) => { - const { userStore } = this.props; - this.setState({ - changePasswordLoading: true, - }); - - const success = await userStore.changePassword(data); - if (success) { - this.handleChangeModalState('changePasswordModalVisible'); - message.success( - formatMessage({ - id: 'password.change.success', - }), - ); - } - - this.setState({ - changePasswordLoading: false, - }); - }; - - private handleChangeModalState = (type: keyof IState, visible?: boolean) => { - this.setState({ - [type]: visible || false, - } as Pick); - }; - - private getMenu = (user: Partial) => { - const isThridPartyLogin = !!this.props.settingStore.serverSystemInfo?.ssoLoginEnabled; - const RoleNames = user?.roles?.length - ? user?.roles - ?.filter((item) => item.enabled) - ?.map((role) => role.name) - ?.join(' | ') - : '-'; - const userName = `${user?.name}(${user?.accountName})`; - let items: MenuProps['items'] = !isClient() - ? [ - { - key: 'userName', - className: styles.userName, - label: {userName}, - }, - { - key: 'userRoles', - className: styles.userRoles, - label: {RoleNames}, - }, - { - type: 'divider', - }, - ] - : []; - items = items - .concat({ - onClick: () => { - this.props.modalStore.changeUserConfigModal(true); - }, - label: formatMessage({ - id: 'odc.component.LoginMenus.PersonalSettings', - }), - key: 'personalSettings', - }) - .concat( - !isClient() && !isThridPartyLogin - ? { - key: 'changePassword', - onClick: () => { - this.handleChangeModalState('changePasswordModalVisible', true); - }, - label: formatMessage({ - id: 'odc.component.GlobalHeader.ChangePassword', - }), - } - : null, - ) - .concat( - isClient() - ? { - key: 'changeLockPwd', - onClick: () => { - this.handleChangeModalState('changeLockPwdModalVisible', true); - }, - label: formatMessage({ - id: 'odc.component.LoginMenus.ApplicationPassword', - }), - } - : null, - ) - .concat( - !isClient() - ? { - key: 'logout', - onClick: this.handleLogout, - label: formatMessage({ - id: 'odc.component.GlobalHeader.LogOut', - }), - } - : null, - ) - .filter(Boolean); - return { - className: !isClient() ? styles.userMenu : '', - items, - }; - }; - - render() { - const { - userStore: { user }, - settingStore, - modalStore, - } = this.props; - const { - changePasswordModalVisible, - changeLockPwdModalVisible, - changePasswordLoading, - } = this.state; - const isThridPartyLogin = !!settingStore.serverSystemInfo?.ssoLoginEnabled; - return ( - <> - - { - !isClient() - ? user?.accountName - : formatMessage({ id: 'odc.component.LoginMenus.Account' }) // 账户 - } - - { - modalStore.changeUserConfigModal(false); - }} - /> - - {!isClient() && !isThridPartyLogin ? ( - { - this.handleChangeModalState('changePasswordModalVisible'); - }} - onSave={this.onChangePassword} - confirmLoading={changePasswordLoading} - /> - ) : null} - {isClient() ? ( - { - this.handleChangeModalState('changeLockPwdModalVisible'); - }} - /> - ) : null} - - ); - } -} - -export default LoginMenus; diff --git a/src/component/TemplateInsertModal/index.tsx b/src/component/TemplateInsertModal/index.tsx index a32329422..5f4245fe3 100644 --- a/src/component/TemplateInsertModal/index.tsx +++ b/src/component/TemplateInsertModal/index.tsx @@ -78,7 +78,7 @@ const TemplateInsertModal: React.FC = function (props) { type="link" size="small" onClick={() => { - modalStore.changeUserConfigModal(true); + modalStore.changeOdcSettingVisible(true); }} > { diff --git a/src/component/ThemeBtn/index.tsx b/src/component/ThemeBtn/index.tsx deleted file mode 100644 index 121476312..000000000 --- a/src/component/ThemeBtn/index.tsx +++ /dev/null @@ -1,60 +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 { SettingStore } from '@/store/setting'; -import { formatMessage } from '@/util/intl'; -import { Menu } from 'antd'; -import { inject, observer } from 'mobx-react'; -import React from 'react'; -import DropdownMenu from '../DropdownMenu'; - -interface IProps { - settingStore?: SettingStore; -} - -const ThemeBtn: React.FC = function ({ settingStore }) { - const currentTheme = settingStore.theme?.key; - return ( - { - if (key != currentTheme) { - settingStore.setTheme(key); - } - }, - items: [ - { - key: 'odc-white', - label: formatMessage({ - id: 'odc.component.ThemeBtn.DefaultTheme', - }) /*默认主题*/, - }, - { - key: 'odc-dark', - label: formatMessage({ - id: 'odc.component.ThemeBtn.DarkTheme', - }) /*暗黑主题*/, - }, - ], - }} - > - {formatMessage({ id: 'odc.component.ThemeBtn.Theme' }) /*主题*/} - - ); -}; - -export default inject('settingStore')(observer(ThemeBtn)); diff --git a/src/layout/Header.less b/src/layout/Header.less deleted file mode 100644 index cc2da9629..000000000 --- a/src/layout/Header.less +++ /dev/null @@ -1,8 +0,0 @@ -.fixedHeader { - position: fixed; - top: 0; - right: 0; - z-index: 9; - width: 100%; - transition: width 0.2s; -} diff --git a/src/layout/Header.tsx b/src/layout/Header.tsx deleted file mode 100644 index 3c25a83c1..000000000 --- a/src/layout/Header.tsx +++ /dev/null @@ -1,33 +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 GlobalHeader from '@/component/GlobalHeader'; -import { Layout } from 'antd'; -import { PureComponent } from 'react'; - -const { Header } = Layout; - -export default class HeaderView extends PureComponent<{ - style: any; -}> { - public render() { - return ( -
- -
- ); - } -} diff --git a/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx b/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx index 8d29a3346..780d11eb9 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/Theme.tsx @@ -20,7 +20,6 @@ import { Menu } from 'antd'; import { inject, observer } from 'mobx-react'; import React from 'react'; import DropMenu from '../DropMenu'; -import MenuItem from '../DropMenu/MenuItem'; interface IProps { settingStore?: SettingStore; diff --git a/src/layout/SpaceContainer/Sider/MineItem/index.tsx b/src/layout/SpaceContainer/Sider/MineItem/index.tsx index a2450a9d9..2141d1a3a 100644 --- a/src/layout/SpaceContainer/Sider/MineItem/index.tsx +++ b/src/layout/SpaceContainer/Sider/MineItem/index.tsx @@ -16,7 +16,6 @@ import ChangePasswordModal from '@/component/ChangePasswordModal'; import ChangeLockPwd from '@/component/LoginMenus/ChangeLockPwdModal'; -import UserConfig from '@/component/LoginMenus/UserConfig'; import RecordPopover, { RecordRef } from '@/component/RecordPopover/index2'; import { UserStore } from '@/store/login'; import { SettingStore } from '@/store/setting'; @@ -29,8 +28,6 @@ import DropMenu from '../DropMenu'; import { ModalStore } from '@/store/modal'; import styles from './index.less'; -import Locale from './Locale'; -import Theme from './Theme'; import tracert from '@/util/tracert'; import { ItemType } from 'antd/es/menu/hooks/useItems'; @@ -38,16 +35,9 @@ interface IProps { userStore?: UserStore; settingStore?: SettingStore; modalStore?: ModalStore; - enableTheme?: boolean; } -const MineItem: React.FC = function ({ - children, - userStore, - settingStore, - modalStore, - enableTheme, -}) { +const MineItem: React.FC = function ({ children, userStore, settingStore, modalStore }) { const { user } = userStore; const [changePasswordModalVisible, setChangePasswordModalVisible] = useState(false); const [changeLockPwdModalVisible, setChangeLockPwdModalVisible] = useState(false); @@ -64,11 +54,6 @@ const MineItem: React.FC = function ({ : '-'; const userName = `${user?.name}(${user?.accountName})`; - function onConfigClick() { - tracert.click('a3112.b46782.c330850.d367365'); - modalStore.changeUserConfigModal(true); - } - const onChangePassword = async (data: { currentPassword: string; newPassword: string }) => { setChangePasswordLoading(true); @@ -140,24 +125,7 @@ const MineItem: React.FC = function ({ }, }); } - menu.push({ - label: , - key: 'locale', - }); - if (enableTheme) { - menu.push({ - label: , - key: 'theme', - }); - } - menu.push({ - key: 'config', - label: formatMessage({ - id: 'odc.Sider.MineItem.Preferences', - }), - onClick: onConfigClick, - }); if (settingStore.enablePersonalRecord) { menu.push({ key: 'record', @@ -204,12 +172,6 @@ const MineItem: React.FC = function ({ > {children} - { - modalStore.changeUserConfigModal(false); - }} - /> {!isClient() && havePasswordLogin ? ( = function () { label={formatMessage({ id: 'odc.Index.Sider.Help' })} /*帮助*/ /> - + Date: Wed, 21 Feb 2024 17:22:33 +0800 Subject: [PATCH 086/231] add client data support --- src/component/ODCSetting/index.tsx | 46 ++++++++++++++++++++++++++++-- src/main/renderService/index.ts | 19 ++++++++++++ src/util/client/index.ts | 8 ++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/component/ODCSetting/index.tsx b/src/component/ODCSetting/index.tsx index 43f5e050a..4f708bbfa 100644 --- a/src/component/ODCSetting/index.tsx +++ b/src/component/ODCSetting/index.tsx @@ -1,10 +1,15 @@ import { Button, Col, Form, Modal, Row, Space, Tabs, Typography } from 'antd'; import React, { useEffect, useMemo, useRef, useState } from 'react'; -import odcSetting, { IODCSetting, ODCSettingGroup } from './config'; +import odcSetting, { IODCSetting, ODCSettingGroup, odcSettingMap } from './config'; import styles from './index.less'; import { inject, observer } from 'mobx-react'; import { ModalStore } from '@/store/modal'; +import setting from '@/store/setting'; +import { IUserConfig } from '@/d.ts'; +import { getODCSetting, saveODCSetting } from '@/util/client'; +import { isClient } from '@/util/env'; +import { safeParseJson } from '@/util/utils'; interface IProps { modalStore?: ModalStore; @@ -98,8 +103,21 @@ const ODCSetting: React.FC = ({ modalStore }) => { }; } + async function loadData() { + let data = setting.configurations || {}; + if (isClient()) { + const clientData = safeParseJson(await getODCSetting(), {}); + data = { ...data, ...clientData }; + } + formRef.setFieldsValue(data); + } + useEffect(() => { + if (!modalStore.odcSettingVisible) { + return; + } const clear = addListener(); + loadData(); return () => { clear(); }; @@ -107,7 +125,31 @@ const ODCSetting: React.FC = ({ modalStore }) => { async function save() { const values = await formRef.validateFields(); - console.log(values); + const serverData: Record = {}, + localData = {}; + Object.keys(values).forEach((key) => { + const info = odcSettingMap[key]; + switch (info.storeType) { + case 'server': { + serverData[key] = values[key]; + break; + } + case 'local': { + localData[key] = values[key]; + break; + } + } + }); + /** + * submit serverData + */ + await setting.updateUserConfig(serverData as any); + /** + * submit localData + */ + if (isClient()) { + await saveODCSetting(JSON.stringify(localData)); + } } function reset() { diff --git a/src/main/renderService/index.ts b/src/main/renderService/index.ts index e978f14c4..7c312a9ea 100644 --- a/src/main/renderService/index.ts +++ b/src/main/renderService/index.ts @@ -18,6 +18,8 @@ * 提供给render的服务 */ import { app, dialog, ipcMain, shell } from 'electron'; +import fs from 'fs'; +import path from 'path'; import MainServer from '../server/main'; import { default as clientLog } from '../utils/log'; import feedbackImpl from './feedback'; @@ -86,4 +88,21 @@ export function initRenderService() { return path?.[0]; } }); + + ipcMain.handle('saveODCSetting', (e, settingText: string) => { + const savePath = path.resolve(app.getPath('exe'), 'setting.json'); + /** + * 保存内容settingText到文件 setting.json + */ + fs.writeFileSync(savePath, settingText); + return savePath; + }); + + ipcMain.handle('getODCSetting', (e) => { + const savePath = path.resolve(app.getPath('exe'), 'setting.json'); + /** + * 保存内容settingText到文件 setting.json + */ + return fs.readFileSync(savePath).toString(); + }); } diff --git a/src/util/client/index.ts b/src/util/client/index.ts index 0085f6543..4042c09bf 100644 --- a/src/util/client/index.ts +++ b/src/util/client/index.ts @@ -37,6 +37,14 @@ export async function changeLockPwd(originPwd: string, pwd: string) { return await ipcInvoke('changeLockPwd', originPwd, pwd); } +export async function saveODCSetting(text: string) { + return await ipcInvoke('saveODCSetting', text); +} + +export async function getODCSetting(): Promise { + return await ipcInvoke('getODCSetting'); +} + /** * 选择一个文件夹 */ From 5092ff4fe555bcb7e1864a5897523291e16217e0 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 21 Feb 2024 17:58:04 +0800 Subject: [PATCH 087/231] support oracle nls typef --- .../MonacoEditor/plugins/ob-language/service.ts | 4 +++- .../CreateModal/RuleContent/index.tsx | 14 +++----------- .../CreateModal/ImportForm/ConfigPanel/index.tsx | 4 +++- .../components/DDLResultSet/hooks/useColumns.tsx | 2 +- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/component/MonacoEditor/plugins/ob-language/service.ts b/src/component/MonacoEditor/plugins/ob-language/service.ts index bf184fd08..7c1e4b779 100644 --- a/src/component/MonacoEditor/plugins/ob-language/service.ts +++ b/src/component/MonacoEditor/plugins/ob-language/service.ts @@ -54,7 +54,9 @@ export function getModelService( async getTableColumns(tableName: string, dbName?: string) { const realTableName = getRealNameInDatabase( tableName, - sessionFunc()?.connection?.dialectType === ConnectionMode.OB_ORACLE, + [ConnectionMode.OB_ORACLE, ConnectionMode.ORACLE].includes( + sessionFunc()?.connection?.dialectType, + ), ); if (!hasConnect(sessionFunc())) { return; diff --git a/src/component/Task/DataMockerTask/CreateModal/RuleContent/index.tsx b/src/component/Task/DataMockerTask/CreateModal/RuleContent/index.tsx index 7e6c37055..4ab65cb6b 100644 --- a/src/component/Task/DataMockerTask/CreateModal/RuleContent/index.tsx +++ b/src/component/Task/DataMockerTask/CreateModal/RuleContent/index.tsx @@ -79,7 +79,7 @@ interface IRuleContentProps { * 获取是否为浮点型 */ function getNumberType(dbMode: ConnectionMode, columnType: string) { - if (dbMode === ConnectionMode.OB_ORACLE) { + if (dbMode === ConnectionMode.OB_ORACLE || dbMode === ConnectionMode.ORACLE) { return 'float'; } if (['DECIMAL', 'FLOAT', 'DOUBLE', 'NUMERIC'].includes(convertColumnType(columnType))) { @@ -92,16 +92,8 @@ const RuleContent: React.FC = (props) => { const [isEditing, _setIsEditing] = useState(false); const itemRef = useRef(); let emptyShowFunc; - let { - dbMode, - columnType, - ruleType, - readonly, - value, - columnSizeMap, - columnName, - onChange, - } = props; + let { dbMode, columnType, ruleType, readonly, value, columnSizeMap, columnName, onChange } = + props; const maxLength = columnSizeMap?.[columnName]; columnType = convertColumnType(columnType); const ruleItem = columnTypeToRuleMap[dbMode]?.[columnType]; diff --git a/src/component/Task/ImportTask/CreateModal/ImportForm/ConfigPanel/index.tsx b/src/component/Task/ImportTask/CreateModal/ImportForm/ConfigPanel/index.tsx index ef540d4e3..609dc5937 100644 --- a/src/component/Task/ImportTask/CreateModal/ImportForm/ConfigPanel/index.tsx +++ b/src/component/Task/ImportTask/CreateModal/ImportForm/ConfigPanel/index.tsx @@ -54,7 +54,9 @@ const FileSelecterPanel: React.FC = function ({ const connection = database?.dataSource; const databaseName = database?.name; const dataTypes = session?.dataTypes ?? []; - const isOracle = connection?.dialectType === ConnectionMode.OB_ORACLE; + const isOracle = + connection?.dialectType === ConnectionMode.OB_ORACLE || + connection?.dialectType === ConnectionMode.ORACLE; const config = getDataSourceModeConfig(connection?.type); async function fetchTable(dbName: string) { const tables = await getTableListByDatabaseName(session?.sessionId, dbName); diff --git a/src/page/Workspace/components/DDLResultSet/hooks/useColumns.tsx b/src/page/Workspace/components/DDLResultSet/hooks/useColumns.tsx index 02f11337f..1a886bb21 100644 --- a/src/page/Workspace/components/DDLResultSet/hooks/useColumns.tsx +++ b/src/page/Workspace/components/DDLResultSet/hooks/useColumns.tsx @@ -163,7 +163,7 @@ export function getCellFormatter( } function getEditor(columnType: string, dbMode: ConnectionMode) { - const isOracle = dbMode === ConnectionMode.OB_ORACLE; + const isOracle = [ConnectionMode.OB_ORACLE, ConnectionMode.ORACLE].includes(dbMode); switch (columnType) { case 'TIME': { return TimeEditor; From 85654122b58057dc99c1f1331474d164f2f24323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Thu, 22 Feb 2024 15:38:52 +0800 Subject: [PATCH 088/231] PullRequest: 327 chore: ob-react-data-grid (update version 3.0.9 -> 3.0.10) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-0221 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/327 Signed-off-by: 晓康 * chore: ob-react-data-grid (update version 3.0.9 -> 3.0.10) --- package.json | 2 +- pnpm-lock.yaml | 51 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 429d442c1..4d4761b2f 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@oceanbase-odc/monaco-plugin-ob": "^0.2.1", "@oceanbase-odc/ob-intl-cli": "^2.0.2", "@oceanbase-odc/ob-parser-js": "^3.0.1", - "@oceanbase-odc/ob-react-data-grid": "^3.0.9", + "@oceanbase-odc/ob-react-data-grid": "^3.0.10", "@sentry/react": "^7.88.0", "@svgr/webpack": "^6.5.1", "@testing-library/react": "^11.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02f7e4684..b3515ad43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,8 +50,8 @@ devDependencies: specifier: ^3.0.1 version: 3.0.1 '@oceanbase-odc/ob-react-data-grid': - specifier: ^3.0.9 - version: 3.0.9(antd@4.24.15)(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) + specifier: ^3.0.10 + version: 3.0.10(antd@4.24.15)(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) '@sentry/react': specifier: ^7.88.0 version: 7.98.0(react@17.0.2) @@ -3401,8 +3401,8 @@ packages: lodash: 4.17.21 dev: true - /@oceanbase-odc/ob-react-data-grid@3.0.9(antd@4.24.15)(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): - resolution: {integrity: sha512-ZVDVloabx+QU/UMuOgpiQfzMqHHKPmpQv7gPepC5P9GiyYb4zmOngPXKOejjSFDASJcj85TLgADb7U/Cvi1aCQ==} + /@oceanbase-odc/ob-react-data-grid@3.0.10(antd@4.24.15)(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): + resolution: {integrity: sha512-GFnmVThgQG25F0akyBmEQKnUhjdnibT33qXb1wo2XhNPILwiI+uvItNRzzO0t4kHKdUbnAJ2rqTLPYQFTUv1xg==} engines: {node: '>=12.0.0'} peerDependencies: antd: ^4.15.3 @@ -4185,7 +4185,7 @@ packages: resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. dependencies: - history: 5.3.0 + history: 4.10.1 dev: true /@types/hoist-non-react-statics@3.3.5: @@ -6921,6 +6921,21 @@ packages: fsevents: 2.3.3 dev: true + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: true @@ -9568,7 +9583,7 @@ packages: dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cosmiconfig: 7.1.0 deepmerge: 4.3.1 fs-extra: 10.1.0 @@ -13025,12 +13040,6 @@ packages: isarray: 0.0.1 dev: true - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 - dev: true - /path-to-regexp@2.4.0: resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} dev: true @@ -14166,7 +14175,7 @@ packages: dependencies: '@babel/runtime': 7.23.9 async-validator: 4.2.5 - rc-util: 5.38.1(react-dom@17.0.2)(react@17.0.2) + rc-util: 5.38.2(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: true @@ -14608,6 +14617,18 @@ packages: react-is: 18.2.0 dev: true + /rc-util@5.38.2(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-yRGRPKyi84H7NkRSP6FzEIYBdUt4ufdsmXUZ7qM2H5qoByPax70NnGPkfo36N+UKUnUBj2f2Q2eUbwYMuAsIOQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.9 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-is: 18.2.0 + dev: true + /rc-virtual-list@3.11.3(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==} engines: {node: '>=8.x'} @@ -14937,7 +14958,7 @@ packages: hoist-non-react-statics: 2.5.5 invariant: 2.2.4 loose-envify: 1.4.0 - path-to-regexp: 1.8.0 + path-to-regexp: 1.7.0 prop-types: 15.8.1 react: 17.0.2 warning: 4.0.3 @@ -17689,7 +17710,7 @@ packages: graceful-fs: 4.2.11 neo-async: 2.6.2 optionalDependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 watchpack-chokidar2: 2.0.1 transitivePeerDependencies: - supports-color From fb5ee156d4b4afdf3ac1a77aaf7db5f742293a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Thu, 22 Feb 2024 17:12:22 +0800 Subject: [PATCH 089/231] PullRequest: 328 Fixes oceanbase/odc#1596 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-odc-1596 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/328 Signed-off-by: 晓康 * Fixes oceanbase/odc#1596 * fix: add height property to Tree --- .../CreateModal/TableSelector.tsx | 28 +++++++++++-------- .../DetailContent/index.tsx | 2 +- .../Notification/components/index.less | 6 ++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/component/Task/StructureComparisonTask/CreateModal/TableSelector.tsx b/src/component/Task/StructureComparisonTask/CreateModal/TableSelector.tsx index c4d6ffd8b..84f19546c 100644 --- a/src/component/Task/StructureComparisonTask/CreateModal/TableSelector.tsx +++ b/src/component/Task/StructureComparisonTask/CreateModal/TableSelector.tsx @@ -99,17 +99,22 @@ const TableSelector: React.FC<{ onSearch={(v) => setSourceSearchValue(v)} > - + {allTreeData?.length ? ( + + ) : ( +
+ )}
@@ -136,6 +141,7 @@ const TableSelector: React.FC<{ selectable={false} treeData={selectedTreeData} showIcon + height={295} titleRender={(node) => { return (
diff --git a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx index 8290b6edf..8739915af 100644 --- a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx +++ b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx @@ -296,8 +296,8 @@ const StructureComparisonTaskContent: React.FC { diff --git a/src/page/Project/Notification/components/index.less b/src/page/Project/Notification/components/index.less index b78a9d388..4904e2046 100644 --- a/src/page/Project/Notification/components/index.less +++ b/src/page/Project/Notification/components/index.less @@ -20,7 +20,7 @@ } } &Tip { - color: rgba(0, 0, 0, 0.45); + color: var(--text-color-placeholder); line-height: 20px; } } @@ -35,5 +35,7 @@ } } } - +.tip { + color: var(--text-color-placeholder); +} // #endregion From 87e954fc847221e2c7a7f24cc5476d542eda1a08 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Fri, 23 Feb 2024 15:17:17 +0800 Subject: [PATCH 090/231] support jvm params --- build/electron-build.config.js | 1 + build/setting.json | 4 ++++ src/main/server/main.ts | 16 ++++++++++++++++ src/main/utils/index.ts | 16 ++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 build/setting.json diff --git a/build/electron-build.config.js b/build/electron-build.config.js index a1109ae20..9d9c73bd4 100644 --- a/build/electron-build.config.js +++ b/build/electron-build.config.js @@ -76,6 +76,7 @@ const config = { from: `${distDir}/renderer`, to: 'renderer', }, + 'build/setting.json' ], }; diff --git a/build/setting.json b/build/setting.json new file mode 100644 index 000000000..c747ce237 --- /dev/null +++ b/build/setting.json @@ -0,0 +1,4 @@ +{ + "client.jvm.params": "-Xms512m\n-Xmx2048m", + "client.start.params": "" +} \ No newline at end of file diff --git a/src/main/server/main.ts b/src/main/server/main.ts index eb0f45b5b..f1a749d2d 100644 --- a/src/main/server/main.ts +++ b/src/main/server/main.ts @@ -26,8 +26,10 @@ import { getJavaLogPath, getJavaPath, getRendererPath, + getSetting, } from '../utils'; import log from '../utils/log'; +import { writeFileSync } from 'fs'; class MainServer { static _mainServer: MainServer = null; @@ -255,14 +257,28 @@ class MainServer { } // https://stackoverflow.com/questions/10232192/exec-display-stdout-live try { + const setting = getSetting(); + let jvmOptions = [], + odcOptions; + if (setting) { + jvmOptions = setting['client.jvm.params'].split('\n'); + const odcProperties = setting['client.start.params']; + if (odcProperties) { + const fileTempPath = path.resolve(app.getPath('userData'), 'odc.temp.properties'); + writeFileSync(fileTempPath, odcProperties); + odcOptions = fileTempPath; + } + } javaChildProcess = spawn( javaBin, [ `-Dodc.log.directory=${javaLogDir}`, `-Dfile.encoding=UTF-8`, `-Duser.language=en-US`, + ...jvmOptions, '-jar', this.jarPath, + odcOptions ? `--spring.config.import="optional:file:${odcOptions}"` : '', ], { // 一定要设置,默认值为 '/',会影响到后端日志文件的存放路径 diff --git a/src/main/utils/index.ts b/src/main/utils/index.ts index a2e5e6ea0..085de08d3 100644 --- a/src/main/utils/index.ts +++ b/src/main/utils/index.ts @@ -219,6 +219,22 @@ export function getJavaPath() { }; } +export function getSetting(): Record { + const isDevelopment = process.env.NODE_ENV === 'development'; + let basePath = isDevelopment + ? path.join(process.cwd(), 'build/setting.json') + : path.join(process.resourcesPath || '', 'setting.json'); + if (!fs.existsSync(basePath)) { + return null; + } + const file = fs.readFileSync(basePath, 'utf-8').toString(); + try { + return JSON.parse(file); + } catch (e) { + return null; + } +} + export function getRendererPath() { const p = 'file:' + path.join(process.resourcesPath, 'renderer/'); log.info('renderer path: ', p); From b54dbaa40d4a7361780d68703b6f3d62c8f32515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Fri, 23 Feb 2024 15:26:50 +0800 Subject: [PATCH 091/231] PullRequest: 330 feat: task (rollback file download) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-task-fileDownload-0220 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/330 Signed-off-by: 晓康 * feat: task (rollback file download) --- .../Task/AsyncTask/DetailContent/index.tsx | 2 +- src/component/Task/component/ActionBar/index.tsx | 4 ++-- .../CommonDetailModal/Nodes/RollbackNode.tsx | 4 ++-- .../Task/component/DownloadFileAction/index.tsx | 13 ++++--------- src/d.ts/index.ts | 2 +- 5 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/component/Task/AsyncTask/DetailContent/index.tsx b/src/component/Task/AsyncTask/DetailContent/index.tsx index 7d091a4e4..fa690f7b1 100644 --- a/src/component/Task/AsyncTask/DetailContent/index.tsx +++ b/src/component/Task/AsyncTask/DetailContent/index.tsx @@ -143,7 +143,7 @@ const AsyncTaskContent: React.FC = (props) => { }) /*回滚内容*/ } - + } content={ diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 8cd2301f7..bf8a2a7ec 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -135,7 +135,7 @@ const ActionBar: React.FC = inject( type, task: task as TaskDetail, databaseId: task?.database?.id, - objectId: result?.rollbackPlanResult?.objectId, + objectId: result?.rollbackPlanResult?.resultFileDownloadUrl, }); }; @@ -889,7 +889,7 @@ const ActionBar: React.FC = inject( open={openRollback} generateRollbackPlan={ (task as TaskDetail)?.parameters?.generateRollbackPlan && - !!result?.rollbackPlanResult?.objectId + !!result?.rollbackPlanResult?.resultFileDownloadUrl } onOk={confirmRollback} onCancel={handleCloseRollback} diff --git a/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx b/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx index 032a499dc..cffd0bcde 100644 --- a/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx +++ b/src/component/Task/component/CommonDetailModal/Nodes/RollbackNode.tsx @@ -97,7 +97,7 @@ const RollbackNode: React.FC = function (props) { id: 'odc.CommonDetailModal.Nodes.RollbackNode.ProcessingResult', })} /*处理结果*/ > - {resultData?.objectId ? ( + {resultData?.resultFileDownloadUrl ? ( { @@ -107,7 +107,7 @@ const RollbackNode: React.FC = function (props) { }) /*成功生成回滚方案*/ } - + ) : ( diff --git a/src/component/Task/component/DownloadFileAction/index.tsx b/src/component/Task/component/DownloadFileAction/index.tsx index 4ae989a3c..dfe845d1c 100644 --- a/src/component/Task/component/DownloadFileAction/index.tsx +++ b/src/component/Task/component/DownloadFileAction/index.tsx @@ -14,27 +14,22 @@ * limitations under the License. */ -import { getTaskFile } from '@/common/network/task'; import Action from '@/component/Action'; import { formatMessage } from '@/util/intl'; import { downloadFile } from '@/util/utils'; interface IProps { - taskId: number; - objectId: string; + url: string; } export const DownloadFileAction: React.FC = (props) => { - const { taskId, objectId } = props; + const { url } = props; const handleDownloadFile = async () => { - const fileUrl = await getTaskFile(taskId, [objectId]); - fileUrl?.forEach((url) => { - url && downloadFile(url); - }); + downloadFile(url); }; - return objectId ? ( + return url ? ( { formatMessage({ diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index 0a9fe037b..242c3bac2 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -2237,7 +2237,7 @@ export interface ITaskResult { rollbackPlanResult?: { error: string; generated: boolean; - objectId: string; + resultFileDownloadUrl: string; success: boolean; }; } From c79e817479b6e0e5979d67e5a6911296ea03eba3 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Fri, 23 Feb 2024 15:37:04 +0800 Subject: [PATCH 092/231] fix electron-build copy path --- build/electron-build.config.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build/electron-build.config.js b/build/electron-build.config.js index 9d9c73bd4..9edb9b46a 100644 --- a/build/electron-build.config.js +++ b/build/electron-build.config.js @@ -76,7 +76,11 @@ const config = { from: `${distDir}/renderer`, to: 'renderer', }, - 'build/setting.json' + { + from: `build/setting.json`, + to: 'setting.json', + }, + ], }; From 3a36c87365252f2aa7bcc1e3f272970931ea5086 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Fri, 23 Feb 2024 15:58:34 +0800 Subject: [PATCH 093/231] add log --- src/main/server/main.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/server/main.ts b/src/main/server/main.ts index f1a749d2d..a3bee8459 100644 --- a/src/main/server/main.ts +++ b/src/main/server/main.ts @@ -267,8 +267,10 @@ class MainServer { const fileTempPath = path.resolve(app.getPath('userData'), 'odc.temp.properties'); writeFileSync(fileTempPath, odcProperties); odcOptions = fileTempPath; + log.info('odc system propeties ', odcOptions, setting['client.start.params']); } } + log.info('jvmOptions:', jvmOptions.join(' ')); javaChildProcess = spawn( javaBin, [ From b25667b6c2c8f6618790c915572c6f41772fa3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Mon, 26 Feb 2024 13:52:12 +0800 Subject: [PATCH 094/231] PullRequest: 332 Fixes oceanbase/odc#722 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-odc-772 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/332 Signed-off-by: 晓康 * Fixes oceanbase/odc#722 --- .../Task/AsyncTask/DetailContent/index.tsx | 38 ++++++++++++++----- src/d.ts/index.ts | 1 + 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/component/Task/AsyncTask/DetailContent/index.tsx b/src/component/Task/AsyncTask/DetailContent/index.tsx index fa690f7b1..2c825167f 100644 --- a/src/component/Task/AsyncTask/DetailContent/index.tsx +++ b/src/component/Task/AsyncTask/DetailContent/index.tsx @@ -18,13 +18,14 @@ import RiskLevelLabel from '@/component/RiskLevelLabel'; import { SQLContent } from '@/component/SQLContent'; import { getTaskExecStrategyMap } from '@/component/Task'; import type { IAsyncTaskParams, ITaskResult, TaskDetail } from '@/d.ts'; -import { ConnectionMode, TaskExecStrategy } from '@/d.ts'; +import { TaskExecStrategy } from '@/d.ts'; import { formatMessage } from '@/util/intl'; import { getFormatDateTime } from '@/util/utils'; -import { Descriptions, Divider, Space } from 'antd'; +import { Descriptions, Divider, Space, Tooltip } from 'antd'; import { DownloadFileAction } from '../../component/DownloadFileAction'; import { SimpleTextItem } from '../../component/SimpleTextItem'; import { getDataSourceModeConfigByConnectionMode } from '@/common/datasource'; +import { InfoCircleOutlined } from '@ant-design/icons'; export const ErrorStrategy = { ABORT: formatMessage({ id: 'odc.TaskManagePage.AsyncTask.StopATask', @@ -210,14 +211,31 @@ const AsyncTaskContent: React.FC = (props) => { }) /* 执行超时时间 */ } > - {formatMessage( - { - id: 'odc.TaskManagePage.AsyncTask.ExecutiontimeoutHours', - }, - { - executionTimeout, - }, - )} + +
+ {formatMessage( + { + id: 'odc.TaskManagePage.AsyncTask.ExecutiontimeoutHours', + }, + { + executionTimeout, + }, + )} +
+ {result?.autoModifyTimeout && ( + +
+ +
+
+ )} +
Date: Mon, 26 Feb 2024 17:10:35 +0800 Subject: [PATCH 095/231] PullRequest: 333 DataArchiveTask & DataClearTask (add sql preview modal) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-task-DataClearTask-0226 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/333 Signed-off-by: 晓康 * feat: DataClearTask (add sql preview modal) * feat: DataArchiveTask (add sql preview modal) --- src/common/network/task.ts | 20 ++++++ .../DataArchiveTask/CreateModal/index.tsx | 63 +++++++++++++--- .../Task/DataClearTask/CreateModal/index.tsx | 71 +++++++++++++++---- .../Task/component/SQLPreviewModal/index.tsx | 48 +++++++++++++ 4 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 src/component/Task/component/SQLPreviewModal/index.tsx diff --git a/src/common/network/task.ts b/src/common/network/task.ts index 601565ebc..971f1fdf8 100644 --- a/src/common/network/task.ts +++ b/src/common/network/task.ts @@ -64,6 +64,26 @@ export async function createTask(data: Partial): Promise { + const res = await request.post('/api/v2/dlm/getRealSqlList', { + data, + }); + return res?.data || []; +} + /** * 新建结构比对工单 * @param data diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.tsx b/src/component/Task/DataArchiveTask/CreateModal/index.tsx index 25a60775e..85ff97fa2 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/index.tsx @@ -15,7 +15,7 @@ */ import { getTableListByDatabaseName } from '@/common/network/table'; -import { createTask, getCycleTaskDetail } from '@/common/network/task'; +import { createTask, getCycleTaskDetail, getRealSqlList } from '@/common/network/task'; import Crontab from '@/component/Crontab'; import { CrontabDateType, ICrontab, CrontabMode } from '@/component/Crontab/interface'; import FormItemPanel from '@/component/FormItemPanel'; @@ -44,6 +44,7 @@ import { inject, observer } from 'mobx-react'; import React, { useEffect, useRef, useState } from 'react'; import moment from 'moment'; import DatabaseSelect from '../../component/DatabaseSelect'; +import SQLPreviewModal from '../../component/SQLPreviewModal'; import ArchiveRange from './ArchiveRange'; import styles from './index.less'; import VariableConfig from './VariableConfig'; @@ -151,6 +152,8 @@ export const getVariableValue = ( }; const CreateModal: React.FC = (props) => { const { modalStore, projectId } = props; + const [previewModalVisible, setPreviewModalVisible] = useState(false); + const [previewSql, setPreviewSQL] = useState(''); const [hasEdit, setHasEdit] = useState(false); const [confirmLoading, setConfirmLoading] = useState(false); const [crontab, setCrontab] = useState(null); @@ -288,6 +291,10 @@ const CreateModal: React.FC = (props) => { }, }); }; + const handleCloseSQLPreviewModal = () => { + setPreviewModalVisible(false); + setPreviewSQL(''); + }; const handleSubmit = () => { form .validateFields() @@ -368,6 +375,39 @@ const CreateModal: React.FC = (props) => { console.error(JSON.stringify(errorInfo)); }); }; + const handleSQLPreview = () => { + form + .validateFields() + .then(async (values) => { + const { variables, tables: _tables, archiveRange } = values; + const parameters = { + variables: getVariables(variables), + tables: + archiveRange === IArchiveRange.ALL + ? tables?.map((item) => { + return { + tableName: item?.tableName, + conditionExpression: '', + }; + }) + : _tables, + }; + const sqls = await getRealSqlList(parameters); + if (sqls) { + setPreviewModalVisible(true); + setPreviewSQL(sqls?.join('\n')); + } + }) + .catch((errorInfo) => { + console.error(JSON.stringify(errorInfo)); + }); + }; + + const handleConfirmTask = () => { + handleCloseSQLPreviewModal(); + handleSubmit(); + }; + const handleFieldsChange = () => { setHasEdit(true); }; @@ -377,17 +417,17 @@ const CreateModal: React.FC = (props) => { setHasEdit(false); }; - const getDrawerTitle = () =>{ + const getDrawerTitle = () => { let title = '新建数据归档'; - if(dataArchiveEditId){ - if(isEdit){ + if (dataArchiveEditId) { + if (isEdit) { title = '编辑数据归档'; - }else{ + } else { title = '再次发起数据归档'; } } return title; - } + }; useEffect(() => { if (!dataArchiveVisible) { @@ -428,7 +468,7 @@ const CreateModal: React.FC = (props) => { }) /*取消*/ } - - - + ); }), diff --git a/src/page/Project/Database/AddDataBaseButton/index.tsx b/src/page/Project/Database/AddDataBaseButton/index.tsx index 21e31af75..84f910ee7 100644 --- a/src/page/Project/Database/AddDataBaseButton/index.tsx +++ b/src/page/Project/Database/AddDataBaseButton/index.tsx @@ -17,10 +17,11 @@ import { getConnectionDetail, getConnectionList } from '@/common/network/connection'; import { listDatabases, updateDataBase } from '@/common/network/database'; import RiskLevelLabel from '@/component/RiskLevelLabel'; +import ApplyDatabasePermissionButton from '@/component/Task/ApplyDatabasePermission/CreateButton'; import { formatMessage } from '@/util/intl'; import { useRequest } from 'ahooks'; import { useContext, useState } from 'react'; -import { Button, Col, Form, message, Modal, Row, Select, Tooltip } from 'antd'; +import { Button, Col, Form, message, Modal, Row, Select, Space, Tooltip } from 'antd'; import Icon from '@ant-design/icons'; import { getDataSourceStyle, getDataSourceStyleByConnectType } from '@/common/datasource'; import ProjectContext from '../../ProjectContext'; @@ -46,18 +47,20 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { }, ], }); - const { data: dataSource, loading: dataSourceLoading, run: fetchDataSource } = useRequest( - getConnectionDetail, - { - manual: true, - }, - ); - const { data: databases, loading: databasesListLoading, run: fetchDatabases } = useRequest( - listDatabases, - { - manual: true, - }, - ); + const { + data: dataSource, + loading: dataSourceLoading, + run: fetchDataSource, + } = useRequest(getConnectionDetail, { + manual: true, + }); + const { + data: databases, + loading: databasesListLoading, + run: fetchDatabases, + } = useRequest(listDatabases, { + manual: true, + }); function close() { setOpen(false); form.resetFields(); @@ -81,21 +84,24 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { } return ( <> - + + + + Date: Tue, 27 Feb 2024 19:26:52 +0800 Subject: [PATCH 105/231] support editor fontsize and theme --- src/component/Input/Keymap/index.tsx | 16 +++++++++++----- src/component/Input/Keymap/keycodemap.ts | 13 +++++++++++-- src/component/MonacoEditor/DiffEditor.tsx | 14 +++++++++++++- src/component/MonacoEditor/index.tsx | 16 ++++++++++++++-- src/page/Workspace/components/SQLPage/index.tsx | 3 +-- src/store/setting.ts | 12 +++++++++--- src/util/env.ts | 4 ++++ 7 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/component/Input/Keymap/index.tsx b/src/component/Input/Keymap/index.tsx index 86a297c75..c30579aed 100644 --- a/src/component/Input/Keymap/index.tsx +++ b/src/component/Input/Keymap/index.tsx @@ -2,7 +2,7 @@ import { useControllableValue } from 'ahooks'; import { Select, Tag } from 'antd'; import React, { useMemo } from 'react'; import { KEY_CODE_MAP, getKeyCodeText } from './keycodemap'; -import { KeyCode } from 'monaco-editor'; +import { KeyCode, KeyMod } from 'monaco-editor'; import { BaseSelectRef, CustomTagProps } from 'rc-select/lib/BaseSelect'; import { PlusOutlined } from '@ant-design/icons'; @@ -28,17 +28,23 @@ const KeymapInput: React.FC = (props) => { e.preventDefault(); e.stopPropagation(); if (keyCode === 8) { + // del setValue(''); return; } const monacoKeyCode = KEY_CODE_MAP[keyCode]; let mod = []; - (metaKey || ctrlKey) && mod.push(KeyCode.Ctrl); + metaKey && mod.push(KeyCode.Meta); + ctrlKey && mod.push(KeyCode.Ctrl); shiftKey && mod.push(KeyCode.Shift); altKey && mod.push(KeyCode.Alt); - let isSpecialKey = [KeyCode.Ctrl, KeyCode.Shift, KeyCode.Alt, KeyCode.Meta].includes( - monacoKeyCode, - ); + let isSpecialKey = [ + KeyCode.Ctrl, + KeyCode.Shift, + KeyCode.Alt, + KeyCode.Meta, + KeyCode.Meta, + ].includes(monacoKeyCode); const value = isSpecialKey ? [...mod] : [...mod, monacoKeyCode]; setValue(value.join(',')); } diff --git a/src/component/Input/Keymap/keycodemap.ts b/src/component/Input/Keymap/keycodemap.ts index 45278a638..3f0ddcf33 100644 --- a/src/component/Input/Keymap/keycodemap.ts +++ b/src/component/Input/Keymap/keycodemap.ts @@ -1,3 +1,4 @@ +import { isMac } from '@/util/env'; import { KeyCode, KeyMod } from 'monaco-editor'; export const KEY_CODE_MAP: Record = { @@ -117,10 +118,10 @@ export const KEY_CODE_MAP: Record = { }; const convertMap = { - [KeyCode.Ctrl]: KeyMod.CtrlCmd, + [KeyCode.Ctrl]: KeyMod.WinCtrl, + [KeyCode.Meta]: KeyMod.CtrlCmd, [KeyCode.Shift]: KeyMod.Shift, [KeyCode.Alt]: KeyMod.Alt, - [KeyCode.Meta]: KeyMod.WinCtrl, }; export function getKeyCodeText(code: string) { @@ -129,6 +130,14 @@ export function getKeyCodeText(code: string) { if (acc.length) { acc.push('+'); } + if (parseInt(cur) === KeyCode.Meta) { + if (isMac()) { + acc.push('⌘'); + } else { + acc.push('Win'); + } + return acc; + } acc.push(KeyCode[cur]); return acc; }, []); diff --git a/src/component/MonacoEditor/DiffEditor.tsx b/src/component/MonacoEditor/DiffEditor.tsx index 8c3c65e0b..a33063252 100644 --- a/src/component/MonacoEditor/DiffEditor.tsx +++ b/src/component/MonacoEditor/DiffEditor.tsx @@ -4,6 +4,7 @@ import styles from './index.less'; import { SettingStore } from '@/store/setting'; import { inject, observer } from 'mobx-react'; import classNames from 'classnames'; +import { getFontSize } from './config'; export interface IDiffEditor { settingStore?: SettingStore; @@ -30,7 +31,8 @@ const DiffEditor = inject('settingStore')( } = props; const domRef = useRef(null); const editorRef = useRef(); - const settingTheme = settingStore.theme.editorTheme; + const settingTheme = + settingStore.theme.editorTheme?.[settingStore.configurations['odc.editor.style.theme']]; const [split, setSplit] = useState(defaultSplit); useImperativeHandle(ref, () => ({ switchSplit: (v: boolean) => { @@ -43,6 +45,16 @@ const DiffEditor = inject('settingStore')( } return theme; }, [theme, settingTheme]); + + useEffect(() => { + const fontSize = settingStore.configurations['odc.editor.style.fontSize']; + if (fontSize && editorRef.current) { + editorRef.current.updateOptions({ + fontSize: getFontSize(fontSize), + }); + } + }, [settingStore.configurations?.['odc.editor.style.fontSize']]); + const initEditor = async () => { const originalModel = monaco.editor.createModel(source, language); const modifiedModel = monaco.editor.createModel(modifie, language); diff --git a/src/component/MonacoEditor/index.tsx b/src/component/MonacoEditor/index.tsx index acd4e5dd5..44b039504 100644 --- a/src/component/MonacoEditor/index.tsx +++ b/src/component/MonacoEditor/index.tsx @@ -20,7 +20,7 @@ import * as monaco from 'monaco-editor'; import odc from '@/plugins/odc'; import SessionStore from '@/store/sessionManager/session'; -import { SettingStore } from '@/store/setting'; +import setting, { SettingStore } from '@/store/setting'; import editorUtils from '@/util/editor'; import { getUnWrapedSnippetBody } from '@/util/snippet'; import { inject, observer } from 'mobx-react'; @@ -29,6 +29,7 @@ import * as groovy from './plugins/languageSupport/groovy'; import { apply as markerPluginApply } from './plugins/marker'; import { getModelService } from './plugins/ob-language/service'; import logger from '@/util/logger'; +import { getFontSize } from './config'; export interface IEditor extends monaco.editor.IStandaloneCodeEditor { doFormat: () => void; getSelectionContent: () => string; @@ -76,7 +77,8 @@ const MonacoEditor: React.FC = function (props) { onEditorCreated, } = props; const [innerValue, _setInnerValue] = useState(defaultValue); - const settingTheme = settingStore.theme.editorTheme; + const settingTheme = + settingStore.theme.editorTheme?.[settingStore.configurations['odc.editor.style.theme']]; function setInnerValue(v: string) { if (readOnly) { return; @@ -124,6 +126,15 @@ const MonacoEditor: React.FC = function (props) { } }, [readOnly, themeValue]); + useEffect(() => { + const fontSize = setting.configurations['odc.editor.style.fontSize']; + if (fontSize && editorRef.current) { + editorRef.current.updateOptions({ + fontSize: getFontSize(fontSize), + }); + } + }, [setting.configurations?.['odc.editor.style.fontSize']]); + async function initPlugin() { const module = await import('./plugins/ob-language/index'); if (!editorRef.current?.getModel?.()) { @@ -154,6 +165,7 @@ const MonacoEditor: React.FC = function (props) { lineNumbers: showLineNumbers ? 'on' : 'off', lineNumbersMinChars: showLineNumbers ? 5 : 0, minimap: { enabled: false }, + fontSize: getFontSize(settingStore.configurations['odc.editor.style.fontSize']), automaticLayout: true, unicodeHighlight: { invisibleCharacters: false, diff --git a/src/page/Workspace/components/SQLPage/index.tsx b/src/page/Workspace/components/SQLPage/index.tsx index 4e41cb818..b2287caed 100644 --- a/src/page/Workspace/components/SQLPage/index.tsx +++ b/src/page/Workspace/components/SQLPage/index.tsx @@ -290,7 +290,6 @@ export class SQLPage extends Component { 'odc.editor.shortcut.executeCurrentStatement': executeCurrentStatement, 'odc.editor.shortcut.executeStatement': executeStatement, } = setting.configurations; - console.log(executeCurrentStatement, executeStatement); this.actions?.forEach((action) => { action.dispose(); }); @@ -298,7 +297,7 @@ export class SQLPage extends Component { this.editor.addAction({ id: 'sql_download', label: 'download', - keybindings: [KeyMod.CtrlCmd | KeyCode.KeyD], + keybindings: [KeyMod.WinCtrl | KeyCode.KeyD], run: () => this.handleDownload(), }), this.editor.addAction({ diff --git a/src/store/setting.ts b/src/store/setting.ts index 09377a905..c14f34aa5 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -33,7 +33,7 @@ import login from './login'; export const themeKey = 'odc-theme'; interface IThemeConfig { - editorTheme: string; + editorTheme: Record; className: string; sheetTheme: string; cmdTheme: 'dark' | 'white'; @@ -49,7 +49,10 @@ export enum EThemeConfigKey { const themeConfig: { [key: string]: IThemeConfig } = { [EThemeConfigKey.ODC_WHITE]: { key: EThemeConfigKey.ODC_WHITE, - editorTheme: 'obwhite', + editorTheme: { + VSCode: 'vs', + OceanBase: 'obwhite', + }, className: 'odc-white', sheetTheme: 'white', cmdTheme: 'white', @@ -58,7 +61,10 @@ const themeConfig: { [key: string]: IThemeConfig } = { }, [EThemeConfigKey.ODC_DARK]: { key: EThemeConfigKey.ODC_DARK, - editorTheme: 'obdark', + editorTheme: { + VSCode: 'vs-dark', + OceanBase: 'obdark', + }, className: 'odc-dark', sheetTheme: 'dark', cmdTheme: 'dark', diff --git a/src/util/env.ts b/src/util/env.ts index 48ed88b66..2e437fe85 100644 --- a/src/util/env.ts +++ b/src/util/env.ts @@ -18,6 +18,10 @@ export function isClient(): boolean { return ENV_target === 'client'; } +export function isMac(): boolean { + return /macintosh|mac os x/i.test(navigator.userAgent); +} + /** * 是否接入了OCP */ From 039c89e853ad859dfca5351e343a31a447e46d88 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 27 Feb 2024 19:38:36 +0800 Subject: [PATCH 106/231] support editor fontsize and theme --- src/component/MonacoEditor/config.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/component/MonacoEditor/config.ts diff --git a/src/component/MonacoEditor/config.ts b/src/component/MonacoEditor/config.ts new file mode 100644 index 000000000..eb8dd5667 --- /dev/null +++ b/src/component/MonacoEditor/config.ts @@ -0,0 +1,8 @@ +export const fontSizeMap = { + Small: 10, + Normal: 12, + Large: 14, +}; +export function getFontSize(fontSizeType: string) { + return fontSizeMap[fontSizeType] || 12; +} From 94b2cb2f8b60c9c47e883b95bcb1ddd0af63612e Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 27 Feb 2024 20:07:38 +0800 Subject: [PATCH 107/231] add more editor theme --- src/component/MonacoEditor/index.tsx | 2 + .../MonacoEditor/plugins/theme/github.ts | 697 ++++++++++++++++++ .../MonacoEditor/plugins/theme/index.ts | 15 + .../MonacoEditor/plugins/theme/monokai.ts | 145 ++++ src/component/ODCSetting/config/editor.tsx | 15 +- src/store/setting.ts | 6 + 6 files changed, 879 insertions(+), 1 deletion(-) create mode 100644 src/component/MonacoEditor/plugins/theme/github.ts create mode 100644 src/component/MonacoEditor/plugins/theme/index.ts create mode 100644 src/component/MonacoEditor/plugins/theme/monokai.ts diff --git a/src/component/MonacoEditor/index.tsx b/src/component/MonacoEditor/index.tsx index 44b039504..45c3e4971 100644 --- a/src/component/MonacoEditor/index.tsx +++ b/src/component/MonacoEditor/index.tsx @@ -30,6 +30,7 @@ import { apply as markerPluginApply } from './plugins/marker'; import { getModelService } from './plugins/ob-language/service'; import logger from '@/util/logger'; import { getFontSize } from './config'; +import { apply as themeApply } from './plugins/theme'; export interface IEditor extends monaco.editor.IStandaloneCodeEditor { doFormat: () => void; getSelectionContent: () => string; @@ -154,6 +155,7 @@ const MonacoEditor: React.FC = function (props) { ), ); markerPluginApply(editorRef.current.getModel()); + themeApply(); logger.debug('init plugin done'); } diff --git a/src/component/MonacoEditor/plugins/theme/github.ts b/src/component/MonacoEditor/plugins/theme/github.ts new file mode 100644 index 000000000..d82fab4da --- /dev/null +++ b/src/component/MonacoEditor/plugins/theme/github.ts @@ -0,0 +1,697 @@ +export const github = { + base: 'vs', + inherit: true, + rules: [ + { + background: 'ffffff', + token: '', + }, + { + foreground: '6a737d', + token: 'comment', + }, + { + foreground: '6a737d', + token: 'punctuation.definition.comment', + }, + { + foreground: '6a737d', + token: 'string.comment', + }, + { + foreground: '005cc5', + token: 'constant', + }, + { + foreground: '005cc5', + token: 'entity.name.constant', + }, + { + foreground: '005cc5', + token: 'variable.other.constant', + }, + { + foreground: '005cc5', + token: 'variable.language', + }, + { + foreground: '6f42c1', + token: 'entity', + }, + { + foreground: '6f42c1', + token: 'entity.name', + }, + { + foreground: '24292e', + token: 'variable.parameter.function', + }, + { + foreground: '22863a', + token: 'entity.name.tag', + }, + { + foreground: 'd73a49', + token: 'keyword', + }, + { + foreground: 'd73a49', + token: 'storage', + }, + { + foreground: 'd73a49', + token: 'storage.type', + }, + { + foreground: '24292e', + token: 'storage.modifier.package', + }, + { + foreground: '24292e', + token: 'storage.modifier.import', + }, + { + foreground: '24292e', + token: 'storage.type.java', + }, + { + foreground: '032f62', + token: 'string', + }, + { + foreground: '032f62', + token: 'punctuation.definition.string', + }, + { + foreground: '032f62', + token: 'string punctuation.section.embedded source', + }, + { + foreground: '005cc5', + token: 'support', + }, + { + foreground: '005cc5', + token: 'meta.property-name', + }, + { + foreground: 'e36209', + token: 'variable', + }, + { + foreground: '24292e', + token: 'variable.other', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.broken', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.deprecated', + }, + { + foreground: 'fafbfc', + background: 'b31d28', + fontStyle: 'italic underline', + token: 'invalid.illegal', + }, + { + foreground: 'fafbfc', + background: 'd73a49', + fontStyle: 'italic underline', + token: 'carriage-return', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.unimplemented', + }, + { + foreground: 'b31d28', + token: 'message.error', + }, + { + foreground: '24292e', + token: 'string source', + }, + { + foreground: '005cc5', + token: 'string variable', + }, + { + foreground: '032f62', + token: 'source.regexp', + }, + { + foreground: '032f62', + token: 'string.regexp', + }, + { + foreground: '032f62', + token: 'string.regexp.character-class', + }, + { + foreground: '032f62', + token: 'string.regexp constant.character.escape', + }, + { + foreground: '032f62', + token: 'string.regexp source.ruby.embedded', + }, + { + foreground: '032f62', + token: 'string.regexp string.regexp.arbitrary-repitition', + }, + { + foreground: '22863a', + fontStyle: 'bold', + token: 'string.regexp constant.character.escape', + }, + { + foreground: '005cc5', + token: 'support.constant', + }, + { + foreground: '005cc5', + token: 'support.variable', + }, + { + foreground: '005cc5', + token: 'meta.module-reference', + }, + { + foreground: '735c0f', + token: 'markup.list', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'markup.heading', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'markup.heading entity.name', + }, + { + foreground: '22863a', + token: 'markup.quote', + }, + { + foreground: '24292e', + fontStyle: 'italic', + token: 'markup.italic', + }, + { + foreground: '24292e', + fontStyle: 'bold', + token: 'markup.bold', + }, + { + foreground: '005cc5', + token: 'markup.raw', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'markup.deleted', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'meta.diff.header.from-file', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'punctuation.definition.deleted', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'markup.inserted', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'meta.diff.header.to-file', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'punctuation.definition.inserted', + }, + { + foreground: 'e36209', + background: 'ffebda', + token: 'markup.changed', + }, + { + foreground: 'e36209', + background: 'ffebda', + token: 'punctuation.definition.changed', + }, + { + foreground: 'f6f8fa', + background: '005cc5', + token: 'markup.ignored', + }, + { + foreground: 'f6f8fa', + background: '005cc5', + token: 'markup.untracked', + }, + { + foreground: '6f42c1', + fontStyle: 'bold', + token: 'meta.diff.range', + }, + { + foreground: '005cc5', + token: 'meta.diff.header', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'meta.separator', + }, + { + foreground: '005cc5', + token: 'meta.output', + }, + { + foreground: '586069', + token: 'brackethighlighter.tag', + }, + { + foreground: '586069', + token: 'brackethighlighter.curly', + }, + { + foreground: '586069', + token: 'brackethighlighter.round', + }, + { + foreground: '586069', + token: 'brackethighlighter.square', + }, + { + foreground: '586069', + token: 'brackethighlighter.angle', + }, + { + foreground: '586069', + token: 'brackethighlighter.quote', + }, + { + foreground: 'b31d28', + token: 'brackethighlighter.unmatched', + }, + { + foreground: 'b31d28', + token: 'sublimelinter.mark.error', + }, + { + foreground: 'e36209', + token: 'sublimelinter.mark.warning', + }, + { + foreground: '959da5', + token: 'sublimelinter.gutter-mark', + }, + { + foreground: '032f62', + fontStyle: 'underline', + token: 'constant.other.reference.link', + }, + { + foreground: '032f62', + fontStyle: 'underline', + token: 'string.other.link', + }, + ], + colors: { + 'editor.foreground': '#24292e', + 'editor.background': '#ffffff', + 'editor.selectionBackground': '#c8c8fa', + 'editor.inactiveSelectionBackground': '#fafbfc', + 'editor.lineHighlightBackground': '#fafbfc', + 'editorCursor.foreground': '#24292e', + 'editorWhitespace.foreground': '#959da5', + 'editorIndentGuide.background': '#959da5', + 'editorIndentGuide.activeBackground': '#24292e', + 'editor.selectionHighlightBorder': '#fafbfc', + }, +}; + +export const githubDark = { + base: 'vs', + inherit: true, + rules: [ + { + background: 'ffffff', + token: '', + }, + { + foreground: '6a737d', + token: 'comment', + }, + { + foreground: '6a737d', + token: 'punctuation.definition.comment', + }, + { + foreground: '6a737d', + token: 'string.comment', + }, + { + foreground: '005cc5', + token: 'constant', + }, + { + foreground: '005cc5', + token: 'entity.name.constant', + }, + { + foreground: '005cc5', + token: 'variable.other.constant', + }, + { + foreground: '005cc5', + token: 'variable.language', + }, + { + foreground: '6f42c1', + token: 'entity', + }, + { + foreground: '6f42c1', + token: 'entity.name', + }, + { + foreground: '24292e', + token: 'variable.parameter.function', + }, + { + foreground: '22863a', + token: 'entity.name.tag', + }, + { + foreground: 'd73a49', + token: 'keyword', + }, + { + foreground: 'd73a49', + token: 'storage', + }, + { + foreground: 'd73a49', + token: 'storage.type', + }, + { + foreground: '24292e', + token: 'storage.modifier.package', + }, + { + foreground: '24292e', + token: 'storage.modifier.import', + }, + { + foreground: '24292e', + token: 'storage.type.java', + }, + { + foreground: '032f62', + token: 'string', + }, + { + foreground: '032f62', + token: 'punctuation.definition.string', + }, + { + foreground: '032f62', + token: 'string punctuation.section.embedded source', + }, + { + foreground: '005cc5', + token: 'support', + }, + { + foreground: '005cc5', + token: 'meta.property-name', + }, + { + foreground: 'e36209', + token: 'variable', + }, + { + foreground: '24292e', + token: 'variable.other', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.broken', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.deprecated', + }, + { + foreground: 'fafbfc', + background: 'b31d28', + fontStyle: 'italic underline', + token: 'invalid.illegal', + }, + { + foreground: 'fafbfc', + background: 'd73a49', + fontStyle: 'italic underline', + token: 'carriage-return', + }, + { + foreground: 'b31d28', + fontStyle: 'bold italic underline', + token: 'invalid.unimplemented', + }, + { + foreground: 'b31d28', + token: 'message.error', + }, + { + foreground: '24292e', + token: 'string source', + }, + { + foreground: '005cc5', + token: 'string variable', + }, + { + foreground: '032f62', + token: 'source.regexp', + }, + { + foreground: '032f62', + token: 'string.regexp', + }, + { + foreground: '032f62', + token: 'string.regexp.character-class', + }, + { + foreground: '032f62', + token: 'string.regexp constant.character.escape', + }, + { + foreground: '032f62', + token: 'string.regexp source.ruby.embedded', + }, + { + foreground: '032f62', + token: 'string.regexp string.regexp.arbitrary-repitition', + }, + { + foreground: '22863a', + fontStyle: 'bold', + token: 'string.regexp constant.character.escape', + }, + { + foreground: '005cc5', + token: 'support.constant', + }, + { + foreground: '005cc5', + token: 'support.variable', + }, + { + foreground: '005cc5', + token: 'meta.module-reference', + }, + { + foreground: '735c0f', + token: 'markup.list', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'markup.heading', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'markup.heading entity.name', + }, + { + foreground: '22863a', + token: 'markup.quote', + }, + { + foreground: '24292e', + fontStyle: 'italic', + token: 'markup.italic', + }, + { + foreground: '24292e', + fontStyle: 'bold', + token: 'markup.bold', + }, + { + foreground: '005cc5', + token: 'markup.raw', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'markup.deleted', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'meta.diff.header.from-file', + }, + { + foreground: 'b31d28', + background: 'ffeef0', + token: 'punctuation.definition.deleted', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'markup.inserted', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'meta.diff.header.to-file', + }, + { + foreground: '22863a', + background: 'f0fff4', + token: 'punctuation.definition.inserted', + }, + { + foreground: 'e36209', + background: 'ffebda', + token: 'markup.changed', + }, + { + foreground: 'e36209', + background: 'ffebda', + token: 'punctuation.definition.changed', + }, + { + foreground: 'f6f8fa', + background: '005cc5', + token: 'markup.ignored', + }, + { + foreground: 'f6f8fa', + background: '005cc5', + token: 'markup.untracked', + }, + { + foreground: '6f42c1', + fontStyle: 'bold', + token: 'meta.diff.range', + }, + { + foreground: '005cc5', + token: 'meta.diff.header', + }, + { + foreground: '005cc5', + fontStyle: 'bold', + token: 'meta.separator', + }, + { + foreground: '005cc5', + token: 'meta.output', + }, + { + foreground: '586069', + token: 'brackethighlighter.tag', + }, + { + foreground: '586069', + token: 'brackethighlighter.curly', + }, + { + foreground: '586069', + token: 'brackethighlighter.round', + }, + { + foreground: '586069', + token: 'brackethighlighter.square', + }, + { + foreground: '586069', + token: 'brackethighlighter.angle', + }, + { + foreground: '586069', + token: 'brackethighlighter.quote', + }, + { + foreground: 'b31d28', + token: 'brackethighlighter.unmatched', + }, + { + foreground: 'b31d28', + token: 'sublimelinter.mark.error', + }, + { + foreground: 'e36209', + token: 'sublimelinter.mark.warning', + }, + { + foreground: '959da5', + token: 'sublimelinter.gutter-mark', + }, + { + foreground: '032f62', + fontStyle: 'underline', + token: 'constant.other.reference.link', + }, + { + foreground: '032f62', + fontStyle: 'underline', + token: 'string.other.link', + }, + ], + colors: { + 'editor.foreground': '#24292e', + 'editor.background': '#ffffff', + 'editor.selectionBackground': '#c8c8fa', + 'editor.inactiveSelectionBackground': '#fafbfc', + 'editor.lineHighlightBackground': '#fafbfc', + 'editorCursor.foreground': '#24292e', + 'editorWhitespace.foreground': '#959da5', + 'editorIndentGuide.background': '#959da5', + 'editorIndentGuide.activeBackground': '#24292e', + 'editor.selectionHighlightBorder': '#fafbfc', + }, +}; diff --git a/src/component/MonacoEditor/plugins/theme/index.ts b/src/component/MonacoEditor/plugins/theme/index.ts new file mode 100644 index 000000000..f30aaea7f --- /dev/null +++ b/src/component/MonacoEditor/plugins/theme/index.ts @@ -0,0 +1,15 @@ +import * as monaco from 'monaco-editor'; + +import { github, githubDark } from './github'; +import { monokai } from './monokai'; + +let loaded = false; +export function apply() { + if (loaded) { + return; + } + monaco.editor.defineTheme('github', github as any); + monaco.editor.defineTheme('githubDark', githubDark as any); + monaco.editor.defineTheme('monokai', monokai as any); + loaded = true; +} diff --git a/src/component/MonacoEditor/plugins/theme/monokai.ts b/src/component/MonacoEditor/plugins/theme/monokai.ts new file mode 100644 index 000000000..16346c47b --- /dev/null +++ b/src/component/MonacoEditor/plugins/theme/monokai.ts @@ -0,0 +1,145 @@ +export const monokai = { + base: 'vs-dark', + inherit: true, + rules: [ + { + background: '272822', + token: '', + }, + { + foreground: '75715e', + token: 'comment', + }, + { + foreground: 'e6db74', + token: 'string', + }, + { + foreground: 'ae81ff', + token: 'constant.numeric', + }, + { + foreground: 'ae81ff', + token: 'constant.language', + }, + { + foreground: 'ae81ff', + token: 'constant.character', + }, + { + foreground: 'ae81ff', + token: 'constant.other', + }, + { + foreground: 'f92672', + token: 'keyword', + }, + { + foreground: 'f92672', + token: 'storage', + }, + { + foreground: '66d9ef', + fontStyle: 'italic', + token: 'storage.type', + }, + { + foreground: 'a6e22e', + fontStyle: 'underline', + token: 'entity.name.class', + }, + { + foreground: 'a6e22e', + fontStyle: 'italic underline', + token: 'entity.other.inherited-class', + }, + { + foreground: 'a6e22e', + token: 'entity.name.function', + }, + { + foreground: 'fd971f', + fontStyle: 'italic', + token: 'variable.parameter', + }, + { + foreground: 'f92672', + token: 'entity.name.tag', + }, + { + foreground: 'a6e22e', + token: 'entity.other.attribute-name', + }, + { + foreground: '66d9ef', + token: 'support.function', + }, + { + foreground: '66d9ef', + token: 'support.constant', + }, + { + foreground: '66d9ef', + fontStyle: 'italic', + token: 'support.type', + }, + { + foreground: '66d9ef', + fontStyle: 'italic', + token: 'support.class', + }, + { + foreground: 'f8f8f0', + background: 'f92672', + token: 'invalid', + }, + { + foreground: 'f8f8f0', + background: 'ae81ff', + token: 'invalid.deprecated', + }, + { + foreground: 'cfcfc2', + token: 'meta.structure.dictionary.json string.quoted.double.json', + }, + { + foreground: '75715e', + token: 'meta.diff', + }, + { + foreground: '75715e', + token: 'meta.diff.header', + }, + { + foreground: 'f92672', + token: 'markup.deleted', + }, + { + foreground: 'a6e22e', + token: 'markup.inserted', + }, + { + foreground: 'e6db74', + token: 'markup.changed', + }, + { + foreground: 'ae81ffa0', + token: 'constant.numeric.line-number.find-in-files - match', + }, + { + foreground: 'e6db74', + token: 'entity.name.filename.find-in-files', + }, + ], + colors: { + 'editor.foreground': '#F8F8F2', + 'editor.background': '#272822', + 'editor.selectionBackground': '#49483E', + 'editor.lineHighlightBackground': '#3E3D32', + 'editorCursor.foreground': '#F8F8F0', + 'editorWhitespace.foreground': '#3B3A32', + 'editorIndentGuide.activeBackground': '#9D550FB0', + 'editor.selectionHighlightBorder': '#222218', + }, +}; +export const monokaiDark = monokai; diff --git a/src/component/ODCSetting/config/editor.tsx b/src/component/ODCSetting/config/editor.tsx index 73707b810..0ec8d8a38 100644 --- a/src/component/ODCSetting/config/editor.tsx +++ b/src/component/ODCSetting/config/editor.tsx @@ -2,6 +2,7 @@ import RadioItem from '../Item/RadioItem'; import { IODCSetting, ODCSettingGroup } from '../config'; import InputItem from '../Item/InputItem'; import KeymapInput from '@/component/Input/Keymap'; +import SelectItem from '../Item/SelectItem'; const editorGroup: ODCSettingGroup = { label: '编辑器', @@ -25,7 +26,7 @@ const editorSettings: IODCSetting[] = [ storeType: 'server', render: (value, onChange) => { return ( - Date: Tue, 27 Feb 2024 20:23:23 +0800 Subject: [PATCH 108/231] fix github theme --- .../MonacoEditor/plugins/theme/github.ts | 174 +++++++++--------- src/store/setting.ts | 2 +- 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/src/component/MonacoEditor/plugins/theme/github.ts b/src/component/MonacoEditor/plugins/theme/github.ts index d82fab4da..36df49e83 100644 --- a/src/component/MonacoEditor/plugins/theme/github.ts +++ b/src/component/MonacoEditor/plugins/theme/github.ts @@ -348,122 +348,122 @@ export const github = { }; export const githubDark = { - base: 'vs', + base: 'vs-dark', inherit: true, rules: [ { - background: 'ffffff', + background: '24292e', token: '', }, { - foreground: '6a737d', + foreground: '959da5', token: 'comment', }, { - foreground: '6a737d', + foreground: '959da5', token: 'punctuation.definition.comment', }, { - foreground: '6a737d', + foreground: '959da5', token: 'string.comment', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'constant', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'entity.name.constant', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'variable.other.constant', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'variable.language', }, { - foreground: '6f42c1', + foreground: 'b392f0', token: 'entity', }, { - foreground: '6f42c1', + foreground: 'b392f0', token: 'entity.name', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'variable.parameter.function', }, { - foreground: '22863a', + foreground: '7bcc72', token: 'entity.name.tag', }, { - foreground: 'd73a49', + foreground: 'ea4a5a', token: 'keyword', }, { - foreground: 'd73a49', + foreground: 'ea4a5a', token: 'storage', }, { - foreground: 'd73a49', + foreground: 'ea4a5a', token: 'storage.type', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'storage.modifier.package', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'storage.modifier.import', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'storage.type.java', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'punctuation.definition.string', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string punctuation.section.embedded source', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'support', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'meta.property-name', }, { - foreground: 'e36209', + foreground: 'fb8532', token: 'variable', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'variable.other', }, { - foreground: 'b31d28', + foreground: 'd73a49', fontStyle: 'bold italic underline', token: 'invalid.broken', }, { - foreground: 'b31d28', + foreground: 'd73a49', fontStyle: 'bold italic underline', token: 'invalid.deprecated', }, { foreground: 'fafbfc', - background: 'b31d28', + background: 'd73a49', fontStyle: 'italic underline', token: 'invalid.illegal', }, @@ -474,93 +474,93 @@ export const githubDark = { token: 'carriage-return', }, { - foreground: 'b31d28', + foreground: 'd73a49', fontStyle: 'bold italic underline', token: 'invalid.unimplemented', }, { - foreground: 'b31d28', + foreground: 'd73a49', token: 'message.error', }, { - foreground: '24292e', + foreground: 'f6f8fa', token: 'string source', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'string variable', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'source.regexp', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string.regexp', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string.regexp.character-class', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string.regexp constant.character.escape', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string.regexp source.ruby.embedded', }, { - foreground: '032f62', + foreground: '79b8ff', token: 'string.regexp string.regexp.arbitrary-repitition', }, { - foreground: '22863a', + foreground: '7bcc72', fontStyle: 'bold', token: 'string.regexp constant.character.escape', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'support.constant', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'support.variable', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'meta.module-reference', }, { - foreground: '735c0f', + foreground: 'fb8532', token: 'markup.list', }, { - foreground: '005cc5', + foreground: '0366d6', fontStyle: 'bold', token: 'markup.heading', }, { - foreground: '005cc5', + foreground: '0366d6', fontStyle: 'bold', token: 'markup.heading entity.name', }, { - foreground: '22863a', + foreground: 'c8e1ff', token: 'markup.quote', }, { - foreground: '24292e', + foreground: 'f6f8fa', fontStyle: 'italic', token: 'markup.italic', }, { - foreground: '24292e', + foreground: 'f6f8fa', fontStyle: 'bold', token: 'markup.bold', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'markup.raw', }, { @@ -579,119 +579,119 @@ export const githubDark = { token: 'punctuation.definition.deleted', }, { - foreground: '22863a', + foreground: '176f2c', background: 'f0fff4', token: 'markup.inserted', }, { - foreground: '22863a', + foreground: '176f2c', background: 'f0fff4', token: 'meta.diff.header.to-file', }, { - foreground: '22863a', + foreground: '176f2c', background: 'f0fff4', token: 'punctuation.definition.inserted', }, { - foreground: 'e36209', - background: 'ffebda', + foreground: 'b08800', + background: 'fffdef', token: 'markup.changed', }, { - foreground: 'e36209', - background: 'ffebda', + foreground: 'b08800', + background: 'fffdef', token: 'punctuation.definition.changed', }, { - foreground: 'f6f8fa', - background: '005cc5', + foreground: '2f363d', + background: '959da5', token: 'markup.ignored', }, { - foreground: 'f6f8fa', - background: '005cc5', + foreground: '2f363d', + background: '959da5', token: 'markup.untracked', }, { - foreground: '6f42c1', + foreground: 'b392f0', fontStyle: 'bold', token: 'meta.diff.range', }, { - foreground: '005cc5', + foreground: 'c8e1ff', token: 'meta.diff.header', }, { - foreground: '005cc5', + foreground: '0366d6', fontStyle: 'bold', token: 'meta.separator', }, { - foreground: '005cc5', + foreground: '0366d6', token: 'meta.output', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.tag', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.curly', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.round', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.square', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.angle', }, { - foreground: '586069', + foreground: 'ffeef0', token: 'brackethighlighter.quote', }, { - foreground: 'b31d28', + foreground: 'd73a49', token: 'brackethighlighter.unmatched', }, { - foreground: 'b31d28', + foreground: 'd73a49', token: 'sublimelinter.mark.error', }, { - foreground: 'e36209', + foreground: 'fb8532', token: 'sublimelinter.mark.warning', }, { - foreground: '959da5', + foreground: '6a737d', token: 'sublimelinter.gutter-mark', }, { - foreground: '032f62', + foreground: '79b8ff', fontStyle: 'underline', token: 'constant.other.reference.link', }, { - foreground: '032f62', + foreground: '79b8ff', fontStyle: 'underline', token: 'string.other.link', }, ], colors: { - 'editor.foreground': '#24292e', - 'editor.background': '#ffffff', - 'editor.selectionBackground': '#c8c8fa', - 'editor.inactiveSelectionBackground': '#fafbfc', - 'editor.lineHighlightBackground': '#fafbfc', - 'editorCursor.foreground': '#24292e', - 'editorWhitespace.foreground': '#959da5', - 'editorIndentGuide.background': '#959da5', - 'editorIndentGuide.activeBackground': '#24292e', - 'editor.selectionHighlightBorder': '#fafbfc', + 'editor.foreground': '#f6f8fa', + 'editor.background': '#24292e', + 'editor.selectionBackground': '#4c2889', + 'editor.inactiveSelectionBackground': '#444d56', + 'editor.lineHighlightBackground': '#444d56', + 'editorCursor.foreground': '#ffffff', + 'editorWhitespace.foreground': '#6a737d', + 'editorIndentGuide.background': '#6a737d', + 'editorIndentGuide.activeBackground': '#f6f8fa', + 'editor.selectionHighlightBorder': '#444d56', }, }; diff --git a/src/store/setting.ts b/src/store/setting.ts index 366deb862..c99feaccb 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -67,7 +67,7 @@ const themeConfig: { [key: string]: IThemeConfig } = { editorTheme: { VSCode: 'vs-dark', OceanBase: 'obdark', - 'VSCode-HC': 'hc-dark', + 'VSCode-HC': 'hc-black', GitHub: 'githubDark', Monokai: 'monokai', }, From 3a16839bf05149f6af9732baa55f2da6c070cc78 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 28 Feb 2024 09:41:22 +0800 Subject: [PATCH 109/231] fixes oceanbase/odc#1178 --- src/component/ScriptPage/index.tsx | 6 +++++- .../Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx | 3 ++- src/store/snippet.ts | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/component/ScriptPage/index.tsx b/src/component/ScriptPage/index.tsx index 3aadf672f..fdecd6c19 100644 --- a/src/component/ScriptPage/index.tsx +++ b/src/component/ScriptPage/index.tsx @@ -27,7 +27,7 @@ import { SettingStore } from '@/store/setting'; import { default as snippet, default as snippetStore } from '@/store/snippet'; import editorUtils from '@/util/editor'; import { getUnWrapedSnippetBody } from '@/util/snippet'; -import { Layout } from 'antd'; +import { Layout, message } from 'antd'; import { inject, observer } from 'mobx-react'; import React, { PureComponent } from 'react'; import SplitPane from 'react-split-pane'; @@ -170,6 +170,10 @@ export default class ScriptPage extends PureComponent { if (!position) { return; } + if (snippetStore.snippetDragging.databaseId !== session.database.databaseId) { + message.warn('该对象不属于当前数据库'); + return; + } const CLOSE_INSERT_PROMPT = localStorage.getItem(CLOSE_INSERT_PROMPT_KEY); if (CLOSE_INSERT_PROMPT === 'true') { const name = snippetBody; diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx index 05119789b..e7380ff10 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx @@ -50,7 +50,7 @@ const TreeNodeMenu = (props: IProps) => { } node.doubleClick?.(dbSession, node, databaseFrom); }} - className={classNames("ant-tree-title", styles.fullWidthTitle)} + className={classNames('ant-tree-title', styles.fullWidthTitle)} > {node.title} {node.warning ? ( @@ -76,6 +76,7 @@ const TreeNodeMenu = (props: IProps) => { prefix: node.title?.toString(), body: node.title?.toString(), objType: node.dbObjectType, + databaseId: dbSession?.database?.databaseId, }; }} > diff --git a/src/store/snippet.ts b/src/store/snippet.ts index 57d19e4be..0bfa4a724 100644 --- a/src/store/snippet.ts +++ b/src/store/snippet.ts @@ -49,6 +49,7 @@ export interface ISnippet extends EditorSnippet { type?: EditorSnippetType; userId?: number; objType?: DbObjectType; + databaseId?: number; } // 枚举不能继承,暂时这样处理 export const EnumSnippetType = { ...EditorSnippetType, ALL: 'ALL' }; From 0d7ef52fe93a56ef4a476221f98048451b4d245f Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 28 Feb 2024 13:36:09 +0800 Subject: [PATCH 110/231] support auto focus database node --- .../SessionSelect/SessionDropdown/index.tsx | 86 ++++++++++++------- .../SessionSelect/index.less | 6 ++ .../SessionSelect/index.tsx | 20 ++++- 3 files changed, 79 insertions(+), 33 deletions(-) diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx index ca0353d82..8e1696e9e 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.tsx @@ -15,7 +15,7 @@ */ import { formatMessage } from '@/util/intl'; import { Badge, Input, Popover, Select, Space, Spin, Tooltip, Tree } from 'antd'; -import React, { Key, useContext, useEffect, useMemo, useState } from 'react'; +import React, { Key, useContext, useEffect, useMemo, useRef, useState } from 'react'; import styles from './index.less'; import Icon, { SearchOutlined } from '@ant-design/icons'; import tracert from '@/util/tracert'; @@ -99,6 +99,7 @@ const SessionDropdown: React.FC = function ({ const context = useContext(SessionContext); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); + const treeRef = useRef(null); const { datasourceId } = useParams<{ datasourceId: string; }>(); @@ -190,6 +191,17 @@ const SessionDropdown: React.FC = function ({ }; }, [data?.contents]); + useEffect(() => { + const databaseId = context?.databaseId; + const db = data?.contents.find((db) => db.id === databaseId); + if (db) { + setExpandedKeys([db.dataSource.id]); + setTimeout(() => { + treeRef?.current?.scrollTo({ key: `db:${databaseId}` }); + }, 500); + } + }, [data?.contents]); + useEffect(() => { if (dataGroup?.allDatasources) { dataSourceStatusStore.asyncUpdateStatus(dataGroup?.allDatasources?.map((a) => a.id)); @@ -368,6 +380,47 @@ const SessionDropdown: React.FC = function ({ } } } + + function TreeRender() { + return ( + { + const key = info.node?.key?.toString(); + let dbId, dsId; + if (context.datasourceMode) { + dsId = toInteger(key); + } else { + dbId = toInteger(key?.replace('db:', '')); + } + setLoading(true); + try { + await context.selectSession(dbId, dsId, from); + } catch (e) { + console.error(e); + } finally { + setLoading(false); + } + setIsOpen(false); + }} + selectedKeys={[ + context?.datasourceMode ? context?.datasourceId : `db:${context?.databaseId}`, + ].filter(Boolean)} + height={215} + expandedKeys={expandedKeys} + onExpand={(expandedKeys) => { + setExpandedKeys(expandedKeys); + }} + showIcon + blockNode={true} + treeData={treeData()} + /> + ); + } + return ( = function ({ overflow: 'hidden', }} > - { - const key = info.node?.key?.toString(); - let dbId, dsId; - if (context.datasourceMode) { - dsId = toInteger(key); - } else { - dbId = toInteger(key?.replace('db:', '')); - } - setLoading(true); - try { - await context.selectSession(dbId, dsId, from); - } catch (e) { - console.error(e); - } finally { - setLoading(false); - } - setIsOpen(false); - }} - selectedKeys={[ - context?.datasourceMode ? context?.datasourceId : `db:${context?.databaseId}`, - ].filter(Boolean)} - height={215} - showIcon - blockNode={true} - treeData={treeData()} - /> + {TreeRender()}
diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less index e5f91553d..abb888e30 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less @@ -24,3 +24,9 @@ color: var(--text-color-link); } } +.aim { + color: var(--text-color-secondary); + &:hover { + color: var(--text-color-primary); + } +} diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx index 18889d65a..54b730473 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx @@ -15,11 +15,11 @@ */ import { formatMessage } from '@/util/intl'; -import { useContext, useEffect } from 'react'; +import React, { useContext, useEffect } from 'react'; import SessionContext from '../context'; import ConnectionPopover from '@/component/ConnectionPopover'; -import Icon, { DownOutlined, LoadingOutlined } from '@ant-design/icons'; +import Icon, { AimOutlined, DownOutlined, LoadingOutlined } from '@ant-design/icons'; import { Divider, Popover, Space, Spin } from 'antd'; import styles from './index.less'; @@ -32,6 +32,9 @@ import SessionDropdown from './SessionDropdown'; import RiskLevelLabel from '@/component/RiskLevelLabel'; import { EnvColorMap } from '@/constant'; import login from '@/store/login'; +import ResourceTreeContext from '@/page/Workspace/context/ResourceTreeContext'; +import ActivityBarContext from '@/page/Workspace/context/ActivityBarContext'; +import { ActivityBarItemType } from '@/page/Workspace/ActivityBar/type'; export default function SessionSelect({ readonly, @@ -40,10 +43,22 @@ export default function SessionSelect({ dialectTypes?: ConnectionMode[]; }) { const context = useContext(SessionContext); + const resourceTreeContext = useContext(ResourceTreeContext); + const activityContext = useContext(ActivityBarContext); useEffect(() => { tracert.expo('a3112.b41896.c330994'); }, []); + function focusDataBase(e: React.MouseEvent) { + const datasourceId = context?.session?.odcDatabase?.dataSource?.id; + const databaseId = context?.session?.odcDatabase?.id; + activityContext.setActiveKey(ActivityBarItemType.Database); + resourceTreeContext.setSelectDatasourceId(datasourceId); + resourceTreeContext.setCurrentDatabaseId(databaseId); + e.stopPropagation(); + e.preventDefault(); + } + function renderProject() { const DBIcon = getDataSourceStyleByConnectType(context?.session?.connection?.type)?.dbIcon; return ( @@ -138,6 +153,7 @@ export default function SessionSelect({ /> {context?.session?.odcDatabase?.name} + } From 02f7acb510a00a2de18d347a6b33545fbc15d8a2 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 28 Feb 2024 17:51:03 +0800 Subject: [PATCH 111/231] add view comment --- .../Workspace/components/ShowViewBaseInfoForm/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx b/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx index 344e84ada..932336ada 100644 --- a/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx +++ b/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx @@ -32,7 +32,7 @@ const { Option } = Select; class ShowViewBaseInfoForm extends Component { public render() { - const { viewName, checkOption, definer } = this.props.model ?? {}; + const { viewName, checkOption, definer, comment } = this.props.model ?? {}; const formItemLayout = { labelCol: { span: 6 }, wrapperCol: { span: 14 }, @@ -42,6 +42,7 @@ class ShowViewBaseInfoForm extends Component { viewName: viewName, checkOption: checkOption || CheckOption.NONE, definer: definer, + comment, }; if (!viewName) { @@ -77,6 +78,9 @@ class ShowViewBaseInfoForm extends Component { >
+ + + ); } From 94477387e8bad409736b55be42058068ba858c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 28 Feb 2024 19:47:44 +0800 Subject: [PATCH 112/231] PullRequest: 338 Fixes oceanbase/odc#1651 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-1651 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/338 Signed-off-by: 晓康 * Fixes oceanbase/odc#1651 --- src/component/Task/AsyncTask/DetailContent/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/component/Task/AsyncTask/DetailContent/index.tsx b/src/component/Task/AsyncTask/DetailContent/index.tsx index 2c825167f..c67ab8507 100644 --- a/src/component/Task/AsyncTask/DetailContent/index.tsx +++ b/src/component/Task/AsyncTask/DetailContent/index.tsx @@ -223,7 +223,9 @@ const AsyncTaskContent: React.FC = (props) => { )}
{result?.autoModifyTimeout && ( - +
Date: Wed, 28 Feb 2024 19:48:03 +0800 Subject: [PATCH 113/231] PullRequest: 339 feat: LDAP's form append loginFailedLimit and lockTimeSeconds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch feat/dev-4.2.4-ldap-newFormItems of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/339 Signed-off-by: 晓康 * feat: LDAP's form append loginFailedLimit and lockTimeSeconds --- .../NewSSODrawerButton/SSOForm/PartForm.tsx | 46 ++++++++++++++++++- .../SSO/NewSSODrawerButton/SSOForm/index.tsx | 2 + src/page/Login/components/LDAPModal/index.tsx | 46 ++++++++++++++----- 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx index 28a566c14..f8528b0a9 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx @@ -20,7 +20,7 @@ import { IUserInfoAuthenticationMethod, } from '@/d.ts'; import { formatMessage } from '@/util/intl'; -import { Form, Input, Select, Space, Switch, Typography } from 'antd'; +import { Form, Input, InputNumber, Select, Space, Switch, Typography } from 'antd'; import React from 'react'; import HelpDoc from '@/component/helpDoc'; import { requiredRule } from '.'; @@ -503,6 +503,50 @@ export const LDAPPartForm: React.FC<{ ]} /> + + loginFailedLimit + + } + rules={[ + { + ...requiredRule, + message: '请输入最大连续登录失败次数', + }, + ]} + initialValue={5} + > + + + + lockTimeSeconds + + } + rules={[ + { + ...requiredRule, + message: '请输入登录次数重置时间', + }, + ]} + initialValue={600} + > + + ); }; diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx index 7089dae86..62dc84aa8 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/index.tsx @@ -249,6 +249,8 @@ export default inject('userStore')( ['ssoParameter', 'groupSearchBase'], ['ssoParameter', 'groupSearchFilter'], ['ssoParameter', 'groupSearchSubtree'], + ['ssoParameter', 'loginFailedLimit'], + ['ssoParameter', 'lockTimeSeconds'], ['mappingRule', 'userProfileViewType'], ['mappingRule', 'nestedAttributeField'], ]) diff --git a/src/page/Login/components/LDAPModal/index.tsx b/src/page/Login/components/LDAPModal/index.tsx index fd85eccae..39b6d90d8 100644 --- a/src/page/Login/components/LDAPModal/index.tsx +++ b/src/page/Login/components/LDAPModal/index.tsx @@ -5,7 +5,7 @@ import { UserStore } from '@/store/login'; import channel, { ChannelMap } from '@/util/broadcastChannel'; import { formatMessage, getLocalImg } from '@/util/intl'; import { LockOutlined, UserOutlined } from '@ant-design/icons'; -import { Button, Divider, Form, Input, message } from 'antd'; +import { Alert, Button, Divider, Form, Input, message } from 'antd'; import useForm from 'antd/lib/form/hooks/useForm'; import classNames from 'classnames'; import { inject, observer } from 'mobx-react'; @@ -45,6 +45,7 @@ export const LDAPLogin: React.FC<{ mode: ELDAPMode; data: ISSOConfig; }>(); + const [errorMessage, setErrorMessage] = useState(null); const handleTest = async () => { const data = await form.validateFields().catch(); if (isSubmiting) { @@ -64,13 +65,14 @@ export const LDAPLogin: React.FC<{ }); if (!result?.successful) { setIsSubmiting(false); - return message.error(result?.errMsg || '测试登录失败!'); + setErrorMessage(result?.errMsg); } else { channel.send(ChannelMap.LDAP_TEST, { isSuccess: true, testId: res.testId, }); setIsSubmiting(false); + setErrorMessage(null); } }; const handleLogin = async () => { @@ -83,8 +85,10 @@ export const LDAPLogin: React.FC<{ username: data?.username, password: data?.password, }); + console.log(result); if (result?.successful) { message.success(formatMessage({ id: 'login.login.success' })); + setErrorMessage(null); await userStore.getOrganizations(); const isSuccess = await userStore.switchCurrentOrganization(); if (!isSuccess) { @@ -104,7 +108,7 @@ export const LDAPLogin: React.FC<{ toDefaultProjectPage(); } } else { - message.error('LDAP 登录失败,请检查输入项是否正确!'); + setErrorMessage(result?.errMsg); console.error(result); } setIsSubmiting(false); @@ -151,21 +155,39 @@ export const LDAPLogin: React.FC<{ handleTest={handleTest} handleLogin={handleLogin} /> + {errorMessage && ( + + )}
); } return ( - + <> + + {errorMessage && ( + + )} + ); }), ); From 3e83230bacb3abe0e74ff8b1dd4d57a6b29dc482 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 29 Feb 2024 10:11:35 +0800 Subject: [PATCH 114/231] support builtinSnippets --- package.json | 2 +- pnpm-lock.yaml | 22 +++++++++---------- src/common/network/snippet.ts | 6 +++++ .../plugins/ob-language/service.ts | 12 ++++++++++ .../Workspace/components/SQLPage/index.tsx | 4 ++++ src/store/sessionManager/session.ts | 10 +++++++++ 6 files changed, 44 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 4d4761b2f..87931e63e 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ }, "devDependencies": { "@ant-design/icons": "^4.0.0", - "@oceanbase-odc/monaco-plugin-ob": "^0.2.1", + "@oceanbase-odc/monaco-plugin-ob": "^0.2.2", "@oceanbase-odc/ob-intl-cli": "^2.0.2", "@oceanbase-odc/ob-parser-js": "^3.0.1", "@oceanbase-odc/ob-react-data-grid": "^3.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3515ad43..811f7c1f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,8 +41,8 @@ devDependencies: specifier: ^4.0.0 version: 4.8.1(react-dom@17.0.2)(react@17.0.2) '@oceanbase-odc/monaco-plugin-ob': - specifier: ^0.2.1 - version: 0.2.1(monaco-editor@0.36.1) + specifier: ^0.2.2 + version: 0.2.2(monaco-editor@0.36.1) '@oceanbase-odc/ob-intl-cli': specifier: ^2.0.2 version: 2.0.2(prettier@2.8.8)(typescript@4.9.5) @@ -3338,8 +3338,8 @@ packages: fastq: 1.16.0 dev: true - /@oceanbase-odc/monaco-plugin-ob@0.2.1(monaco-editor@0.36.1): - resolution: {integrity: sha512-qU4JYQAOWMnU0b1n84tUydpqlR1NZy9IJewEYTOAkRspNdw6/yH3+c/ZpDm4OtFTNmrnsINC+cQ/PW2hIPjjZw==} + /@oceanbase-odc/monaco-plugin-ob@0.2.2(monaco-editor@0.36.1): + resolution: {integrity: sha512-FjewRgoTQWfq4yPrxio3gHvEUomXM+Erybcc3m0aDYLwoa/sObwswy99zL1kjxQC8DCxFsFrRuKVFQgAS/jINQ==} peerDependencies: monaco-editor: ^0.34.1 dependencies: @@ -4185,7 +4185,7 @@ packages: resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. dependencies: - history: 4.10.1 + history: 5.3.0 dev: true /@types/hoist-non-react-statics@3.3.5: @@ -5150,7 +5150,7 @@ packages: babel-plugin-import: 1.13.8 babel-plugin-styled-components: 2.1.4(@babel/core@7.23.9)(styled-components@6.1.1) dayjs: 1.11.10 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dva-immer: 1.0.1(dva@2.5.0-beta.2) dva-loading: 3.0.24(dva-core@2.0.4) event-emitter: 0.3.5 @@ -8083,7 +8083,7 @@ packages: warning: 3.0.0 dev: true - /dva-core@2.0.4(redux@3.7.2): + /dva-core@2.0.4(redux@4.2.1): resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} peerDependencies: redux: 4.x @@ -8093,7 +8093,7 @@ packages: global: 4.4.0 invariant: 2.2.4 is-plain-object: 2.0.4 - redux: 3.7.2 + redux: 4.2.1 redux-saga: 0.16.2 warning: 3.0.0 dev: true @@ -8114,7 +8114,7 @@ packages: dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0 dependencies: '@babel/runtime': 7.23.9 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dev: true /dva@2.5.0-beta.2(react-dom@17.0.2)(react@17.0.2): @@ -14851,7 +14851,7 @@ packages: /react-redux@8.1.3(@types/react-dom@16.9.24)(@types/react@16.14.56)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1): resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} peerDependencies: - '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react': ^16.0.0 '@types/react-dom': ^16.8 || ^17.0 || ^18.0 react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 @@ -17561,7 +17561,7 @@ packages: resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} peerDependencies: - '@types/react': '>=16.8' + '@types/react': ^16.0.0 react: '>=16.8' peerDependenciesMeta: '@types/react': diff --git a/src/common/network/snippet.ts b/src/common/network/snippet.ts index 751c557f1..3d9c3c5aa 100644 --- a/src/common/network/snippet.ts +++ b/src/common/network/snippet.ts @@ -56,3 +56,9 @@ export async function deleteCustomerSnippet(snippet: ISnippet) { }); return res?.data; } + +export async function getBuiltinSnippets(): Promise { + const res = await request.get('/api/v2/snippet/builtinSnippets'); + const snippets = res?.data?.contents || []; + return snippets; +} diff --git a/src/component/MonacoEditor/plugins/ob-language/service.ts b/src/component/MonacoEditor/plugins/ob-language/service.ts index 7c1e4b779..0990687c8 100644 --- a/src/component/MonacoEditor/plugins/ob-language/service.ts +++ b/src/component/MonacoEditor/plugins/ob-language/service.ts @@ -125,5 +125,17 @@ export function getModelService( desc: func.status, })); }, + async getSnippets() { + const session = sessionFunc(); + if (session) { + return session.snippets.map((item) => { + return { + label: item.prefix || '', + documentation: item.description || '', + insertText: item.body || '', + }; + }); + } + }, }; } diff --git a/src/page/Workspace/components/SQLPage/index.tsx b/src/page/Workspace/components/SQLPage/index.tsx index b2287caed..32edd93e6 100644 --- a/src/page/Workspace/components/SQLPage/index.tsx +++ b/src/page/Workspace/components/SQLPage/index.tsx @@ -247,6 +247,10 @@ export class SQLPage extends Component { {}, { cid: this.getSession()?.odcDatabase?.id, dbName: this.getSession()?.odcDatabase?.name }, ); + /** + * 异步加载内置片段 + */ + this.getSession()?.addBuiltinSnippets(); } else if (this.props.settingStore.configurations !== this.config) { this.bindEditorKeymap(); } diff --git a/src/store/sessionManager/session.ts b/src/store/sessionManager/session.ts index f3f14bcca..0be1ba078 100644 --- a/src/store/sessionManager/session.ts +++ b/src/store/sessionManager/session.ts @@ -34,6 +34,8 @@ import settingStore from '../setting'; import DatabaseStore from './database'; import { ISupportFeature } from './type'; import setting from '../setting'; +import { getBuiltinSnippets } from '@/common/network/snippet'; +import { ISnippet } from '../snippet'; const DEFAULT_QUERY_LIMIT = 1000; const DEFAULT_DELIMITER = ';'; @@ -48,6 +50,8 @@ class SessionStore { @observable public dataTypes: IDataType[] = []; + public snippets: ISnippet[] = []; + @observable public odcDatabase: IDatabase; @@ -490,6 +494,12 @@ class SessionStore { return isSuccess; }; + @action + public addBuiltinSnippets = async () => { + const data = await getBuiltinSnippets(); + this.snippets = data; + }; + @action public changeColumnInfoVisible = async (v: boolean) => { this.params.tableColumnInfoVisible = v; From 6741aa3d1a9611ad0101c2ba5422af717aec7d0e Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 29 Feb 2024 10:21:26 +0800 Subject: [PATCH 115/231] fix: add sessionid in builtin request --- src/common/network/snippet.ts | 8 ++++++-- src/store/sessionManager/session.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/common/network/snippet.ts b/src/common/network/snippet.ts index 3d9c3c5aa..423a57efd 100644 --- a/src/common/network/snippet.ts +++ b/src/common/network/snippet.ts @@ -57,8 +57,12 @@ export async function deleteCustomerSnippet(snippet: ISnippet) { return res?.data; } -export async function getBuiltinSnippets(): Promise { - const res = await request.get('/api/v2/snippet/builtinSnippets'); +export async function getBuiltinSnippets(sid): Promise { + const res = await request.get('/api/v2/snippet/builtinSnippets', { + params: { + sessionId: sid, + }, + }); const snippets = res?.data?.contents || []; return snippets; } diff --git a/src/store/sessionManager/session.ts b/src/store/sessionManager/session.ts index 0be1ba078..0c696b365 100644 --- a/src/store/sessionManager/session.ts +++ b/src/store/sessionManager/session.ts @@ -496,7 +496,7 @@ class SessionStore { @action public addBuiltinSnippets = async () => { - const data = await getBuiltinSnippets(); + const data = await getBuiltinSnippets(this.sessionId); this.snippets = data; }; From c3f66d95425fa34ed9578b267fddced69690a6ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Thu, 29 Feb 2024 16:24:31 +0800 Subject: [PATCH 116/231] =?UTF-8?q?PullRequest:=20340=20=E5=B0=86environme?= =?UTF-8?q?ntIdMap=E4=BF=AE=E6=94=B9=E4=B8=BAenvironmentMap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-newRiskLevel of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/340 Signed-off-by: 晓康 * wip: wait for api debug * fix: modify environmentIdMap to environmentMap --- src/d.ts/environment.ts | 1 + .../Secure/RiskLevel/components/Condition.tsx | 16 +++--- .../RiskLevel/components/InnerRiskLevel.tsx | 53 +++++++++++-------- .../RiskLevel/components/RootNodeContent.tsx | 6 +-- .../Secure/RiskLevel/components/options.ts | 17 +++--- src/page/Secure/RiskLevel/interface.ts | 3 +- 6 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/d.ts/environment.ts b/src/d.ts/environment.ts index 7ca10cf85..395d00294 100644 --- a/src/d.ts/environment.ts +++ b/src/d.ts/environment.ts @@ -19,6 +19,7 @@ import type { ProjectUser } from './project'; export interface IEnvironment { id: number; name: string; + originalName?: string; description: string; rulesetId: number; rulesetName: string; diff --git a/src/page/Secure/RiskLevel/components/Condition.tsx b/src/page/Secure/RiskLevel/components/Condition.tsx index d53b47a47..7a2b1bf57 100644 --- a/src/page/Secure/RiskLevel/components/Condition.tsx +++ b/src/page/Secure/RiskLevel/components/Condition.tsx @@ -41,7 +41,7 @@ const Condition = ({ remove, removeGroup, setShowConditionGroup, - environmentIdMap, + environmentMap, taskTypeIdMap, sqlCheckResultIdMap, environmentOptions, @@ -62,7 +62,7 @@ const Condition = ({ value: string; }[] >(environmentOptions); - const [valueMap, setValueMap] = useState<{ [key in string | number]: string }>(environmentIdMap); + const [valueMap, setValueMap] = useState<{ [key in string | number]: string }>(environmentMap); const [isMultiple, setIsMultiple] = useState( checkMultipleOrTags(condition?.operator) || false, ); @@ -72,9 +72,9 @@ const Condition = ({ const initCondition = () => { handleOperatorChange(operator); switch (expression) { - case Expression.ENVIRONMENT_ID: { + case Expression.ENVIRONMENT_NAME: { setValueOptions(environmentOptions); - setValueMap(environmentIdMap); + setValueMap(environmentMap); return; } case Expression.TASK_TYPE: { @@ -99,7 +99,7 @@ const Condition = ({ } default: { setValueOptions(environmentOptions); - setValueMap(environmentIdMap); + setValueMap(environmentMap); return; } } @@ -110,9 +110,7 @@ const Condition = ({ if (checkIsProNameOrDBName(expression)) { setIsInputComponent(false); setIsTags(true); - console.log(99, value); } else { - console.log(101, value); const data = formRef.getFieldsValue()?.conditions; if (parentIsRoot && !firstTimeLoadRef.current) { if (!firstTimeLoadRef.current) { @@ -200,8 +198,8 @@ const Condition = ({ } options={[ { - label: ExpressionMap[Expression.ENVIRONMENT_ID], - value: Expression.ENVIRONMENT_ID, + label: ExpressionMap[Expression.ENVIRONMENT_NAME], + value: Expression.ENVIRONMENT_NAME, }, { label: ExpressionMap[Expression.PROJECT_NAME], diff --git a/src/page/Secure/RiskLevel/components/InnerRiskLevel.tsx b/src/page/Secure/RiskLevel/components/InnerRiskLevel.tsx index b626fa216..d64f2282b 100644 --- a/src/page/Secure/RiskLevel/components/InnerRiskLevel.tsx +++ b/src/page/Secure/RiskLevel/components/InnerRiskLevel.tsx @@ -23,7 +23,7 @@ import useForm from 'antd/es/form/hooks/useForm'; import classnames from 'classnames'; import _ from 'lodash'; import Condition from './Condition'; -import { SelectItemProps } from '../interface'; +import { Expression, SelectItemProps } from '../interface'; import TreeTitle from './TreeTitle'; import { createRiskDetectRules, @@ -71,13 +71,11 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor const [originRootNode, setOriginRootNode] = useState(null); const [loading, setLoading] = useState(false); const [empty, setEmpty] = useState(true); - const [environmentIdMap, setEnvironmentIdMap] = useState<{ [key in string | number]: string }>( - {}, - ); + const [environmentMap, setEnvironmentMap] = useState<{ [key in string | number]: string }>({}); const [taskTypeIdMap, setTaskTypeIdMap] = useState<{ [key in string | number]: string }>({}); - const [sqlCheckResultIdMap, setSqlCheckResultIdMap] = useState< - { [key in string | number]: string } - >({}); + const [sqlCheckResultIdMap, setSqlCheckResultIdMap] = useState<{ + [key in string | number]: string; + }>({}); const [environmentOptions, setEnvironmentOptions] = useState([]); const [taskTypeOptions, setTaskTypeOptions] = useState([]); const [sqlCheckResultOptions, setSqlCheckResultOptions] = useState([]); @@ -126,7 +124,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor conditions: conditions, }); }; - const initRootNode = async () => { + const initRootNode = async (envMap) => { if (currentRiskLevel) { const rd = await listRiskDetectRules({ riskLevelId: currentRiskLevel?.id, @@ -136,7 +134,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor } else { setEmpty(true); } - rd?.rootNode && setRootNode(rd?.rootNode); + rd?.rootNode && setRootNode(transferIdToName(rd?.rootNode, envMap)); rd?.rootNode && setRootBoolOperator( (rd?.rootNode as IConditionGroup)?.booleanOperator || EBooleanOperator.AND, @@ -148,19 +146,34 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor }; const initInnerRiskLevel = async () => { setLoading(true); - await initOptions({ - setEnvironmentIdMap, + const envMap = await initOptions({ + setEnvironmentMap, setEnvironmentOptions, setTaskTypeIdMap, setTaskTypeOptions, setSqlCheckResultIdMap, setSqlCheckResultOptions, }); - const rootNode = await initRootNode(); + const rootNode = await initRootNode(envMap); parseRootNode(rootNode); formRef.resetFields(); setLoading(false); }; + // 自定义环境为了方便拓展,需要将原来值为ENVIRONMENT_ID的expression修改为ENVIRONMENT_NAME。 + const transferIdToName = (root, envMap) => { + if (root?.type === EConditionType.CONDITION) { + if (root?.expression === Expression.ENVIRONMENT_ID) { + root.expression = Expression.ENVIRONMENT_NAME; + root.value = envMap?.[root?.value]; + } + return root; + } + if (root?.type === EConditionType.CONDITION_GROUP && root?.children?.length) { + root.children = root?.children?.map((node) => transferIdToName(node, envMap)); + return root; + } + return root; + }; const handleSubmit = async () => { const formData = await formRef.validateFields()?.catch(); const rawData = formData?.conditions; @@ -197,7 +210,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor memoryReload(); setOriginRootNode(null); setRootNode(null); - await initRootNode(); + await initRootNode(environmentMap); setIsEdit(false); formRef.resetFields(); } else { @@ -222,7 +235,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor }), //'删除成功' ); memoryReload(); - initRootNode(); + initRootNode(environmentMap); formRef.resetFields(); setRootNode(null); setOriginRootNode(null); @@ -346,7 +359,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor remove={inRemove} removeGroup={remove} setShowConditionGroup={setShowConditionGroup} - environmentIdMap={taskTypeIdMap} + environmentMap={taskTypeIdMap} taskTypeIdMap={taskTypeIdMap} sqlCheckResultIdMap={sqlCheckResultIdMap} environmentOptions={environmentOptions} @@ -368,8 +381,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor > { formatMessage({ - id: - 'odc.src.page.Secure.RiskLevel.components.AddConditions', + id: 'odc.src.page.Secure.RiskLevel.components.AddConditions', }) /* 添加条件 */ @@ -397,7 +409,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor remove={remove} removeGroup={remove} setShowConditionGroup={setShowConditionGroup} - environmentIdMap={taskTypeIdMap} + environmentMap={taskTypeIdMap} taskTypeIdMap={taskTypeIdMap} sqlCheckResultIdMap={sqlCheckResultIdMap} environmentOptions={environmentOptions} @@ -464,8 +476,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor > { formatMessage({ - id: - 'odc.src.page.Secure.RiskLevel.components.AddConditionGroup', + id: 'odc.src.page.Secure.RiskLevel.components.AddConditionGroup', }) /* 添加条件组 */ @@ -486,7 +497,7 @@ const InnerRiskLevel: React.FC = ({ currentRiskLevel, memor key={currentRiskLevel?.id} empty={empty} rootNode={originRootNode} - environmentIdMap={environmentIdMap} + environmentMap={environmentMap} taskTypeIdMap={taskTypeIdMap} sqlCheckResultIdMap={sqlCheckResultIdMap} /> diff --git a/src/page/Secure/RiskLevel/components/RootNodeContent.tsx b/src/page/Secure/RiskLevel/components/RootNodeContent.tsx index 4bc646573..9aa5a2c6d 100644 --- a/src/page/Secure/RiskLevel/components/RootNodeContent.tsx +++ b/src/page/Secure/RiskLevel/components/RootNodeContent.tsx @@ -24,7 +24,7 @@ import { useState } from 'react'; const RootNodeContent = ({ empty, rootNode, - environmentIdMap, + environmentMap, taskTypeIdMap, sqlCheckResultIdMap, }) => { @@ -32,8 +32,8 @@ const RootNodeContent = ({ const getValueMapByExpression = (expression: Expression): { [key in string]: string } => { let valueMap; switch (expression) { - case Expression.ENVIRONMENT_ID: { - valueMap = environmentIdMap; + case Expression.ENVIRONMENT_NAME: { + valueMap = environmentMap; break; } case Expression.TASK_TYPE: { diff --git a/src/page/Secure/RiskLevel/components/options.ts b/src/page/Secure/RiskLevel/components/options.ts index 57c690ed8..c536c74d5 100644 --- a/src/page/Secure/RiskLevel/components/options.ts +++ b/src/page/Secure/RiskLevel/components/options.ts @@ -23,8 +23,9 @@ export const getEnvironmentOptions = async () => { const rawData = (await listEnvironments()) || []; const newEnvOptions = rawData?.map((rd) => { return { - label: rd.name, - value: '' + rd.id, + id: rd?.id, + label: rd?.name, + value: rd?.originalName, }; }); return newEnvOptions; @@ -94,7 +95,7 @@ export const getSqlCheckResultOptions = () => { return sqlCheckResultOptions; }; export const initOptions = async ({ - setEnvironmentIdMap, + setEnvironmentMap, setEnvironmentOptions, setTaskTypeIdMap, setTaskTypeOptions, @@ -102,9 +103,12 @@ export const initOptions = async ({ setSqlCheckResultOptions, }) => { const envOptions = await getEnvironmentOptions(); - const envIdMap = {}; - envOptions?.forEach(({ value, label }) => (envIdMap[value] = label)); - setEnvironmentIdMap(envIdMap); + const envMap = {}; + envOptions?.forEach(({ value, label, id }) => { + envMap[value] = label; + envMap[id] = value; + }); + setEnvironmentMap(envMap); setEnvironmentOptions(envOptions); const taskTypeOptions = await getTaskTypeOptions(); const taskTypeIdMap = {}; @@ -116,4 +120,5 @@ export const initOptions = async ({ sqlCheckResultOptions?.forEach(({ label, value }) => (sqlChekcResultMap['' + value] = label)); setSqlCheckResultIdMap(sqlChekcResultMap); setSqlCheckResultOptions(sqlCheckResultOptions); + return envMap; }; diff --git a/src/page/Secure/RiskLevel/interface.ts b/src/page/Secure/RiskLevel/interface.ts index 7ae5f676a..b19483ba6 100644 --- a/src/page/Secure/RiskLevel/interface.ts +++ b/src/page/Secure/RiskLevel/interface.ts @@ -41,6 +41,7 @@ export interface SelectItemProps { value: string | number; } export enum Expression { + ENVIRONMENT_NAME = 'ENVIRONMENT_NAME', ENVIRONMENT_ID = 'ENVIRONMENT_ID', TASK_TYPE = 'TASK_TYPE', SQL_CHECK_RESULT = 'SQL_CHECK_RESULT', @@ -48,7 +49,7 @@ export enum Expression { DATABASE_NAME = 'DATABASE_NAME', } export const ExpressionMap = { - [Expression.ENVIRONMENT_ID]: formatMessage({ + [Expression.ENVIRONMENT_NAME]: formatMessage({ id: 'odc.src.page.Secure.RiskLevel.Environment', }), //'环境' [Expression.TASK_TYPE]: formatMessage({ From 8984bd9f469869a85f99b08abc9fa491f3f96074 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 29 Feb 2024 19:20:39 +0800 Subject: [PATCH 117/231] fix: remove error arrow --- src/component/SQLConfig/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/component/SQLConfig/index.tsx b/src/component/SQLConfig/index.tsx index 82cc68d5c..279fe9981 100644 --- a/src/component/SQLConfig/index.tsx +++ b/src/component/SQLConfig/index.tsx @@ -219,6 +219,7 @@ const SQLConfig: React.FC = function (props) { title="" content={session ? renderContent() : null} open={visible} + showArrow={false} onOpenChange={(v) => { setVisible(v); }} From bc019a6251748574e5121d1a74a3c4b2308e4751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Fri, 1 Mar 2024 16:40:57 +0800 Subject: [PATCH 118/231] PullRequest: 343 PartitionTask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-partitionTask-0229 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/343 Signed-off-by: 陈朝俊 * feat: PartitionTask (remove PartitionPolicyTable to Task/component) * feat: PartitionTask (create) * chore: PartitionTask (create - clear test data) * feat: PartitionTask (create & detail) * feat: PartitionTask (create form) * feat: PartitionTask (api sync) * feat: PartitionTask (detail modal - api sync) * feat: PartitionTask (support oracle database) * feat: PartitionTask (sql preview adjusted to CommonIDE) * fix: PartitionTask (date type calculation) * fix: PartitionTask (form validation) * fix: PartitionTask (strategy display problem in create modal) * fix: PartitionTask (test bugs) * fix: PartitionTask (create form default value) * fix: PartitionTask (create form style) * fix: PartitionTask (clear checkConnectionPartitionPlan api) * fix: PartitionTask (create form) * fix: PartitionTask (create form - date select) * fix: PartitionTask (create form - suffix select & ui change sync) * fix: PartitionTask (create form - style) * fomat: component name change (SQLCodeEditorDDL -> SQLCodePreviewer) * fix: PartitionTask (time unit conversion) * fix: PartitionTask (status style) * feat: PartitionTask (remove formatting from sql preview) * fix: PartitionTask (detail page display) * fix: PartitionTask (detail page - history api change sync) * fix: PartitionTask (create form - add alert info) * feat: PartitionTask (api change sync) * fix: PartitionTask (alter info style) * fix: PartitionTask (filter invalid config) * fix: PartitionTask (set form defaults based on data type) * fix: PartitionTask (do not allow different partitionMode to be selected at the same time) * fix: PartitionTask (batch selection and interactive modification) * fix: PartitionTask (style) * format: pr commit fix * fix: PartitionTask (style) --- src/common/datasource/oceanbase/oboracle.ts | 8 +- src/common/network/task.ts | 86 +- src/component/AddDataSourceDropdown/index.tsx | 2 +- src/component/CommonTable/TableInfo.tsx | 18 +- src/component/Crontab/index.tsx | 11 +- .../index.less | 0 .../index.tsx | 4 +- .../Task/AsyncTask/DetailContent/index.tsx | 4 +- src/component/Task/Content.tsx | 15 +- src/component/Task/DetailModal.tsx | 42 +- .../Task/PartitionTask/CreateModal/index.tsx | 526 +++++++----- .../DetailContent/CycleDescriptionItem.tsx | 70 ++ .../PartitionTask/DetailContent/index.tsx | 187 ++--- .../Task/SQLPlanTask/DetailContent/index.tsx | 6 +- .../Task/component/ApprovalModal/index.tsx | 17 +- .../component/CommonDetailModal/FlowModal.tsx | 15 +- .../CommonDetailModal/TaskRecord.tsx | 7 +- .../EditTable/index.less | 23 + .../EditTable/index.tsx | 149 ++++ .../PreviewSQLModal/index.less | 16 + .../PreviewSQLModal/index.tsx | 77 ++ .../RuleFormItem/index.less | 11 + .../RuleFormItem/index.tsx | 228 +++++ .../PartitionPolicyFormTable/configModal.tsx | 787 ++++++++++++++++++ .../PartitionPolicyFormTable/const.ts | 4 + .../PartitionPolicyFormTable/index.less | 56 ++ .../PartitionPolicyFormTable/index.tsx | 243 ++++++ .../PartitionPolicyTable/ConfigDrawer.tsx | 101 +++ .../PartitionPolicyTable/ConfigTable.tsx | 74 ++ .../PartitionPolicyTable/index.less | 23 + .../component/PartitionPolicyTable/index.tsx | 237 ++++++ .../Task/component/SimpleTextItem/index.tsx | 4 +- src/component/Task/const.ts | 11 + src/d.ts/index.ts | 148 +++- .../components/FunctionPage/index.tsx | 4 +- .../components/PackagePage/index.tsx | 6 +- .../PartitionPolicyTable/configModal.tsx | 426 ---------- .../components/PartitionPolicyTable/index.tsx | 361 -------- .../components/ProcedurePage/index.tsx | 4 +- .../components/SequencePage/index.tsx | 4 +- .../components/SynonymPage/index.tsx | 4 +- .../components/TablePage/DDL/index.tsx | 4 +- .../components/TriggerPage/index.tsx | 4 +- .../Workspace/components/TypePage/index.tsx | 4 +- .../Workspace/components/ViewPage/index.tsx | 4 +- src/util/utils.ts | 10 + 46 files changed, 2742 insertions(+), 1303 deletions(-) rename src/component/{SQLCodeEditorDDL => SQLCodePreviewer}/index.less (100%) rename src/component/{SQLCodeEditorDDL => SQLCodePreviewer}/index.tsx (91%) create mode 100644 src/component/Task/PartitionTask/DetailContent/CycleDescriptionItem.tsx create mode 100644 src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less create mode 100644 src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx create mode 100644 src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less create mode 100644 src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx create mode 100644 src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less create mode 100644 src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx create mode 100644 src/component/Task/component/PartitionPolicyFormTable/configModal.tsx create mode 100644 src/component/Task/component/PartitionPolicyFormTable/const.ts create mode 100644 src/component/Task/component/PartitionPolicyFormTable/index.less create mode 100644 src/component/Task/component/PartitionPolicyFormTable/index.tsx create mode 100644 src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx create mode 100644 src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx rename src/{page/Workspace/components => component/Task/component}/PartitionPolicyTable/index.less (76%) create mode 100644 src/component/Task/component/PartitionPolicyTable/index.tsx create mode 100644 src/component/Task/const.ts delete mode 100644 src/page/Workspace/components/PartitionPolicyTable/configModal.tsx delete mode 100644 src/page/Workspace/components/PartitionPolicyTable/index.tsx diff --git a/src/common/datasource/oceanbase/oboracle.ts b/src/common/datasource/oceanbase/oboracle.ts index f2b6055fc..a5cf93de9 100644 --- a/src/common/datasource/oceanbase/oboracle.ts +++ b/src/common/datasource/oceanbase/oboracle.ts @@ -100,13 +100,7 @@ const items: Record - ![ - TaskType.SHADOW, - TaskType.DATA_ARCHIVE, - TaskType.DATA_DELETE, - TaskType.PARTITION_PLAN, - ].includes(type), + (type) => ![TaskType.SHADOW, TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(type), ), obclient: true, recycleBin: true, diff --git a/src/common/network/task.ts b/src/common/network/task.ts index 44537ca9f..7e5d4b054 100644 --- a/src/common/network/task.ts +++ b/src/common/network/task.ts @@ -18,12 +18,15 @@ import { IShadowSyncAnalysisResult } from '@/component/Task/ShadowSyncTask/Creat import { CommonTaskLogType, CreateTaskRecord, + IPartitionTablePreviewConfig, CycleTaskDetail, IAsyncTaskResultSet, ICycleSubTaskRecord, ICycleTaskRecord, IFunction, IPartitionPlan, + IPartitionPlanTable, + IPartitionPlanKeyType, IResponseData, ISubTaskRecords, ITaskResult, @@ -65,6 +68,28 @@ export async function createTask(data: Partial): Promise +> { + const res = await request.post( + `/api/v2/datasource/sessions/${sessionId}/partitionPlans/latest/preview`, + { + data, + }, + ); + return res?.data || []; +} + /** * SQL 预览 */ @@ -384,39 +409,60 @@ export async function getStructureComparisonTaskFile( } /** - * 查询分区详情 + * 查询分区候选表集合 */ -export async function getPartitionPlan(params: { - databaseId?: number; - isFilterManagedTable?: boolean; -}): Promise { - const res = await request.get('/api/v2/partitionPlan/partitionPlans', { - params, - }); +export async function getPartitionPlanTables( + sessionId: string, + databaseId: number, +): Promise> { + const res = await request.get( + `/api/v2/connect/sessions/${sessionId}/databases/${databaseId}/candidatePartitionPlanTables`, + { + params: { + sessionId, + databaseId, + }, + }, + ); return res?.data; } /** - * 更新分区计划 + * 查询分区候选表分区键类型集合 */ -export async function updatePartitionPlan(id, data: Partial): Promise { - const res = await request.put(`/api/v2/partitionPlan/partitionPlans/${id}`, { - data, - }); - return !!res?.data; +export async function getPartitionPlanKeyDataTypes( + sessionId: string, + databaseId: number, + tableName: string, +): Promise> { + const res = await request.get( + `/api/v2/connect/sessions/${sessionId}/databases/${databaseId}/candidatePartitionPlanTables/${tableName}/getPartitionKeyDataTypes`, + { + params: { + sessionId, + databaseId, + tableName, + }, + }, + ); + return res?.data; } /** - * 检查当前连接下是否已存在分区计划 + * 查询分区策略详情 */ -export async function checkConnectionPartitionPlan(id: number): Promise { - const res = await request.get('/api/v2/partitionPlan/partitionPlans/exists', { - params: { - databaseId: id, +export async function getPartitionPlan(taskId: number): Promise { + const res = await request.get( + `/api/v2/flow/flowInstances/${taskId}/tasks/partitionPlans/getDetail`, + { + params: { + id: taskId, + }, }, - }); + ); return res?.data; } + /* * 发起结构分析任务 */ diff --git a/src/component/AddDataSourceDropdown/index.tsx b/src/component/AddDataSourceDropdown/index.tsx index c3b42e727..75687f2cd 100644 --- a/src/component/AddDataSourceDropdown/index.tsx +++ b/src/component/AddDataSourceDropdown/index.tsx @@ -56,7 +56,7 @@ export default function AddDataSourceDropdown(props: IProps) { key: 'batchImport', }); return result; - }, [dorisConnectTypes,mysqlConnectTypes, obConnectTypes]); + }, [dorisConnectTypes, mysqlConnectTypes, obConnectTypes]); return ( extends IRowSelecter { } export const TableInfo: React.FC> = (props) => { - const { options, selectedRowKeys, onCancelSelect, onSelectAllRows } = props; + const { options, selectedRowKeys, hideSelectAll, onCancelSelect, onSelectAllRows } = props; return (
> = (props) => { /*已选择{selectedRowKeysLength}项*/ } - - { - formatMessage({ - id: 'odc.component.CommonTable.TableInfo.SelectAll', - }) /*全选所有*/ - } - + {!hideSelectAll && ( + + { + formatMessage({ + id: 'odc.component.CommonTable.TableInfo.SelectAll', + }) /*全选所有*/ + } + + )} { formatMessage({ diff --git a/src/component/Crontab/index.tsx b/src/component/Crontab/index.tsx index 52883fbb2..3449340af 100644 --- a/src/component/Crontab/index.tsx +++ b/src/component/Crontab/index.tsx @@ -50,11 +50,12 @@ const defaultCronTabValue = { interface IProps { initialValue?: ICrontab; + title?: string; onValueChange: (value: ICrontab) => void; } const Crontab = (props, ref) => { - const { initialValue = null, onValueChange } = props; + const { initialValue = null, title = '定时周期', onValueChange } = props; const [value, setValue] = useState(() => { return merge({}, defaultCronTabValue, initialValue); }); @@ -142,13 +143,7 @@ const Crontab = (props, ref) => { return (
- - { - formatMessage({ - id: 'odc.component.Crontab.TimingPeriod', - }) /*定时周期*/ - } - + {title}
+ + + + + + ); +}; + +interface TableFormProps { + form: FormInstance; +} + +const TableForm: React.FC = (props) => { + const { form } = props; + + return ( + + {(fields) => { + return ( + + {(field) => } + + ); + }} + + ); +}; + +interface IEditTableProps { + form: FormInstance; +} + +const EditTable: React.FC = (props) => { + const { form } = props; + return ( + <> +
+
{column?.name}
+
+
+ {column?.type?.localizedMessage || column?.type?.dataTypeName} +
+
+
+ +
+
+ +
+
+ + + {columns?.map((item) => { + return ( + + ); + })} + + +
+ {item?.title} +
+ + + + +
+ + ); +}; + +export default EditTable; diff --git a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less new file mode 100644 index 000000000..5116293e5 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.less @@ -0,0 +1,16 @@ +.wrapper { + height: calc(100% - 40px); + position: relative; + background: var(--background-tertraiy-color); + padding: 11px 12px 8px; +} +.tabs { + :global { + .ant-tabs-nav .ant-tabs-tab { + padding: 4px 12px; + } + .ant-tabs-nav { + margin-bottom: 10px; + } + } +} diff --git a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx new file mode 100644 index 000000000..d5af960b7 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx @@ -0,0 +1,77 @@ +/* + * 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 { Button, Drawer, Tabs } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { SQLCodePreviewer } from '@/component/SQLCodePreviewer'; +import styles from './index.less'; + +interface IProps { + visible: boolean; + previewData: { + tableName: string; + sqls: string[]; + }[]; + onClose: () => void; +} +const PreviewSQLModal: React.FC = (props) => { + const { visible, previewData, onClose } = props; + const [activeKey, setActiveKey] = useState(previewData?.[0]?.tableName); + const activePreview = previewData?.find((item) => item.tableName === activeKey); + + const handleChange = (key) => { + setActiveKey(key); + }; + + useEffect(() => { + if (previewData?.length) { + setActiveKey(previewData?.[0]?.tableName); + } + }, [previewData]); + + return ( + + 关闭 + + } + > + { + return { + label: tableName, + key: tableName, + }; + })} + onChange={handleChange} + /> +
+ +
+
+ ); +}; + +export default PreviewSQLModal; diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less new file mode 100644 index 000000000..564fd815e --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.less @@ -0,0 +1,11 @@ +.pickerLabel{ + display: flex; + justify-content: space-between; + align-items: center; + .picker{ + display: inline-block; + opacity: 0; + width: 0; + height: 0; + } +} \ No newline at end of file diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx new file mode 100644 index 000000000..868cc749f --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx @@ -0,0 +1,228 @@ +import React from 'react'; +import { + Form, + Input, + Select, + Space, + Tag, + InputNumber, + Tooltip, + DatePicker, + Typography, +} from 'antd'; +import { CloseCircleFilled } from '@ant-design/icons'; +import { intervalPrecisionOptions } from '../configModal'; +import { START_DATE } from '../const'; +import { PARTITION_KEY_INVOKER } from '@/d.ts'; +import styles from '../index.less'; + +const { Text } = Typography; + +const startDateOptionValues = [ + { + label: '当前时间', + value: START_DATE.CURRENT_DATE, + description: '从实际执行的时间开始创建', + }, + { + label: '指定时间', + value: START_DATE.CUSTOM_DATE, + description: '从指定的某个时间开始创建', + }, +]; + +export const startDateOptions = startDateOptionValues.map(({ label, value, description }) => { + return { + label: ( +
+
{label}
+ {description} +
+ ), + value, + }; +}); + +const EmptyHelp = () => null; + +const getFieldProps: ( + error: string[], + position?: 'prefix' | 'suffix', +) => Partial<{ + status: 'error'; + prefix: React.ReactNode; + suffix: React.ReactNode; +}> = (error, position = 'suffix') => { + return error?.length + ? { + status: 'error', + [position]: ( + + + + ), + } + : {}; +}; + +interface TableFormProps { + field: any; +} + +const RuleFormItem: React.FC = (props) => { + const { field } = props; + + return ( + + {({ getFieldValue, getFieldError }) => { + const partitionKeyInvoker = getFieldValue([ + 'option', + 'partitionKeyConfigs', + field.name, + 'partitionKeyInvoker', + ]); + const fromCurrentTime = getFieldValue([ + 'option', + 'partitionKeyConfigs', + field.name, + 'fromCurrentTime', + ]); + const generateExprError = getFieldError([ + 'option', + 'partitionKeyConfigs', + 'columns', + field.name, + 'generateExpr', + ]); + const intervalGenerateExprError = getFieldError([ + 'option', + 'partitionKeyConfigs', + 'columns', + field.name, + 'intervalGenerateExpr', + ]); + const intervalError = getFieldError([ + 'option', + 'partitionKeyConfigs', + 'columns', + field.name, + 'interval', + ]); + const isCustom = partitionKeyInvoker === PARTITION_KEY_INVOKER.CUSTOM_GENERATOR; + + return ( + + {isCustom ? ( + <> + + + + + 间隔 + + + + + + ) : ( + <> + + 起始 + + + + } + style={{ width: 260 }} + {...getFieldProps(intervalError, 'prefix')} + /> + + + )} + + ); + }} + + ); +}; + +export default RuleFormItem; diff --git a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx new file mode 100644 index 000000000..9a506a089 --- /dev/null +++ b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx @@ -0,0 +1,787 @@ +/* + * 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 { previewPartitionPlans, getPartitionPlanKeyDataTypes } from '@/common/network/task'; +import HelpDoc from '@/component/helpDoc'; +import Action from '@/component/Action'; +import { TaskPartitionStrategy, PARTITION_KEY_INVOKER, PARTITION_NAME_INVOKER } from '@/d.ts'; +import { formatMessage } from '@/util/intl'; +import { TaskPartitionStrategyMap } from '../../const'; +import { START_DATE } from './const'; +import EditTable from './EditTable'; +import PreviewSQLModal from './PreviewSQLModal'; +import { startDateOptions } from './RuleFormItem'; +import { ITableConfig } from '../../PartitionTask/CreateModal'; +import { + Alert, + Button, + Checkbox, + Descriptions, + Form, + Input, + InputNumber, + Drawer, + Popconfirm, + Select, + Space, + Tag, + Radio, + Typography, + DatePicker, +} from 'antd'; +import React, { useEffect, useState } from 'react'; +import styles from './index.less'; + +const { Text } = Typography; + +export enum NameRuleType { + PRE_SUFFIX = 'PRE_SUFFIX', + CUSTOM = 'CUSTOM', +} + +export const intervalPrecisionOptions = [ + { + label: '秒', + value: 63, + }, + { + label: '分', + value: 31, + }, + { + label: '时', + value: 15, + }, + { + label: '日', + value: 7, + }, + { + label: '月', + value: 3, + }, + { + label: '年', + value: 1, + }, +]; + +const defaultInitialValues = { + strategies: [TaskPartitionStrategy.CREATE, TaskPartitionStrategy.DROP], + nameRuleType: NameRuleType.PRE_SUFFIX, + interval: 1, + intervalPrecision: 63, + reloadIndexes: true, +}; + +const StrategyOptions = Object.keys(TaskPartitionStrategyMap)?.map((key) => ({ + label: TaskPartitionStrategyMap[key], + value: key, +})); + +const nameRuleOptions = [ + { + label: '前缀 + 后缀', + value: NameRuleType.PRE_SUFFIX, + }, + { + label: '自定义', + value: NameRuleType.CUSTOM, + }, +]; + +interface IProps { + visible: boolean; + isBatch: boolean; + sessionId: string; + databaseId: number; + configs: ITableConfig[]; + onClose: () => void; + onChange?: (values: ITableConfig[]) => void; +} + +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', + }, +]; + +export const getUnitLabel = (value: number) => { + return intervalPrecisionOptions.find((item) => item.value === value)?.label; +}; + +const ConfigDrawer: React.FC = (props) => { + const { visible, configs, isBatch, sessionId, databaseId, onClose } = props; + const [previewSQLVisible, setPreviewSQLVisible] = useState(false); + const [ruleExample, setRuleExample] = useState(''); + const [previewData, setPreviewData] = useState< + { + tableName: string; + sqls: string[]; + }[] + >([]); + const [form] = Form.useForm(); + const strategies = Form.useWatch('strategies', form); + const nameRuleType = Form.useWatch('nameRuleType', form); + const fromCurrentTime = Form.useWatch('fromCurrentTime', form); + const isDropConfigVisible = strategies?.includes(TaskPartitionStrategy.DROP); + const isCreateConfigVisible = strategies?.includes(TaskPartitionStrategy.CREATE); + const isCustomRuleType = nameRuleType === NameRuleType.CUSTOM; + const tableNames = configs?.map((item) => item.tableName); + const firstTableName = tableNames?.[0]; + + const tableLen = configs?.length; + const moreText = + tableLen > 10 + ? formatMessage( + { + id: 'odc.components.PartitionPolicyTable.configModal.WaitForTablelenTables', + }, + { tableLen: tableLen }, + ) //`...等 ${tableLen} 个表` + : ''; + const tableLabels = configs + ?.slice(0, 10) + ?.map((item) => item?.tableName) + ?.join('; '); + + const loadKeyTypes = async () => { + const res = await getPartitionPlanKeyDataTypes(sessionId, databaseId, firstTableName); + const values = configs.map((item) => { + return { + ...item, + option: { + partitionKeyConfigs: res?.contents?.map((type, index) => { + const isDateType = !!type?.localizedMessage; + return { + partitionKeyInvoker: isDateType + ? PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR + : PARTITION_KEY_INVOKER.CUSTOM_GENERATOR, + ...item.option.partitionKeyConfigs[index], + type, + }; + }), + }, + }; + }); + props.onChange(values); + }; + + const handlePlansConfigChange = (value: ITableConfig) => { + const values = configs?.map((item) => { + return { + ...item, + ...value, + }; + }); + props.onChange(values); + }; + + const handleClose = () => { + form.resetFields(); + onClose(); + }; + + const handleOk = () => { + form + .validateFields() + .then((data) => { + handlePlansConfigChange(data); + handleClose(); + }) + .catch((error) => { + console.error(JSON.stringify(error)); + }); + }; + + const handlePreview = () => { + form + .validateFields() + .then(async (data) => { + const { + strategies, + generateCount, + nameRuleType, + namingPrefix, + namingSuffixExpression, + fromCurrentTime, + baseTimestampMillis, + generateExpr, + option, + keepLatestCount, + interval, + intervalPrecision, + intervalGenerateExpr, + reloadIndexes, + } = data; + const partitionKeyConfigs = + option?.partitionKeyConfigs?.map((item) => { + const { + name: partitionKey, + partitionKeyInvoker, + fromCurrentTime, + baseTimestampMillis, + generateExpr, + interval, + intervalPrecision, + intervalGenerateExpr, + } = item; + if (partitionKeyInvoker === PARTITION_KEY_INVOKER.CUSTOM_GENERATOR) { + return { + partitionKey, + partitionKeyInvoker, + strategy: 'CREATE', + partitionKeyInvokerParameters: { + generateCount, + partitionKey, + generateParameter: { + generateExpr, + intervalGenerateExpr, + }, + }, + }; + } else { + const currentTimeParameter = { + fromCurrentTime: fromCurrentTime === START_DATE.CURRENT_DATE, + baseTimestampMillis: baseTimestampMillis?.valueOf(), + }; + if (fromCurrentTime !== START_DATE.CUSTOM_DATE) { + delete currentTimeParameter.baseTimestampMillis; + } + return { + partitionKey, + partitionKeyInvoker, + strategy: 'CREATE', + partitionKeyInvokerParameters: { + generateCount, + partitionKey, + generateParameter: { + ...currentTimeParameter, + interval, + intervalPrecision, + }, + }, + }; + } + }) ?? []; + + if (strategies?.includes('DROP')) { + partitionKeyConfigs.push({ + partitionKeyInvoker: PARTITION_KEY_INVOKER.KEEP_MOST_LATEST_GENERATOR, + strategy: 'DROP', + partitionKeyInvokerParameters: { + keepLatestCount, + reloadIndexes, + }, + }); + } + + const formData = { + tableNames, + template: { + partitionKeyConfigs: partitionKeyConfigs?.filter((item) => + strategies?.includes(item.strategy), + ), + partitionNameInvoker: null, + partitionNameInvokerParameters: null, + }, + }; + + if (nameRuleType === 'PRE_SUFFIX') { + const currentTimeParameter = { + fromCurrentTime: fromCurrentTime === START_DATE.CURRENT_DATE, + baseTimestampMillis: baseTimestampMillis?.valueOf(), + }; + if (fromCurrentTime !== START_DATE.CUSTOM_DATE) { + delete currentTimeParameter.baseTimestampMillis; + } + formData.template.partitionNameInvoker = + PARTITION_NAME_INVOKER.DATE_BASED_PARTITION_NAME_GENERATOR; + formData.template.partitionNameInvokerParameters = { + partitionNameGeneratorConfig: { + namingPrefix, + namingSuffixExpression, + interval, + intervalPrecision, + ...currentTimeParameter, + }, + }; + } else { + formData.template.partitionNameInvoker = + PARTITION_NAME_INVOKER.CUSTOM_PARTITION_NAME_GENERATOR; + formData.template.partitionNameInvokerParameters = { + generateExpr, + intervalGenerateExpr, + }; + } + + if (strategies?.length === 1 && strategies?.includes('DROP')) { + delete formData.template.partitionNameInvokerParameters; + } + const res = await previewPartitionPlans(sessionId, formData); + if (res?.contents?.length) { + setPreviewSQLVisible(true); + setPreviewData(res?.contents); + } + }) + .catch((error) => { + console.error(JSON.stringify(error)); + }); + }; + + const handleTest = async () => { + form + .validateFields([ + 'nameRuleType', + 'namingPrefix', + 'namingSuffixExpression', + 'generateExpr', + 'interval', + 'intervalPrecision', + 'intervalGenerateExpr', + 'fromCurrentTime', + 'baseTimestampMillis', + 'namingSuffixExpression', + ]) + .then(async (data) => { + const { + nameRuleType, + namingPrefix, + namingSuffixExpression, + fromCurrentTime, + baseTimestampMillis, + generateExpr, + interval, + intervalPrecision, + intervalGenerateExpr, + } = data; + const formData = { + tableNames, + onlyForPartitionName: true, + template: { + partitionNameInvoker: null, + partitionNameInvokerParameters: null, + }, + }; + + if (nameRuleType === 'PRE_SUFFIX') { + const currentTimeParameter = { + fromCurrentTime: fromCurrentTime === START_DATE.CURRENT_DATE, + baseTimestampMillis: baseTimestampMillis?.valueOf(), + }; + if (fromCurrentTime !== START_DATE.CUSTOM_DATE) { + delete currentTimeParameter.baseTimestampMillis; + } + formData.template.partitionNameInvoker = + PARTITION_NAME_INVOKER.DATE_BASED_PARTITION_NAME_GENERATOR; + formData.template.partitionNameInvokerParameters = { + partitionNameGeneratorConfig: { + namingPrefix, + namingSuffixExpression, + interval, + intervalPrecision, + ...currentTimeParameter, + }, + }; + } else { + formData.template.partitionNameInvoker = + PARTITION_NAME_INVOKER.CUSTOM_PARTITION_NAME_GENERATOR; + formData.template.partitionNameInvokerParameters = { + partitionNameGeneratorConfig: { + generateExpr, + intervalGenerateExpr, + }, + }; + } + const res = await previewPartitionPlans(sessionId, formData); + if (res?.contents?.length) { + const rule = res?.contents?.map((item) => item?.partitionName)?.join(', '); + setRuleExample(rule); + } + }) + .catch((error) => { + console.error(JSON.stringify(error)); + }); + }; + + const handleClosePreviewSQL = () => { + setPreviewSQLVisible(false); + }; + + const handleChange = () => { + setRuleExample(''); + }; + + useEffect(() => { + if (visible && databaseId && sessionId && firstTableName) { + loadKeyTypes(); + } + }, [databaseId, sessionId, firstTableName, visible]); + + useEffect(() => { + if (visible) { + const value = configs?.[0] ?? defaultInitialValues; + form.setFieldsValue({ + ...value, + }); + } + }, [configs, visible]); + + return ( + + + + {isBatch ? ( + + + + ) : ( + + )} + + } + > +
+ + {`${tableLabels}${moreText}`} + {`${tableLabels}${moreText}`} + + + + + {isCreateConfigVisible && ( + + )} + {isCreateConfigVisible && ( + + + + + + 创建规则 + 如何配置 + + } + > + + + + + + + ) : ( + + + + + + 后缀 + + + + + + )} + + + + 测试生成 + {!!ruleExample && 示例名称: {ruleExample}} + + {isCustomRuleType ? ( + + + + ) : ( + + + - - } - style={{ width: 160 }} - /> - - - { - formatMessage({ - id: 'odc.components.PartitionPolicyTable.configModal.RetentionDuration', - }) /*保留时长*/ - } - - } - rules={[ - { - required: isRequired, - message: formatMessage({ - id: - 'odc.components.PartitionPolicyTable.configModal.PleaseEnterTheRetentionPeriod', - }), //请输入保留时长 - }, - ]} - > - - - - - - { - formatMessage({ - id: 'odc.components.PartitionPolicyTable.configModal.Suffix', - }) /*后缀*/ - } - - - + {enabledTargetTable && ( + + + + )} {fields?.length > 1 && remove(name)} />}
))} diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.less b/src/component/Task/DataArchiveTask/CreateModal/index.less index 7443b05d5..1c516bb53 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.less +++ b/src/component/Task/DataArchiveTask/CreateModal/index.less @@ -22,10 +22,10 @@ .tables { display: grid; grid-gap: 8px; - grid-template-columns: 220px 1fr; + grid-template-columns: 220px 1fr 220px; align-items: baseline; &.delete { - grid-template-columns: 220px 1fr 18px; + grid-template-columns: 220px 1fr 220px 18px; } } .hide { diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.tsx b/src/component/Task/DataArchiveTask/CreateModal/index.tsx index dd00f45a0..4be918f86 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/index.tsx @@ -160,10 +160,10 @@ const CreateModal: React.FC = (props) => { const [tables, setTables] = useState(); const [form] = Form.useForm(); const databaseId = Form.useWatch('databaseId', form); - const { session, database } = useDBSession(databaseId); - const databaseName = database?.name; + const { session: sourceDBSession, database: sourceDB } = useDBSession(databaseId); + const loadTables = async () => { - const tables = await getTableListByDatabaseName(session?.sessionId, databaseName); + const tables = await getTableListByDatabaseName(sourceDBSession?.sessionId, sourceDB?.name); setTables(tables); }; const crontabRef = useRef<{ @@ -193,7 +193,7 @@ const CreateModal: React.FC = (props) => { const formData = { databaseId: sourceDatabaseId, - targetDatabase: targetDataBaseId, + targetDataBaseId: targetDataBaseId, rowLimit: rateLimit?.rowLimit, dataSizeLimit: kbToMb(rateLimit?.dataSizeLimit), deleteAfterMigration, @@ -302,7 +302,7 @@ const CreateModal: React.FC = (props) => { const { startAt, databaseId, - targetDatabase, + targetDataBaseId, variables, tables: _tables, deleteAfterMigration, @@ -319,7 +319,7 @@ const CreateModal: React.FC = (props) => { taskId: dataArchiveEditId, scheduleTaskParameters: { sourceDatabaseId: databaseId, - targetDataBaseId: targetDatabase, + targetDataBaseId, variables: getVariables(variables), tables: archiveRange === IArchiveRange.ALL @@ -327,6 +327,7 @@ const CreateModal: React.FC = (props) => { return { tableName: item?.tableName, conditionExpression: '', + targetTableName: '', }; }) : _tables, @@ -388,6 +389,7 @@ const CreateModal: React.FC = (props) => { return { tableName: item?.tableName, conditionExpression: '', + targetTableName: '', }; }) : _tables, @@ -434,14 +436,15 @@ const CreateModal: React.FC = (props) => { handleReset(); } }, [dataArchiveVisible]); + useEffect(() => { - if (database?.id) { + if (sourceDB?.id) { loadTables(); if (!isEdit) { form.setFieldValue('tables', [null]); } } - }, [database?.id]); + }, [sourceDB?.id]); useEffect(() => { if (dataArchiveEditId) { @@ -509,12 +512,12 @@ const CreateModal: React.FC = (props) => { label={formatMessage({ id: 'odc.DataArchiveTask.CreateModal.TargetDatabase', })} - /*目标数据库*/ name="targetDatabase" + /*目标数据库*/ name="targetDataBaseId" projectId={projectId} /> - + diff --git a/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx b/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx index 7eb4de59f..14d2464d5 100644 --- a/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx +++ b/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx @@ -30,11 +30,16 @@ const columns = [ dataIndex: 'conditionExpression', title: formatMessage({ id: 'odc.DataArchiveTask.DetailContent.ArchiveRange.FilterConditions' }), //过滤条件 ellipsis: true, - width: 150, render: (value) => { return {value ?? '-'}; }, }, + { + dataIndex: 'targetTableName', + title: '目标表名', + ellipsis: true, + width: 190, + }, ]; const ArchiveRange: React.FC<{ diff --git a/src/component/Task/DataClearTask/CreateModal/index.tsx b/src/component/Task/DataClearTask/CreateModal/index.tsx index 8abe42869..0a1da60cb 100644 --- a/src/component/Task/DataClearTask/CreateModal/index.tsx +++ b/src/component/Task/DataClearTask/CreateModal/index.tsx @@ -59,12 +59,25 @@ export const variable = { format: '', pattern: [null], }; + +const deleteByUniqueKeyOptions = [ + { + label: '是', + value: true, + }, + { + label: '否', + value: false, + }, +]; + const defaultValue = { triggerStrategy: TaskExecStrategy.START_NOW, archiveRange: IArchiveRange.PORTION, tables: [null], rowLimit: 100, dataSizeLimit: 1, + deleteByUniqueKey: false, }; interface IProps { modalStore?: ModalStore; @@ -128,12 +141,13 @@ const CreateModal: React.FC = (props) => { description, triggerConfig: { triggerStrategy, cronExpression, hours, days, startAt }, } = data; - const { sourceDatabaseId, rateLimit, tables, variables } = jobParameters; + const { sourceDatabaseId, rateLimit, tables, variables, deleteByUniqueKey } = jobParameters; const formData = { databaseId: sourceDatabaseId, rowLimit: rateLimit?.rowLimit, dataSizeLimit: kbToMb(rateLimit?.dataSizeLimit), tables, + deleteByUniqueKey, variables: getVariableValue(variables), archiveRange: IArchiveRange.PORTION, triggerStrategy, @@ -245,6 +259,7 @@ const CreateModal: React.FC = (props) => { description, rowLimit, dataSizeLimit, + deleteByUniqueKey, } = values; const parameters = { type: TaskJobType.DATA_DELETE, @@ -252,6 +267,7 @@ const CreateModal: React.FC = (props) => { taskId: editTaskId, scheduleTaskParameters: { databaseId, + deleteByUniqueKey, variables: getVariables(variables), tables: archiveRange === IArchiveRange.ALL @@ -500,6 +516,18 @@ const CreateModal: React.FC = (props) => { keepExpand > + + + diff --git a/src/component/Task/DataClearTask/DetailContent/index.tsx b/src/component/Task/DataClearTask/DetailContent/index.tsx index d02801d0d..668e54422 100644 --- a/src/component/Task/DataClearTask/DetailContent/index.tsx +++ b/src/component/Task/DataClearTask/DetailContent/index.tsx @@ -215,6 +215,9 @@ const DataClearTaskContent: React.FC = (props) => { onOk={handleDataSizeLimit} /> + + {jobParameters?.deleteByUniqueKey ? '是' : '否'} + Date: Tue, 5 Mar 2024 09:36:42 +0800 Subject: [PATCH 126/231] mds --- src/component/Crontab/index.tsx | 6 +- src/component/EditorToolBar/actions/sql.tsx | 9 +- src/component/ODCSetting/config/account.tsx | 19 +- src/component/ODCSetting/config/database.tsx | 38 +- src/component/ODCSetting/config/editor.tsx | 21 +- .../ODCSetting/config/performance.tsx | 9 +- .../ODCSetting/config/preference.tsx | 11 +- src/component/ODCSetting/index.tsx | 25 +- src/component/SQLConfig/index.tsx | 12 +- src/component/ScriptPage/index.tsx | 10 +- .../CreateModal/index.tsx | 140 +++- .../DetailContent/index.tsx | 102 ++- .../ApplyPermission/CreateModal/index.tsx | 30 +- .../Task/AsyncTask/CreateModal/index.tsx | 8 +- .../Task/AsyncTask/DetailContent/index.tsx | 15 +- .../CreateModal/ArchiveRange.tsx | 14 +- .../DataArchiveTask/CreateModal/index.tsx | 8 +- .../DetailContent/ArchiveRange.tsx | 2 +- .../Task/DataClearTask/CreateModal/index.tsx | 21 +- .../DataClearTask/DetailContent/index.tsx | 14 +- .../Task/DataMockerTask/CreateModal/index.tsx | 6 +- .../Task/ExportTask/CreateModal/index.tsx | 8 +- .../Task/ImportTask/CreateModal/index.tsx | 7 +- .../Task/PartitionTask/CreateModal/index.tsx | 102 ++- .../DetailContent/CycleDescriptionItem.tsx | 7 +- .../PartitionTask/DetailContent/index.tsx | 45 +- .../CreateModal/TableSelector.tsx | 29 +- .../CreateModal/index.tsx | 115 ++- .../CreateModal/interface.ts | 33 +- .../DetailContent/index.tsx | 188 ++++- .../Task/component/ActionBar/index.tsx | 16 +- .../CommonDetailModal/Nodes/SQLCheckNode.tsx | 60 +- .../Task/component/DatabaseSelecter/index.tsx | 32 +- .../EditTable/index.tsx | 25 +- .../PreviewSQLModal/index.tsx | 14 +- .../RuleFormItem/index.tsx | 71 +- .../PartitionPolicyFormTable/configModal.tsx | 331 +++++++-- .../PartitionPolicyFormTable/index.tsx | 83 ++- .../PartitionPolicyTable/ConfigDrawer.tsx | 113 ++- .../PartitionPolicyTable/ConfigTable.tsx | 37 +- .../component/PartitionPolicyTable/index.tsx | 47 +- .../Task/component/SQLPreviewModal/index.tsx | 5 +- src/component/Task/component/Status/index.tsx | 31 +- .../Task/component/TaskTable/index.tsx | 15 +- src/component/Task/const.ts | 9 +- src/component/Task/helper.tsx | 6 +- src/component/Task/index.tsx | 5 +- src/component/helpDoc/doc.tsx | 153 +++- .../SpaceContainer/Sider/MineItem/index.tsx | 8 +- .../Sider/SettingItem/index.tsx | 4 +- src/locales/must/strings/zh-CN.json | 690 +++++++++++++++++- .../Form/Account/PrivateAccount.tsx | 15 +- .../NewDatasourceDrawer/Form/AddressItems.tsx | 17 +- .../NewSSODrawerButton/SSOForm/PartForm.tsx | 216 +++++- .../SSO/NewSSODrawerButton/SSOForm/index.tsx | 19 +- .../SSO/SSODetailDrawer/index.tsx | 9 +- src/page/Login/components/LDAPModal/index.tsx | 25 +- .../Database/AddDataBaseButton/index.tsx | 11 +- .../Notification/components/Channel.tsx | 434 +++++++++-- .../Notification/components/Message.tsx | 60 +- .../Notification/components/Policy.tsx | 72 +- .../Notification/components/columns.tsx | 120 ++- .../Notification/components/interface.ts | 63 +- src/page/Project/Notification/index.tsx | 8 +- .../Project/Project/CreateProject/index.tsx | 14 +- .../User/ManageModal/CreateAuth/index.tsx | 79 +- .../Project/User/ManageModal/Status/index.tsx | 20 +- .../User/ManageModal/TaskApplyList/index.tsx | 61 +- .../User/ManageModal/UserAuthList/index.tsx | 45 +- src/page/Project/User/ManageModal/index.tsx | 64 +- .../Project/User/UpdateUserModal/index.tsx | 6 +- src/page/Project/User/index.tsx | 11 +- src/page/Project/index.tsx | 23 +- .../Secure/Env/components/EnvironmentInfo.tsx | 16 +- .../Env/components/FormEnvironmentModal.tsx | 77 +- .../Env/components/InnerEnvironment.tsx | 14 +- src/page/Secure/Env/index.tsx | 12 +- .../Secure/Record/RecordPage/interface.ts | 42 +- .../SQLResultSet/DBPermissionTable.tsx | 76 +- .../SQLResultSet/DBPermissionTableDrawer.tsx | 15 +- .../SessionSelect/SelectItem.tsx | 18 +- .../SessionSelect/SessionDropdown/index.tsx | 10 +- .../SessionSelect/index.tsx | 22 +- .../components/ShowViewBaseInfoForm/index.tsx | 7 +- 84 files changed, 3754 insertions(+), 756 deletions(-) diff --git a/src/component/Crontab/index.tsx b/src/component/Crontab/index.tsx index 3449340af..667947b10 100644 --- a/src/component/Crontab/index.tsx +++ b/src/component/Crontab/index.tsx @@ -55,7 +55,11 @@ interface IProps { } const Crontab = (props, ref) => { - const { initialValue = null, title = '定时周期', onValueChange } = props; + const { + initialValue = null, + title = formatMessage({ id: 'src.component.Crontab.D7390DC8' }), + onValueChange, + } = props; const [value, setValue] = useState(() => { return merge({}, defaultCronTabValue, initialValue); }); diff --git a/src/component/EditorToolBar/actions/sql.tsx b/src/component/EditorToolBar/actions/sql.tsx index 6a90cd644..ed197d6d2 100644 --- a/src/component/EditorToolBar/actions/sql.tsx +++ b/src/component/EditorToolBar/actions/sql.tsx @@ -63,8 +63,9 @@ const sqlActions: ToolBarActions = { SQL_EXEC: { name: () => - '运行 ' + - getKeyCodeText(setting.configurations['odc.editor.shortcut.executeStatement']).join(''), + /*'运行 '*/ formatMessage({ + id: 'src.component.EditorToolBar.actions.C07F15B8' /*'运行 '*/, + }) + getKeyCodeText(setting.configurations['odc.editor.shortcut.executeStatement']).join(''), icon: 'SQL_RUN', statusFunc: (ctx: SQLPage) => { @@ -98,7 +99,9 @@ const sqlActions: ToolBarActions = { SQL_EXEC_SECTION: { name: () => - '运行当前语句 ' + + /*'运行当前语句 '*/ formatMessage({ + id: 'src.component.EditorToolBar.actions.3BDAC881' /*'运行当前语句 '*/, + }) + getKeyCodeText(setting.configurations['odc.editor.shortcut.executeCurrentStatement']).join( '', ), diff --git a/src/component/ODCSetting/config/account.tsx b/src/component/ODCSetting/config/account.tsx index 59b7775dc..8d95b433a 100644 --- a/src/component/ODCSetting/config/account.tsx +++ b/src/component/ODCSetting/config/account.tsx @@ -1,23 +1,24 @@ +import { formatMessage } from '@/util/intl'; import RadioItem from '../Item/RadioItem'; import { IODCSetting, ODCSettingGroup } from '../config'; import { SpaceType } from '@/d.ts/_index'; const accountGroup: ODCSettingGroup = { - label: '账号', + label: formatMessage({ id: 'src.component.ODCSetting.config.01FFDFB6' }), //'账号' key: 'account', }; const accountSpaceGroup: ODCSettingGroup = { - label: '空间', + label: formatMessage({ id: 'src.component.ODCSetting.config.2D3DF155' }), //'空间' key: 'accountSpace', }; const accountPrivacyGroup: ODCSettingGroup = { - label: '隐私', + label: formatMessage({ id: 'src.component.ODCSetting.config.CE327E25' }), //'隐私' key: 'accountPrivacy', }; const accountSettings: IODCSetting[] = [ { - label: '默认空间', + label: formatMessage({ id: 'src.component.ODCSetting.config.099F3C40' }), //'默认空间' key: 'odc.account.defaultOrganizationType', group: accountGroup, secondGroup: accountSpaceGroup, @@ -27,11 +28,11 @@ const accountSettings: IODCSetting[] = [ ), + value: EThemeConfigKey.ODC_WHITE, }, { @@ -40,6 +42,7 @@ const perferenceSettings: IODCSetting[] = [ src={window.publicPath + `img/theme-dark.png`} /> ), + value: EThemeConfigKey.ODC_DARK, }, ]} @@ -50,7 +53,7 @@ const perferenceSettings: IODCSetting[] = [ }, }, { - label: '语言', + label: formatMessage({ id: 'src.component.ODCSetting.config.7E2B58B7' }), //'语言' key: 'odc.appearance.language', group: preferenceGroup, secondGroup: preferenceDefaultGroup, @@ -61,7 +64,7 @@ const perferenceSettings: IODCSetting[] = [ = ({ modalStore }) => { await saveODCSetting(JSON.stringify(localData)); } if (isSuccess) { - message.success('保存成功'); + message.success(formatMessage({ id: 'src.component.ODCSetting.E6DD81BF' /*'保存成功'*/ })); modalStore.changeOdcSettingVisible(false); } } function reset() { Modal.confirm({ - title: '确定要恢复默认设置吗?', + title: formatMessage({ id: 'src.component.ODCSetting.647A18AA' }), //'确定要恢复默认设置吗?' onOk: async () => { const isSuccess = await setting.resetUserConfig(); if (isSuccess) { - message.success('已恢复到默认配置'); + message.success( + formatMessage({ id: 'src.component.ODCSetting.654799D1' /*'已恢复到默认配置'*/ }), + ); modalStore.changeOdcSettingVisible(false); } }, @@ -175,10 +178,18 @@ const ODCSetting: React.FC = ({ modalStore }) => { function footerRender() { return ( - - + + ); @@ -189,7 +200,7 @@ const ODCSetting: React.FC = ({ modalStore }) => { width={760} open={modalStore.odcSettingVisible} onCancel={() => modalStore.changeOdcSettingVisible(false)} - title="设置" + title={formatMessage({ id: 'src.component.ODCSetting.AEB0A2EF' }) /*"设置"*/} footer={footerRender()} >
diff --git a/src/component/SQLConfig/index.tsx b/src/component/SQLConfig/index.tsx index 279fe9981..4edb74169 100644 --- a/src/component/SQLConfig/index.tsx +++ b/src/component/SQLConfig/index.tsx @@ -162,7 +162,11 @@ const SQLConfig: React.FC = function (props) { marginTop: 12, }} > - 报错继续执行 + { + formatMessage({ + id: 'src.component.SQLConfig.2F1AC452' /*报错继续执行*/, + }) /* 报错继续执行 */ + } = function (props) { marginTop: 12, }} > - 开启全链路诊断 + { + formatMessage({ + id: 'src.component.SQLConfig.C03B2372' /*开启全链路诊断*/, + }) /* 开启全链路诊断 */ + } { {showSessionSelect && ( )} + {isShowDebugStackBar ? (
{stackbar.list.map((stack) => { @@ -171,7 +173,11 @@ export default class ScriptPage extends PureComponent { return; } if (snippetStore.snippetDragging.databaseId !== session.database.databaseId) { - message.warn('该对象不属于当前数据库'); + message.warn( + formatMessage({ + id: 'src.component.ScriptPage.D0B6C37B' /*'该对象不属于当前数据库'*/, + }), + ); return; } const CLOSE_INSERT_PROMPT = localStorage.getItem(CLOSE_INSERT_PROMPT_KEY); @@ -244,6 +250,7 @@ export default class ScriptPage extends PureComponent { ) : ( this.renderPanels() )} + { ); }} /> + ); diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx index e14682532..03126f1cf 100644 --- a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx +++ b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -56,7 +57,9 @@ export const getExpireTime = (expireTime, customExpireTime, isCustomExpireTime) export const getExpireTimeLabel = (expireTime) => { const label = moment(expireTime).format('YYYY-MM-DD'); - return label === MAX_DATE_LABEL ? '永不过期' : label; + return label === MAX_DATE_LABEL + ? formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B5C7760D' }) + : label; }; const Label: React.FC<{ @@ -70,17 +73,17 @@ const Label: React.FC<{ export const permissionOptionsMap = { [DatabasePermissionType.QUERY]: { - text: '查询', + text: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.8890FE39' }), //'查询' docKey: 'ApplyDatabasePermissionQueryTip', value: DatabasePermissionType.QUERY, }, [DatabasePermissionType.EXPORT]: { - text: '导出', + text: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.3B7A9E11' }), //'导出' docKey: 'ApplyDatabasePermissionExportTip', value: DatabasePermissionType.EXPORT, }, [DatabasePermissionType.CHANGE]: { - text: '变更', + text: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.985A0E7F' }), //'变更' docKey: 'ApplyDatabasePermissionChangeTip', value: DatabasePermissionType.CHANGE, }, @@ -95,35 +98,35 @@ export const permissionOptions = Object.values(permissionOptionsMap)?.map( export const expireTimeOptions = [ { - label: '7 天', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.A3DBC09F' }), //'7 天' value: '7,days', }, { - label: '30 天', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B4654D83' }), //'30 天' value: '30,days', }, { - label: '90 天', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.44988077' }), //'90 天' value: '90,days', }, { - label: '半年', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.A383B626' }), //'半年' value: '0.5,years', }, { - label: '1 年', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.87E335B0' }), //'1 年' value: '1,years', }, { - label: '3 年', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.1758E31F' }), //'3 年' value: '3,years', }, { - label: '永不过期', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.35CFABDC' }), //'永不过期' value: 'never', }, { - label: '自定义', + label: formatMessage({ id: 'src.component.Task.ApplyDatabasePermission.CreateModal.1AAFDFFB' }), //'自定义' value: 'custom', }, ]; @@ -166,7 +169,9 @@ const CreateModal: React.FC = (props) => { const handleCancel = (hasEdit: boolean) => { if (hasEdit) { Modal.confirm({ - title: '确认取消申请库权限吗?', + title: formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.B35BDC54', + }), //'确认取消申请库权限吗?' centered: true, onOk: () => { modalStore.changeApplyDatabasePermissionModal(false); @@ -202,7 +207,11 @@ const CreateModal: React.FC = (props) => { handleCancel(false); setConfirmLoading(false); if (res) { - message.success('申请库权限成功!'); + message.success( + formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.C33C50A5' /*'申请库权限成功!'*/, + }), + ); openTasksPage( TaskPageType.APPLY_DATABASE_PERMISSION, TaskPageScope.CREATED_BY_CURRENT_USER, @@ -255,7 +264,11 @@ const CreateModal: React.FC = (props) => { destroyOnClose className={styles.createModal} width={816} - title="申请库权限" + title={ + formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.4149EA9A', + }) /*"申请库权限"*/ + } footer={ } @@ -286,12 +307,18 @@ const CreateModal: React.FC = (props) => { onFieldsChange={handleFieldsChange} > @@ -299,23 +326,41 @@ const CreateModal: React.FC = (props) => { showSearch style={{ width: 336 }} options={projectOptions} - placeholder="请选择" + placeholder={ + formatMessage({ + id: 'src.component.Task.ApplyDatabasePermission.CreateModal.AA89519C', + }) /*"请选择"*/ + } filterOption={(input, option) => (option?.label ?? '').toLowerCase().includes(input.toLowerCase()) } onChange={handleResetDatabase} /> - + @@ -323,19 +368,29 @@ const CreateModal: React.FC = (props) => { + )} + {fields?.length > 1 && remove(name)} />}
))} diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.tsx b/src/component/Task/DataArchiveTask/CreateModal/index.tsx index 4be918f86..933c77692 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/index.tsx @@ -68,6 +68,7 @@ export const InsertActionOptions = [ value: MigrationInsertAction.INSERT_DUPLICATE_UPDATE, }, ]; + export const variable = { name: '', format: '', @@ -274,6 +275,7 @@ const CreateModal: React.FC = (props) => {
), + cancelText: formatMessage({ id: 'odc.DataArchiveTask.CreateModal.Cancel', }), @@ -420,12 +422,12 @@ const CreateModal: React.FC = (props) => { }; const getDrawerTitle = () => { - let title = '新建数据归档'; + let title = formatMessage({ id: 'src.component.Task.DataArchiveTask.CreateModal.81AF31F1' }); //'新建数据归档' if (dataArchiveEditId) { if (isEdit) { - title = '编辑数据归档'; + title = formatMessage({ id: 'src.component.Task.DataArchiveTask.CreateModal.77394106' }); } else { - title = '再次发起数据归档'; + title = formatMessage({ id: 'src.component.Task.DataArchiveTask.CreateModal.364BA033' }); } } return title; diff --git a/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx b/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx index 14d2464d5..d62d3f17a 100644 --- a/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx +++ b/src/component/Task/DataArchiveTask/DetailContent/ArchiveRange.tsx @@ -36,7 +36,7 @@ const columns = [ }, { dataIndex: 'targetTableName', - title: '目标表名', + title: formatMessage({ id: 'src.component.Task.DataArchiveTask.DetailContent.8D9A2CED' }), //'目标表名' ellipsis: true, width: 190, }, diff --git a/src/component/Task/DataClearTask/CreateModal/index.tsx b/src/component/Task/DataClearTask/CreateModal/index.tsx index 0a1da60cb..c802e90bf 100644 --- a/src/component/Task/DataClearTask/CreateModal/index.tsx +++ b/src/component/Task/DataClearTask/CreateModal/index.tsx @@ -62,11 +62,11 @@ export const variable = { const deleteByUniqueKeyOptions = [ { - label: '是', + label: formatMessage({ id: 'src.component.Task.DataClearTask.CreateModal.ED9CFF17' }), //'是' value: true, }, { - label: '否', + label: formatMessage({ id: 'src.component.Task.DataClearTask.CreateModal.CC3EF591' }), //'否' value: false, }, ]; @@ -223,6 +223,7 @@ const CreateModal: React.FC = (props) => {
), + cancelText: formatMessage({ id: 'odc.DataClearTask.CreateModal.Cancel', }), @@ -364,12 +365,12 @@ const CreateModal: React.FC = (props) => { setHasEdit(false); }; const getDrawerTitle = () => { - let title = '新建数据清理'; + let title = formatMessage({ id: 'src.component.Task.DataClearTask.CreateModal.268C0069' }); //'新建数据清理' if (editTaskId) { if (isEdit) { - title = '编辑数据清理'; + title = formatMessage({ id: 'src.component.Task.DataClearTask.CreateModal.A5BAF884' }); } else { - title = '再次发起数据清理'; + title = formatMessage({ id: 'src.component.Task.DataClearTask.CreateModal.2856A9BB' }); } } return title; @@ -517,12 +518,18 @@ const CreateModal: React.FC = (props) => { > diff --git a/src/component/Task/DataClearTask/DetailContent/index.tsx b/src/component/Task/DataClearTask/DetailContent/index.tsx index 668e54422..125f074fb 100644 --- a/src/component/Task/DataClearTask/DetailContent/index.tsx +++ b/src/component/Task/DataClearTask/DetailContent/index.tsx @@ -185,6 +185,7 @@ const DataClearTaskContent: React.FC = (props) => {
)} + = (props) => { onOk={handleDataSizeLimit} /> - - {jobParameters?.deleteByUniqueKey ? '是' : '否'} + + {jobParameters?.deleteByUniqueKey + ? formatMessage({ id: 'src.component.Task.DataClearTask.DetailContent.D2882643' }) + : formatMessage({ id: 'src.component.Task.DataClearTask.DetailContent.834E7D89' })} = (props) => { marginTop: 4, }} /> + = inject('modalStore')( destroyOnClose width={960} className="o-adaptive-drawer" - title={isReTry ? '再次发起模拟数据' : '新建模拟数据'} + title={ + isReTry + ? formatMessage({ id: 'src.component.Task.DataMockerTask.CreateModal.5DA6FB52' }) + : formatMessage({ id: 'src.component.Task.DataMockerTask.CreateModal.2C3DF5A5' }) + } footer={ + @@ -117,7 +140,11 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => name={['parameters', 'sourceDatabaseId']} width={'336px'} type={TaskType.STRUCTURE_COMPARISON} - label="源端数据库" + label={ + formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.1D072B46', + }) /*"源端数据库"*/ + } projectId={projectId} filters={{ dialectTypes: [ @@ -126,21 +153,39 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => ConnectionMode.OB_ORACLE, ], }} - placeholder={'请选择'} + placeholder={formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.84D445B8', + })} /> + - + + {comparisonScopeMap[EComparisonScope.PART]} @@ -156,12 +201,18 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => } return ( @@ -174,8 +225,22 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => }} - - + + {taskExecStrategyMap?.[TaskExecStrategy.AUTO]} @@ -187,17 +252,31 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => - + diff --git a/src/component/Task/StructureComparisonTask/CreateModal/interface.ts b/src/component/Task/StructureComparisonTask/CreateModal/interface.ts index 7c9f362d3..454e25b22 100644 --- a/src/component/Task/StructureComparisonTask/CreateModal/interface.ts +++ b/src/component/Task/StructureComparisonTask/CreateModal/interface.ts @@ -1,13 +1,30 @@ +import { formatMessage } from '@/util/intl'; import { EComparisonScope, EOperationType } from '@/d.ts/task'; export const comparisonScopeMap = { - [EComparisonScope.ALL]: '全部表', - [EComparisonScope.PART]: '部分表', + [EComparisonScope.ALL]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.9C98407E', + }), //'全部表' + [EComparisonScope.PART]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.D2F4E132', + }), //'部分表' }; export const EOperationTypeMap = { - [EOperationType.CREATE]: '新建', - [EOperationType.UPDATE]: '修改', - [EOperationType.DROP]: '删除', - [EOperationType.NO_ACTION]: '一致', - [EOperationType.SKIP]: '跳过', - [EOperationType.UNSUPPORTED]: '不支持', + [EOperationType.CREATE]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.604BD3CF', + }), //'新建' + [EOperationType.UPDATE]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.8F395AFB', + }), //'修改' + [EOperationType.DROP]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.4DAACA54', + }), //'删除' + [EOperationType.NO_ACTION]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.32ECF203', + }), //'一致' + [EOperationType.SKIP]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.E247086C', + }), //'跳过' + [EOperationType.UNSUPPORTED]: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.CreateModal.F20205E5', + }), //'不支持' }; diff --git a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx index 228fb9810..5ba2c0f61 100644 --- a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx +++ b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx @@ -65,8 +65,20 @@ interface IStructureComparisonTaskContentProps { } const TableEmpty = () => ( - 正在比对中,暂无数据} /> + + { + formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.1A3F5341' /*正在比对中,暂无数据*/, + }) /* 正在比对中,暂无数据 */ + } + + } + /> ); + const CompareTable: React.FC<{ taskId: number; currentTaskResult: ITaskResult; @@ -86,7 +98,9 @@ const CompareTable: React.FC<{ const tableRef = useRef(null); const columns = [ { - title: '对比表', + title: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.322E747A', + }), //'对比表' key: 'dbObjectName', dataIndex: 'dbObjectName', filters: [], @@ -109,7 +123,9 @@ const CompareTable: React.FC<{ ), }, { - title: '对比结果', + title: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.04A0E2C5', + }), //'对比结果' key: 'operationType', dataIndex: 'operationType', filters: [ @@ -138,13 +154,16 @@ const CompareTable: React.FC<{ value: EOperationType.SKIP, }, ], + onFilter: (value: string, record: IComparisonResult) => { return record?.operationType === value; }, render: (operationType: EOperationType) => EOperationTypeMap?.[operationType] || '-', }, { - title: '操作', + title: formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.E8DAF6BA', + }), //'操作' key: 'action', render: (_, record: IComparisonResult) => ( - 查看 + { + formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.DF21DA79' /*查看*/, + }) /* 查看 */ + } ), }, ]; + useEffect(() => { if ( currentTaskResult && @@ -210,7 +234,9 @@ const SQLPreview: React.FC<{ return (
- 删除表、索引、字段等风险变更 SQL 已修改为注释,如需执行,需手动修改 SQL + {formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.9DFA1E59' /*删除表、索引、字段等风险变更 SQL 已修改为注释,如需执行,需手动修改 SQL*/, + })}
{comparisonResult?.id && comparisonResult?.overSizeLimit ? (
- 当前 SQL 文件超过 1 兆,暂不支持预览,请 下载 SQL{' '} - 进行查看 + {formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.099109D1' /*当前 SQL 文件超过 1 兆,暂不支持预览,请*/, + })} + + { + formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.49F7605B' /*下载 SQL*/, + }) /* 下载 SQL */ + } + {' '} + {formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.734F1D69' /*进行查看*/, + })}
) : ( - '正在比对中,暂无数据' + formatMessage({ + id: 'src.component.Task.StructureComparisonTask.DetailContent.8453A485', + }) )} } @@ -344,7 +383,9 @@ const StructureComparisonTaskContent: React.FC
- + {structrueComparison?.dbObjectName || '-'} - + {structrueComparison?.dbObjectName || '-'} @@ -399,7 +463,9 @@ const StructureComparisonTaskContent: React.FC
- + {task?.id} - + {TaskTypeMap?.[task?.type]} - + {comparisonScopeMap?.[task?.parameters?.comparisonScope]} - + {task?.database?.project?.name || '-'} - + {task?.database?.dataSource?.name || '-'} - + {task?.database?.name || '-'} - + {getTaskExecStrategyMap(task?.type)?.[task?.executionStrategy] || '-'} - + {task?.relatedDatabase?.dataSource?.name || '-'} - + {task?.relatedDatabase?.name || '-'} - + {task?.description || '-'} @@ -460,12 +596,14 @@ const StructureComparisonTaskContent: React.FC + + = inject( }), disabled: Math.abs(Date.now() - completeTime) >= 14 * 24 * 60 * 60 * 1000, isExpired: Math.abs(Date.now() - completeTime) >= 14 * 24 * 60 * 60 * 1000, - tip: '文件下载链接已超时,请重新发起工单。', - //下载 + tip: formatMessage({ id: 'src.component.Task.component.ActionBar.F20AAC3F' }), //'文件下载链接已超时,请重新发起工单。' + action: download, type: 'button', }; const downloadSQLBtn = { key: 'downloadSQL', - text: '下载 SQL', + text: formatMessage({ id: 'src.component.Task.component.ActionBar.DBA6CB6E' }), //'下载 SQL' disabled: disableBtn || !structureComparisonData?.storageObjectId, isExpired: disableBtn || !structureComparisonData?.storageObjectId, - tip: '暂不可用', + tip: formatMessage({ id: 'src.component.Task.component.ActionBar.A79907A3' }), //'暂不可用' type: 'button', action: async () => { if (structureComparisonData?.storageObjectId) { @@ -525,10 +525,12 @@ const ActionBar: React.FC = inject( }; const structrueComparisonBySQL = { key: 'structrueComparisonBySQL', - text: '发起结构同步', + text: formatMessage({ id: 'src.component.Task.component.ActionBar.46F2F0ED' }), //'发起结构同步' isExpired: disableBtn || noAction, disabled: disableBtn || noAction, - tip: noAction ? '结构一致,无需发起结构同步' : '暂不可用', + tip: noAction + ? formatMessage({ id: 'src.component.Task.component.ActionBar.D98B5B62' }) + : formatMessage({ id: 'src.component.Task.component.ActionBar.4BF7D8BF' }), type: 'button', isPrimary: true, action: async () => { @@ -721,7 +723,7 @@ const ActionBar: React.FC = inject( const reTryBtn = { key: 'reTry', - text: '再次发起', + text: formatMessage({ id: 'src.component.Task.component.ActionBar.C324AD20' }), //'再次发起' type: 'button', action: handleReTryCycleTask, }; diff --git a/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx b/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx index f71933d7a..75f269959 100644 --- a/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx +++ b/src/component/Task/component/CommonDetailModal/Nodes/SQLCheckNode.tsx @@ -75,8 +75,7 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { className={preCheckOverLimit ? styles.checkReslut : null} label={ formatMessage({ - id: - 'odc.src.component.Task.component.CommonDetailModal.Nodes.SQLExaminationResults', + id: 'odc.src.component.Task.component.CommonDetailModal.Nodes.SQLExaminationResults', }) /* SQL 检查结果 */ } > @@ -87,12 +86,14 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { id: 'odc.CommonTaskDetailModal.Nodes.SQLCheckNode.Existence', }) /*存在*/ } + {issueCount} { formatMessage({ id: 'odc.CommonTaskDetailModal.Nodes.SQLCheckNode.Question', }) /*个问题*/ } + {issueCount > 0 && ( = function ({ node, flowId }) { )} )} + {preCheckOverLimit && ( { formatMessage({ - id: - 'odc.src.component.Task.component.CommonDetailModal.Nodes.TheNumberOf', + id: 'odc.src.component.Task.component.CommonDetailModal.Nodes.TheNumberOf', }) /* - ,预检查处理 SQL 条数超过最大限制,当前任务流程将按 - */ + ,预检查处理 SQL 条数超过最大限制,当前任务流程将按 + */ } + = function ({ node, flowId }) { formatMessage({ id: 'odc.src.component.Task.component.CommonDetailModal.Nodes.HighRisk', }) /* - 高风险 - */ + 高风险 + */ } { formatMessage({ - id: - 'odc.src.component.Task.component.CommonDetailModal.Nodes.GradeContinuesToAdvance', + id: 'odc.src.component.Task.component.CommonDetailModal.Nodes.GradeContinuesToAdvance', }) /* - 等级继续推进 - */ + 等级继续推进 + */ } )} @@ -149,25 +150,36 @@ const SQLCheckNode: React.FC = function ({ node, flowId }) { - 存在 {unauthorizedDatabases?.length} 个问题 - - 查看 - + {formatMessage({ + id: 'src.component.Task.component.CommonDetailModal.Nodes.23342D6D' /*存在*/, + })} + + {unauthorizedDatabases?.length} + {formatMessage({ + id: 'src.component.Task.component.CommonDetailModal.Nodes.B70BB654' /*个问题*/, + })} + + { + formatMessage({ + id: 'src.component.Task.component.CommonDetailModal.Nodes.3D1ABD2F' /*查看*/, + }) /* 查看 */ + } + ) : null} )} + = function ({ node, flowId }) { { + onClose={() => { setPermissionResultVisible(false); }} /> diff --git a/src/component/Task/component/DatabaseSelecter/index.tsx b/src/component/Task/component/DatabaseSelecter/index.tsx index 5dd7bde9f..403a385e3 100644 --- a/src/component/Task/component/DatabaseSelecter/index.tsx +++ b/src/component/Task/component/DatabaseSelecter/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -105,6 +106,7 @@ const DatabaseSelecter: React.FC = function ({ ), + key: item?.id, icon: , }; @@ -157,7 +159,14 @@ const DatabaseSelecter: React.FC = function ({ onChange={handleSwitchSelectAll} style={{ marginRight: '8px' }} /> - 全部 + + + { + formatMessage({ + id: 'src.component.Task.component.DatabaseSelecter.99F8392B' /*全部*/, + }) /* 全部 */ + } + ({allTreeDataCount}) } @@ -179,7 +188,12 @@ const DatabaseSelecter: React.FC = function ({
setTargetSearchValue(v)} extra={ = function ({ onChange([]); }} placement="left" - title="确定要清空已选对象吗?" + title={ + formatMessage({ + id: 'src.component.Task.component.DatabaseSelecter.2FB288CA', + }) /*"确定要清空已选对象吗?"*/ + } > - 清空 + + { + formatMessage({ + id: 'src.component.Task.component.DatabaseSelecter.302B4FB5' /*清空*/, + }) /* 清空 */ + } + } disabled diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx index afaf4a0f4..c82e7be6e 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; import React from 'react'; import { Form, Select } from 'antd'; import type { FormInstance } from 'antd'; @@ -10,30 +11,42 @@ const TABLE_ROW_HEIGHT = 72; const columns = [ { - title: '分区键', + title: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.6B748774', + }), //'分区键' width: '80px', }, { - title: '字段类型', + title: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.F56607BB', + }), //'字段类型' width: '80px', }, { - title: '创建方式', + title: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.1E12C404', + }), //'创建方式' width: '108px', }, { - title: '细则', + title: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.3ADF7B62', + }), //'细则' width: '380px', }, ]; const TypeOptions = [ { - label: '顺序递增', + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.397A9C98', + }), //'顺序递增' value: PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR, }, { - label: '自定义', + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.EditTable.1ED9B737', + }), //'自定义' value: PARTITION_KEY_INVOKER.CUSTOM_GENERATOR, }, ]; diff --git a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx index d5af960b7..7590a4b3d 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/PreviewSQLModal/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -44,14 +45,22 @@ const PreviewSQLModal: React.FC = (props) => { return ( - 关闭 + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.PreviewSQLModal.7E1FC0D5' /*关闭*/, + }) /* 关闭 */ + } } > @@ -67,6 +76,7 @@ const PreviewSQLModal: React.FC = (props) => { })} onChange={handleChange} /> +
diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx index 868cc749f..f8c412404 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; import React from 'react'; import { Form, @@ -20,14 +21,22 @@ const { Text } = Typography; const startDateOptionValues = [ { - label: '当前时间', + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.88D572DE', + }), //'当前时间' value: START_DATE.CURRENT_DATE, - description: '从实际执行的时间开始创建', + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.684CAF92', + }), //'从实际执行的时间开始创建' }, { - label: '指定时间', + label: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9CDC5E14', + }), //'指定时间' value: START_DATE.CUSTOM_DATE, - description: '从指定的某个时间开始创建', + description: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.0E0ADD3E', + }), //'从指定的某个时间开始创建' }, ]; @@ -39,6 +48,7 @@ export const startDateOptions = startDateOptionValues.map(({ label, value, descr {description}
), + value, }; }); @@ -127,18 +137,30 @@ const RuleFormItem: React.FC = (props) => { rules={[ { required: true, - message: '请输入', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.DE258551', + }), //'请输入' }, ]} help={EmptyHelp} > - 间隔 + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9F9223B3' /*间隔*/, + }) /* 间隔 */ + } + = (props) => { rules={[ { required: true, - message: '请输入', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.8368A05F', + }), //'请输入' }, ]} help={EmptyHelp} > - + ) : ( <> - 起始 + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.C6AB94A8' /*起始*/, + }) /* 起始 */ + } + = (props) => { rules={[ { required: true, - message: '请输入', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.2F986FD8', + }), //'请输入' }, ]} help={EmptyHelp} > = (props) => { rules={[ { required: true, - message: '请选择', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.7FB4A416', + }), //'请选择' }, ]} noStyle diff --git a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx index 9a506a089..8365e346b 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx @@ -55,27 +55,27 @@ export enum NameRuleType { export const intervalPrecisionOptions = [ { - label: '秒', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.436BC171' }), //'秒' value: 63, }, { - label: '分', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.0E0CEBAC' }), //'分' value: 31, }, { - label: '时', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.9EC2D1FF' }), //'时' value: 15, }, { - label: '日', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.1E11DFEA' }), //'日' value: 7, }, { - label: '月', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.1FB1ABDC' }), //'月' value: 3, }, { - label: '年', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.069255DB' }), //'年' value: 1, }, ]; @@ -95,11 +95,11 @@ const StrategyOptions = Object.keys(TaskPartitionStrategyMap)?.map((key) => ({ const nameRuleOptions = [ { - label: '前缀 + 后缀', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.EB655A6C' }), //'前缀 + 后缀' value: NameRuleType.PRE_SUFFIX, }, { - label: '自定义', + label: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.AB4964B2' }), //'自定义' value: NameRuleType.CUSTOM, }, ]; @@ -464,7 +464,11 @@ const ConfigDrawer: React.FC = (props) => { return ( = (props) => { }) /*取消*/ } - + {isBatch ? ( = (props) => { onChange={handleChange} > - {`${tableLabels}${moreText}`} - {`${tableLabels}${moreText}`} + {`${tableLabels}${moreText}`} + {`${tableLabels}${moreText}`} @@ -538,51 +566,103 @@ const ConfigDrawer: React.FC = (props) => { {isCreateConfigVisible && ( )} + {isCreateConfigVisible && ( - + - + - 创建规则 - 如何配置 + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.C28CD656' /*创建规则*/, + }) /* 创建规则 */ + } + + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.DF75EB9E' /*如何配置*/, + }) /* 如何配置 */ + } + } > + ) : ( @@ -607,34 +700,63 @@ const ConfigDrawer: React.FC = (props) => { rules={[ { required: true, - message: '请输入前缀', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.4293BED4', + }), //'请输入前缀' }, { pattern: /^[a-zA-Z][a-zA-Z0-9_]*$/, - message: '仅支持英文/数字/下划线,且以英文开头', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.F70A7891', + }), //'仅支持英文/数字/下划线,且以英文开头' }, { max: 32, - message: '不超过32个字符', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.D76C944C', + }), //'不超过32个字符' }, ]} style={{ width: 140 }} > - + - 后缀 + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.0F79EE9C' /*后缀*/, + }) /* 后缀 */ + } + @@ -674,30 +812,62 @@ const ConfigDrawer: React.FC = (props) => { - 测试生成 - {!!ruleExample && 示例名称: {ruleExample}} + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.8067C91E' /*测试生成*/, + }) /* 测试生成 */ + } + + {!!ruleExample && ( + + {formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.797EC6B1' /*示例名称:*/, + })} + {ruleExample} + + )} {isCustomRuleType ? ( - + ) : ( @@ -709,13 +879,19 @@ const ConfigDrawer: React.FC = (props) => { rules={[ { required: true, - message: '请选择', + message: formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.A464079B', + }), //'请选择' }, ]} noStyle > = function (props) { passwordValidStatus === 'error' ? formContext?.testResult?.errorMessage : null } /> + = function (props) { }} label={ formatMessage({ - id: - 'odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.HostIPDomainName', + id: 'odc.src.page.Datasource.Datasource.NewDatasourceDrawer.Form.HostIPDomainName', }) //"主机 IP/域名" } rules={[ @@ -184,7 +183,15 @@ const AddressItems: React.FC = function (props) { const serviceName = getFieldValue('serviceName'); const type = isNil(serviceName) ? 'sid' : 'serviceName'; return ( - +
+ - 用户 DN + + {formatMessage({ + id: 'src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.88A5F823' /*用户 DN*/, + })} } rules={[ { - message: '请输入managerDn', + message: formatMessage({ + id: 'src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.9DBF4E00', + }), //'请输入managerDn' ...requiredRule, }, ]} > - + {!isEdit ? ( - 访问密码 + + { + formatMessage({ + id: 'src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.DC978DE4' /*访问密码*/, + }) /* 访问密码 */ + } } rules={[ { - message: '请输入访问密码', + message: formatMessage({ + id: 'src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.4DF22947', + }), //'请输入访问密码' ...requiredRule, }, ]} > - + ) : null} userSearchFilter } > - + userSearchBase } > - + + groupSearchBase } > - + + groupSearchFilter } > - + + groupSearchSubtree } @@ -490,7 +604,11 @@ export const LDAPPartForm: React.FC<{ initialValue={false} > } - placeholder={'请输入 LDAP 账号'} + placeholder={formatMessage({ id: 'src.page.Login.components.LDAPModal.B5335F6F' })} onFocus={() => { setFocusInput('username'); }} @@ -255,7 +258,7 @@ const LDAPLoginContent = ({ rules={[ { required: true, - message: 'LDAP 密码不能为空', + message: formatMessage({ id: 'src.page.Login.components.LDAPModal.AA5AB5DA' }), //'LDAP 密码不能为空' }, ]} > @@ -263,7 +266,7 @@ const LDAPLoginContent = ({ visibilityToggle={false} autoComplete="current-password" prefix={} - placeholder={'请输入 LDAP 密码'} + placeholder={formatMessage({ id: 'src.page.Login.components.LDAPModal.9C1F7A9B' })} onFocus={() => { setFocusInput('password'); }} @@ -282,11 +285,19 @@ const LDAPLoginContent = ({ className={`${prefix}-submit-btn`} onClick={isTest ? handleTest : handleLogin} > - 登录 + { + formatMessage({ + id: 'src.page.Login.components.LDAPModal.B82B6C2B' /*登录*/, + }) /* 登录 */ + } {switchSSOLoginType ? ( ) : null} diff --git a/src/page/Project/Database/AddDataBaseButton/index.tsx b/src/page/Project/Database/AddDataBaseButton/index.tsx index 84f910ee7..9c90e9db6 100644 --- a/src/page/Project/Database/AddDataBaseButton/index.tsx +++ b/src/page/Project/Database/AddDataBaseButton/index.tsx @@ -100,7 +100,14 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { }) /*添加数据库*/ } - + + {item.name} @@ -231,6 +239,7 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { id: 'odc.Database.AddDataBaseButton.BoundProject', }) /*- 已绑定项目:*/ } + {p.project?.name} ); diff --git a/src/page/Project/Notification/components/Channel.tsx b/src/page/Project/Notification/components/Channel.tsx index ac3e2629b..b23f85c3b 100644 --- a/src/page/Project/Notification/components/Channel.tsx +++ b/src/page/Project/Notification/components/Channel.tsx @@ -75,16 +75,22 @@ const Channel: React.FC<{ }; const handleDelete = (channelId: number) => { return Modal.confirm({ - title: '确认要删除此通道吗?', - content: '删除后,关联工单事件的消息推送将不再生效。', + title: formatMessage({ id: 'src.page.Project.Notification.components.C66FA7EF' }), //'确认要删除此通道吗?' + content: formatMessage({ id: 'src.page.Project.Notification.components.C6EB2CE0' }), //'删除后,关联工单事件的消息推送将不再生效。' onOk: async () => { const result = await deleteChannel(projectId, channelId); if (result) { - message.success('删除成功!'); + message.success( + formatMessage({ + id: 'src.page.Project.Notification.components.00F5D0D6' /*'删除成功!'*/, + }), + ); tableRef?.current?.reload?.(); return; } - message.error('删除失败'); + message.error( + formatMessage({ id: 'src.page.Project.Notification.components.FBB6B2D7' /*'删除失败'*/ }), + ); }, onCancel: () => {}, }); @@ -105,7 +111,15 @@ const Channel: React.FC<{ const operationOptions = [ { type: IOperationOptionType.button, - content: 新建通道, + content: ( + + { + formatMessage({ + id: 'src.page.Project.Notification.components.9709DF4E' /*新建通道*/, + }) /* 新建通道 */ + } + + ), isPrimary: true, onClick: () => { setFormDrawerOpen(true); @@ -134,6 +148,7 @@ const Channel: React.FC<{ detailDrawerOpen={detailDrawerOpen} setDetailDrawerOpen={setDetailDrawerOpen} /> + (false); const [testChannelErrorMessage, setTestChannelErrorMessage] = useState(null); const [testLoading, setTestLoading] = useState(false); - const tip = `配置{"key":"value"}来验证json结构的返回结果,验证返回结果中包含配置中的所有key、value,则认为发送成功`; + const tip = formatMessage({ id: 'src.page.Project.Notification.components.0963E13A' }); //`配置{"key":"value"}来验证json结构的返回结果,验证返回结果中包含配置中的所有key、value,则认为发送成功` const loadChannelDetail = async (channelId) => { const channel = await detailChannel(projectId, channelId); if (channel) { @@ -184,7 +199,11 @@ export const FromChannelDrawer: React.FC<{ formRef?.setFieldsValue(channel); return; } - message.error('加载通道数据失败'); + message.error( + formatMessage({ + id: 'src.page.Project.Notification.components.A2B52297' /*'加载通道数据失败'*/, + }), + ); }; const handleTestChannel = async () => { setTestChannelErrorMessage(null); @@ -193,10 +212,18 @@ export const FromChannelDrawer: React.FC<{ const result = await testChannel(projectId, channel); if (result?.active) { setTestChannelSuccess(true); - message.success('测试消息发送成功!'); + message.success( + formatMessage({ + id: 'src.page.Project.Notification.components.A50DD7D6' /*'测试消息发送成功!'*/, + }), + ); } else { setTestChannelSuccess(false); - message.error('测试消息发送失败!'); + message.error( + formatMessage({ + id: 'src.page.Project.Notification.components.494A6AA0' /*'测试消息发送失败!'*/, + }), + ); setTestChannelErrorMessage(result?.errorMessage); } setTestLoading(false); @@ -205,7 +232,9 @@ export const FromChannelDrawer: React.FC<{ if (hasEdit) { return Modal.confirm({ centered: true, - title: channelId ? '确认关闭编辑通道?' : '确认关闭新建通道?', + title: channelId + ? formatMessage({ id: 'src.page.Project.Notification.components.1E5D8CF3' }) + : formatMessage({ id: 'src.page.Project.Notification.components.5ED12758' }), onOk: () => { setFormDrawerOpen(false); }, @@ -228,12 +257,20 @@ export const FromChannelDrawer: React.FC<{ data = await createChannel(projectId, result); } if (data) { - message.success(channelId ? '保存成功' : '新建成功'); + message.success( + channelId + ? formatMessage({ id: 'src.page.Project.Notification.components.E4112EC6' }) + : formatMessage({ id: 'src.page.Project.Notification.components.A1ADE4ED' }), + ); setFormDrawerOpen(false); closedCallback?.(true); return; } - message.error(channelId ? '保存失败' : '新建失败'); + message.error( + channelId + ? formatMessage({ id: 'src.page.Project.Notification.components.CD9CDC1F' }) + : formatMessage({ id: 'src.page.Project.Notification.components.562D512A' }), + ); }; const handleFieldsChange = (changedFields, allFields) => { if (changedFields?.[0]?.name?.join('') === 'description') { @@ -277,18 +314,34 @@ export const FromChannelDrawer: React.FC<{ open={formDrawerOpen} destroyOnClose closable - title={channelId ? '编辑通道' : '新建通道'} + title={ + channelId + ? formatMessage({ id: 'src.page.Project.Notification.components.9CF32BBF' }) + : formatMessage({ id: 'src.page.Project.Notification.components.F689C8B8' }) + } width={520} onClose={handleFormDrawerClose} footer={
- +
@@ -303,6 +356,7 @@ export const FromChannelDrawer: React.FC<{ style={{ marginBottom: '8px' }} /> )} +
- + @@ -376,7 +444,13 @@ export const FromChannelDrawer: React.FC<{ -
Webhook 地址
+
+ { + formatMessage({ + id: 'src.page.Project.Notification.components.D55443F5' /*Webhook 地址*/, + }) /* Webhook 地址 */ + } +
{docUrlMap?.[type] && ( - 如何配置 + { + formatMessage({ + id: 'src.page.Project.Notification.components.E5532E71' /*如何配置*/, + }) /* 如何配置 */ + } )} @@ -397,31 +475,66 @@ export const FromChannelDrawer: React.FC<{ rules={[ { required: true, - message: '通道名称不能为空', + message: formatMessage({ + id: 'src.page.Project.Notification.components.AAAA3457', + }), //'通道名称不能为空' }, ]} > - +
{hasSign ? ( - + ) : null} {isWebhook ? ( - + - + POST GET @@ -434,7 +547,11 @@ export const FromChannelDrawer: React.FC<{ name={['channelConfig', 'headersTemplate']} > @@ -444,13 +561,32 @@ export const FromChannelDrawer: React.FC<{ name={['channelConfig', 'bodyTemplate']} > - + - +
{tip}
@@ -458,11 +594,22 @@ export const FromChannelDrawer: React.FC<{ ) : null} {hasAtMobiles ? ( - ) : null} @@ -470,7 +617,11 @@ export const FromChannelDrawer: React.FC<{ }}
- +
- {'可通过输入${ } 引入标签,'} + {formatMessage({ id: 'src.page.Project.Notification.components.D0CF8521' })} - 查看标签说明 + { + formatMessage({ + id: 'src.page.Project.Notification.components.E3748BB5' /*查看标签说明*/, + }) /* 查看标签说明 */ + }
- - + +
@@ -566,7 +751,12 @@ export const DetailChannelDrawer: React.FC<{ function parseRateLimitConfigToText(rateLimitConfig: IRateLimitConfig) { const timeUnitText = TimeUnitMap?.[rateLimitConfig?.timeUnit]; const rateLimitConfigLimit = rateLimitConfig?.limit; - let result = timeUnitText + `不超过${rateLimitConfigLimit}次`; + let result = + timeUnitText + + formatMessage( + { id: 'src.page.Project.Notification.components.EE8B3451' }, + { rateLimitConfigLimit: rateLimitConfigLimit }, + ); //`不超过${rateLimitConfigLimit}次` return result; } const isWebhook = channel?.type === EChannelType.WEBHOOK; @@ -574,39 +764,89 @@ export const DetailChannelDrawer: React.FC<{ const hasAtMobiles = [EChannelType.DING_TALK, EChannelType.WE_COM]?.includes(channel?.type); return ( - {channel?.name || '-'} - + + {channel?.name || '-'} + + {EChannelTypeMap?.[channel?.type] || '-'} - + {channel?.channelConfig?.webhook || '-'} {hasSign && ( - + {(channel as IChannel)?.channelConfig ?.sign || '-'} )} + {hasAtMobiles && ( - + {( channel as IChannel )?.channelConfig?.atMobiles?.join('、') || '-'} )} + {isWebhook && ( <> - + {(channel as IChannel)?.channelConfig?.httpProxy || '-'} - + {(channel as IChannel)?.channelConfig?.httpMethod || '-'} @@ -615,18 +855,37 @@ export const DetailChannelDrawer: React.FC<{ {(channel as IChannel)?.channelConfig?.bodyTemplate || '-'} - + {(channel as IChannel)?.channelConfig?.responseValidation || '-'} )} - + + {channel?.channelConfig?.rateLimitConfig ? parseRateLimitConfigToText(channel?.channelConfig?.rateLimitConfig) : '-'} - + {ELanguageMap?.[channel?.channelConfig?.language] || '-'} @@ -640,7 +899,13 @@ export const DetailChannelDrawer: React.FC<{ {channel?.channelConfig?.contentTemplate || '-'} - {channel?.description || '-'} + + {channel?.description || '-'} + ); @@ -678,16 +943,28 @@ const CheckboxWithTip: React.FC<{ })} > handleCheckboxOnChange()}> - 使用消息限流 + + { + formatMessage({ + id: 'src.page.Project.Notification.components.DD7AFBF7' /*使用消息限流*/, + }) /* 使用消息限流 */ + } +
{rateLimitConfig - ? '使用消息限流,可在规定时间内接收消息,避免忽略重要消息' - : '不使用消息限流,短时间内可能会收到过多消息,导致重要消息淹没'} + ? formatMessage({ id: 'src.page.Project.Notification.components.6A310F2D' }) + : formatMessage({ id: 'src.page.Project.Notification.components.ED0EC433' })}
{rateLimitConfig ? ( - + ( @@ -298,7 +338,13 @@ const FormPolicyModal: React.FC<{ {menu}
setChannelFormDrawerOpen(true)} style={{ cursor: 'pointer' }}> - +
)} diff --git a/src/page/Project/Notification/components/columns.tsx b/src/page/Project/Notification/components/columns.tsx index eaa60c18f..07cef7378 100644 --- a/src/page/Project/Notification/components/columns.tsx +++ b/src/page/Project/Notification/components/columns.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; import { Space, Switch } from 'antd'; import { EChannelType, @@ -27,13 +28,23 @@ export const getMessageColumns: GetMessageColumns = function ({ }) { return [ { - title: '工单事件', + title: formatMessage({ id: 'src.page.Project.Notification.components.3380A1F2' }), //'工单事件' dataIndex: 'title', key: 'title', width: 260, filters: [], filterDropdown: (props) => { - return ; + return ( + + ); }, filterIcon: (filtered) => ( channel?.name || '-', }, { - title: '生效时间', + title: formatMessage({ id: 'src.page.Project.Notification.components.94C9B938' }), //'生效时间' dataIndex: 'createTime', key: 'createTime', sorter: (a, b) => a?.createTime - b?.createTime, @@ -60,7 +71,7 @@ export const getMessageColumns: GetMessageColumns = function ({ render: (createTime) => (createTime ? getLocalFormatDateTime(createTime) : '-'), }, { - title: '最后推送时间', + title: formatMessage({ id: 'src.page.Project.Notification.components.3F4AA52D' }), //'最后推送时间' dataIndex: 'lastSentTime', key: 'lastSentTime', sorter: (a, b) => a?.lastSentTime - b?.lastSentTime, @@ -68,7 +79,7 @@ export const getMessageColumns: GetMessageColumns = function ({ render: (lastSentTime) => (lastSentTime ? getLocalFormatDateTime(lastSentTime) : '-'), }, { - title: '推送状态', + title: formatMessage({ id: 'src.page.Project.Notification.components.C17F635B' }), //'推送状态' dataIndex: 'status', width: 158, key: 'status', @@ -94,16 +105,25 @@ export const getMessageColumns: GetMessageColumns = function ({ value: EMessageStatus.THROWN, }, ], + render: (status, message) => { return ; }, }, { - title: '操作', + title: formatMessage({ id: 'src.page.Project.Notification.components.550A0B74' }), //'操作' width: 104, key: 'action', render: (_, message) => { - return handleOpenMessageDetailDrawer(message?.id)}>查看; + return ( + handleOpenMessageDetailDrawer(message?.id)}> + { + formatMessage({ + id: 'src.page.Project.Notification.components.445FB17E' /*查看*/, + }) /* 查看 */ + } + + ); }, }, ]; @@ -130,13 +150,21 @@ export const getPolicyColumns: GetPolicyColumns = function ({ }) { return [ { - title: '事件', + title: formatMessage({ id: 'src.page.Project.Notification.components.3F3F37F5' }), //'事件' dataIndex: 'eventName', filters: [], width: 354, key: 'eventName', filterDropdown: (props) => { - return ; + return ( + + ); }, filterIcon: (filtered) => ( @@ -148,7 +176,7 @@ export const getPolicyColumns: GetPolicyColumns = function ({ ), }, { - title: '启用状态', + title: formatMessage({ id: 'src.page.Project.Notification.components.C21BB343' }), //'启用状态' dataIndex: 'enabled', width: 122, key: 'enabled', @@ -166,12 +194,22 @@ export const getPolicyColumns: GetPolicyColumns = function ({ ), }, { - title: '推送通道', + title: formatMessage({ id: 'src.page.Project.Notification.components.A7341EE0' }), //'推送通道' dataIndex: 'channels', width: 480, key: 'channels', filterDropdown: (props) => { - return ; + return ( + + ); }, filterIcon: (filtered) => ( @@ -181,6 +219,7 @@ export const getPolicyColumns: GetPolicyColumns = function ({ }} /> ), + render: (channels: IChannel[] = []) => { if (channels?.length === 0) { return '-'; @@ -219,7 +258,7 @@ export const getPolicyColumns: GetPolicyColumns = function ({ }, }, { - title: '操作', + title: formatMessage({ id: 'src.page.Project.Notification.components.30DE4191' }), //'操作' key: 'action', width: 140, render: (_, proxy) => { @@ -232,7 +271,11 @@ export const getPolicyColumns: GetPolicyColumns = function ({ }) } > - 添加通道 + { + formatMessage({ + id: 'src.page.Project.Notification.components.7555452E' /*添加通道*/, + }) /* 添加通道 */ + } ); }, @@ -258,11 +301,21 @@ export const getChannelColumns: GetChannelColumn = function ({ }) { return [ { - title: '通道名称', + title: formatMessage({ id: 'src.page.Project.Notification.components.76BA6F01' }), //'通道名称' dataIndex: 'name', key: 'name', filterDropdown: (props) => { - return ; + return ( + + ); }, filterIcon: (filtered) => ( @@ -274,7 +327,7 @@ export const getChannelColumns: GetChannelColumn = function ({ ), }, { - title: '通道类型', + title: formatMessage({ id: 'src.page.Project.Notification.components.2E263203' }), //'通道类型' dataIndex: 'type', key: 'type', filters: [ @@ -295,15 +348,16 @@ export const getChannelColumns: GetChannelColumn = function ({ value: EChannelType.WEBHOOK, }, ], + render: (type) => EChannelTypeMap[type as EChannelType], }, { - title: '创建人', + title: formatMessage({ id: 'src.page.Project.Notification.components.9E340A54' }), //'创建人' dataIndex: 'creatorName', key: 'creatorName', }, { - title: '创建时间', + title: formatMessage({ id: 'src.page.Project.Notification.components.F8D12615' }), //'创建时间' dataIndex: 'createTime', key: 'createTime', sorter: (a, b) => a?.createTime - b?.createTime, @@ -311,14 +365,32 @@ export const getChannelColumns: GetChannelColumn = function ({ render: (createTime) => (createTime ? getLocalFormatDateTime(createTime) : '-'), }, { - title: '操作', + title: formatMessage({ id: 'src.page.Project.Notification.components.89B6BD2A' }), //'操作' key: 'action', render: (channel: IChannel) => { return ( - hanleOpenChannelDetailDrawer(channel)}>查看 - handleChannelEdit(channel?.id)}>编辑 - handleDelete(channel?.id)}>删除 + hanleOpenChannelDetailDrawer(channel)}> + { + formatMessage({ + id: 'src.page.Project.Notification.components.2D408702' /*查看*/, + }) /* 查看 */ + } + + handleChannelEdit(channel?.id)}> + { + formatMessage({ + id: 'src.page.Project.Notification.components.1C77B416' /*编辑*/, + }) /* 编辑 */ + } + + handleDelete(channel?.id)}> + { + formatMessage({ + id: 'src.page.Project.Notification.components.B65E55FA' /*删除*/, + }) /* 删除 */ + } + ); }, diff --git a/src/page/Project/Notification/components/interface.ts b/src/page/Project/Notification/components/interface.ts index 88688cb4c..dc697e43c 100644 --- a/src/page/Project/Notification/components/interface.ts +++ b/src/page/Project/Notification/components/interface.ts @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; import { EChannelType, ELanguage, @@ -7,34 +8,32 @@ import { } from '@/d.ts/projectNotification'; export const TimeUnitMap = { - [ETimeUnit.MINUTES]: '每分钟', - [ETimeUnit.HOURS]: '每小时', - [ETimeUnit.DAYS]: '每天', + [ETimeUnit.MINUTES]: formatMessage({ id: 'src.page.Project.Notification.components.AEB0CAF2' }), //'每分钟' + [ETimeUnit.HOURS]: formatMessage({ id: 'src.page.Project.Notification.components.AF2822D3' }), //'每小时' + [ETimeUnit.DAYS]: formatMessage({ id: 'src.page.Project.Notification.components.A8432D68' }), //'每天' }; export const EChannelTypeMap = { - [EChannelType.DING_TALK]: '钉钉', - [EChannelType.FEI_SHU]: '飞书', - [EChannelType.WE_COM]: '企业微信', - [EChannelType.WEBHOOK]: '自定义webhook', + [EChannelType.DING_TALK]: formatMessage({ + id: 'src.page.Project.Notification.components.02532812', + }), //'钉钉' + [EChannelType.FEI_SHU]: formatMessage({ + id: 'src.page.Project.Notification.components.F80DF1C7', + }), //'飞书' + [EChannelType.WE_COM]: formatMessage({ id: 'src.page.Project.Notification.components.A41C487F' }), //'企业微信' + [EChannelType.WEBHOOK]: formatMessage({ + id: 'src.page.Project.Notification.components.617AFC70', + }), //'自定义webhook' }; export const ELanguageMap = { - [ELanguage.ZH_CN]: '中文', - [ELanguage.ZH_TW]: '繁体中文', - [ELanguage.EN_US]: '英文', + [ELanguage.ZH_CN]: formatMessage({ id: 'src.page.Project.Notification.components.1BFBC1A9' }), //'中文' + [ELanguage.ZH_TW]: formatMessage({ id: 'src.page.Project.Notification.components.739AD573' }), //'繁体中文' + [ELanguage.EN_US]: formatMessage({ id: 'src.page.Project.Notification.components.21BD64D9' }), //'英文' }; export const EContentTemplateMap = { - [ELanguage.ZH_CN]: `### ODC \${taskType}-\${taskStatus} - - 任务ID: \${taskId} - - 项目: \${projectName} - - 数据库: \${databaseName} - - 发起人: \${creatorName} - - 触发时间: \${triggerTime}`, - [ELanguage.ZH_TW]: `### ODC \${taskType}-\${taskStatus} - - 任務ID: \${taskId} - - 項目: \${projectName} - - 數據庫: \${databaseName} - - 發起人: \${creatorName} - - 觸發時間: \${triggerTime}`, + [ELanguage.ZH_CN]: formatMessage({ id: 'src.page.Project.Notification.components.A7DBBE1D' }), + + [ELanguage.ZH_TW]: formatMessage({ id: 'src.page.Project.Notification.components.D5DC58D0' }), + [ELanguage.EN_US]: `### ODC \${taskType}-\${taskStatus} - task ID: \${taskId} - project: \${projectName} @@ -43,11 +42,21 @@ export const EContentTemplateMap = { - trigger time: \${triggerTime}`, }; export const EMessageStatusMap = { - [EMessageStatus.CREATED]: '待发送', - [EMessageStatus.SENDING]: '发送中', - [EMessageStatus.SENT_SUCCESSFULLY]: '发送成功', - [EMessageStatus.SENT_FAILED]: '发送失败', - [EMessageStatus.THROWN]: '忽略', + [EMessageStatus.CREATED]: formatMessage({ + id: 'src.page.Project.Notification.components.22049CA8', + }), //'待发送' + [EMessageStatus.SENDING]: formatMessage({ + id: 'src.page.Project.Notification.components.590F2E70', + }), //'发送中' + [EMessageStatus.SENT_SUCCESSFULLY]: formatMessage({ + id: 'src.page.Project.Notification.components.7C3C69DA', + }), //'发送成功' + [EMessageStatus.SENT_FAILED]: formatMessage({ + id: 'src.page.Project.Notification.components.4D27FA10', + }), //'发送失败' + [EMessageStatus.THROWN]: formatMessage({ + id: 'src.page.Project.Notification.components.C2F2FE55', + }), //'忽略' }; export enum EPolicyFormMode { SINGLE = 'SINGLE', diff --git a/src/page/Project/Notification/index.tsx b/src/page/Project/Notification/index.tsx index 286e1ea4d..35e2cdbd7 100644 --- a/src/page/Project/Notification/index.tsx +++ b/src/page/Project/Notification/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -41,18 +42,19 @@ const Notification: React.FC<{ }> = ({ id }) => { const items: MenuItem[] = [ { - label: '推送记录', + label: formatMessage({ id: 'src.page.Project.Notification.3538B93C' }), //'推送记录' key: 'message', }, { - label: '推送规则', + label: formatMessage({ id: 'src.page.Project.Notification.25A341FB' }), //'推送规则' key: 'policy', }, { - label: '推送通道', + label: formatMessage({ id: 'src.page.Project.Notification.87BBE655' }), //'推送通道' key: 'channel', }, ]; + const [key, setKey] = useState(items?.[0]?.key as string); const Component = contentMap?.[key]?.component; const handleItemOnClick = (key: string) => { diff --git a/src/page/Project/Project/CreateProject/index.tsx b/src/page/Project/Project/CreateProject/index.tsx index 399e171c1..cdd17bef6 100644 --- a/src/page/Project/Project/CreateProject/index.tsx +++ b/src/page/Project/Project/CreateProject/index.tsx @@ -151,7 +151,11 @@ export default React.forwardRef<{ name={'developer'} label={ - 开发者 + { + formatMessage({ + id: 'src.page.Project.Project.CreateProject.AD525382' /*开发者*/, + }) /* 开发者 */ + } } > @@ -176,8 +180,8 @@ export default React.forwardRef<{ formatMessage({ id: 'odc.src.page.Project.Project.CreateProject.SecurityAdministrator', }) /* - 安全管理员 - */ + 安全管理员 + */ } } @@ -203,8 +207,8 @@ export default React.forwardRef<{ formatMessage({ id: 'odc.src.page.Project.Project.CreateProject.Participant', }) /* - 参与者 - */ + 参与者 + */ } } diff --git a/src/page/Project/User/ManageModal/CreateAuth/index.tsx b/src/page/Project/User/ManageModal/CreateAuth/index.tsx index eaa0789e0..ce875b972 100644 --- a/src/page/Project/User/ManageModal/CreateAuth/index.tsx +++ b/src/page/Project/User/ManageModal/CreateAuth/index.tsx @@ -1,3 +1,4 @@ +import { formatMessage } from '@/util/intl'; /* * Copyright 2023 OceanBase * @@ -49,7 +50,7 @@ const CreateModal: React.FC = (props) => { const handleCancel = (hasEdit: boolean) => { if (hasEdit) { Modal.confirm({ - title: '确认取消新增授权吗?', + title: formatMessage({ id: 'src.page.Project.User.ManageModal.CreateAuth.8BBA1BE1' }), //'确认取消新增授权吗?' centered: true, onOk: () => { handleModalVisizble(false); @@ -80,7 +81,11 @@ const CreateModal: React.FC = (props) => { handleCancel(false); setConfirmLoading(false); if (res) { - message.success('新增授权成功!'); + message.success( + formatMessage({ + id: 'src.page.Project.User.ManageModal.CreateAuth.6770E480' /*'新增授权成功!'*/, + }), + ); onSwitchUserTab(); } }) @@ -101,13 +106,21 @@ const CreateModal: React.FC = (props) => { }} type="primary" > - 新增授权 + { + formatMessage({ + id: 'src.page.Project.User.ManageModal.CreateAuth.67243BDA' /*新增授权*/, + }) /* 新增授权 */ + }
} @@ -135,16 +156,30 @@ const CreateModal: React.FC = (props) => { form={form} onFieldsChange={handleFieldsChange} > - + @@ -152,19 +187,29 @@ const CreateModal: React.FC = (props) => { + -
新建之后无法修改
+
+ { + formatMessage({ + id: 'src.page.Secure.Env.components.D11CF27F' /*新建之后无法修改*/, + }) /* 新建之后无法修改 */ + } +
@@ -141,32 +175,39 @@ export const FormEnvironmentModal: React.FC<{ shouldUpdate label={ - 引用环境 + { + formatMessage({ + id: 'src.page.Secure.Env.components.977B9386' /*引用环境*/, + }) /* 引用环境 */ + } } name="copiedRulesetId" rules={[ { required: true, - message: '请选择引用环境', + message: formatMessage({ id: 'src.page.Secure.Env.components.351C7EB6' }), //'请选择引用环境' }, ]} > + {context?.session?.odcDatabase?.name} )} + @@ -101,6 +103,7 @@ export default function SessionSelect({ component={DBIcon?.component} style={{ fontSize: 16, verticalAlign: 'text-top', color: DBIcon?.color }} /> + {context?.session?.connection?.name} {!context.datasourceMode && ( <> @@ -108,6 +111,7 @@ export default function SessionSelect({ {context?.session?.odcDatabase?.name} )} + @@ -142,6 +146,7 @@ export default function SessionSelect({ component={dsStyle?.icon?.component} style={{ fontSize: 16, verticalAlign: 'middle', color: dsStyle?.icon?.color }} /> + {context?.session?.connection?.name} @@ -151,6 +156,7 @@ export default function SessionSelect({ component={dsStyle?.dbIcon?.component} style={{ fontSize: 16, verticalAlign: 'middle' }} /> + {context?.session?.odcDatabase?.name} @@ -160,14 +166,26 @@ export default function SessionSelect({ style={{ color: 'var(--text-color-hint)', marginLeft: 8 }} > {login.isPrivateSpace() ? null : ( - 项目:{context?.session?.odcDatabase?.project?.name} + + {formatMessage({ + id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.38EA55F4' /*项目:*/, + })} + {context?.session?.odcDatabase?.project?.name} + )} - 数据源:{context?.session?.odcDatabase?.dataSource?.name} + + + {formatMessage({ + id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.CD007EC1' /*数据源:*/, + })} + {context?.session?.odcDatabase?.dataSource?.name} + )} ); + if (readonly) { return ( <> diff --git a/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx b/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx index 932336ada..9cac07cbb 100644 --- a/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx +++ b/src/page/Workspace/components/ShowViewBaseInfoForm/index.tsx @@ -78,7 +78,12 @@ class ShowViewBaseInfoForm extends Component { > - + From 5bd5724fb30e7e74ac1078b75aee65eac346da49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Tue, 5 Mar 2024 11:44:20 +0800 Subject: [PATCH 127/231] PullRequest: 349 Fixes oceanbase/odc#1736,#1732,#1734 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-030501 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/349 Signed-off-by: 晓康 * Fixes oceanbase/odc#1736,#1732 * Fixes oceanbase/odc#1734 --- .../Task/PartitionTask/CreateModal/index.tsx | 10 +++++++--- .../PartitionPolicyFormTable/configModal.tsx | 12 ++++++++---- .../component/PartitionPolicyFormTable/index.tsx | 10 ++-------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/component/Task/PartitionTask/CreateModal/index.tsx b/src/component/Task/PartitionTask/CreateModal/index.tsx index f153840e7..93d791581 100644 --- a/src/component/Task/PartitionTask/CreateModal/index.tsx +++ b/src/component/Task/PartitionTask/CreateModal/index.tsx @@ -143,13 +143,17 @@ const CreateModal: React.FC = inject('modalStore')( __id: index, containsCreateStrategy, containsDropStrategy, - strategies: getStrategyByConfig(config), + strategies: [], tableName, partitionMode, option: { - partitionKeyConfigs: partition.partitionOption.columnNames.map((name) => ({ + partitionKeyConfigs: partition.partitionOption?.columnNames?.map((name) => ({ name, - })), + })) ?? [ + { + name: partition.partitionOption?.expression, + }, + ], }, }; }), diff --git a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx index 8365e346b..d47ad8b72 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx @@ -192,7 +192,7 @@ const ConfigDrawer: React.FC = (props) => { partitionKeyInvoker: isDateType ? PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR : PARTITION_KEY_INVOKER.CUSTOM_GENERATOR, - ...item.option.partitionKeyConfigs[index], + ...item.option.partitionKeyConfigs?.[index], type, }; }), @@ -345,8 +345,10 @@ const ConfigDrawer: React.FC = (props) => { formData.template.partitionNameInvoker = PARTITION_NAME_INVOKER.CUSTOM_PARTITION_NAME_GENERATOR; formData.template.partitionNameInvokerParameters = { - generateExpr, - intervalGenerateExpr, + partitionNameGeneratorConfig: { + generateExpr, + intervalGenerateExpr, + }, }; } @@ -544,7 +546,9 @@ const ConfigDrawer: React.FC = (props) => { id: 'src.component.Task.component.PartitionPolicyFormTable.D50C1358', }) /*"分区类型"*/ } - >{`${tableLabels}${moreText}`} + > + Range + = (props) => {
{label?.length ? ( - - { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.92C4082E' /*已设置: */, - }) /* 已设置:  */ - } - + 已设置: {label} ) : ( @@ -178,7 +172,7 @@ const PartitionPolicyFormTable: React.FC = (props) => { function handleFilter(data: ITableConfig[]) { const { tableName } = filters ?? {}; return data - ?.filter((item) => (isOnlyNoSetTable ? !item?.option : true)) + ?.filter((item) => (isOnlyNoSetTable ? !item?.strategies?.length : true)) ?.filter((item) => { return tableName?.[0] ? item.tableName.indexOf(tableName[0]) > -1 : true; }); From 0dcd7443f1f343be5ac9395aba06427deef4608a Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 5 Mar 2024 17:01:06 +0800 Subject: [PATCH 128/231] fixes oceanbase/odc#1718 , fixes oceanbase/odc#1728 --- src/common/datasource/interface.ts | 1 + src/common/datasource/mysql/index.tsx | 1 + src/common/datasource/oceanbase/obmysql.ts | 1 + src/common/datasource/oceanbase/oboracle.ts | 1 + src/common/datasource/oracle/index.tsx | 6 +++--- src/component/EditorToolBar/actions/pl.tsx | 3 +++ .../SideBar/ResourceTree/TreeNodeMenu/config/function.tsx | 3 +++ .../ResourceTree/TreeNodeMenu/config/packageBody.tsx | 3 +++ .../SideBar/ResourceTree/TreeNodeMenu/config/procedure.tsx | 5 ++++- 9 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/common/datasource/interface.ts b/src/common/datasource/interface.ts index f3f21a342..6636c4f2e 100644 --- a/src/common/datasource/interface.ts +++ b/src/common/datasource/interface.ts @@ -132,6 +132,7 @@ export interface IDataSourceModeConfig { plEdit?: boolean; anonymousBlock?: boolean; supportOBProxy?: boolean; + plRun?: boolean; export: { fileLimit: boolean; snapshot: boolean; diff --git a/src/common/datasource/mysql/index.tsx b/src/common/datasource/mysql/index.tsx index 8fcebd5b0..71a9da843 100644 --- a/src/common/datasource/mysql/index.tsx +++ b/src/common/datasource/mysql/index.tsx @@ -80,6 +80,7 @@ const items: Record = { ], obclient: true, recycleBin: false, + plRun: true, sessionManage: true, sqlExplain: true, export: { diff --git a/src/common/datasource/oceanbase/obmysql.ts b/src/common/datasource/oceanbase/obmysql.ts index d1038b4c6..be6dafacf 100644 --- a/src/common/datasource/oceanbase/obmysql.ts +++ b/src/common/datasource/oceanbase/obmysql.ts @@ -77,6 +77,7 @@ const items: Record< sqlExplain: true, sessionManage: true, supportOBProxy: true, + plRun: true, export: { fileLimit: true, snapshot: true, diff --git a/src/common/datasource/oceanbase/oboracle.ts b/src/common/datasource/oceanbase/oboracle.ts index 14b40ec78..fa34895e4 100644 --- a/src/common/datasource/oceanbase/oboracle.ts +++ b/src/common/datasource/oceanbase/oboracle.ts @@ -67,6 +67,7 @@ const items: Record = { recycleBin: false, sqlExplain: false, sessionManage: true, - compile: true, + compile: false, plEdit: true, anonymousBlock: true, supportOBProxy: false, export: { - fileLimit: true, - snapshot: true, + fileLimit: false, + snapshot: false, }, }, schema: { diff --git a/src/component/EditorToolBar/actions/pl.tsx b/src/component/EditorToolBar/actions/pl.tsx index 740a54ae4..0e25eedbc 100644 --- a/src/component/EditorToolBar/actions/pl.tsx +++ b/src/component/EditorToolBar/actions/pl.tsx @@ -196,6 +196,9 @@ const plActions: ToolBarActions = { return IConStatus.INIT; }, isVisible(ctx: PLPage) { + if (!getDataSourceModeConfig(ctx.getSession()?.connection?.type)?.features?.plRun) { + return false; + } const plSchema = ctx.getFormatPLSchema(); return plSchema.plType != plType.PKG_HEAD && plSchema.plType != plType.PKG_BODY; }, diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/function.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/function.tsx index d88f985b8..6d3126012 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/function.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/function.tsx @@ -194,6 +194,9 @@ export const functionMenusConfig: Partial Date: Tue, 5 Mar 2024 17:12:36 +0800 Subject: [PATCH 129/231] fixes oceanbase/odc#1718 --- src/component/MonacoEditor/plugins/ob-language/service.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/component/MonacoEditor/plugins/ob-language/service.ts b/src/component/MonacoEditor/plugins/ob-language/service.ts index 0990687c8..ecf4be83a 100644 --- a/src/component/MonacoEditor/plugins/ob-language/service.ts +++ b/src/component/MonacoEditor/plugins/ob-language/service.ts @@ -114,7 +114,10 @@ export function getModelService( return []; }, async getSchemaList() { - return [sessionFunc()?.database?.dbName].filter(Boolean); + if (!Object.keys(sessionFunc()?.allIdentities).length) { + sessionFunc()?.queryIdentities(); + } + return Object.keys(sessionFunc()?.allIdentities); }, async getFunctions() { if (!sessionFunc()?.database.functions) { From 12b10157b66933b627ec94453421a7680afef055 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 5 Mar 2024 17:44:26 +0800 Subject: [PATCH 130/231] improve session select style --- .../Workspace/SideBar/ResourceTree/index.tsx | 7 +- .../SideBar/ResourceTree/useTreeState.tsx | 4 ++ .../SessionSelect/index.less | 3 +- .../SessionSelect/index.tsx | 67 ++++++++++--------- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/page/Workspace/SideBar/ResourceTree/index.tsx b/src/page/Workspace/SideBar/ResourceTree/index.tsx index c724d45aa..0ca47c491 100644 --- a/src/page/Workspace/SideBar/ResourceTree/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/index.tsx @@ -60,9 +60,8 @@ const ResourceTree: React.FC = function ({ enableFilter, stateId, }) { - const { expandedKeys, loadedKeys, sessionIds, setSessionId, onExpand, onLoad } = useTreeState( - stateId, - ); + const { expandedKeys, loadedKeys, sessionIds, setSessionId, onExpand, onLoad } = + useTreeState(stateId); const treeContext = useContext(ResourceTreeContext); const { tabKey } = useParams<{ tabKey: string }>(); const update = useUpdate(); @@ -118,7 +117,6 @@ const ResourceTree: React.FC = function ({ const loadData = useCallback( async (treeNode: EventDataNode & TreeDataNode) => { - console.log('loaddata', treeNode.key); const { type, data } = treeNode; switch (type) { case ResourceNodeType.Database: { @@ -139,7 +137,6 @@ const ResourceTree: React.FC = function ({ await loadNode(sessionManagerStore, treeNode); } } - console.log('loaddata-end', treeNode.key); }, [sessionIds], ); diff --git a/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx b/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx index fa8abfc7a..8760dd435 100644 --- a/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/useTreeState.tsx @@ -50,6 +50,10 @@ export default function useTreeState(id: string) { treeContext.setCurrentDatabaseId(cid); } if (expanded && !loadedKeys?.includes(node.key)) { + /** + * 只允许在onload内部修改expandedKeys + * 触发onload可以保证node是加载成功的,并且在loadedkeys中,避免请求失败无限循环 + */ return; } cache[id] = Object.assign({}, cache[id], { expandedKeys: [...expandedKeys] }); diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less index abb888e30..e5c3f761d 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less @@ -25,8 +25,9 @@ } } .aim { + padding: 8px 6px; color: var(--text-color-secondary); &:hover { - color: var(--text-color-primary); + color: var(--text-color-link); } } diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx index 718e2c515..b9474415d 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.tsx @@ -134,7 +134,7 @@ export default function SessionSelect({ const fromDataSource = context.datasourceMode; const dsStyle = getDataSourceStyleByConnectType(context?.session?.connection?.type); - const content = ( + const databaseItem = ( {context?.session?.odcDatabase?.name} - - } - style={{ color: 'var(--text-color-hint)', marginLeft: 8 }} - > - {login.isPrivateSpace() ? null : ( - - {formatMessage({ - id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.38EA55F4' /*项目:*/, - })} - {context?.session?.odcDatabase?.project?.name} - - )} - - - {formatMessage({ - id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.CD007EC1' /*数据源:*/, - })} - {context?.session?.odcDatabase?.dataSource?.name} - - )} ); + const aimItem = ; + const datasourceAndProjectItem = !fromDataSource ? ( + } + style={{ color: 'var(--text-color-hint)' }} + > + {login.isPrivateSpace() ? null : ( + + {formatMessage({ + id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.38EA55F4' /*项目:*/, + })} + {context?.session?.odcDatabase?.project?.name} + + )} + + + {formatMessage({ + id: 'src.page.Workspace.components.SessionContextWrap.SessionSelect.CD007EC1' /*数据源:*/, + })} + {context?.session?.odcDatabase?.dataSource?.name} + + + ) : null; if (readonly) { return ( <> {renderEnv()} -
{content}
+
+ {databaseItem} + {datasourceAndProjectItem} +
); } return ( - -
- {renderEnv()} -
{content}
-
-
+
+ {renderEnv()} + +
{databaseItem}
+
+
{aimItem}
+
{datasourceAndProjectItem}
+
); } From ada926bfd97802b6438c8d6310d00a54d2d2520c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Tue, 5 Mar 2024 18:55:39 +0800 Subject: [PATCH 131/231] PullRequest: 350 fix: modify some ui and update oic's version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-ui-ccj of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/350 Signed-off-by: 晓康 * fix: modify some ui and update oic's version --- package.json | 2 +- pnpm-lock.yaml | 8 +-- src/common/network/env.ts | 8 +-- .../SSO/NewSSODrawerButton/index.tsx | 2 +- src/page/ExternalIntegration/index.tsx | 2 +- .../Notification/components/Channel.tsx | 69 +++++++------------ .../Notification/components/Policy.tsx | 8 +-- .../Notification/components/interface.ts | 25 +++---- src/page/Project/index.tsx | 2 +- .../Env/components/FormEnvironmentModal.tsx | 18 ++--- src/page/Secure/Env/index.tsx | 4 +- 11 files changed, 57 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index 05ace2b1d..533cff786 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "devDependencies": { "@ant-design/icons": "^4.0.0", "@oceanbase-odc/monaco-plugin-ob": "^0.2.2", - "@oceanbase-odc/ob-intl-cli": "^2.0.3", + "@oceanbase-odc/ob-intl-cli": "^2.0.4", "@oceanbase-odc/ob-parser-js": "^3.0.1", "@oceanbase-odc/ob-react-data-grid": "^3.0.10", "@sentry/react": "^7.88.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 194ca08d3..f34c4c6a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,8 +44,8 @@ devDependencies: specifier: ^0.2.2 version: 0.2.2(monaco-editor@0.36.1) '@oceanbase-odc/ob-intl-cli': - specifier: ^2.0.3 - version: 2.0.3(prettier@2.8.8)(typescript@4.9.5) + specifier: ^2.0.4 + version: 2.0.4(prettier@2.8.8)(typescript@4.9.5) '@oceanbase-odc/ob-parser-js': specifier: ^3.0.1 version: 3.0.1 @@ -3349,8 +3349,8 @@ packages: monaco-editor: 0.36.1 dev: true - /@oceanbase-odc/ob-intl-cli@2.0.3(prettier@2.8.8)(typescript@4.9.5): - resolution: {integrity: sha512-9FvhOVyu4xh3CnImzETZUpfK85ytRu/WZbnxOuB/dyQH3A0w/XAxPOBeK9qHGY2h7qaXdvLNMBNoDli2zIUZpg==} + /@oceanbase-odc/ob-intl-cli@2.0.4(prettier@2.8.8)(typescript@4.9.5): + resolution: {integrity: sha512-nxp4vkoO84hxxMCLp1l2dSByxXUPKDxs+fukG1V38KzfLEXXFKpsHrvP2YFzTZ+paBXb442ci7fx0StpusscMA==} hasBin: true requiresBuild: true dependencies: diff --git a/src/common/network/env.ts b/src/common/network/env.ts index 9b35ad16c..fbb8eac7b 100644 --- a/src/common/network/env.ts +++ b/src/common/network/env.ts @@ -33,11 +33,11 @@ export async function listEnvironments( * @param data * @returns */ -export async function createEnvironment(data: Partial): Promise { +export async function createEnvironment(data: Partial): Promise { const res = await request.post(`/api/v2/collaboration/environments`, { data, }); - return res?.successful; + return res; } /** * 删除自定义环境 @@ -57,11 +57,11 @@ export async function deleteEnvironment(environmentId: number): Promise export async function updateEnvironment( environmentId: number, data: Pick, -): Promise { +): Promise { const res = await request.put(`/api/v2/collaboration/environments/${environmentId}`, { data, }); - return res?.successful; + return res; } /** * 修改环境的启用状态 diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/index.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/index.tsx index 584c63a11..e208bc98c 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/index.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/index.tsx @@ -84,7 +84,7 @@ export default function NewSSODrawerButton({ onSuccess }: IProps) { }} type="primary" > - {formatMessage({ id: 'odc.SSO.NewSSODrawerButton.CreateSsoIntegration' }) /*新建 SSO 集成*/} + 新建登录集成 - { - formatMessage({ - id: 'src.page.Project.Notification.components.9709DF4E' /*新建通道*/, - }) /* 新建通道 */ - } - - ), + content: 新建推送通道, isPrimary: true, onClick: () => { setFormDrawerOpen(true); @@ -314,11 +306,7 @@ export const FromChannelDrawer: React.FC<{ open={formDrawerOpen} destroyOnClose closable - title={ - channelId - ? formatMessage({ id: 'src.page.Project.Notification.components.9CF32BBF' }) - : formatMessage({ id: 'src.page.Project.Notification.components.F689C8B8' }) - } + title={channelId ? '编辑推送通道' : '新建推送通道'} width={520} onClose={handleFormDrawerClose} footer={ @@ -386,7 +374,7 @@ export const FromChannelDrawer: React.FC<{ rules={[ { required: true, - message: formatMessage({ id: 'src.page.Project.Notification.components.D41EF6A2' }), //'通道名称不能为空' + message: '请输入', }, { message: formatMessage({ id: 'src.page.Project.Notification.components.CA33D8AB' }), //'通道名称已存在' @@ -475,9 +463,7 @@ export const FromChannelDrawer: React.FC<{ rules={[ { required: true, - message: formatMessage({ - id: 'src.page.Project.Notification.components.AAAA3457', - }), //'通道名称不能为空' + message: '请输入', }, ]} > @@ -689,19 +675,20 @@ export const FromChannelDrawer: React.FC<{
- - - - - + + + + + + + + @@ -993,6 +983,7 @@ const CheckboxWithTip: React.FC<{ }) /*"不超过"*/ } style={{ width: '145px' }} + min={1} addonAfter={ formatMessage({ id: 'src.page.Project.Notification.components.90C16E2F', @@ -1015,13 +1006,7 @@ const CheckboxWithTip: React.FC<{ > - + { formatMessage({ id: 'src.page.Project.Notification.components.91FA1DA5' /*忽略*/, @@ -1030,13 +1015,7 @@ const CheckboxWithTip: React.FC<{ - + { formatMessage({ id: 'src.page.Project.Notification.components.AB93FA16' /*重发*/, diff --git a/src/page/Project/Notification/components/Policy.tsx b/src/page/Project/Notification/components/Policy.tsx index e3a505f8e..4249148f3 100644 --- a/src/page/Project/Notification/components/Policy.tsx +++ b/src/page/Project/Notification/components/Policy.tsx @@ -338,13 +338,7 @@ const FormPolicyModal: React.FC<{ {menu}
setChannelFormDrawerOpen(true)} style={{ cursor: 'pointer' }}> - +
)} diff --git a/src/page/Project/Notification/components/interface.ts b/src/page/Project/Notification/components/interface.ts index dc697e43c..80dece9ad 100644 --- a/src/page/Project/Notification/components/interface.ts +++ b/src/page/Project/Notification/components/interface.ts @@ -20,26 +20,23 @@ export const EChannelTypeMap = { id: 'src.page.Project.Notification.components.F80DF1C7', }), //'飞书' [EChannelType.WE_COM]: formatMessage({ id: 'src.page.Project.Notification.components.A41C487F' }), //'企业微信' - [EChannelType.WEBHOOK]: formatMessage({ - id: 'src.page.Project.Notification.components.617AFC70', - }), //'自定义webhook' + [EChannelType.WEBHOOK]: '自定义', }; export const ELanguageMap = { - [ELanguage.ZH_CN]: formatMessage({ id: 'src.page.Project.Notification.components.1BFBC1A9' }), //'中文' + [ELanguage.ZH_CN]: '简体中文', [ELanguage.ZH_TW]: formatMessage({ id: 'src.page.Project.Notification.components.739AD573' }), //'繁体中文' [ELanguage.EN_US]: formatMessage({ id: 'src.page.Project.Notification.components.21BD64D9' }), //'英文' }; export const EContentTemplateMap = { - [ELanguage.ZH_CN]: formatMessage({ id: 'src.page.Project.Notification.components.A7DBBE1D' }), - - [ELanguage.ZH_TW]: formatMessage({ id: 'src.page.Project.Notification.components.D5DC58D0' }), - - [ELanguage.EN_US]: `### ODC \${taskType}-\${taskStatus} - - task ID: \${taskId} - - project: \${projectName} - - database: \${databaseName} - - creator: \${creatorName} - - trigger time: \${triggerTime}`, + // @oic-line-ignore + [ELanguage.ZH_CN]: + '### ODC ${taskType}-${taskStatus}\n- 任务ID: ${taskId}\n- 项目: ${projectName}\n- 数据库: ${databaseName}\n- 发起人: ${creatorName}\n- 触发时间: ${triggerTime}', + // @oic-line-ignore + [ELanguage.ZH_TW]: + '### ODC ${taskType}-${taskStatus}\n- 任務ID: ${taskId}\n- 項目: ${projectName}\n- 數據庫: ${databaseName}\n- 發起人: ${creatorName}\n- 觸發時間: ${triggerTime}', + // @oic-line-ignore + [ELanguage.EN_US]: + '### ODC ${taskType}-${taskStatus}\n- task ID: ${taskId}\n- project: ${projectName}\n- database: ${databaseName}\n- creator: ${creatorName}\n- trigger time: ${triggerTime}', }; export const EMessageStatusMap = { [EMessageStatus.CREATED]: formatMessage({ diff --git a/src/page/Project/index.tsx b/src/page/Project/index.tsx index 86dd07728..b95fe0f2c 100644 --- a/src/page/Project/index.tsx +++ b/src/page/Project/index.tsx @@ -121,7 +121,7 @@ const tabs = [ key: IPageType.Project_Sensitive, }, { - tab: formatMessage({ id: 'src.page.Project.9197A72C' }), //'消息通知' + tab: '消息', key: IPageType.Project_Notification, }, { diff --git a/src/page/Secure/Env/components/FormEnvironmentModal.tsx b/src/page/Secure/Env/components/FormEnvironmentModal.tsx index 39aefaf01..ed553a187 100644 --- a/src/page/Secure/Env/components/FormEnvironmentModal.tsx +++ b/src/page/Secure/Env/components/FormEnvironmentModal.tsx @@ -15,7 +15,7 @@ export const FormEnvironmentModal: React.FC<{ formEnvironmentModalOpen: boolean; options: SelectProps['options']; handleCancelFormModal: () => void; - callback: () => void; + callback: (environmentId: number) => void; }> = ({ isEdit = false, currentEnvironment = null, @@ -31,22 +31,22 @@ export const FormEnvironmentModal: React.FC<{ return; } const formData = await formRef.validateFields()?.catch(); - let successful; + let result; setLoading(true); if (isEdit) { - successful = await updateEnvironment(currentEnvironment?.id, formData); + result = await updateEnvironment(currentEnvironment?.id, formData); } else { formData.enabled = true; - successful = await createEnvironment(formData); + result = await createEnvironment(formData); } setLoading(false); - if (successful) { + if (result?.successful) { message.success( currentEnvironment ? formatMessage({ id: 'src.page.Secure.Env.components.6BD18E5A' }) : formatMessage({ id: 'src.page.Secure.Env.components.CEAD4978' }), ); - currentEnvironment && (await callback?.()); + currentEnvironment && (await callback?.(result?.data?.id)); return; } message.error( @@ -143,11 +143,7 @@ export const FormEnvironmentModal: React.FC<{
diff --git a/src/page/Secure/Env/index.tsx b/src/page/Secure/Env/index.tsx index ebed046dd..83063137b 100644 --- a/src/page/Secure/Env/index.tsx +++ b/src/page/Secure/Env/index.tsx @@ -115,9 +115,9 @@ const Environment = () => { }, }); }; - const callback = async () => { + const callback = async (environmentId: number = null) => { setFormEnvironmentModalOpen(false); - await initEnvironment(currentEnvironment?.id); + await initEnvironment(environmentId || currentEnvironment?.id); setIsEdit(null); }; const loadIntegrations = async () => { From 8e2f6fbe3274ad29aee80475ff6eefeb2fd5de17 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 6 Mar 2024 10:27:16 +0800 Subject: [PATCH 132/231] fix: disable account setting in client --- src/component/ODCSetting/config.tsx | 1 + src/component/ODCSetting/config/account.tsx | 2 ++ src/component/ODCSetting/index.tsx | 5 ++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/component/ODCSetting/config.tsx b/src/component/ODCSetting/config.tsx index f815e1690..a4711bf98 100644 --- a/src/component/ODCSetting/config.tsx +++ b/src/component/ODCSetting/config.tsx @@ -20,6 +20,7 @@ export interface IODCSetting { */ span?: number; storeType: 'server' | 'local'; + disabledInClient?: boolean; render: (value: T, onChange: (value: T) => Promise) => React.ReactNode; } diff --git a/src/component/ODCSetting/config/account.tsx b/src/component/ODCSetting/config/account.tsx index 8d95b433a..94835c685 100644 --- a/src/component/ODCSetting/config/account.tsx +++ b/src/component/ODCSetting/config/account.tsx @@ -23,6 +23,7 @@ const accountSettings: IODCSetting[] = [ group: accountGroup, secondGroup: accountSpaceGroup, storeType: 'server', + disabledInClient: true, render: (value, onChange) => { return ( { return ( diff --git a/src/component/ODCSetting/index.tsx b/src/component/ODCSetting/index.tsx index 9a5678d1e..bad3d0f72 100644 --- a/src/component/ODCSetting/index.tsx +++ b/src/component/ODCSetting/index.tsx @@ -33,10 +33,13 @@ const ODCSetting: React.FC = ({ modalStore }) => { } >(); odcSetting.forEach((setting) => { - const { group, secondGroup, key, render, storeType } = setting; + const { group, secondGroup, key, render, storeType, disabledInClient } = setting; if (!isClient() && storeType === 'local') { return; } + if (isClient() && disabledInClient) { + return; + } if (!result.has(group.key)) { result.set(group.key, { ...group, From 8ba4e001b5133b2a697a12c4e49d3cf90044fe55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Wed, 6 Mar 2024 13:55:08 +0800 Subject: [PATCH 133/231] PullRequest: 351 bug fixed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-030502 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/351 Signed-off-by: 晓康 * fix: PartitionTask (sql preview) * fix: PartitionTask (add alert info to the create form) * feat: PartitionTask (add display of number of existing partitions) * fix: PartitionTask (create form) * Fixes oceanbase/odc#1584 * fix: PartitionTask (detail display) * fix: PartitionTask (text change) --- .../Task/PartitionTask/CreateModal/index.tsx | 31 ++-- .../PreviewSQLModal/index.tsx | 4 +- .../PartitionPolicyFormTable/configModal.tsx | 4 + .../PartitionPolicyFormTable/index.tsx | 8 +- .../PartitionPolicyTable/ConfigDrawer.tsx | 151 ++++++++++-------- .../PartitionPolicyTable/ConfigTable.tsx | 52 ++++-- .../Workspace/components/TablePage/index.tsx | 2 +- 7 files changed, 154 insertions(+), 98 deletions(-) diff --git a/src/component/Task/PartitionTask/CreateModal/index.tsx b/src/component/Task/PartitionTask/CreateModal/index.tsx index 93d791581..fee14d291 100644 --- a/src/component/Task/PartitionTask/CreateModal/index.tsx +++ b/src/component/Task/PartitionTask/CreateModal/index.tsx @@ -44,12 +44,12 @@ import { Typography, Radio, InputNumber, + Alert, } from 'antd'; import { DrawerProps } from 'antd/es/drawer'; import { inject, observer } from 'mobx-react'; import React, { useCallback, useEffect, useState, useRef } from 'react'; import PartitionPolicyFormTable from '../../component/PartitionPolicyFormTable'; -import { getStrategyByConfig } from '../../component/PartitionPolicyTable'; import { START_DATE } from '../../component/PartitionPolicyFormTable/const'; import DatabaseSelect from '../../component/DatabaseSelect'; import Crontab from '@/component/Crontab'; @@ -70,6 +70,7 @@ export interface ITableConfig { containsCreateStrategy: boolean; containsDropStrategy: boolean; tableName: string; + definitionCount?: number; generateCount?: number; nameRuleType?: string; generateExpr?: string; @@ -130,6 +131,10 @@ const CreateModal: React.FC = inject('modalStore')( const loadData = async () => { if (sessionId && databaseId) { const res = await getPartitionPlanTables(sessionId, databaseId); + const hasPartitionPlan = res?.contents?.some( + (item) => item?.containsCreateStrategy || item?.containsDropStrategy, + ); + setHasPartitionPlan(hasPartitionPlan); setTableConfigs( res?.contents?.map((config, index) => { const { @@ -145,6 +150,7 @@ const CreateModal: React.FC = inject('modalStore')( containsDropStrategy, strategies: [], tableName, + definitionCount: partition?.partitionDefinitions?.length, partitionMode, option: { partitionKeyConfigs: partition.partitionOption?.columnNames?.map((name) => ({ @@ -301,11 +307,11 @@ const CreateModal: React.FC = inject('modalStore')( PARTITION_NAME_INVOKER.DATE_BASED_PARTITION_NAME_GENERATOR; tableConfig.partitionNameInvokerParameters = { partitionNameGeneratorConfig: { + ...currentTimeParameter, namingPrefix, namingSuffixExpression, interval, intervalPrecision, - fromCurrentTime: true, }, }; } else { @@ -437,18 +443,15 @@ const CreateModal: React.FC = inject('modalStore')( timeoutMillis: 2, }} > - - + + {hasPartitionPlan && ( + + )} = (props) => { const { visible, previewData, onClose } = props; const [activeKey, setActiveKey] = useState(previewData?.[0]?.tableName); const activePreview = previewData?.find((item) => item.tableName === activeKey); + const sql = activePreview?.sqls?.join('\n') ?? ''; const handleChange = (key) => { setActiveKey(key); @@ -51,7 +52,6 @@ const PreviewSQLModal: React.FC = (props) => { }) /*"SQL 预览"*/ } open={visible} - destroyOnClose width={840} onClose={onClose} footer={ @@ -78,7 +78,7 @@ const PreviewSQLModal: React.FC = (props) => { />
- +
); diff --git a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx index d47ad8b72..640f1b389 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx @@ -80,6 +80,10 @@ export const intervalPrecisionOptions = [ }, ]; +export const getIntervalPrecisionLabel = (value) => { + return intervalPrecisionOptions?.find((item) => item.value === value)?.label; +}; + const defaultInitialValues = { strategies: [TaskPartitionStrategy.CREATE, TaskPartitionStrategy.DROP], nameRuleType: NameRuleType.PRE_SUFFIX, diff --git a/src/component/Task/component/PartitionPolicyFormTable/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/index.tsx index b7d78ce39..766762335 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/index.tsx @@ -117,12 +117,18 @@ const PartitionPolicyFormTable: React.FC = (props) => { ); }, }, + { + title: '已有分区数量', + key: 'definitionCount', + dataIndex: 'definitionCount', + width: 120, + }, { title: formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.787E8B6F', }), //'分区策略' key: 'action', - width: 430, + width: 310, filterIcon: , filters: ActionFilters, render: (_, record) => { diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx index 58c7376e0..77a144dba 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx @@ -22,6 +22,7 @@ import ConfigTable from './ConfigTable'; import { SimpleTextItem } from '../../component/SimpleTextItem'; import type { IPartitionTableConfig } from '@/d.ts'; import { TaskPartitionStrategy, PARTITION_NAME_INVOKER } from '@/d.ts'; +import { getFormatDateTime } from '@/util/utils'; import styles from './index.less'; interface IProps { @@ -99,30 +100,35 @@ const ConfigDrawer: React.FC = (props) => { > {getStrategyLabelByConfig(config)} - - {config?.partitionKeyConfigs?.[0]?.partitionKeyInvokerParameters?.generateCount} - - - -
- } - direction="column" - /> - + {createKeyConfigs?.length && ( + <> + + + {config?.partitionKeyConfigs?.[0]?.partitionKeyInvokerParameters?.generateCount} + + + + +
+ } + direction="column" + /> + + )} = (props) => { } > {config?.partitionNameInvoker === - PARTITION_NAME_INVOKER.DATE_BASED_PARTITION_NAME_GENERATOR - ? [ - formatMessage( - { id: 'src.component.Task.component.PartitionPolicyTable.1D7346EE' }, - { - partitionNameInvokerParametersPartitionNameGeneratorConfigNamingPrefix: - partitionNameInvokerParameters.partitionNameGeneratorConfig.namingPrefix, - }, - ), - formatMessage( - { id: 'src.component.Task.component.PartitionPolicyTable.72F5EDA4' }, - { - partitionNameInvokerParametersPartitionNameGeneratorConfigNamingSuffixExpression: - partitionNameInvokerParameters.partitionNameGeneratorConfig - .namingSuffixExpression, - }, - ), - ]?.join(', ') - : formatMessage( - { id: 'src.component.Task.component.PartitionPolicyTable.59CEB82C' }, + PARTITION_NAME_INVOKER.DATE_BASED_PARTITION_NAME_GENERATOR ? ( + + {formatMessage( + { id: 'src.component.Task.component.PartitionPolicyTable.1D7346EE' }, { - partitionNameInvokerParametersPartitionNameGeneratorConfigGenerateExpr: - partitionNameInvokerParameters.partitionNameGeneratorConfig.generateExpr, + partitionNameInvokerParametersPartitionNameGeneratorConfigNamingPrefix: + partitionNameInvokerParameters.partitionNameGeneratorConfig.namingPrefix, }, )} + + 后缀: + {partitionNameInvokerParameters?.partitionNameGeneratorConfig?.fromCurrentTime + ? '当前时间' + : '指定时间'} + {partitionNameInvokerParameters?.partitionNameGeneratorConfig + ?.baseTimestampMillis && + getFormatDateTime( + partitionNameInvokerParameters?.partitionNameGeneratorConfig + ?.baseTimestampMillis, + )} + {partitionNameInvokerParameters.partitionNameGeneratorConfig.namingSuffixExpression} + + + ) : ( + formatMessage( + { id: 'src.component.Task.component.PartitionPolicyTable.59CEB82C' }, + { + partitionNameInvokerParametersPartitionNameGeneratorConfigGenerateExpr: + partitionNameInvokerParameters.partitionNameGeneratorConfig.generateExpr, + }, + ) + )} - - {dropKeyConfig?.partitionKeyInvokerParameters?.keepLatestCount} - - - {dropKeyConfig?.partitionKeyInvokerParameters?.reloadIndexes - ? formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.88E93248' }) - : formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.A5E08D34' })} - + {dropKeyConfig && ( + <> + + {dropKeyConfig?.partitionKeyInvokerParameters?.keepLatestCount} + + + {dropKeyConfig?.partitionKeyInvokerParameters?.reloadIndexes + ? formatMessage({ + id: 'src.component.Task.component.PartitionPolicyTable.88E93248', + }) + : formatMessage({ + id: 'src.component.Task.component.PartitionPolicyTable.A5E08D34', + })} + + + )} ); diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx index d30f3b3bc..fd24d1e5b 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx @@ -17,8 +17,9 @@ import { formatMessage } from '@/util/intl'; import DisplayTable from '@/component/DisplayTable'; import { IPartitionKeyConfig, PARTITION_KEY_INVOKER } from '@/d.ts'; -import { Descriptions } from 'antd'; +import { Descriptions, Space, Tooltip } from 'antd'; import React from 'react'; +import { getIntervalPrecisionLabel } from '@/component/Task/component/PartitionPolicyFormTable/configModal'; import styles from './index.less'; const columns = [ @@ -46,18 +47,31 @@ const columns = [ ? formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.C9467B5B' }) : formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.F057FAAF' })} - - {record?.fromCurrentTime - ? formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.02D5A436' }) - : formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.C5755BD5' })} - - + {record?.partitionKeyInvoker === PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR ? ( + + {record?.partitionKeyInvokerParameters?.generateParameter?.fromCurrentTime + ? formatMessage({ + id: 'src.component.Task.component.PartitionPolicyTable.02D5A436', + }) + : formatMessage({ + id: 'src.component.Task.component.PartitionPolicyTable.C5755BD5', + })} + + ) : ( + + + {record?.partitionKeyInvokerParameters?.generateParameter?.generateExpr} + + + )} - {record?.partitionKeyInvokerParameters?.generateParameter?.interval || - record?.partitionKeyInvokerParameters?.generateParameter?.intervalGenerateExpr} + {record?.partitionKeyInvokerParameters?.generateParameter?.interval ? ( + + {record?.partitionKeyInvokerParameters?.generateParameter?.interval} + {getIntervalPrecisionLabel( + record?.partitionKeyInvokerParameters?.generateParameter?.intervalPrecision, + )} + + ) : ( + record?.partitionKeyInvokerParameters?.generateParameter?.intervalGenerateExpr + )} ); diff --git a/src/page/Workspace/components/TablePage/index.tsx b/src/page/Workspace/components/TablePage/index.tsx index e05d1f14e..dc7747c00 100644 --- a/src/page/Workspace/components/TablePage/index.tsx +++ b/src/page/Workspace/components/TablePage/index.tsx @@ -284,7 +284,7 @@ const TablePage: React.FC = function ({ params, pageStore, pageKey, sett label: formatMessage({ id: 'workspace.window.table.propstab.partition', }), - childen: ( + children: ( From b8cddfa9aab80415e81a98af86300c048910d89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 6 Mar 2024 17:33:59 +0800 Subject: [PATCH 134/231] PullRequest: 352 Fixes oceanbase/odc#1339 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-odc-1339 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/352 Signed-off-by: 晓康 * Fixes oceanbase/odc#1339 * feat: modify condition expression --- .../Env/components/EnvironmentTable.tsx | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/page/Secure/Env/components/EnvironmentTable.tsx b/src/page/Secure/Env/components/EnvironmentTable.tsx index a42742899..ba32c3aa0 100644 --- a/src/page/Secure/Env/components/EnvironmentTable.tsx +++ b/src/page/Secure/Env/components/EnvironmentTable.tsx @@ -32,6 +32,7 @@ import styles from './index.less'; import tracert from '@/util/tracert'; import { IEnvironment } from '@/d.ts/environment'; import { IManagerIntegration } from '@/d.ts'; +import modal from 'antd/lib/modal'; interface IEnvironmentProps { currentEnvironment: IEnvironment; @@ -180,25 +181,33 @@ const EnvironmentTable: React.FC = ({ tracert.click(!rule.enabled ? 'a3112.b64008.c330923.d367476' : 'a3112.b64008.c330923.d367477', { ruleId: rule.id, }); - const updateResult = - (await updateRule(rulesetId, rule.id, { - ...rule, - enabled: !rule.enabled, - })) || false; - if (updateResult) { - message.success( - formatMessage({ - id: 'odc.src.page.Secure.Env.components.UpdateCompleted', - }), //'更新成功' - ); - tableRef.current?.reload(argsRef.current || {}); - } else { - message.error( - formatMessage({ - id: 'odc.src.page.Secure.Env.components.UpdateFailure', - }), //'更新失败' - ); + const isCloseDisabledPLDebug = + rule?.metadata?.type === RuleType.SQL_CONSOLE && rule?.metadata?.id === 6 && rule?.enabled; + const switchRuleStatus = async () => { + const successful = + (await updateRule(rulesetId, rule.id, { + ...rule, + enabled: !rule.enabled, + })) || false; + if (successful) { + message.success(rule.enabled ? '禁用成功' : '启用成功'); + tableRef.current?.reload(argsRef.current || {}); + } else { + message.error(rule.enabled ? '禁用失败' : '启用失败'); + } + }; + if (isCloseDisabledPLDebug) { + return modal.confirm({ + title: '确认禁用?', + centered: true, + content: rule?.metadata?.description, + cancelText: '取消', + okText: '确认', + onCancel: () => {}, + onOk: switchRuleStatus, + }); } + switchRuleStatus(); }; const rawColumns = getColumns({ subTypeFilters, From 575dbf9bf5215cf46ea8f34aa9a017c66f659bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 6 Mar 2024 17:34:24 +0800 Subject: [PATCH 135/231] PullRequest: 353 Fixes oceanbase/odc#1563 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-odc-1563 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/353 Signed-off-by: 晓康 * Fixes oceanbase/odc#1563 * fix: add tip where task's file is expired * fix: append comment * fix: fix the spinning bug of custom environment --- src/common/network/env.ts | 17 ++++++++ .../Task/component/ActionBar/index.tsx | 12 ++++-- .../component/DataTransferModal/index.tsx | 28 +++++++++---- .../Env/components/FormEnvironmentModal.tsx | 41 ++++++++++--------- 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/src/common/network/env.ts b/src/common/network/env.ts index fbb8eac7b..7e1397182 100644 --- a/src/common/network/env.ts +++ b/src/common/network/env.ts @@ -77,3 +77,20 @@ export async function setEnabled(environmentId: number, enabled: boolean) { }); return res?.successful; } + +/** + * 环境名场重复校验接口 + * @param environmentName 环境名称 + * @returns + */ +export async function getEnvironmentExists(environmentName: string): Promise<{ + errorMessage: string; + exists: boolean; +}> { + const res = await request.post(`/api/v2/collaboration/environments/exists`, { + params: { + name: environmentName, + }, + }); + return res?.data; +} diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index f7adbd49b..203a5a4ae 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -371,10 +371,14 @@ const ActionBar: React.FC = inject( const { status, completeTime = 0 } = _task; const structureComparisonData = modalStore?.structureComparisonDataMap?.get(_task?.id) || null; + // 文件过期判断。 + const isExpired = Math.abs(Date.now() - completeTime) >= 14 * 24 * 60 * 60 * 1000 || false; + // 结构比对工单详情 任务未得到执行结果前禁用按钮。 const disableBtn = task?.type === TaskType.STRUCTURE_COMPARISON && structureComparisonData && ![SubTaskStatus.DONE, SubTaskStatus.FAILED].includes(structureComparisonData?.status); + // 结构比对结果均为一致时,无须发起数据库变更任务。 const noAction = SubTaskStatus.DONE === structureComparisonData?.status && ((structureComparisonData?.overSizeLimit && structureComparisonData?.storageObjectId) || @@ -498,8 +502,8 @@ const ActionBar: React.FC = inject( text: formatMessage({ id: 'odc.TaskManagePage.component.TaskTools.Download', }), - disabled: Math.abs(Date.now() - completeTime) >= 14 * 24 * 60 * 60 * 1000, - isExpired: Math.abs(Date.now() - completeTime) >= 14 * 24 * 60 * 60 * 1000, + disabled: isExpired, + isExpired, tip: formatMessage({ id: 'src.component.Task.component.ActionBar.F20AAC3F' }), //'文件下载链接已超时,请重新发起工单。' action: download, @@ -563,7 +567,9 @@ const ActionBar: React.FC = inject( text: formatMessage({ id: 'odc.TaskManagePage.component.TaskTools.DownloadQueryResults', }), - + disabled: isExpired, + isExpired, + tip: '文件下载链接已超时,请重新发起工单。', //下载查询结果 action: downloadViewResult, type: 'button', diff --git a/src/component/Task/component/DataTransferModal/index.tsx b/src/component/Task/component/DataTransferModal/index.tsx index 97c85ca4c..3746fe23b 100644 --- a/src/component/Task/component/DataTransferModal/index.tsx +++ b/src/component/Task/component/DataTransferModal/index.tsx @@ -21,7 +21,7 @@ import { FILE_DATA_TYPE, IMPORT_TYPE, TaskExecStrategy } from '@/d.ts'; import { isClient } from '@/util/env'; import { formatMessage } from '@/util/intl'; import { getLocalFormatDateTime } from '@/util/utils'; -import { Alert, Col, Divider, Row, Space } from 'antd'; +import { Alert, Col, Divider, Row, Space, Tooltip } from 'antd'; import React from 'react'; import CsvTable from './csvTables'; import styles from './index.less'; @@ -304,6 +304,8 @@ class TaskContent extends React.Component { id: 'odc.component.TaskDetailDrawer.TaskInfo.ClearDataBeforeImport', }), ); + const isExpired = + Math.abs(Date.now() - task?.completeTime) >= 14 * 24 * 60 * 60 * 1000 || false; return ( <> @@ -337,14 +339,22 @@ class TaskContent extends React.Component { {taskConfig?.importFileName?.map((fileName, index) => { return ( - { - downloadTaskFlow(task?.id, fileName); - }} - > - {fileName} - + + { + if (isExpired) { + return; + } + downloadTaskFlow(task?.id, fileName); + }} + download + > + {fileName} + + ); })} diff --git a/src/page/Secure/Env/components/FormEnvironmentModal.tsx b/src/page/Secure/Env/components/FormEnvironmentModal.tsx index ed553a187..5df39e50d 100644 --- a/src/page/Secure/Env/components/FormEnvironmentModal.tsx +++ b/src/page/Secure/Env/components/FormEnvironmentModal.tsx @@ -1,5 +1,5 @@ import { formatMessage } from '@/util/intl'; -import { updateEnvironment, createEnvironment } from '@/common/network/env'; +import { updateEnvironment, createEnvironment, getEnvironmentExists } from '@/common/network/env'; import { EnvColorMap } from '@/constant'; import { IEnvironment } from '@/d.ts/environment'; import { message, Modal, Button, Form, Input, Tag, Select, SelectProps } from 'antd'; @@ -30,16 +30,19 @@ export const FormEnvironmentModal: React.FC<{ if (isEdit && currentEnvironment?.builtIn) { return; } - const formData = await formRef.validateFields()?.catch(); let result; - setLoading(true); if (isEdit) { + const formData = await formRef.validateFields(['style'])?.catch(); + setLoading(true); result = await updateEnvironment(currentEnvironment?.id, formData); + setLoading(false); } else { + const formData = await formRef.validateFields()?.catch(); formData.enabled = true; + setLoading(true); result = await createEnvironment(formData); + setLoading(false); } - setLoading(false); if (result?.successful) { message.success( currentEnvironment @@ -56,17 +59,16 @@ export const FormEnvironmentModal: React.FC<{ ); }; - // TODO: waiting for new API - // const checkNameRepeat = async (ruler, value) => { - // const name = value?.trim(); - // if (!name) { - // return; - // } - // const isRepeat = await getEnvironmentExists(name); - // if (isRepeat) { - // throw new Error(); - // } - // }; + const checkNameRepeat = async (ruler, value) => { + const name = value?.trim(); + if (!name) { + return; + } + const result = await getEnvironmentExists(name); + if (result?.exists) { + throw new Error(result?.errorMessage); + } + }; useEffect(() => { if (formEnvironmentModalOpen) { if (isEdit) { @@ -117,6 +119,8 @@ export const FormEnvironmentModal: React.FC<{ Date: Wed, 6 Mar 2024 18:27:02 +0800 Subject: [PATCH 136/231] PullRequest: 354 style: PartitionTask (configModal style) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-030601 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/354 Signed-off-by: 晓康 * style: PartitionTask (configModal style) * style: PartitionTask (colors change: const -> var) --- .../EditTable/index.less | 64 ++++++++++++++----- .../EditTable/index.tsx | 54 +++++++--------- .../RuleFormItem/index.tsx | 10 +-- .../PartitionPolicyFormTable/configModal.tsx | 1 + .../PartitionPolicyFormTable/index.less | 8 +++ 5 files changed, 84 insertions(+), 53 deletions(-) diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less index f78469b92..f72b5dc96 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less +++ b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less @@ -1,23 +1,55 @@ -.table{ - width: 100%; - border-spacing: 0; - background-color: #fff; - thead{ - line-height: 24px; +.editTable { + border: 1px solid var(--neutral-grey4-color); +} + +.thead { + display: grid; + grid-template-columns: 80px 80px 108px 1fr; + line-height: 24px; + grid-gap: 1px; + background-color: var(--neutral-grey4-color); + border-bottom: 1px solid var(--neutral-grey4-color); + + .theadCell { + background-color: var(--background-primary-color); + padding: 0 8px; + font-size: 12px; + font-weight: 500; + } +} +.row { + display: grid; + grid-template-columns: 80px 80px 108px 1fr; + align-items: center; + height: 72px; + grid-gap: 1px; + background-color: var(--neutral-grey4-color); + .td { display: flex; - text-align: left; - background-color: #FAFAFA; - border-bottom: none; - th{ - border: 1px solid #E9E9E9; - padding: 0 5px; + height: 100%; + background-color: var(--background-primary-color); + vertical-align: middle; + .content { + width: 100%; + display: inline-flex; + padding: 0 8px; + line-height: 62px; } } - td .content{ - padding: 5px 8px; + .ruleFormItem { + width: 100%; + padding: 4px 8px; } - td{ - border: 1px solid #E9E9E9; + .typeSelect { + display: flex; vertical-align: middle; + padding: 0 8px; + line-height: 72px; + :global { + .ant-form-item { + margin-bottom: 0px; + line-height: unset; + } + } } } diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx index c82e7be6e..8d236c115 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.tsx @@ -69,17 +69,17 @@ const Row: React.FC = (props) => { }; return ( - - +
+
{column?.name}
- - +
+
{column?.type?.localizedMessage || column?.type?.dataTypeName}
- - -
+
+
+
= (props) => { />
- - -
+
+
+
- - +
+
); }; @@ -136,26 +136,16 @@ interface IEditTableProps { const EditTable: React.FC = (props) => { const { form } = props; return ( - <> - - - - {columns?.map((item) => { - return ( - - ); - })} - - -
- {item?.title} -
- - - - -
- +
+
+ {columns?.map((item) => { + return
{item?.title}
; + })} +
+
+ +
+
); }; diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx index f8c412404..b6cef6e4d 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx @@ -122,8 +122,8 @@ const RuleFormItem: React.FC = (props) => { return ( @@ -133,7 +133,7 @@ const RuleFormItem: React.FC = (props) => { {...field} name={[field.name, 'generateExpr']} className={styles.noMarginBottom} - style={{ width: '364px' }} + style={{ width: '374px' }} rules={[ { required: true, @@ -165,7 +165,7 @@ const RuleFormItem: React.FC = (props) => { {...field} name={[field.name, 'intervalGenerateExpr']} className={styles.noMarginBottom} - style={{ width: '316px' }} + style={{ width: '326px' }} rules={[ { required: true, @@ -257,7 +257,7 @@ const RuleFormItem: React.FC = (props) => { diff --git a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx index 74f918028..48dc27789 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/configModal.tsx @@ -24,7 +24,6 @@ import { TaskPartitionStrategyMap } from '../../const'; import { START_DATE } from './const'; import EditTable from './EditTable'; import PreviewSQLModal from './PreviewSQLModal'; -import { startDateOptions } from './RuleFormItem'; import { ITableConfig } from '../../PartitionTask/CreateModal'; import { Alert, @@ -48,6 +47,32 @@ import styles from './index.less'; const { Text } = Typography; +const startDateOptionValues = [ + { + label: '当前时间', + value: START_DATE.CURRENT_DATE, + description: '从实际执行时间开始命名', + }, + { + label: '指定时间', + value: START_DATE.CUSTOM_DATE, + description: '从指定时间开始命名', + }, +]; + +export const startDateOptions = startDateOptionValues.map(({ label, value, description }) => { + return { + label: ( +
+
{label}
+ {description} +
+ ), + + value, + }; +}); + export enum NameRuleType { PRE_SUFFIX = 'PRE_SUFFIX', CUSTOM = 'CUSTOM', @@ -768,6 +793,7 @@ const ConfigDrawer: React.FC = (props) => { } optionLabelProp="label" options={startDateOptions} + dropdownMatchSelectWidth={154} style={{ width: 135 }} /> @@ -940,7 +966,7 @@ const ConfigDrawer: React.FC = (props) => { required name="keepLatestCount" label={ - + { formatMessage({ id: 'src.component.Task.component.PartitionPolicyFormTable.7D6F23AE' /*分区保留数量*/, diff --git a/src/component/helpDoc/doc.tsx b/src/component/helpDoc/doc.tsx index f1d261e70..9effa522a 100644 --- a/src/component/helpDoc/doc.tsx +++ b/src/component/helpDoc/doc.tsx @@ -371,6 +371,8 @@ export default {

), + partitionKeepLatestCount:

超出数量后,仅保留最近若干个分区,其他分区均删除

, + expirePeriod: (

{ From b02e6b6ad04d979bd9631bc30a97ac70a3010310 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Thu, 7 Mar 2024 15:02:34 +0800 Subject: [PATCH 138/231] fixes oceanbase/odc#1764, fixes oceanbase/odc#1681, fixes oceanbase/odc#1787, fixes oceanbase/odc#1788 --- src/component/ODCSetting/index.tsx | 26 ++++- src/layout/SpaceContainer/Sider/index.tsx | 26 +++-- .../Form/ProjectItem/index.tsx | 15 +-- .../components/ShowViewBaseInfoForm/index.tsx | 109 +++++++++--------- 4 files changed, 101 insertions(+), 75 deletions(-) diff --git a/src/component/ODCSetting/index.tsx b/src/component/ODCSetting/index.tsx index bad3d0f72..e678d06ec 100644 --- a/src/component/ODCSetting/index.tsx +++ b/src/component/ODCSetting/index.tsx @@ -18,6 +18,7 @@ interface IProps { const ODCSetting: React.FC = ({ modalStore }) => { const [formRef] = Form.useForm(); + const [changed, setChanged] = useState(false); const formBoxRef = React.createRef(); const scrollSwitcher = useRef(true); const data = useMemo(() => { @@ -110,6 +111,21 @@ const ODCSetting: React.FC = ({ modalStore }) => { }; } + function close(force: boolean = false) { + if (changed && !force) { + Modal.confirm({ + title: '确认要取消修改配置吗?', + onOk: () => { + setChanged(false); + modalStore.changeOdcSettingVisible(false); + }, + }); + } else { + setChanged(false); + modalStore.changeOdcSettingVisible(false); + } + } + async function loadData() { let data = setting.configurations || {}; if (isClient()) { @@ -159,7 +175,7 @@ const ODCSetting: React.FC = ({ modalStore }) => { } if (isSuccess) { message.success(formatMessage({ id: 'src.component.ODCSetting.E6DD81BF' /*'保存成功'*/ })); - modalStore.changeOdcSettingVisible(false); + close(true); } } @@ -172,7 +188,7 @@ const ODCSetting: React.FC = ({ modalStore }) => { message.success( formatMessage({ id: 'src.component.ODCSetting.654799D1' /*'已恢复到默认配置'*/ }), ); - modalStore.changeOdcSettingVisible(false); + close(true); } }, }); @@ -181,7 +197,7 @@ const ODCSetting: React.FC = ({ modalStore }) => { function footerRender() { return ( - { setOpen(false); diff --git a/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx b/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx index 34bdfe1b3..8f8d73ae1 100644 --- a/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx +++ b/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx @@ -147,7 +147,7 @@ export default function SSODetailDrawer({ visible, id, close }: IProps) { return ( close()} footer={ From 53580382ef6a9a792f9e23fc5d5c843e135bbe84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Tue, 12 Mar 2024 10:04:02 +0800 Subject: [PATCH 149/231] PullRequest: 362 Fixes oceanbase/odc#1670 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-odc-1670-2 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/362 Signed-off-by: 晓康 * Fixes oceanbase/odc#1670 --- .../DetailContent/index.tsx | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx index 5ba2c0f61..71626e2d1 100644 --- a/src/component/Task/StructureComparisonTask/DetailContent/index.tsx +++ b/src/component/Task/StructureComparisonTask/DetailContent/index.tsx @@ -98,9 +98,7 @@ const CompareTable: React.FC<{ const tableRef = useRef(null); const columns = [ { - title: formatMessage({ - id: 'src.component.Task.StructureComparisonTask.DetailContent.322E747A', - }), //'对比表' + title: '比对表', key: 'dbObjectName', dataIndex: 'dbObjectName', filters: [], @@ -123,9 +121,7 @@ const CompareTable: React.FC<{ ), }, { - title: formatMessage({ - id: 'src.component.Task.StructureComparisonTask.DetailContent.04A0E2C5', - }), //'对比结果' + title: '比对结果', key: 'operationType', dataIndex: 'operationType', filters: [ @@ -243,7 +239,7 @@ const SQLPreview: React.FC<{ marginTop: '8px', }} > - {comparisonResult?.id && comparisonResult?.totalChangeScript ? ( + {comparisonResult?.id && !comparisonResult?.overSizeLimit ? (

Date: Tue, 12 Mar 2024 10:18:47 +0800 Subject: [PATCH 150/231] PullRequest: 363 fix: modify webhook's placeholder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-nofitication of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/363 Signed-off-by: 晓康 * fix: modify webhook's placeholder --- .../Project/Notification/components/Channel.tsx | 16 ++++++++-------- .../Project/Notification/components/interface.ts | 7 +++++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/page/Project/Notification/components/Channel.tsx b/src/page/Project/Notification/components/Channel.tsx index f54c7ef31..1a7948571 100644 --- a/src/page/Project/Notification/components/Channel.tsx +++ b/src/page/Project/Notification/components/Channel.tsx @@ -42,7 +42,13 @@ import styles from './index.less'; import { formatMessage, getLocalDocs } from '@/util/intl'; import HelpDoc from '@/component/helpDoc'; import { getChannelColumns } from './columns'; -import { EChannelTypeMap, EContentTemplateMap, ELanguageMap, TimeUnitMap } from './interface'; +import { + EChannelTypeMap, + EContentTemplateMap, + ELanguageMap, + TimeUnitMap, + WebhookPlaceholderMap, +} from './interface'; import odc from '@/plugins/odc'; const Channel: React.FC<{ @@ -467,13 +473,7 @@ export const FromChannelDrawer: React.FC<{ }, ]} > - + {hasSign ? ( Date: Tue, 12 Mar 2024 14:01:43 +0800 Subject: [PATCH 151/231] PullRequest: 364 Fixes oceanbase/odc#1850 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-odc-1850 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/364 Signed-off-by: 晓康 * Fixes oceanbase/odc#1850 --- src/page/Secure/Env/components/FormEnvironmentModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/Secure/Env/components/FormEnvironmentModal.tsx b/src/page/Secure/Env/components/FormEnvironmentModal.tsx index 5df39e50d..b7ccb76a0 100644 --- a/src/page/Secure/Env/components/FormEnvironmentModal.tsx +++ b/src/page/Secure/Env/components/FormEnvironmentModal.tsx @@ -32,7 +32,7 @@ export const FormEnvironmentModal: React.FC<{ } let result; if (isEdit) { - const formData = await formRef.validateFields(['style'])?.catch(); + const formData = await formRef.validateFields(['style', 'description'])?.catch(); setLoading(true); result = await updateEnvironment(currentEnvironment?.id, formData); setLoading(false); From 139342f8bae6009995f303971e8d83bb141a6d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Tue, 12 Mar 2024 14:07:26 +0800 Subject: [PATCH 152/231] PullRequest: 365 bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-031201 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/365 Signed-off-by: 晓康 * Fixes oceanbase/odc#1842 * Fixes oceanbase/odc#1683 * Fixes oceanbase/odc#1852 * Fixes oceanbase/odc#1665,#1652 --- .../CreateModal/index.tsx | 3 ++- .../Task/SQLPlanTask/CreateModal/index.tsx | 2 ++ src/page/Project/Database/index.tsx | 27 +++++++++++++------ .../TreeNodeMenu/config/package.tsx | 3 +++ .../TreeNodeMenu/config/table.tsx | 3 +++ 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx index 760f8daf7..aee060554 100644 --- a/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx +++ b/src/component/Task/ApplyDatabasePermission/CreateModal/index.tsx @@ -251,12 +251,13 @@ const CreateModal: React.FC = (props) => { }; useEffect(() => { - const { projectId } = applyDatabasePermissionData ?? {}; + const { projectId, databaseId } = applyDatabasePermissionData ?? {}; if (applyDatabasePermissionData?.task) { loadEditData(); } else { form.setFieldsValue({ projectId: projectId || props?.projectId, + databases: databaseId ? [databaseId] : [], }); } }, [applyDatabasePermissionData]); diff --git a/src/component/Task/SQLPlanTask/CreateModal/index.tsx b/src/component/Task/SQLPlanTask/CreateModal/index.tsx index cf99c3ae9..7aa43765f 100644 --- a/src/component/Task/SQLPlanTask/CreateModal/index.tsx +++ b/src/component/Task/SQLPlanTask/CreateModal/index.tsx @@ -103,12 +103,14 @@ const CreateModal: React.FC = (props) => { const { jobParameters, triggerConfig: { triggerStrategy, cronExpression, hours, days }, + database: { id: databaseId }, ...rest } = data; const sqlContentType = jobParameters?.sqlObjectIds ? SQLContentType.FILE : SQLContentType.TEXT; const formData = { ...rest, ...jobParameters, + databaseId, sqlContentType, sqlFiles: undefined, timeoutMillis: jobParameters.timeoutMillis / 1000 / 60 / 60, diff --git a/src/page/Project/Database/index.tsx b/src/page/Project/Database/index.tsx index b9645b17f..b15cfcee3 100644 --- a/src/page/Project/Database/index.tsx +++ b/src/page/Project/Database/index.tsx @@ -71,7 +71,16 @@ const Database: React.FC = ({ id }) => { params.current.current = current; params.current.environmentId = environmentId; const res = await listDatabases( - parseInt(id), null, current, pageSize, name, environmentId, null, null, true); + parseInt(id), + null, + current, + pageSize, + name, + environmentId, + null, + null, + true, + ); if (res) { datasourceStatus.asyncUpdateStatus(res?.contents?.map((item) => item?.dataSource?.id)); setData(res?.contents); @@ -141,9 +150,7 @@ const Database: React.FC = ({ id }) => { fixed: 'left', ellipsis: true, render: (name, record) => { - const hasChangeAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); - const hasQueryAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.QUERY); - const disabled = !hasChangeAuth && !hasQueryAuth; + const disabled = !record.authorizedPermissionTypes?.length; if (!record.existed) { return disabled ? (
{name}
@@ -266,9 +273,13 @@ const Database: React.FC = ({ id }) => { const disableTransfer = !!record?.dataSource?.projectId && !config?.schema?.innerSchema?.includes(record?.name); - const hasExportAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.EXPORT); - const hasChangeAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); - const hasQueryAuth = record.authorizedPermissionTypes?.includes(DatabasePermissionType.QUERY); + const hasExportAuth = record.authorizedPermissionTypes?.includes( + DatabasePermissionType.EXPORT, + ); + const hasChangeAuth = record.authorizedPermissionTypes?.includes( + DatabasePermissionType.CHANGE, + ); + const hasLoginAuth = !!record.authorizedPermissionTypes?.length; return ( {config?.features?.task?.includes(TaskType.EXPORT) && setting.enableDBExport && ( @@ -323,7 +334,7 @@ const Database: React.FC = ({ id }) => { tracert.click('a3112.b64002.c330858.d367381'); gotoSQLWorkspace(parseInt(id), record?.dataSource?.id, record?.id); }} - disabled={!hasQueryAuth} + disabled={!hasLoginAuth} > { formatMessage({ diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/package.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/package.tsx index 81694e5e9..2c415bfc9 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/package.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/package.tsx @@ -301,6 +301,9 @@ export const packageMenusConfig: Partial { + return !hasChangePermission(session); + }, run(session, node, databaseFrom) { packageMenusConfig[ResourceNodeType.Package] .find((item) => item.key === 'DELETE') diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx index 941ab9a54..144a50d09 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx @@ -186,6 +186,9 @@ export const tableMenusConfig: Partial { + return !hasChangePermission(session); + }, isHide: (session) => { return ( !setting.enableMockdata || From 9049ecf999eccb6d4fdac9844374a4850fa797ef Mon Sep 17 00:00:00 2001 From: xiaokang Date: Tue, 12 Mar 2024 17:48:46 +0800 Subject: [PATCH 153/231] add pnpm in bundlesize --- .github/workflows/bundleSize.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/bundleSize.yaml b/.github/workflows/bundleSize.yaml index afc3df5e1..d41cb6204 100644 --- a/.github/workflows/bundleSize.yaml +++ b/.github/workflows/bundleSize.yaml @@ -8,6 +8,10 @@ jobs: steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + run_install: false - uses: preactjs/compressed-size-action@v2 with: build-script: "build:odc" From 6169a89a7eb6d5c4ffdcfd6ffb1b654aaa6ea2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Tue, 12 Mar 2024 18:31:00 +0800 Subject: [PATCH 154/231] PullRequest: 366 bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-031202 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/366 Signed-off-by: 晓康 * Fixes oceanbase/odc#1687 --- src/component/TooltipAction/index.tsx | 28 +++++++++++++++++ .../Database/AddDataBaseButton/index.tsx | 29 +++++++++-------- src/page/Project/Database/index.tsx | 5 +++ src/page/Project/User/index.tsx | 25 ++++++++++----- src/page/Project/index.tsx | 31 ++++++++++--------- 5 files changed, 81 insertions(+), 37 deletions(-) create mode 100644 src/component/TooltipAction/index.tsx diff --git a/src/component/TooltipAction/index.tsx b/src/component/TooltipAction/index.tsx new file mode 100644 index 000000000..aa75fb2e7 --- /dev/null +++ b/src/component/TooltipAction/index.tsx @@ -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 { Tooltip } from 'antd'; + +interface IProps { + title?: string; + children?: React.ReactElement; +} + +const TooltipAction: React.FC = (props) => { + const { title = '', children } = props; + return title?.length ? {children} : children; +}; + +export default TooltipAction; diff --git a/src/page/Project/Database/AddDataBaseButton/index.tsx b/src/page/Project/Database/AddDataBaseButton/index.tsx index 9c90e9db6..93f9b51ae 100644 --- a/src/page/Project/Database/AddDataBaseButton/index.tsx +++ b/src/page/Project/Database/AddDataBaseButton/index.tsx @@ -18,6 +18,7 @@ import { getConnectionDetail, getConnectionList } from '@/common/network/connect import { listDatabases, updateDataBase } from '@/common/network/database'; import RiskLevelLabel from '@/component/RiskLevelLabel'; import ApplyDatabasePermissionButton from '@/component/Task/ApplyDatabasePermission/CreateButton'; +import TooltipAction from '@/component/TooltipAction'; import { formatMessage } from '@/util/intl'; import { useRequest } from 'ahooks'; import { useContext, useState } from 'react'; @@ -61,6 +62,10 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { } = useRequest(listDatabases, { manual: true, }); + const disabledAction = + project?.currentUserResourceRoles?.filter((roles) => + [ProjectRole.DBA, ProjectRole.OWNER]?.includes(roles), + )?.length === 0; function close() { setOpen(false); form.resetFields(); @@ -85,21 +90,15 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { return ( <> - + + + = ({ id }) => { handleMenuClick(TaskPageType.EXPORT, record.id); }} disabled={!hasExportAuth} + tooltip={!hasExportAuth ? '暂无权限' : ''} > { formatMessage({ @@ -306,6 +307,7 @@ const Database: React.FC = ({ id }) => { handleMenuClick(TaskPageType.IMPORT, record.id); }} disabled={!hasChangeAuth} + tooltip={!hasChangeAuth ? '暂无权限' : ''} > { formatMessage({ @@ -321,6 +323,7 @@ const Database: React.FC = ({ id }) => { handleMenuClick(TaskPageType.ASYNC, record.id); }} disabled={!hasChangeAuth} + tooltip={!hasChangeAuth ? '暂无权限' : ''} > { formatMessage({ @@ -335,6 +338,7 @@ const Database: React.FC = ({ id }) => { gotoSQLWorkspace(parseInt(id), record?.dataSource?.id, record?.id); }} disabled={!hasLoginAuth} + tooltip={!hasLoginAuth ? '暂无权限' : ''} > { formatMessage({ @@ -350,6 +354,7 @@ const Database: React.FC = ({ id }) => { setDatabase(record); }} disabled={!hasChangeAuth || disableTransfer} + tooltip={!hasChangeAuth || disableTransfer ? '暂无权限' : ''} > = ({ id, userStore }) => { return ( setAddUserModalVisiable(true)} disabled={!isOwner}> - { - formatMessage({ - id: 'odc.Project.User.AddMembers', - }) /*添加成员*/ - } - + + + } extra={ @@ -187,6 +190,7 @@ const User: React.FC = ({ id, userStore }) => { onClick={() => updateUser(record.id)} key={'export'} disabled={disabled} + tooltip={disabled ? '暂无权限' : ''} > { formatMessage({ @@ -201,7 +205,11 @@ const User: React.FC = ({ id, userStore }) => { })} /*确定删除该成员吗?*/ onConfirm={() => deleteUser(record.id)} > - + { formatMessage({ id: 'odc.Project.User.Remove', @@ -211,6 +219,7 @@ const User: React.FC = ({ id, userStore }) => { { showManageModal(record.id); }} diff --git a/src/page/Project/index.tsx b/src/page/Project/index.tsx index b95fe0f2c..d960ce302 100644 --- a/src/page/Project/index.tsx +++ b/src/page/Project/index.tsx @@ -15,6 +15,7 @@ */ import PageContainer, { TitleType } from '@/component/PageContainer'; +import TooltipAction from '@/component/TooltipAction'; import { formatMessage } from '@/util/intl'; import { Button, Menu, Space } from 'antd'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; @@ -54,20 +55,22 @@ const ExtraContent = ({ projectId }) => { return ( - + + + ); }; From e4fbbdbad75ee9c0b4f7111c64ce4d7dc1e93cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Tue, 12 Mar 2024 18:32:13 +0800 Subject: [PATCH 155/231] PullRequest: 367 Fixes oceanbase/odc#1853 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-odc-1853 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/367 Signed-off-by: 晓康 * Fixes oceanbase/odc#1853 --- src/page/Secure/Env/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/page/Secure/Env/index.tsx b/src/page/Secure/Env/index.tsx index 83063137b..c4d041c7e 100644 --- a/src/page/Secure/Env/index.tsx +++ b/src/page/Secure/Env/index.tsx @@ -99,6 +99,8 @@ const Environment = () => { const handleDeleteEnvironment = async () => { return Modal.confirm({ title: formatMessage({ id: 'src.page.Secure.Env.65EAAB75' }), //'确认删除该环境么?' + content: '删除后不可撤回', + centered: true, onCancel: () => {}, onOk: async () => { if (currentEnvironment?.builtIn) { From 47c94a82dc02c7bbeae0907bd17c4b009d60a038 Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 13 Mar 2024 12:34:16 +0800 Subject: [PATCH 156/231] fix: connection popup --- src/component/Manage/ResourceSelector/index.less | 5 ----- .../Content/List/ConnectionNameItem/index.less | 7 ------- .../components/FormRecordExportModal/index.less | 5 ----- .../ResourceTree/SelectPanel/Datasource/index.less | 12 +----------- .../SessionSelect/SessionDropdown/index.less | 8 -------- .../SessionContextWrap/SessionSelect/index.less | 8 -------- 6 files changed, 1 insertion(+), 44 deletions(-) diff --git a/src/component/Manage/ResourceSelector/index.less b/src/component/Manage/ResourceSelector/index.less index 4e7aafbbd..0b881a19f 100644 --- a/src/component/Manage/ResourceSelector/index.less +++ b/src/component/Manage/ResourceSelector/index.less @@ -6,11 +6,6 @@ .connectionPopover { padding: 0; - :global { - .ant-popover-inner-content { - padding: 0; - } - } } .labelName { diff --git a/src/page/Datasource/Datasource/Content/List/ConnectionNameItem/index.less b/src/page/Datasource/Datasource/Content/List/ConnectionNameItem/index.less index e5aedd81a..035f72236 100644 --- a/src/page/Datasource/Datasource/Content/List/ConnectionNameItem/index.less +++ b/src/page/Datasource/Datasource/Content/List/ConnectionNameItem/index.less @@ -3,13 +3,6 @@ font-size: 24px; } -.connectionPopover { - :global { - .ant-popover-inner-content { - padding: 0; - } - } -} .container { display: flex; align-items: center; diff --git a/src/page/Secure/components/FormRecordExportModal/index.less b/src/page/Secure/components/FormRecordExportModal/index.less index be73eeb3a..3c9396c77 100644 --- a/src/page/Secure/components/FormRecordExportModal/index.less +++ b/src/page/Secure/components/FormRecordExportModal/index.less @@ -12,11 +12,6 @@ .connectionPopover { padding: 0; - :global { - .ant-popover-inner-content { - padding: 0; - } - } } .labelName { diff --git a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.less b/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.less index 07a068255..73057dfaf 100644 --- a/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.less +++ b/src/page/Workspace/SideBar/ResourceTree/SelectPanel/Datasource/index.less @@ -21,14 +21,6 @@ } } -.connectionPopover { - :global { - .ant-popover-inner-content { - padding: 0; - } - } -} - .tree { :global { .ant-tree-list { @@ -85,11 +77,9 @@ font-size: 24px; } - - .fullWidthTitle { display: block; line-height: 24px; height: 100%; flex: 1; -} \ No newline at end of file +} diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.less b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.less index ef36be832..fd443c9b3 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.less +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SessionDropdown/index.less @@ -39,11 +39,3 @@ } } } - -.pop { - :global { - .ant-popover-inner-content { - width: 100%; - } - } -} diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less index e5c3f761d..bc4e128b0 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/index.less @@ -10,14 +10,6 @@ align-items: center; } -.pop { - :global { - .ant-popover-inner-content { - padding: 0px; - } - } -} - .link { cursor: pointer; &:hover { From 6ec67829907505a8fb96f20ded09caa904459a4e Mon Sep 17 00:00:00 2001 From: xiaokang Date: Wed, 13 Mar 2024 14:01:34 +0800 Subject: [PATCH 157/231] fix: remove blob text disable mode --- .../hooks/components/BlobFormatter/BlobViewModal.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/page/Workspace/components/DDLResultSet/hooks/components/BlobFormatter/BlobViewModal.tsx b/src/page/Workspace/components/DDLResultSet/hooks/components/BlobFormatter/BlobViewModal.tsx index 87b8df288..32e86a7b1 100644 --- a/src/page/Workspace/components/DDLResultSet/hooks/components/BlobFormatter/BlobViewModal.tsx +++ b/src/page/Workspace/components/DDLResultSet/hooks/components/BlobFormatter/BlobViewModal.tsx @@ -53,9 +53,7 @@ const maxTextSize = 1024 * 200; const maxReadyonlyTextSize = 1024 * 1024 * 2; const len = 500; -type Request = ( - offset: number, -) => Promise<{ +type Request = (offset: number) => Promise<{ content: string; size: number; }>; @@ -265,9 +263,7 @@ const BlobViewModal: React.FC = (props) => { /> ) : disabled ? (
- - {mode == DISPLAY_MODE.TEXT ? text : hexText} - + {mode == DISPLAY_MODE.TEXT ? text : hexText}
) : ( Date: Wed, 13 Mar 2024 14:51:14 +0800 Subject: [PATCH 158/231] PullRequest: 368 feat: append overLimitStrategy to channel's detail drawer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-appendItemToNotificationDetail of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/368 Signed-off-by: 晓康 * feat: append overLimitStrategy to channel's detail drawer --- .../CreateModal/index.tsx | 11 +---- src/d.ts/projectNotification.ts | 8 ++++ .../Notification/components/Channel.tsx | 42 +++++++++++++------ 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/component/Task/StructureComparisonTask/CreateModal/index.tsx b/src/component/Task/StructureComparisonTask/CreateModal/index.tsx index 54f6a7a84..06266150e 100644 --- a/src/component/Task/StructureComparisonTask/CreateModal/index.tsx +++ b/src/component/Task/StructureComparisonTask/CreateModal/index.tsx @@ -178,15 +178,7 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => })} /> - + {comparisonScopeMap[EComparisonScope.PART]} @@ -240,6 +232,7 @@ const StructureComparisonTask: React.FC = ({ projectId, modalStore }) => id: 'src.component.Task.StructureComparisonTask.CreateModal.EE50E3DC', }) /*"执行方式"*/ } + required name="executionStrategy" > diff --git a/src/d.ts/projectNotification.ts b/src/d.ts/projectNotification.ts index 91fee6de2..80008356f 100644 --- a/src/d.ts/projectNotification.ts +++ b/src/d.ts/projectNotification.ts @@ -43,6 +43,14 @@ export enum EOverLimitStrategy { // 重发 RESEND = 'RESEND', } +export const EOverLimitStrategyMap = { + [EOverLimitStrategy.THROWN]: '忽略', + [EOverLimitStrategy.RESEND]: '重发', +}; +export const EOverLimitStrategyTipMap = { + [EOverLimitStrategy.THROWN]: '忽略已超出限流的消息,不再重发', + [EOverLimitStrategy.RESEND]: '限流时间过后,将自动重发超出限流的消息', +}; export interface IRateLimitConfig { timeUnit: ETimeUnit; limit: number; diff --git a/src/page/Project/Notification/components/Channel.tsx b/src/page/Project/Notification/components/Channel.tsx index 1a7948571..f12feec2a 100644 --- a/src/page/Project/Notification/components/Channel.tsx +++ b/src/page/Project/Notification/components/Channel.tsx @@ -33,6 +33,8 @@ import { EChannelType, ELanguage, EOverLimitStrategy, + EOverLimitStrategyMap, + EOverLimitStrategyTipMap, ETimeUnit, IChannel, IRateLimitConfig, @@ -854,7 +856,6 @@ export const DetailChannelDrawer: React.FC<{ )} - + {channel?.channelConfig?.rateLimitConfig?.overLimitStrategy && ( + + + {EOverLimitStrategyMap?.[channel?.channelConfig?.rateLimitConfig?.overLimitStrategy]} + + + )} - - { - formatMessage({ - id: 'src.page.Project.Notification.components.91FA1DA5' /*忽略*/, - }) /* 忽略 */ - } + + {EOverLimitStrategyMap?.[EOverLimitStrategy.THROWN]} - - { - formatMessage({ - id: 'src.page.Project.Notification.components.AB93FA16' /*重发*/, - }) /* 重发 */ - } + + {EOverLimitStrategyMap?.[EOverLimitStrategy.RESEND]} From fe95c91eee54adb9c70db2877073d2e793f6b4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Wed, 13 Mar 2024 20:11:17 +0800 Subject: [PATCH 159/231] PullRequest: 369 bug fixed and PartitionTask (details page API change adaptation) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-partitionTask-adaptation-0313 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/369 Signed-off-by: 晓康 * feat: PartitionTask (details page API change adaptation) * Fixes oceanbase/odc#1882 * Fixes oceanbase/odc#1881 * style: PartitionTask (PartitionPolicyFormTable) --- .../Task/component/ActionBar/index.tsx | 10 +- .../EditTable/index.less | 5 +- .../PartitionPolicyTable/ConfigDrawer.tsx | 101 +++++++++++------- .../PartitionPolicyTable/ConfigTable.tsx | 8 +- .../Task/component/SQLPreviewModal/index.tsx | 1 - src/d.ts/index.ts | 2 + 6 files changed, 76 insertions(+), 51 deletions(-) diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 2ddeb4caa..56e704be4 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -193,17 +193,11 @@ const ActionBar: React.FC = inject( return; } default: { - const { - database: { id: databaseId } = {}, - executionStrategy, - executionTime, - parameters, - description, - } = task; + const { database, executionStrategy, executionTime, parameters, description } = task; const data = { taskType: type, parameters, - databaseId, + databaseId: database?.id, executionStrategy, executionTime, description, diff --git a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less index f72b5dc96..c87208b4a 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less +++ b/src/component/Task/component/PartitionPolicyFormTable/EditTable/index.less @@ -34,17 +34,20 @@ display: inline-flex; padding: 0 8px; line-height: 62px; + border-bottom: 1px solid var(--neutral-grey4-color); } } .ruleFormItem { width: 100%; padding: 4px 8px; + border-bottom: 1px solid var(--neutral-grey4-color); } .typeSelect { display: flex; vertical-align: middle; padding: 0 8px; - line-height: 72px; + line-height: 71px; + border-bottom: 1px solid var(--neutral-grey4-color); :global { .ant-form-item { margin-bottom: 0px; diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx index 77a144dba..25a208287 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigDrawer.tsx @@ -21,10 +21,25 @@ import { getStrategyLabelByConfig } from './index'; import ConfigTable from './ConfigTable'; import { SimpleTextItem } from '../../component/SimpleTextItem'; import type { IPartitionTableConfig } from '@/d.ts'; -import { TaskPartitionStrategy, PARTITION_NAME_INVOKER } from '@/d.ts'; +import { TaskPartitionStrategy, PARTITION_NAME_INVOKER, PARTITION_KEY_INVOKER } from '@/d.ts'; import { getFormatDateTime } from '@/util/utils'; import styles from './index.less'; +const periodUnits = [ + { + label: '年', + value: 1, + }, + { + label: '月', + value: 2, + }, + { + label: '日', + value: 5, + }, +]; + interface IProps { visible: boolean; config?: IPartitionTableConfig; @@ -44,6 +59,27 @@ const ConfigDrawer: React.FC = (props) => { (item) => item?.strategy === TaskPartitionStrategy.CREATE, ); + const getNamingSuffix = () => { + const isFromCurrentTime = + partitionNameInvokerParameters?.partitionNameGeneratorConfig?.fromCurrentTime; + const baseTimestampMillis = + partitionNameInvokerParameters?.partitionNameGeneratorConfig?.baseTimestampMillis; + const suffixExpression = + partitionNameInvokerParameters.partitionNameGeneratorConfig.namingSuffixExpression; + const suffix = [isFromCurrentTime ? '当前时间' : '指定时间']; + if (!isFromCurrentTime && !!baseTimestampMillis) { + suffix.push(getFormatDateTime(baseTimestampMillis)); + } + if (suffixExpression) { + suffix.push(`时间格式: ${suffixExpression}`); + } + return suffix.filter(Boolean).join(', '); + }; + + const getUnitLabel = (periodUnit) => { + return periodUnits?.find((item) => item.value === periodUnit)?.label; + }; + const handleClose = () => { onClose(); }; @@ -148,17 +184,8 @@ const ConfigDrawer: React.FC = (props) => { }, )} - 后缀: - {partitionNameInvokerParameters?.partitionNameGeneratorConfig?.fromCurrentTime - ? '当前时间' - : '指定时间'} - {partitionNameInvokerParameters?.partitionNameGeneratorConfig - ?.baseTimestampMillis && - getFormatDateTime( - partitionNameInvokerParameters?.partitionNameGeneratorConfig - ?.baseTimestampMillis, - )} - {partitionNameInvokerParameters.partitionNameGeneratorConfig.namingSuffixExpression} + 后缀: + {getNamingSuffix()}
) : ( @@ -171,35 +198,29 @@ const ConfigDrawer: React.FC = (props) => { ) )} - {dropKeyConfig && ( - <> - - {dropKeyConfig?.partitionKeyInvokerParameters?.keepLatestCount} - - - {dropKeyConfig?.partitionKeyInvokerParameters?.reloadIndexes - ? formatMessage({ - id: 'src.component.Task.component.PartitionPolicyTable.88E93248', - }) - : formatMessage({ - id: 'src.component.Task.component.PartitionPolicyTable.A5E08D34', - })} - - - )} + {dropKeyConfig && ( + + 保留最近 {dropKeyConfig?.partitionKeyInvokerParameters?.expirePeriod}个 + {getUnitLabel(dropKeyConfig?.partitionKeyInvokerParameters?.periodUnit)} + 的分区,不重建全局索引 +
+ ) : ( +
+ 保留最近{dropKeyConfig?.partitionKeyInvokerParameters?.keepLatestCount}个分区, + {dropKeyConfig?.partitionKeyInvokerParameters?.reloadIndexes ? '重建' : '不重建'} + 全局索引 +
+ ) + } + direction="column" + /> + )} ); }; diff --git a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx index fd24d1e5b..368f553c4 100644 --- a/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx +++ b/src/component/Task/component/PartitionPolicyTable/ConfigTable.tsx @@ -28,6 +28,9 @@ const columns = [ title: formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.8086D142' }), //'分区键' ellipsis: true, width: 100, + render: (partitionKey) => { + return partitionKey || '-'; + }, }, { dataIndex: 'partitionOption', @@ -47,7 +50,10 @@ const columns = [ ? formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.C9467B5B' }) : formatMessage({ id: 'src.component.Task.component.PartitionPolicyTable.F057FAAF' })} - {record?.partitionKeyInvoker === PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR ? ( + {[ + PARTITION_KEY_INVOKER.TIME_INCREASING_GENERATOR, + PARTITION_KEY_INVOKER.HISTORICAL_PARTITION_PLAN_CREATE_GENERATOR, + ].includes(record?.partitionKeyInvoker) ? ( {formatMessage({ diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index f8747b784..f7367a8cc 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -3175,6 +3175,8 @@ export enum PARTITION_KEY_INVOKER { CUSTOM_GENERATOR = 'CUSTOM_GENERATOR', TIME_INCREASING_GENERATOR = 'TIME_INCREASING_GENERATOR', KEEP_MOST_LATEST_GENERATOR = 'KEEP_MOST_LATEST_GENERATOR', + HISTORICAL_PARTITION_PLAN_DROP_GENERATOR = 'HISTORICAL_PARTITION_PLAN_DROP_GENERATOR', + HISTORICAL_PARTITION_PLAN_CREATE_GENERATOR = 'HISTORICAL_PARTITION_PLAN_CREATE_GENERATOR', } export enum TaskErrorStrategy { From f5c517ac5a98d30fa0633505c565f109838fc889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Wed, 13 Mar 2024 20:11:37 +0800 Subject: [PATCH 160/231] PullRequest: 370 Fixes oceanbase/odc#1884 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-odc-1884 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/370 Signed-off-by: 晓康 * Fixes oceanbase/odc#1884 --- src/component/Login/LoginForm.tsx | 9 +++---- src/component/Login/index.tsx | 5 +++- .../Task/component/DatabaseSelect/index.tsx | 2 +- src/page/Login/components/LDAPModal/index.tsx | 25 ++++++++++++++++--- src/page/Login/index.tsx | 3 ++- .../SessionSelect/SelectItem.tsx | 2 +- 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/component/Login/LoginForm.tsx b/src/component/Login/LoginForm.tsx index ed7b66a29..17d67d81b 100644 --- a/src/component/Login/LoginForm.tsx +++ b/src/component/Login/LoginForm.tsx @@ -43,6 +43,7 @@ export interface ILoginFormProps extends FormProps { showAuthCode?: boolean; showOtherLoginButton?: boolean; ssoLoginType?: ESSOLgoinType; + ssoLoginName?: string; authCodeImg?: string; otherLoginProps?: any; switchSSOLoginType?: () => void; @@ -56,6 +57,7 @@ const Login: React.FC = ({ showAuthCode, showOtherLoginButton, ssoLoginType, + ssoLoginName, authCodeImg, otherLoginProps, onAuthCodeImgChange, @@ -186,7 +188,6 @@ const Login: React.FC = ({
= ({ projectId, filters = null, width, - placeholder = null, + placeholder = '请选择', disabled = false, onChange, }) => { From a2ae866fa7b92ce490a5da4ec9f65d261af5929f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Thu, 14 Mar 2024 11:01:22 +0800 Subject: [PATCH 161/231] PullRequest: 371 feat: AsyncTask (add task retry) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-asyncTask-031401 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/371 Signed-off-by: 晓康 * feat: AsyncTask (add task retry) --- .../Task/AsyncTask/CreateModal/index.tsx | 17 +++++++++++++++++ .../Task/AsyncTask/DetailContent/index.tsx | 3 +++ src/d.ts/index.ts | 1 + 3 files changed, 21 insertions(+) diff --git a/src/component/Task/AsyncTask/CreateModal/index.tsx b/src/component/Task/AsyncTask/CreateModal/index.tsx index 69b445c89..4b7984f73 100644 --- a/src/component/Task/AsyncTask/CreateModal/index.tsx +++ b/src/component/Task/AsyncTask/CreateModal/index.tsx @@ -143,6 +143,7 @@ const CreateModal: React.FC = (props) => { rollbackSqlObjectNames, rollbackSqlContent, generateRollbackPlan, + retryTimes = 0, } = parameters ?? {}; let sqlContentType = null; let rollbackContentType = null; @@ -169,6 +170,7 @@ const CreateModal: React.FC = (props) => { errorStrategy, sqlFiles: undefined, rollbackSqlFiles: undefined, + retryTimes, }; if (isRollback) { formData.sqlContent = rollbackSqlContent; @@ -348,6 +350,7 @@ const CreateModal: React.FC = (props) => { description, queryLimit, delimiter, + retryTimes, } = values; const sqlFileIdAndNames = getFileIdAndNames(sqlFiles); const rollbackSqlFileIdAndNames = getFileIdAndNames(rollbackSqlFiles); @@ -366,6 +369,7 @@ const CreateModal: React.FC = (props) => { rollbackSqlObjectNames: rollbackSqlFileIdAndNames?.names, queryLimit, delimiter, + retryTimes, }; if (!checkFileSizeAmount(sqlFiles) || !checkFileSizeAmount(rollbackSqlFiles)) { return; @@ -521,6 +525,7 @@ const CreateModal: React.FC = (props) => { initialValues={{ executionStrategy: TaskExecStrategy.AUTO, databaseId: asyncTaskData?.databaseId, + retryTimes: 0, }} layout="vertical" requiredMark="optional" @@ -878,6 +883,18 @@ const CreateModal: React.FC = (props) => { })} /*任务设置*/ keepExpand > + + + = (props) => { > {ErrorStrategy[parameters?.errorStrategy]} + + {parameters?.retryTimes ?? 0} + Date: Thu, 14 Mar 2024 15:44:54 +0800 Subject: [PATCH 162/231] PullRequest: 372 fix: modify DatabaseSelect's default width MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-odc-databaseSelect of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/372 Signed-off-by: 晓康 * fix: modify DatabaseSelect's default width * fix: save const.ts --- .../SessionContextWrap/SessionSelect/SelectItem.tsx | 5 +++-- .../SessionSelect/SessionDropdown/index.tsx | 4 +++- .../components/SessionContextWrap/SessionSelect/const.ts | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 src/page/Workspace/components/SessionContextWrap/SessionSelect/const.ts diff --git a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx index 83e6082c8..09f0e4e05 100644 --- a/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx +++ b/src/page/Workspace/components/SessionContextWrap/SessionSelect/SelectItem.tsx @@ -10,6 +10,7 @@ import RiskLevelLabel from '@/component/RiskLevelLabel'; import { getDataSourceStyleByConnectType } from '@/common/datasource'; import { TaskType } from '@/d.ts'; import login from '@/store/login'; +import { DEFALT_WIDTH } from './const'; interface IProps { value?: number; @@ -56,7 +57,7 @@ const SelectItem: React.FC = ({ + - item.value <= INTERVAL_PRECISION_DAY_VALUE, )} diff --git a/src/page/Project/Database/AddDataBaseButton/index.tsx b/src/page/Project/Database/AddDataBaseButton/index.tsx index 93f9b51ae..dd89c7d31 100644 --- a/src/page/Project/Database/AddDataBaseButton/index.tsx +++ b/src/page/Project/Database/AddDataBaseButton/index.tsx @@ -90,7 +90,7 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { return ( <> - + - {builtIn ? null : ( + + + {builtIn || !hasPremissions ? null : ( diff --git a/src/page/Secure/Env/index.tsx b/src/page/Secure/Env/index.tsx index c4d041c7e..f04af8509 100644 --- a/src/page/Secure/Env/index.tsx +++ b/src/page/Secure/Env/index.tsx @@ -17,7 +17,7 @@ import { formatMessage } from '@/util/intl'; import { deleteEnvironment, listEnvironments } from '@/common/network/env'; import { getIntegrationList } from '@/common/network/manager'; -import { IManagerIntegration, IntegrationType } from '@/d.ts'; +import { IManagerIntegration, IManagerResourceType, IntegrationType, actionTypes } from '@/d.ts'; import { IEnvironment } from '@/d.ts/environment'; import { RuleType } from '@/d.ts/rule'; import { useLayoutEffect, useState } from 'react'; @@ -29,6 +29,7 @@ import styles from './index.less'; import Icon, { PlusOutlined } from '@ant-design/icons'; import { Modal, SelectProps, message } from 'antd'; import { FormEnvironmentModal } from './components/FormEnvironmentModal'; +import { Acess, createPermission } from '@/component/Acess'; // 从Environment数组中生成Sider中的Item数据 function genEnv(env: IEnvironment): { @@ -149,11 +150,16 @@ const Environment = () => {
{formatMessage({ id: 'src.page.Secure.Env.48529F6E' /*全部环境*/ }) /* 全部环境 */}
- + + +
} loading={loading} From 1b4148148886457231ae5143daab8ce0aac41302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=8F=E5=92=8C?= Date: Fri, 22 Mar 2024 09:46:24 +0800 Subject: [PATCH 177/231] PullRequest: 381 fix style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-bugs-xyh-032002 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/381 Signed-off-by: 晓康 * style: Crontab * style: PartitionTask (fix style) * chore: clear test log --- src/component/Crontab/index.less | 6 +++ src/component/Crontab/index.tsx | 16 ++---- .../EditTable/index.less | 14 +++-- .../RuleFormItem/index.tsx | 3 -- .../PartitionPolicyFormTable/configModal.tsx | 54 +++++++++++-------- .../PartitionPolicyFormTable/index.less | 10 ++++ 6 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/component/Crontab/index.less b/src/component/Crontab/index.less index 89c14327b..0d6fe49df 100644 --- a/src/component/Crontab/index.less +++ b/src/component/Crontab/index.less @@ -7,9 +7,15 @@ } .content { width: 100%; + display: grid; + grid-gap: 8px; &.default-mode { padding: 8px; background: var(--background-tertraiy-color); + grid-template-columns: 120px 210px 1fr; + &.daily { + grid-template-columns: 120px 1fr; + } } } .custom-editor { diff --git a/src/component/Crontab/index.tsx b/src/component/Crontab/index.tsx index 667947b10..ad51863db 100644 --- a/src/component/Crontab/index.tsx +++ b/src/component/Crontab/index.tsx @@ -191,11 +191,11 @@ const Crontab = (props, ref) => { />
- {mode === CrontabMode.custom ? ( <> @@ -215,19 +215,13 @@ const Crontab = (props, ref) => { ) : ( <> - {dateType === CrontabDateType.weekly && ( + - + name={['channelConfig', 'sign']} + requiredMark="optional" + > + +
+ {channelId && ( + + {hasChangeSign ? '取消修改' : '修改密钥'} + + )} + ) : null} {isWebhook ? ( diff --git a/src/page/Project/Notification/components/index.less b/src/page/Project/Notification/components/index.less index 4904e2046..920383e1f 100644 --- a/src/page/Project/Notification/components/index.less +++ b/src/page/Project/Notification/components/index.less @@ -38,4 +38,9 @@ .tip { color: var(--text-color-placeholder); } +.modifyBtn { + display: inline-block; + margin-bottom: 8px; + user-select: none; +} // #endregion From 1dea9cadfb7075d9b8128a7e7fafe7c5ec8fcd44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Fri, 22 Mar 2024 10:39:17 +0800 Subject: [PATCH 179/231] PullRequest: 383 feat: disabled some feature in SSOLogin on ver.4.2.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'feat/dev-4.2.4-hideSomeItemsInSSOLogin of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/383 Signed-off-by: 晓康 * feat: disabled some feature in SSOLogin on ver.4.2.4 --- .../NewSSODrawerButton/SSOForm/PartForm.tsx | 9 + .../SSO/NewSSODrawerButton/SSOForm/index.tsx | 336 ++++++++---------- 2 files changed, 166 insertions(+), 179 deletions(-) diff --git a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx index dffc57745..ac546de81 100644 --- a/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx +++ b/src/page/ExternalIntegration/SSO/NewSSODrawerButton/SSOForm/PartForm.tsx @@ -621,6 +621,15 @@ export const LDAPPartForm: React.FC<{ ]} /> + {/* */} + + ); +}; +const SomeFetureInODC430: React.FC<{ + tip: string; +}> = ({ tip }) => { + return ( + <> ; }>, ) { + const [form] = Form.useForm(); + const type = useWatch('type', form); + const userProfileViewType = useWatch(['mappingRule', 'userProfileViewType'], form); + const userNickNameField = useWatch(['mappingRule', 'userNickNameField'], form); const loginWindow = useRef(); + const channelStatusRef = useRef(false); const timer = useRef(); const [showExtraConfig, setShowExtraConfig] = useState(!!isEdit); @@ -86,7 +92,6 @@ export default inject('userStore')( _setTestInfo(v); onTestInfoChanged(v); } - const [form] = Form.useForm(); useImperativeHandle( ref, () => { @@ -257,8 +262,8 @@ export default inject('userStore')( ['ssoParameter', 'groupSearchBase'], ['ssoParameter', 'groupSearchFilter'], ['ssoParameter', 'groupSearchSubtree'], - ['ssoParameter', 'loginFailedLimit'], - ['ssoParameter', 'lockTimeSeconds'], + // ['ssoParameter', 'loginFailedLimit'], + // ['ssoParameter', 'lockTimeSeconds'], ['mappingRule', 'userProfileViewType'], ['mappingRule', 'nestedAttributeField'], ]) @@ -327,6 +332,21 @@ export default inject('userStore')( }, }); } + const getPartForm = (type: ISSOType) => { + if (type === ISSOType.OAUTH2) { + return ( + + ); + } else if (type === ISSOType.LDAP) { + return ; + } else { + return ; + } + }; const redirectUrl = `${window.ODCApiHost || location.origin}/login/oauth2/code/${ userStore?.organizationId }-test`; @@ -415,111 +435,82 @@ export default inject('userStore')( /> - {({ getFieldValue }) => { - const type = getFieldValue(['type']); - if (type === ISSOType.OAUTH2) { - return ( - - ); - } else if (type === ISSOType.LDAP) { - return ; - } else { - return ; - } - }} + {getPartForm(type)} - {({ getFieldValue }) => { - const type = getFieldValue(['type']); - return type !== ISSOType.LDAP ? ( - - + + ) : null} - {({ getFieldValue }) => { - const userProfileViewType = getFieldValue(['mappingRule', 'userProfileViewType']); - if (userProfileViewType === 'NESTED') { - return ( - - - - ); - } - }} + {userProfileViewType === 'NESTED' && ( + + + + )} - - {({ getFieldValue }) => { - const type = getFieldValue(['type']); - return ( - - - testByType(type)}> - { - formatMessage({ - id: 'odc.NewSSODrawerButton.SSOForm.TestConnection', - }) /*测试连接*/ - } - - - - ); - }} + + + testByType(type)}> + { + formatMessage({ + id: 'odc.NewSSODrawerButton.SSOForm.TestConnection', + }) /*测试连接*/ + } + + + {testInfo ? ( - {({ getFieldValue }) => { - const type = getFieldValue('type'); - if (type !== ISSOType.LDAP) { - return ( - - - - ); - } - }} + {type !== ISSOType.LDAP && ( + + + + )} - {({ getFieldValue }) => { - const userNickNameField = getFieldValue(['mappingRule', 'userNickNameField']); - return ( - - + - {({ getFieldValue }) => { - const type = getFieldValue(['type']); - return type === ISSOType.LDAP ? ( - - + + ) : null} {(fields, operation) => { From 0c76182e8c9a37b24ea973a7000aef1553a31e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9C=9D=E4=BF=8A?= Date: Fri, 22 Mar 2024 10:39:32 +0800 Subject: [PATCH 180/231] PullRequest: 384 Fixes oceanbase/odc#1976 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch fix/dev-4.2.4-odc-1967 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/384 Signed-off-by: 晓康 * Fixes oceanbase/odc#1976 * fix: wrap database's name when it disabled --- src/page/Project/Database/index.tsx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/page/Project/Database/index.tsx b/src/page/Project/Database/index.tsx index 06bc0c765..97681b189 100644 --- a/src/page/Project/Database/index.tsx +++ b/src/page/Project/Database/index.tsx @@ -110,7 +110,13 @@ const Database: React.FC = ({ id }) => { default: } }; - const statusMap = datasourceStatus.statusMap; + const renderDisabledDBWithTip = (name: React.ReactNode) => { + return ( + + {name} + + ); + }; return ( reload()} projectId={parseInt(id)} />} @@ -150,10 +156,18 @@ const Database: React.FC = ({ id }) => { fixed: 'left', ellipsis: true, render: (name, record) => { - const disabled = !record.authorizedPermissionTypes?.length; + const disabled = !record?.authorizedPermissionTypes?.length; if (!record.existed) { return disabled ? ( -
{name}
+ + {renderDisabledDBWithTip(name)} + ) : ( = ({ id }) => { ); } return disabled ? ( -
{name}
+ renderDisabledDBWithTip(name) ) : ( Date: Fri, 22 Mar 2024 11:50:03 +0800 Subject: [PATCH 181/231] PullRequest: 386 design change sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge branch 'fix/dev-4.2.4-bugs-xyh-032201 of git@code.alipay.com:oceanbase/oceanbase-developer-center.git into dev-4.2.4 https://code.alipay.com/oceanbase/oceanbase-developer-center/pull_requests/386 Signed-off-by: 晓康 * style: user manageModal (design change sync) * style: PartitionTask (design change sync) --- .../RuleFormItem/index.tsx | 21 +++--- src/component/helpDoc/doc.tsx | 6 ++ .../User/ManageModal/CreateAuth/index.tsx | 12 +--- .../User/ManageModal/TaskApplyList/index.tsx | 23 ++----- .../User/ManageModal/UserAuthList/index.tsx | 23 ++----- src/page/Project/User/ManageModal/index.less | 1 + src/page/Project/User/ManageModal/index.tsx | 64 +++++++------------ 7 files changed, 50 insertions(+), 100 deletions(-) diff --git a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx index 4e78e793b..32b494d64 100644 --- a/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx +++ b/src/component/Task/component/PartitionPolicyFormTable/RuleFormItem/index.tsx @@ -12,6 +12,7 @@ import { Typography, } from 'antd'; import { CloseCircleFilled } from '@ant-design/icons'; +import HelpDoc from '@/component/helpDoc'; import { intervalPrecisionOptions } from '../configModal'; import { START_DATE } from '../const'; import { PARTITION_KEY_INVOKER } from '@/d.ts'; @@ -146,27 +147,25 @@ const RuleFormItem: React.FC = (props) => { help={EmptyHelp} >
- { - formatMessage({ - id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9F9223B3' /*间隔*/, - }) /* 间隔 */ - } + + { + formatMessage({ + id: 'src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.9F9223B3' /*间隔*/, + }) /* 间隔 */ + } + ), + userManageTip: ( + <> +

工单授权:用户通过工单申请的权限

+

用户权限:项目管理员/DBA授予的权限

+ + ), }; diff --git a/src/page/Project/User/ManageModal/CreateAuth/index.tsx b/src/page/Project/User/ManageModal/CreateAuth/index.tsx index ce875b972..8d74b97c9 100644 --- a/src/page/Project/User/ManageModal/CreateAuth/index.tsx +++ b/src/page/Project/User/ManageModal/CreateAuth/index.tsx @@ -106,21 +106,13 @@ const CreateModal: React.FC = (props) => { }} type="primary" > - { - formatMessage({ - id: 'src.page.Project.User.ManageModal.CreateAuth.67243BDA' /*新增授权*/, - }) /* 新增授权 */ - } + 新增库授权 { setOpen(false); diff --git a/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx b/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx index 8f8d73ae1..c4b648e3b 100644 --- a/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx +++ b/src/page/ExternalIntegration/SSO/SSODetailDrawer/index.tsx @@ -147,7 +147,7 @@ export default function SSODetailDrawer({ visible, id, close }: IProps) { return ( close()} footer={ diff --git a/src/page/ExternalIntegration/index.tsx b/src/page/ExternalIntegration/index.tsx index 2f1d67d3c..7809ade96 100644 --- a/src/page/ExternalIntegration/index.tsx +++ b/src/page/ExternalIntegration/index.tsx @@ -46,7 +46,7 @@ const tabs = [ key: IPageType.ExternalIntegration_Sql, }, { - tab: '登录集成', + tab: formatMessage({ id: 'src.page.ExternalIntegration.B29CC4F4' }), //'登录集成' key: IPageType.ExternalIntegration_SSO, }, ]; diff --git a/src/page/Login/components/LDAPModal/index.tsx b/src/page/Login/components/LDAPModal/index.tsx index 59f817451..205fc4990 100644 --- a/src/page/Login/components/LDAPModal/index.tsx +++ b/src/page/Login/components/LDAPModal/index.tsx @@ -236,7 +236,10 @@ const LDAPLoginContent: React.FC<{ }} > {ssoLoginName - ? `${ssoLoginName} 登录` + ? formatMessage( + { id: 'src.page.Login.components.LDAPModal.7201A252' }, + { ssoLoginName: ssoLoginName }, + ) : formatMessage({ id: 'src.page.Login.components.LDAPModal.95DA8BD0' /*LDAP 登录*/ })}
diff --git a/src/page/Project/Database/AddDataBaseButton/index.tsx b/src/page/Project/Database/AddDataBaseButton/index.tsx index dd89c7d31..b19c7cfc8 100644 --- a/src/page/Project/Database/AddDataBaseButton/index.tsx +++ b/src/page/Project/Database/AddDataBaseButton/index.tsx @@ -90,7 +90,13 @@ export default function AddDataBaseButton({ projectId, onSuccess }: IProps) { return ( <> - + +
)} diff --git a/src/page/Project/Notification/components/interface.ts b/src/page/Project/Notification/components/interface.ts index d5ee7226c..41d48087e 100644 --- a/src/page/Project/Notification/components/interface.ts +++ b/src/page/Project/Notification/components/interface.ts @@ -20,27 +20,37 @@ export const EChannelTypeMap = { id: 'src.page.Project.Notification.components.F80DF1C7', }), //'飞书' [EChannelType.WE_COM]: formatMessage({ id: 'src.page.Project.Notification.components.A41C487F' }), //'企业微信' - [EChannelType.WEBHOOK]: '自定义', + [EChannelType.WEBHOOK]: formatMessage({ + id: 'src.page.Project.Notification.components.CDD8F083', + }), //'自定义' }; export const WebhookPlaceholderMap = { - [EChannelType.DING_TALK]: '请输入钉钉群机器人 Webhook 地址', - [EChannelType.FEI_SHU]: '请输入飞书群机器人 Webhook 地址', - [EChannelType.WE_COM]: '请输入企业微信群机器人 Webhook 地址', - [EChannelType.WEBHOOK]: '请输入 Webhook 地址', + [EChannelType.DING_TALK]: formatMessage({ + id: 'src.page.Project.Notification.components.D6700838', + }), //'请输入钉钉群机器人 Webhook 地址' + [EChannelType.FEI_SHU]: formatMessage({ + id: 'src.page.Project.Notification.components.0EB64694', + }), //'请输入飞书群机器人 Webhook 地址' + [EChannelType.WE_COM]: formatMessage({ id: 'src.page.Project.Notification.components.83F1E770' }), //'请输入企业微信群机器人 Webhook 地址' + [EChannelType.WEBHOOK]: formatMessage({ + id: 'src.page.Project.Notification.components.F33A3513', + }), //'请输入 Webhook 地址' }; export const ELanguageMap = { - [ELanguage.ZH_CN]: '简体中文', + [ELanguage.ZH_CN]: formatMessage({ id: 'src.page.Project.Notification.components.B1D41451' }), //'简体中文' [ELanguage.ZH_TW]: formatMessage({ id: 'src.page.Project.Notification.components.739AD573' }), //'繁体中文' [ELanguage.EN_US]: formatMessage({ id: 'src.page.Project.Notification.components.21BD64D9' }), //'英文' }; // @oic-line-ignore -const EContentTemplateMap_ZH_CN = - '### ODC ${taskType}-${taskStatus}\n- 任务ID: ${taskId}\n- 项目: ${projectName}\n- 数据库: ${databaseName}\n- 发起人: ${creatorName}\n- 触发时间: ${triggerTime}'; -// @oic-line-ignore -const EContentTemplateMap_ZH_TW = - '### ODC ${taskType}-${taskStatus}\n- 任務ID: ${taskId}\n- 項目: ${projectName}\n- 數據庫: ${databaseName}\n- 發起人: ${creatorName}\n- 觸發時間: ${triggerTime}'; -// @oic-line-ignore +const EContentTemplateMap_ZH_CN = formatMessage({ + id: 'src.page.Project.Notification.components.F562FBAA', +}); //'### ODC ${taskType}-${taskStatus}\n- 任务ID: ${taskId}\n- 项目: ${projectName}\n- 数据库: ${databaseName}\n- 发起人: ${creatorName}\n- 触发时间: ${triggerTime}' + +const EContentTemplateMap_ZH_TW = formatMessage({ + id: 'src.page.Project.Notification.components.ED742927', +}); //'### ODC ${taskType}-${taskStatus}\n- 任務ID: ${taskId}\n- 項目: ${projectName}\n- 數據庫: ${databaseName}\n- 發起人: ${creatorName}\n- 觸發時間: ${triggerTime}' + const EContentTemplateMap_EN_US = '### ODC ${taskType}-${taskStatus}\n- task ID: ${taskId}\n- project: ${projectName}\n- database: ${databaseName}\n- creator: ${creatorName}\n- trigger time: ${triggerTime}'; export const EContentTemplateMap = { diff --git a/src/page/Project/User/ManageModal/CreateAuth/index.tsx b/src/page/Project/User/ManageModal/CreateAuth/index.tsx index 8d74b97c9..8dd581883 100644 --- a/src/page/Project/User/ManageModal/CreateAuth/index.tsx +++ b/src/page/Project/User/ManageModal/CreateAuth/index.tsx @@ -106,13 +106,21 @@ const CreateModal: React.FC = (props) => { }} type="primary" > - 新增库授权 + { + formatMessage({ + id: 'src.page.Project.User.ManageModal.CreateAuth.ED0CF3A6' /*新增库授权*/, + }) /* 新增库授权 */ + }