diff --git a/src/common/network/sql/executeSQL.tsx b/src/common/network/sql/executeSQL.tsx index d41546040..0a37e9eda 100644 --- a/src/common/network/sql/executeSQL.tsx +++ b/src/common/network/sql/executeSQL.tsx @@ -232,7 +232,6 @@ export default async function executeSQL( return pre; }, []); const unauthorizedResource = taskInfo?.unauthorizedDBResources; - const violatedRules = rootViolatedRules?.concat(taskInfo?.sqls); if (unauthorizedResource?.length) { // 无权限库 return { diff --git a/src/component/CommonTable/index.tsx b/src/component/CommonTable/index.tsx index 5191eb916..cba69221f 100644 --- a/src/component/CommonTable/index.tsx +++ b/src/component/CommonTable/index.tsx @@ -73,7 +73,7 @@ interface IProps { operationContent?: IOperationContent; // 是否展示 操作连 筛选区&自定义操作区 分割标记 isSplit?: boolean; - // 行选择 相关配置 + // 行选择 相关配置 (初使用时容易与antd的rowSelection混淆重复导致bug) rowSelecter?: IRowSelecter; // 行选择状态回调 rowSelectedCallback?: (selectedRowKeys: any[]) => void; @@ -276,12 +276,11 @@ const CommonTable: ( } function handleRowKeyChange(selected: boolean, changeKeys: number[]) { - const keys = [...selectedRowKeys]; + let keys = [...selectedRowKeys]; if (selected) { keys.push(...changeKeys); } else { - const firstKeyIndex = keys.indexOf(changeKeys[0]); - keys.splice(firstKeyIndex, changeKeys.length); + keys = keys.filter((item) => !changeKeys.includes(item)); } setSelectedRowKeys(keys); } diff --git a/src/component/ExecuteSqlDetailModal/index.less b/src/component/ExecuteSqlDetailModal/index.less index 59d46b1a5..8d37496d0 100644 --- a/src/component/ExecuteSqlDetailModal/index.less +++ b/src/component/ExecuteSqlDetailModal/index.less @@ -49,7 +49,7 @@ white-space: nowrap; text-overflow: ellipsis; flex-shrink: 0; - max-width: 300px; + max-width: 640px; } .flexBetween { display: flex; diff --git a/src/component/ExecuteSqlDetailModal/index.tsx b/src/component/ExecuteSqlDetailModal/index.tsx index a1e51151c..ea79456f2 100644 --- a/src/component/ExecuteSqlDetailModal/index.tsx +++ b/src/component/ExecuteSqlDetailModal/index.tsx @@ -15,7 +15,7 @@ import { handleShowOutputFilter } from '@/page/Workspace/components/SQLExplain'; import { formatMessage } from '@/util/intl'; import { getFullLinkTraceDownloadUrl } from '@/common/network/sql'; import { downloadFile } from '@/util/utils'; -import TraceComp from '@/page/Workspace/components/Trace/TraceComp'; +import TraceComp from '@/page/Workspace/components/Trace/TraceComponent'; import { TraceTabsType } from '@/page/Workspace/components/Trace'; import { ProfileType, @@ -49,6 +49,8 @@ const ExecuteSQLDetailModal: React.FC = ({ modalStore }: IProps) => { const [pageLoading, setPageLoading] = useState(false); const [searchValue, setSearchValue] = useState(null); const finished = !!data?.graph?.status && data?.graph?.status === IProfileStatus.FINISHED; + const enableTrace = + finished && modalStore?.executeSqlDetailData?.session?.params?.fullLinkTraceEnabled; const getExecuteRadioOption = () => { return [ { @@ -71,7 +73,7 @@ const ExecuteSQLDetailModal: React.FC = ({ modalStore }: IProps) => { id: 'src.component.ExecuteSqlDetailModal.0B221F0A', defaultMessage: '全链路诊断', }), - disabled: !finished, + disabled: !enableTrace, }, ]; }; @@ -87,6 +89,9 @@ const ExecuteSQLDetailModal: React.FC = ({ modalStore }: IProps) => { ]; const getDisabledTooltip = (val) => { + if (modalStore?.executeSqlDetailData?.traceEmptyReason) { + return modalStore?.executeSqlDetailData?.traceEmptyReason; + } if (finished || !data?.graph?.status) { return val; } @@ -334,7 +339,7 @@ const ExecuteSQLDetailModal: React.FC = ({ modalStore }: IProps) => { id: 'src.component.ExecuteSqlDetailModal.A944EAD1', defaultMessage: '执行计划详情', }), - sql: modalStore?.executeSqlDetailData?.sql, + sql: modalStore?.executeSqlDetailData?.selectedSQL, session: modalStore?.executeSqlDetailData?.session, traceId: modalStore?.executeSqlDetailData?.traceId, getDetail: getPlanDetail, diff --git a/src/component/ProfileFlow/customComponents/DetailBox.tsx b/src/component/ProfileFlow/customComponents/DetailBox.tsx index 91d38c2a1..d8e4d476b 100644 --- a/src/component/ProfileFlow/customComponents/DetailBox.tsx +++ b/src/component/ProfileFlow/customComponents/DetailBox.tsx @@ -88,7 +88,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { function getProfileNodeDetail(data) { return ( -
+
{top5Render()} {topNodesList.length ? : null} @@ -152,7 +152,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { > {key} - + {formatTimeTemplate( BigNumber(value as any) .div(1000000) @@ -163,7 +163,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { ) : ( <> {key} - {value} + {value} )}
@@ -182,7 +182,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { return (
{key} - {value} + {value}
); })} @@ -287,7 +287,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { {subNodesSortMap[subNodeSortType.BY_DURATION].label} @@ -328,7 +328,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => {
[{i?.id}]
- + {' '} {formatTimeTemplate(BigNumber(i?.data?.duration).div(1000000).toNumber())}{' '} @@ -371,12 +371,14 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { > {key} - {formatTimeTemplate(BigNumber(value).div(1000000).toNumber())} + + {formatTimeTemplate(BigNumber(value).div(1000000).toNumber())}{' '} + ) : ( <> {key} - {value} + {value} )} @@ -395,7 +397,7 @@ export default ({ dataSource, topNodes, initialNodes, globalInfo }: Iprops) => { return (
{key} - {value} + {value}
); })} diff --git a/src/component/ProfileFlow/customComponents/Edge.tsx b/src/component/ProfileFlow/customComponents/Edge.tsx index f63245467..560fc013e 100644 --- a/src/component/ProfileFlow/customComponents/Edge.tsx +++ b/src/component/ProfileFlow/customComponents/Edge.tsx @@ -11,10 +11,10 @@ const CustomEdge = ({ id, sourceX, sourceY, targetX, targetY, style = {}, data } const edgeEndPointY = targetY - TURNNG_LINE_GAP; - // 根据tartget与source的x位置计算xOffset, 1.左边 2.右边 和 3.中间的区别 - const xOffset = sourceX - targetX > 4 ? -16 : sourceX - targetX < -4 ? 16 : 0; - // 根据tartget与source的x位置计算yOffset, 1.左边/右边 2.中间的区别 - let yOffset = Math.abs(sourceX - targetX) < 4 ? 25 : 10; + // 根据是否有一个以上子节点tartget与source的x位置计算xOffset + const xOffset = data?.isSingleChild ? 0 : sourceX - targetX > 4 ? -16 : 16; + // 根据tartget与source的x位置计算yOffset + let yOffset = data?.isSingleChild ? 25 : 10; // 有子节点的再单独计算 yOffset = data.isOverlap ? yOffset + 8 : yOffset; diff --git a/src/component/ProfileFlow/customComponents/Node.tsx b/src/component/ProfileFlow/customComponents/Node.tsx index 49591d617..212d60192 100644 --- a/src/component/ProfileFlow/customComponents/Node.tsx +++ b/src/component/ProfileFlow/customComponents/Node.tsx @@ -81,7 +81,7 @@ function TextUpdaterNode({ data, id, isConnectable }) { {data?.hasChild ? (
{ e.preventDefault(); e.stopPropagation(); diff --git a/src/component/ProfileFlow/customComponents/index.less b/src/component/ProfileFlow/customComponents/index.less index 89b95bfb6..3f2e0fab6 100644 --- a/src/component/ProfileFlow/customComponents/index.less +++ b/src/component/ProfileFlow/customComponents/index.less @@ -3,13 +3,16 @@ .customDetailBox { position: absolute; right: 16px; - width: 332px; + width: 336px; background-color: var(--profile-secondry-background-color); border: 1px solid var(--profile-border-color); border-left: none; height: calc(100% - 151px); overflow-y: auto; padding: 12px 8px; + .value { + color: var(--profile-text-color); + } .customDetailBoxItem { display: flex; justify-content: space-between; @@ -133,7 +136,9 @@ } .icon { position: absolute; - left: 129px; + left: 50%; + top: 100%; + transform: translateX(-50%); padding: 4px; color: var(--profile-icon-color); } diff --git a/src/component/ProfileFlow/index.less b/src/component/ProfileFlow/index.less index 94fea7805..60587664c 100644 --- a/src/component/ProfileFlow/index.less +++ b/src/component/ProfileFlow/index.less @@ -4,7 +4,7 @@ overflow-x: auto; background-color: var(--profile-primary-background-color); border: 1px solid var(--profile-border-color); - width: calc(100% - 332px); + width: calc(100% - 336px); :global { .react-flow__attribution { display: none; diff --git a/src/component/ProfileFlow/utils.ts b/src/component/ProfileFlow/utils.ts index 17a9f9568..334ec325f 100644 --- a/src/component/ProfileFlow/utils.ts +++ b/src/component/ProfileFlow/utils.ts @@ -224,6 +224,7 @@ export function transformDataForReactFlow( data: { weight: node?.data.inEdges?.[0]?.weight, isOverlap: isParantOverlap, + isSingleChild: node?.parent?.data?.outEdges?.length === 1, }, }; edges.push(reactFlowEdge); diff --git a/src/component/SelectTransfer/index.tsx b/src/component/SelectTransfer/index.tsx index 6aaf5d535..b08ab2b8f 100644 --- a/src/component/SelectTransfer/index.tsx +++ b/src/component/SelectTransfer/index.tsx @@ -117,8 +117,13 @@ export default function SelectTransfer(props: IProps) { checkable selectable={false} checkedKeys={checkedKeys} - onCheck={(v) => { - setCheckedKeys([...(checkedKeys || []), ...(v as string[])]); + onCheck={(v, e) => { + const { checked, checkedNodes, node, event, halfCheckedKeys } = e; + if (checked === false) { + setCheckedKeys([...checkedKeys.filter((i) => i !== node?.key)]); + } else { + setCheckedKeys([...(checkedKeys || []), ...(v as string[])]); + } }} height={274} treeData={sourceDisplayTreeData} diff --git a/src/component/Task/AlterDdlTask/DetailContent/index.tsx b/src/component/Task/AlterDdlTask/DetailContent/index.tsx index 33ebb6275..bad4ccc9e 100644 --- a/src/component/Task/AlterDdlTask/DetailContent/index.tsx +++ b/src/component/Task/AlterDdlTask/DetailContent/index.tsx @@ -227,7 +227,7 @@ export function getItems( defaultMessage: '所属数据源', }), //'所属数据源' - task?.database.dataSource?.name || '-', + task?.database?.dataSource?.name || '-', ], hasFlow ? riskItem : null, diff --git a/src/component/Task/ApplyTablePermission/CreateModal/index.tsx b/src/component/Task/ApplyTablePermission/CreateModal/index.tsx index bb11d2e73..a5fa3ba1a 100644 --- a/src/component/Task/ApplyTablePermission/CreateModal/index.tsx +++ b/src/component/Task/ApplyTablePermission/CreateModal/index.tsx @@ -198,7 +198,7 @@ const CreateModal: React.FC = (props) => { const projectId = Form.useWatch('projectId', form); const disabledDate = (current) => { - return current && current < moment().endOf('day'); + return current && current < moment().subtract(1, 'days').endOf('day'); }; useEffect(() => { diff --git a/src/component/Task/DataArchiveTask/CreateModal/ArchiveRange.tsx b/src/component/Task/DataArchiveTask/CreateModal/ArchiveRange.tsx index d9a783efb..c903e3320 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/ArchiveRange.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/ArchiveRange.tsx @@ -31,19 +31,19 @@ import type { FormInstance } from 'antd/lib/form'; interface IProps { tables: ITable[]; enabledTargetTable?: boolean; - form?: FormInstance; + checkPartition?: boolean; } const ArchiveRange: React.FC = (props) => { - const { tables, enabledTargetTable = false, form } = props; - const [enablePartition, setEnablePartition] = useState(false); + const { tables, enabledTargetTable = false, checkPartition } = props; + const [enablePartition, setEnablePartition] = useState(checkPartition); const tablesOptions = tables?.map((item) => ({ label: item.tableName, value: item.tableName, })); useEffect(() => { - setEnablePartition(!!form?.getFieldsValue()?.tables?.find((i) => i?.partitions)); - }, [form?.getFieldsValue()?.tables]); + setEnablePartition(checkPartition); + }, [checkPartition]); return ( <> diff --git a/src/component/Task/DataArchiveTask/CreateModal/index.tsx b/src/component/Task/DataArchiveTask/CreateModal/index.tsx index b22d5c53c..1e22b731c 100644 --- a/src/component/Task/DataArchiveTask/CreateModal/index.tsx +++ b/src/component/Task/DataArchiveTask/CreateModal/index.tsx @@ -164,6 +164,7 @@ const CreateModal: React.FC = (props) => { const [confirmLoading, setConfirmLoading] = useState(false); const [crontab, setCrontab] = useState(null); const [tables, setTables] = useState(); + const [enablePartition, setEnablePartition] = useState(false); const [form] = Form.useForm(); const databaseId = Form.useWatch('databaseId', form); const { session: sourceDBSession, database: sourceDB } = useDBSession(databaseId); @@ -198,7 +199,7 @@ const CreateModal: React.FC = (props) => { timeoutMillis, syncTableStructure, } = jobParameters; - + setEnablePartition(isEdit && !!tables?.find((i) => i?.partitions)); const formData = { databaseId: sourceDatabaseId, targetDataBaseId: targetDataBaseId, @@ -572,7 +573,7 @@ const CreateModal: React.FC = (props) => { /> - + diff --git a/src/component/Task/DataClearTask/CreateModal/ArchiveRange.tsx b/src/component/Task/DataClearTask/CreateModal/ArchiveRange.tsx index 9add3b05d..fbe04d822 100644 --- a/src/component/Task/DataClearTask/CreateModal/ArchiveRange.tsx +++ b/src/component/Task/DataClearTask/CreateModal/ArchiveRange.tsx @@ -32,11 +32,11 @@ const { Text, Link } = Typography; interface IProps { tables: ITable[]; needCheckBeforeDelete?: boolean; - form?: FormInstance; + checkPartition?: boolean; } const ArchiveRange: React.FC = (props) => { - const { tables, needCheckBeforeDelete = false, form } = props; - const [enablePartition, setEnablePartition] = useState(false); + const { tables, needCheckBeforeDelete = false, checkPartition } = props; + const [enablePartition, setEnablePartition] = useState(checkPartition); const tablesOptions = tables?.map((item) => ({ label: item.tableName, value: item.tableName, @@ -45,8 +45,8 @@ const ArchiveRange: React.FC = (props) => { const hasAdvancedOptionCol = enablePartition || needCheckBeforeDelete; useEffect(() => { - setEnablePartition(!!form?.getFieldsValue()?.tables?.find((i) => i?.partitions)); - }, [form?.getFieldsValue()?.tables]); + setEnablePartition(checkPartition); + }, [checkPartition]); return ( <> diff --git a/src/component/Task/DataClearTask/CreateModal/index.tsx b/src/component/Task/DataClearTask/CreateModal/index.tsx index ab3008b8b..9bd9efbe0 100644 --- a/src/component/Task/DataClearTask/CreateModal/index.tsx +++ b/src/component/Task/DataClearTask/CreateModal/index.tsx @@ -126,6 +126,7 @@ const CreateModal: React.FC = (props) => { const [confirmLoading, setConfirmLoading] = useState(false); const [crontab, setCrontab] = useState(null); const [tables, setTables] = useState(); + const [enablePartition, setEnablePartition] = useState(false); const [form] = Form.useForm(); const databaseId = Form.useWatch('databaseId', form); const { session, database } = useDBSession(databaseId); @@ -159,6 +160,7 @@ const CreateModal: React.FC = (props) => { targetDatabaseId, timeoutMillis, } = jobParameters; + setEnablePartition(isEdit && !!tables?.find((i) => i?.partitions)); const formData = { databaseId, rowLimit: rateLimit?.rowLimit, @@ -553,7 +555,7 @@ const CreateModal: React.FC = (props) => { ); }} diff --git a/src/component/Task/MutipleAsyncTask/CreateModal/DatabaseQueue.tsx b/src/component/Task/MutipleAsyncTask/CreateModal/DatabaseQueue.tsx index 03a817cb8..f8695bd9c 100644 --- a/src/component/Task/MutipleAsyncTask/CreateModal/DatabaseQueue.tsx +++ b/src/component/Task/MutipleAsyncTask/CreateModal/DatabaseQueue.tsx @@ -15,6 +15,21 @@ import { SelectTemplate, CreateTemplate } from '../components/Template'; import datasourceStatus from '@/store/datasourceStatus'; import styles from './index.less'; +export const checkDbExpiredByDataSourceStatus = (status: IConnectionStatus) => { + switch (status) { + case IConnectionStatus.ACTIVE: { + return false; + } + case IConnectionStatus.TESTING: + case IConnectionStatus.NOPASSWORD: + case IConnectionStatus.DISABLED: + case IConnectionStatus.INACTIVE: + default: { + return true; + } + } +}; + export const DatabaseQueueSelect: React.FC<{ rootName: (number | string)[]; multipleDatabaseChangeOpen: boolean; @@ -43,20 +58,6 @@ export const DatabaseQueueSelect: React.FC<{ true, true, ); - const checkDbExpiredByDataSourceStatus = (status: IConnectionStatus) => { - switch (status) { - case IConnectionStatus.ACTIVE: { - return false; - } - case IConnectionStatus.TESTING: - case IConnectionStatus.NOPASSWORD: - case IConnectionStatus.DISABLED: - case IConnectionStatus.INACTIVE: - default: { - return true; - } - } - }; setDatabaseOptions( databaseList?.contents?.map((item) => { const statusInfo = datasourceStatus.statusMap.get(item?.dataSource?.id); @@ -148,7 +149,7 @@ export const DatabaseQueueSelect: React.FC<{ innerAdd(undefined)} /> { @@ -169,7 +170,10 @@ export const DatabaseQueueSelect: React.FC<{ { diff --git a/src/component/Task/MutipleAsyncTask/CreateModal/InnerSelecter.tsx b/src/component/Task/MutipleAsyncTask/CreateModal/InnerSelecter.tsx index f3d3dbf19..2e7691f18 100644 --- a/src/component/Task/MutipleAsyncTask/CreateModal/InnerSelecter.tsx +++ b/src/component/Task/MutipleAsyncTask/CreateModal/InnerSelecter.tsx @@ -124,7 +124,7 @@ const InnerSelect: React.FC<{ />
{item?.label}
-
+
{item?.dataSource?.name}
@@ -211,7 +211,7 @@ const InnerSelect: React.FC<{ [styles.optionDisabled]: disabled, })} style={{ - backgroundColor: isCurrentItem ? '#e6f4ff' : null, + backgroundColor: isCurrentItem ? 'val(--hover-color)' : null, }} > @@ -227,15 +227,21 @@ const InnerSelect: React.FC<{
{item?.label}
-
+
{item?.dataSource?.name}
diff --git a/src/component/Task/MutipleAsyncTask/CreateModal/ProjectSelect.tsx b/src/component/Task/MutipleAsyncTask/CreateModal/ProjectSelect.tsx index d941f783a..8a5d95735 100644 --- a/src/component/Task/MutipleAsyncTask/CreateModal/ProjectSelect.tsx +++ b/src/component/Task/MutipleAsyncTask/CreateModal/ProjectSelect.tsx @@ -12,6 +12,16 @@ const ProjectSelect: React.FC<{ }[]; }> = ({ projectOptions }) => { const form = Form.useFormInstance(); + + const callback = async () => { + await form.setFields([ + { + name: ['parameters', 'orderedDatabaseIds'], + value: [[undefined]], + errors: [], + }, + ]); + }; return ( (option?.label ?? '').toLowerCase().includes(input.toLowerCase()) } diff --git a/src/component/Task/MutipleAsyncTask/CreateModal/index.less b/src/component/Task/MutipleAsyncTask/CreateModal/index.less index 8d66a39ea..46b109d4e 100644 --- a/src/component/Task/MutipleAsyncTask/CreateModal/index.less +++ b/src/component/Task/MutipleAsyncTask/CreateModal/index.less @@ -159,11 +159,11 @@ .optionDisabled { cursor: not-allowed; - background-color: rgb(237, 237, 237); + background-color: var(--hover-color); &:hover { cursor: not-allowed; - background-color: rgb(237, 237, 237); + background-color: var(--hover-color); } } } diff --git a/src/component/Task/MutipleAsyncTask/components/Template/EditTemplate.tsx b/src/component/Task/MutipleAsyncTask/components/Template/EditTemplate.tsx index 3ab20eb9c..4d6af89b8 100644 --- a/src/component/Task/MutipleAsyncTask/components/Template/EditTemplate.tsx +++ b/src/component/Task/MutipleAsyncTask/components/Template/EditTemplate.tsx @@ -6,7 +6,7 @@ import { detailTemplate, editTemplate, } from '@/common/network/databaseChange'; -import { DBObjectSyncStatus, DatabasePermissionType, IDatabase } from '@/d.ts/database'; +import { DatabasePermissionType, IDatabase } from '@/d.ts/database'; import login from '@/store/login'; import { DownOutlined, PlusOutlined, UpOutlined, DeleteOutlined } from '@ant-design/icons'; import { useRequest } from 'ahooks'; @@ -17,6 +17,8 @@ import { HTML5Backend } from 'react-dnd-html5-backend'; import { flatArray } from '../../CreateModal/helper'; import InnerSelecter, { DatabaseOption } from '../../CreateModal/InnerSelecter'; import styles from './index.less'; +import datasourceStatus from '@/store/datasourceStatus'; +import { checkDbExpiredByDataSourceStatus } from '../../CreateModal/DatabaseQueue'; const EditTemplate: React.FC<{ open: boolean; @@ -48,16 +50,20 @@ const EditTemplate: React.FC<{ true, true, ); + setDatabaseOptions( - databaseList?.contents?.map((item) => ({ - label: item?.name, - value: item?.id, - environment: item?.environment, - dataSource: item?.dataSource, - existed: item?.existed, - unauthorized: !item?.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE), - expired: item?.objectSyncStatus === DBObjectSyncStatus.FAILED, - })), + databaseList?.contents?.map((item) => { + const statusInfo = datasourceStatus.statusMap.get(item?.dataSource?.id); + return { + label: item?.name, + value: item?.id, + environment: item?.environment, + dataSource: item?.dataSource, + existed: item?.existed, + unauthorized: !item?.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE), + expired: checkDbExpiredByDataSourceStatus(statusInfo?.status), + }; + }), ); }; const initTemplate = async (templateId: number) => { @@ -295,7 +301,7 @@ const EditTemplate: React.FC<{ innerAdd(undefined)} /> { @@ -317,7 +323,9 @@ const EditTemplate: React.FC<{ { diff --git a/src/component/Task/MutipleAsyncTask/components/Template/index.less b/src/component/Task/MutipleAsyncTask/components/Template/index.less index 503b614fb..f5f0b52c4 100644 --- a/src/component/Task/MutipleAsyncTask/components/Template/index.less +++ b/src/component/Task/MutipleAsyncTask/components/Template/index.less @@ -139,11 +139,11 @@ } } .disabled { - color: var(--mask-color); + color: var(--text-color-hint); &:hover { cursor: not-allowed; - color: var(--mask-color) !important; + color: var(--text-color-hint) !important; } } diff --git a/src/component/Task/component/ActionBar/index.tsx b/src/component/Task/component/ActionBar/index.tsx index 12c1532e6..11c39ead0 100644 --- a/src/component/Task/component/ActionBar/index.tsx +++ b/src/component/Task/component/ActionBar/index.tsx @@ -241,15 +241,26 @@ const ActionBar: React.FC = inject( const editCycleTask = async () => { props?.onClose?.(); - if (task?.type === TaskType.DATA_ARCHIVE) { - props.modalStore.changeDataArchiveModal(true, { - id: task?.id, - type: 'EDIT', - }); - } else { - props.modalStore.changeCreateSQLPlanTaskModal(true, { - id: task?.id, - }); + switch (task?.type) { + case TaskType.DATA_ARCHIVE: { + props.modalStore.changeDataArchiveModal(true, { + id: task?.id, + type: 'EDIT', + }); + break; + } + case TaskType.DATA_DELETE: { + props.modalStore.changeDataClearModal(true, { + id: task?.id, + type: 'EDIT', + }); + break; + } + default: { + props.modalStore.changeCreateSQLPlanTaskModal(true, { + id: task?.id, + }); + } } }; @@ -960,7 +971,7 @@ const ActionBar: React.FC = inject( tools = [viewBtn]; } // 仅 sql 计划 & 数据归档支持编辑 - if (![TaskType.SQL_PLAN, TaskType.DATA_ARCHIVE].includes(task?.type)) { + if (![TaskType.SQL_PLAN, TaskType.DATA_ARCHIVE, TaskType.DATA_DELETE].includes(task?.type)) { tools = tools.filter((item) => item.key !== 'edit'); } return tools; diff --git a/src/component/Task/component/TableSelecter/index.less b/src/component/Task/component/TableSelecter/index.less index 9be617fae..11d687dd0 100644 --- a/src/component/Task/component/TableSelecter/index.less +++ b/src/component/Task/component/TableSelecter/index.less @@ -66,8 +66,21 @@ .allTree, .selectedTree { :global { - .ant-tree-indent-unit { - width: 32px; + .ant-tree-treenode { + overflow: hidden; + } + } +} + +.env { + position: absolute; + top: 0px; + right: 8px; + bottom: 0px; + align-items: center; + :global { + .ant-badge-status-dot { + border-radius: 0px; } } } diff --git a/src/component/Task/component/TableSelecter/index.tsx b/src/component/Task/component/TableSelecter/index.tsx index b785b0f42..28405a5fa 100644 --- a/src/component/Task/component/TableSelecter/index.tsx +++ b/src/component/Task/component/TableSelecter/index.tsx @@ -23,7 +23,7 @@ import { IDatabase } from '@/d.ts/database'; import { TablePermissionType } from '@/d.ts/table'; import { ReactComponent as TableSvg } from '@/svgr/menuTable.svg'; import Icon, { DeleteOutlined } from '@ant-design/icons'; -import { Checkbox, Empty, Popconfirm, Space, Spin, Tree, Typography } from 'antd'; +import { Badge, Empty, Popconfirm, Space, Spin, Tree, Typography } from 'antd'; import { DataNode, EventDataNode, TreeProps } from 'antd/lib/tree'; import classnames from 'classnames'; import React, { @@ -36,6 +36,7 @@ import React, { } from 'react'; import { isNumber } from 'lodash'; import styles from './index.less'; +import { EnvColorMap } from '@/constant'; export type TableItem = { databaseId: number; tableName: string; tableId?: number }; @@ -133,14 +134,27 @@ export const flatTableByGroupedParams = ( }); return result; }; + +function envRender(environment) { + if (!environment) { + return null; + } + return ( + + ); +} + /** * 将原始的IDataBaseWithTable数据转成TreeData格式 * @param validTableList * @returns */ -const getTreeData = (validTableList: IDataBaseWithTable[]) => { +const getTreeData = (validTableList: IDataBaseWithTable[], isSourceTree = false) => { const allTreeData = validTableList?.map((database) => { - const { id, name, tableList, dataSource, hasGetTableList } = database; + const { id, name, tableList, dataSource, hasGetTableList, environment } = database; const children = tableList.map((tableItem) => ({ title: ( @@ -165,8 +179,9 @@ const getTreeData = (validTableList: IDataBaseWithTable[]) => { {dataSource?.name} - {hasGetTableList ? `(${tableList.length})` : ''} + {hasGetTableList && isSourceTree ? `(${tableList.length})` : ''} + {isSourceTree ? envRender(environment) : null} ), @@ -176,6 +191,7 @@ const getTreeData = (validTableList: IDataBaseWithTable[]) => { disabled: hasGetTableList && tableList.length === 0, expandable: true, children, + isLeaf: false, }; }); return allTreeData; @@ -229,12 +245,12 @@ const TableSelecter: React.ForwardRefRenderFunction = */ const allTreeData = useMemo(() => { if (!sourceSearchValue?.length) { - return getTreeData(databaseWithTableList); + return getTreeData(databaseWithTableList, true); } const filtedDataSource = []; for (const datasource of databaseWithTableList) { let { tableList, name } = datasource; - if (name.includes(sourceSearchValue)) { + if (name?.toLowerCase().includes(sourceSearchValue?.toLowerCase())) { filtedDataSource.push(datasource); } else { const targetTableList = tableList.filter((item) => item?.name?.includes(sourceSearchValue)); @@ -246,46 +262,48 @@ const TableSelecter: React.ForwardRefRenderFunction = } } } - return getTreeData(filtedDataSource); + return getTreeData(filtedDataSource, true); }, [sourceSearchValue, databaseWithTableList]); /** * 已选择的所有库表(按搜索条件过滤) */ const selectedTreeData = useMemo(() => { - const filtedDataSource = []; - for (const datasource of databaseWithTableList) { - let { tableList, id: databaseId, name: tableName } = datasource; - const checkedTableNames = tableList.filter((item) => - checkedKeys?.includes( - generateKeyByDataBaseIdAndTableName({ - databaseId, - tableName: item.name, - tableId: item.id, - }), - ), - ); - if (!checkedKeys.includes(String(databaseId)) && checkedTableNames.length < 1) { - continue; - } - if (tableName.includes(targetSearchValue) || !targetSearchValue) { - filtedDataSource.push({ - ...datasource, - tableList: checkedTableNames, - }); - } else { - const searchedTableList = checkedTableNames.filter((item) => - item?.name.includes(targetSearchValue), + try { + const filtedDataSource = []; + for (const datasource of databaseWithTableList) { + let { tableList, id: databaseId, name: tableName } = datasource; + const checkedTableNames = tableList.filter((item) => + checkedKeys?.includes( + generateKeyByDataBaseIdAndTableName({ + databaseId, + tableName: item.name, + tableId: item.id, + }), + ), ); - if (searchedTableList.length > 0) { + if (!checkedKeys.includes(String(databaseId)) && checkedTableNames.length < 1) { + continue; + } + if (tableName.includes(targetSearchValue) || !targetSearchValue) { filtedDataSource.push({ ...datasource, - tableList: searchedTableList, + tableList: checkedTableNames, }); + } else { + const searchedTableList = checkedTableNames.filter((item) => + item?.name.includes(targetSearchValue), + ); + if (searchedTableList.length > 0) { + filtedDataSource.push({ + ...datasource, + tableList: searchedTableList, + }); + } } } - } - return getTreeData(filtedDataSource); + return getTreeData(filtedDataSource); + } catch (err) {} }, [databaseWithTableList, checkedKeys, targetSearchValue]); /** * 点击删除已选中的选项 @@ -458,21 +476,12 @@ const TableSelecter: React.ForwardRefRenderFunction = - - {formatMessage({ id: 'src.component.Task.component.TableSelecter.E836E630', defaultMessage: '选择表', })} - - ({selectedTreeDataCount}/{allTreeDataCount}) - } onSearch={setSourceSearchValue} diff --git a/src/component/Toolbar/index.tsx b/src/component/Toolbar/index.tsx index ff78ac556..76f374e0a 100644 --- a/src/component/Toolbar/index.tsx +++ b/src/component/Toolbar/index.tsx @@ -153,7 +153,12 @@ function TButton({ if (tip) { return ( - + {content} diff --git a/src/d.ts/index.ts b/src/d.ts/index.ts index bfc2847ab..f27534a7f 100644 --- a/src/d.ts/index.ts +++ b/src/d.ts/index.ts @@ -1652,6 +1652,7 @@ export interface ISqlExecuteResult { type: string; }[]; withFullLinkTrace: boolean; + withQueryProfile: boolean; traceEmptyReason?: string; } export interface ISqlExecuteResultTimer { diff --git a/src/locales/must/strings/en-US.json b/src/locales/must/strings/en-US.json index c9cc81135..144fd6fa1 100644 --- a/src/locales/must/strings/en-US.json +++ b/src/locales/must/strings/en-US.json @@ -2565,7 +2565,6 @@ "odc.AlterDdlTask.CreateModal.TaskErrorHandling": "Task Error Handling Method", "odc.DataClearTask.DetailContent.TaskType": "Task Type", "odc.ResourceTree.Nodes.table.Partition": "Partition", - "odc.Project.User.Edit": "Edit", "odc.SSO.SSODetailDrawer.Close": "Close", "odc.component.SelectTransfer.CountItemSelected": "{count} Selected", "odc.Workspace.ActivityBar.type.Database": "Database", @@ -3492,7 +3491,7 @@ "odc.src.page.Auth.Autoauth.component.FormModal.ProjectRole": "Project Role", "odc.src.component.Task.AsyncTask.DetailContent.ExecutionTime": "Execution time", "odc.src.component.Task.ResultSetExportTask.DetailContent.EmptyStringTurnsToEmpty": "Empty string to null value", - "odc.src.component.Task.ResultSetExportTask.DetailContent.Type": "Ticket Type", + "odc.src.component.Task.ResultSetExportTask.DetailContent.Type": "Task Type", "odc.src.component.Task.ResultSetExportTask.CreateModal.NewlyBuilt": "New", "odc.src.component.Task.DataArchiveTask.CreateModal.TaskSetting": "Task Settings", "odc.src.component.Task.DataArchiveTask.DetailContent.InsertionStrategy": "Insert Policy", @@ -4220,7 +4219,6 @@ "src.page.Secure.Env.components.EECB6084": "Cancel", "src.page.Workspace.components.SQLResultSet.5008F988": "Database Name", "src.page.Project.User.ManageModal.UserAuthList.AD0486C8": "Please enter", - "src.page.Workspace.components.SQLResultSet.0B7D4FBE": "Apply", "src.component.ODCSetting.config.F785B55E": "Fetch Result Set Column Information", "src.page.Project.User.ManageModal.CreateAuth.779234F2": "Cancel", "src.component.Task.StructureComparisonTask.CreateModal.FBBFFC4C": "The description cannot exceed 200 characters in length.", @@ -4348,11 +4346,9 @@ "src.component.Task.PartitionTask.CreateModal.05B817DF": "Please enter the timeout value.", "src.component.Task.PartitionTask.CreateModal.6C651A64": "Please select the error handling method for the task.", "src.component.Task.ApplyPermission.CreateModal.B35D50C9": "Able to manage sensitive columns in the project in addition to the privileges of a participant", - "src.page.Project.User.ManageModal.1DCD8093": "Ticket Application", "src.page.Project.User.ManageModal.2DDCB471": "Change", "src.page.Project.User.ManageModal.B7377F46": "Once revoked, the operation cannot be undone.", "src.page.Project.User.ManageModal.Status.F7C8A70D": "Active", - "src.component.SQLConfig.C03B2372": "Enable End-to-end Trace Diagnostics", "src.page.Secure.Record.RecordPage.C96CBA29": "Apply for Database Permissions", "src.page.Secure.Record.RecordPage.FE7177CE": "Add Database Permission", "src.page.Secure.Record.RecordPage.BBF6BE0C": "Revoke Database Permission", @@ -4367,7 +4363,6 @@ "src.page.Secure.Env.components.60756A4B": "The environment has been disabled.", "src.component.helpDoc.4961AEB2": "You can reference and modify the SQL check and SQL window specifications from an existing environment", "src.component.Task.ApplyPermission.CreateModal.211C9AC8": "Able to manage sensitive columns, and add or remove databases in addition to the privileges of a developer", - "src.page.Project.User.ManageModal.211FFE62": "Manage Database Permissions", "src.page.Project.User.ManageModal.TaskApplyList.B805DCE9": "Expired On", "src.page.Project.User.ManageModal.Status.F648282E": "Expired", "src.component.SQLConfig.2F1AC452": "Continue Execution on Error", @@ -4378,7 +4373,6 @@ "src.component.Task.PartitionTask.CreateModal.BE341FCE": "Customize Deletion Strategy Execution Period", "src.component.Task.PartitionTask.CreateModal.0A49F493": "Hours", "src.page.Secure.Env.48529F6E": "All Environments", - "src.page.Workspace.components.SQLResultSet.52CCC188": "Missing permissions for the following databases. Please apply for the permissions first.", "src.page.Project.User.ManageModal.TaskApplyList.75F749A1": "Revoke", "src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.19909602": "Reset Time for Login Attempts", "src.component.Task.PartitionTask.CreateModal.E454F701": "Ignore Error and Continue", @@ -4427,7 +4421,6 @@ "src.page.Secure.Env.65EAAB75": "Are you sure you want to delete this environment?", "src.page.Secure.Env.components.351C7EB6": "Please select the referenced environment.", "src.page.Secure.Env.components.A4A3A31E": "Disable", - "src.component.helpDoc.5373CF9E": "Permission to create tickets for database changes (including import, mock data, database change, shadow table synchronization, SQL plans, partitioning plans, data archiving, and data cleaning), and permission to execute change statements (SQL window's ability to execute changes is constrained by security specifications)", "src.page.Datasource.Datasource.NewDatasourceDrawer.Form.Account.C21B3C92": "Role", "src.component.Task.component.ActionBar.F20AAC3F": "The file download link has expired. Please initiate a new ticket.", "src.component.Task.PartitionTask.DetailContent.477F07A5": "Execution Timeout", @@ -4483,7 +4476,6 @@ "src.component.Crontab.D7390DC8": " Execution Schedule", "src.component.Task.component.PartitionPolicyTable.274DB973": "Enabled", "src.component.Task.component.PartitionPolicyTable.AB027BA5": "Enabled", - "src.page.Project.User.26C36450": "Manage Database Permissions", "src.component.Task.DataMockerTask.CreateModal.2C3DF5A5": "Create Mock Data Ticket", "src.component.Task.component.PartitionPolicyTable.15852854": "Partitioned Table", "src.page.Secure.Env.components.63B256F5": "The description cannot exceed 200 characters.", @@ -4755,7 +4747,6 @@ "src.component.Task.component.CommonDetailModal.D9ACA50C": "Processing Condition", "src.component.Task.DataClearTask.DetailContent.D4D1227C": "Specify Task Duration", "src.page.Datasource.Info.D30F985C": "Administrator", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.03B6F86A": "Search Databases", "src.page.Workspace.components.SQLResultSet.CB2CF731": "Result Details", "src.page.Project.Database.components.DatabaseOwnerSelect.tsx.2882064F": "No Admin", "src.component.Task.MutipleAsyncTask.DetailContent.439EBA2B": "Execution Timeout", @@ -4770,21 +4761,17 @@ "src.component.Button.Reload.CC20653B": "Refresh", "src.component.Task.component.CommonDetailModal.403574A6": "Ended At", "src.component.Task.component.SynchronizationItem.ABA6445B": "Sync Scope", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.69106FDA": "All Databases", "src.page.Workspace.SideBar.ResourceTree.TreeNodeMenu.config.1599957C": "Last Sync: ", "src.page.Project.Database.components.DatabaseOwnerSelect.tsx.34B8A74A": "The database administrator is responsible for the database and tables and can be referenced during the approval workflow.", "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.E2C1F722": "Request Permission", "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.D45537CC": " results displayed", "src.page.Workspace.SideBar.ResourceTree.TreeNodeMenu.config.A32BC9F9": "Syncing metadata, please wait...", "src.constant.8D87AF25": "Columns", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.D7B63CB7": "Open SQL Window", "src.page.Workspace.SideBar.ResourceTree.TreeNodeMenu.config.8485C0D3": "Sync Metadata", "src.component.Task.component.SynchronizationItem.3B43C19D": "Synchronize Source and Target Table Schemas", "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.EF45DCA4": "Search Tables, Columns, Views, etc.", "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.35B21489": "Columns", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.9F4C3737": "All Databases", "src.page.Workspace.components.SQLResultSet.4F0CD429": "Database", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.0D1BC60D": "View More", "src.component.Task.component.TaskdurationItem.7B7A6912": "If the task exceeds the specified duration, it will pause and wait for the next schedule.", "src.component.Task.component.CommonDetailModal.99A2CD95": "Table Name", "src.page.Project.Database.ChangeOwnerModal.2EFFDBF5": "Assign Database Admin", @@ -4903,5 +4890,185 @@ "src.component.Task.MutipleAsyncTask.components.Template.6BC97AE1": "Failed to update the template", "src.component.Task.MutipleAsyncTask.components.Template.869B1F0B": "OK", "src.component.Task.MutipleAsyncTask.CreateModal.51536A7D": "At least 2 databases are required.", - "src.constant.0C73ED6E": "Create Batch Database Change Task" + "src.constant.0C73ED6E": "Create Batch Database Change Task", + "src.component.ProfileFlow.customComponents.3057F753": "Zoom In", + "src.page.Project.User.ManageModal.Table.CreateAuth.9C0612BE": "Permission Expiration Policy", + "src.component.Task.ApplyTablePermission.CreateModal.BC4488C7": "Never Expires", + "src.component.Task.ApplyTablePermission.CreateModal.7DDD3557": "Table Permission Application", + "src.page.Workspace.components.SQLResultSet.44FA6D77": "Apply for Table Permissions", + "src.constant.77379A9D": "Reject Table Permission Application", + "src.constant.6AF8D624": "Stop Table Permission Application", + "src.component.Task.ApplyTablePermission.CreateModal.AB5C56FA": "Create", + "src.page.Project.User.ManageModal.Table.CreateAuth.E589EDA6": "Please select", + "src.page.Project.User.ManageModal.Table.UserAuthList.012DC13E": "Table", + "src.component.Task.ApplyTablePermission.CreateModal.82C8FE0E": "Query", + "src.page.Project.User.ManageModal.Table.Status.F4074114": "Expired", + "src.component.Task.ApplyTablePermission.DetailContent.FB4B30E0": "Permission Expiration Policy", + "src.page.Project.User.ManageModal.Table.2E8F3BF1": "Operation successful", + "src.constant.6F5D437C": "Apply for Table Permissions", + "src.page.Workspace.components.SQLResultSet.455E73CE": "Unable to apply for table permissions: Not a member of the database's project.", + "src.component.ProfileFlow.customComponents.66C75D66": "Top 5 in Duration", + "src.component.Task.ApplyTablePermission.DetailContent.2740E99B": "Created By", + "src.page.Project.User.ManageModal.Table.070B09D0": "Update", + "src.component.ExecuteSqlDetailModal.FB8B6D0B": "List View", + "src.component.SQLConfig.1A5CCA98": "SQL Execution", + "src.component.Task.AlterDdlTask.DetailContent.FE4166B2": "Row Limit", + "src.page.Project.User.ManageModal.Table.CreateAuth.5FD0D70D": "Permission Type", + "src.component.ProfileFlow.customComponents.B32C7D03": "Fit Width", + "src.constant.16E15B2D": "Table Permission Management", + "src.page.Project.User.ManageModal.Table.TaskApplyList.8BA76A12": "This permission will be revoked if it is expired for more than three months", + "src.page.Project.User.ManageModal.81C0C3D0": "Table Permission", + "src.page.Workspace.components.SQLResultSet.DDB9284D": "Missing corresponding permissions for the following database tables. Please apply for permissions first.", + "src.constant.7CFF0BF7": "Create Table Permission Application", + "src.component.Task.ApplyTablePermission.CreateModal.DC9A3E27": "Please select", + "src.component.Task.component.TableSelecter.9995622C": "{selectedTreeDataCount} Selected", + "src.page.Project.User.3AE67EC2": "Manage Permission", + "src.page.Project.User.ManageModal.Table.TaskApplyList.8F13E12E": "Table", + "src.constant.E15D0656": "Add Table Permission Management", + "src.component.ProfileFlow.customComponents.2AB1AD68": "Node Execution Overview", + "src.component.Task.ApplyTablePermission.CreateModal.77D8F632": "Please select a project.", + "src.component.Task.ApplyTablePermission.CreateModal.A206D2B4": "Please select", + "src.component.Task.component.TableSelecter.E836E630": "Select Table", + "src.page.Project.User.ManageModal.Table.UserAuthList.A02EBD96": "Expired On", + "src.component.ProfileFlow.customComponents.7812E9AE": "{nodeName} Total", + "src.component.ExecuteSqlDetailModal.68BF8995": "Copy", + "src.component.Task.ApplyTablePermission.CreateModal.BC9BE9CE": "Please select", + "src.page.Project.User.ManageModal.Table.C5AD844C": "Cancel", + "src.page.Project.User.ManageModal.Table.CreateAuth.705DD31B": "Please select", + "src.component.Task.ApplyTablePermission.DetailContent.6C1A740A": "Apply for Table Permissions", + "src.component.Task.ApplyTablePermission.CreateModal.11B637AA": "Are you sure you want to cancel applying for table permissions?", + "src.component.Task.ApplyTablePermission.CreateModal.3BCFDC84": "Permission Type", + "src.page.Project.User.ManageModal.Table.CreateAuth.F34065CE": "Please select", + "src.page.Workspace.components.SQLExplain.E0965DAC": "Actual Rows", + "src.component.Task.ApplyTablePermission.CreateModal.472B1735": "Permission Expiration Policy", + "src.page.Workspace.components.SQLResultSet.9BDFC99E": "Current Trace ID: ", + "src.component.Task.D7396534": "Table Permission Application", + "src.constant.A016D539": "Apply for Table Permissions", + "src.component.ExecuteSqlDetailModal.A944EAD1": "Execution Plan Details", + "src.component.ExecuteSqlDetailModal.D47F3410": "End-to-end Trace Diagnostics", + "src.component.ExecuteSqlDetailModal.0B221F0A": "End-to-end Trace Diagnostics", + "src.component.Task.ApplyTablePermission.DetailContent.04825B86": "Data Source", + "src.component.Task.ApplyTablePermission.DetailContent.64239A78": "Permission Type", + "src.page.Project.User.ManageModal.Table.Status.3F56D2D7": "Expiring Soon", + "src.page.Project.User.ManageModal.A4F73E8C": "Manage Permission", + "src.page.Project.User.ManageModal.Table.TaskApplyList.C0ABE640": "Please enter", + "src.page.Project.User.ManageModal.Table.UserAuthList.A644DA9A": "Please enter", + "src.component.ExecuteSqlDetailModal.5B8FA08A": "Execution Profile for Trace ID \"{modalStoreExecuteSqlDetailDataTraceId}\"", + "src.component.ExecuteSqlDetailModal.D6886430": "The current SQL statement is being executed. You can view it after the execution is complete.", + "src.page.Project.User.ManageModal.Table.CED524BB": "Ticket Application", + "src.component.ProfileFlow.customComponents.5FAB7852": "SQL Execution Overview", + "src.page.Workspace.components.SQLResultSet.3BA312DB": "Unable to apply for table permissions: The database to which the table belongs is not assigned to any project.", + "src.component.ProfileFlow.customComponents.0E9A817E": "I/O Statistics", + "src.page.Project.User.ManageModal.Table.UserAuthList.12F7A572": "Permission Type", + "src.page.Project.User.ManageModal.Table.TaskApplyList.F38F822F": "Please enter", + "src.page.Project.User.ManageModal.Table.7E23C899": "Once revoked, the operation cannot be undone.", + "src.page.Project.User.ManageModal.Table.CreateAuth.6D949D9E": "End Date", + "src.constant.EB58961E": "Approve Table Permission Application", + "src.component.ProfileFlow.customComponents.89BEEE9E": "Actual Size", + "src.page.Project.User.ManageModal.Table.CreateAuth.680C9CFF": "Create Authorization", + "src.page.Project.User.ManageModal.Table.TaskApplyList.3B1CD3B1": "Please enter", + "src.page.Workspace.components.SQLResultSet.73CA790E": "Table", + "src.component.ProfileFlow.C4791007": "Sort by Memory Usage", + "src.component.helpDoc.2207D608": "Permission to create tickets for database changes (including import, mock data, database change, shadow table synchronization, SQL plans, partitioning plans, data archiving, and data cleaning), and permission to execute change statements in the SQL window (SQL window's ability to execute changes is constrained by security specifications)", + "src.constant.7DC84DC5": "Revoke Table Permission Management", + "src.constant.B59F26E3": "Table Permission Management", + "src.page.Project.User.ManageModal.Table.UserAuthList.26E39901": "Please enter", + "src.component.Task.ApplyTablePermission.CreateModal.705AE4C3": "Never Expires", + "src.component.Task.ApplyTablePermission.CreateModal.0D449988": "Ticket created successfully", + "src.page.Project.User.ManageModal.Table.TaskApplyList.88257A65": "Please enter", + "src.page.Project.User.ManageModal.Table.TaskApplyList.9CDE663F": "Revoke", + "src.component.Task.ApplyTablePermission.CreateModal.E26609A0": "Export", + "src.component.Task.ApplyTablePermission.DetailContent.9E007486": "Database", + "src.component.ProfileFlow.C966E64A": "Sort by DB Duration", + "src.page.Project.User.ManageModal.Table.92D4CD12": "User Authorization", + "src.page.Project.User.ManageModal.Table.CreateAuth.0635BFD4": "Database", + "src.page.Project.User.ManageModal.Table.CreateAuth.9F6C8075": "Cancel", + "src.page.Workspace.components.DDLResultSet.0B7666A0": "Total Duration: {DBCostTime}", + "src.page.Workspace.components.DDLResultSet.22F863D6": "Execution Profile", + "src.component.Task.ApplyTablePermission.CreateModal.8B90F708": "Please enter the reason for the application", + "src.component.ExecuteSqlDetailModal.052B3894": "Text View", + "src.component.ExecuteSqlDetailModal.14585364": "Plan Statistics", + "src.component.ExecuteSqlDetailModal.69A79B8E": "Execution Details", + "src.component.ProfileFlow.6B28FD92": "Sort by Rows Returned", + "src.component.Task.ApplyTablePermission.CreateModal.55D2BC4D": "Please select", + "src.component.Task.ApplyTablePermission.CreateModal.72AFD173": "Please select", + "src.component.Task.component.TaskTable.3236150E": "Table Permission Application", + "src.component.ODCSetting.CFC0C3E8": "Shortcut key conflict, please try again.", + "src.page.Project.User.ManageModal.Table.UserAuthList.E7BFBCC8": "Please enter", + "src.page.Project.User.ManageModal.Table.TaskApplyList.AEDC316B": "Batch Revoke", + "src.component.ExecuteSqlDetailModal.BF467954": "Execution Plan", + "src.component.Task.component.TableSelecter.A56A8B2D": "Are you sure you want to clear the selected objects?", + "src.page.Project.User.ManageModal.Table.TaskApplyList.9C75241F": "Permission Type", + "src.page.Project.User.ManageModal.Table.E297BA02": "OK", + "src.page.Project.User.ManageModal.Table.TaskApplyList.EC52BFBC": "Expired On", + "src.page.Project.User.ManageModal.Table.UserAuthList.DE0222B0": "Batch Revoke", + "src.page.Workspace.components.SQLResultSet.4035B347": "View Execution Profile", + "src.component.ExecuteSqlDetailModal.97782AAE": "Text View", + "src.component.ExecuteSqlDetailModal.D11F8620": "Plan Statistics", + "src.component.helpDoc.618FF120": "Permission to create tickets for database changes (including import, mock data, database change, shadow table synchronization, SQL plans, partitioning plans, data archiving, and data cleaning), and permission to execute change statements in the SQL window (SQL window's ability to execute changes is constrained by security specifications)", + "src.component.Task.ApplyTablePermission.CreateModal.D6E6AE6E": "1 Year", + "src.page.Project.User.ManageModal.946C38DA": "Database Permission", + "src.page.Project.User.ManageModal.Table.CreateAuth.1D45C292": "Please select", + "src.component.ExecuteSqlDetailModal.8A207B02": "Execution Plan", + "src.component.Task.ApplyTablePermission.CreateModal.78B63403": "Please select", + "src.component.Task.ApplyTablePermission.CreateModal.95EB40E7": "Cancel", + "src.page.Workspace.components.DDLResultSet.E32AB474": "SQL Execution Profile", + "src.page.Workspace.components.SQLResultSet.D3F95049": "Terminate", + "src.component.Task.ApplyTablePermission.CreateModal.06672C99": "End Date", + "src.component.Task.ApplyTablePermission.CreateModal.DEF52B23": "join a project", + "src.page.Project.User.ManageModal.Table.UserAuthList.804D4C5D": "Revoke", + "src.page.Project.User.ManageModal.Table.A3D05C57": "Query", + "src.page.Project.User.ManageModal.Table.UserAuthList.41C6A809": "Data Source", + "src.component.Task.AlterDdlTask.DetailContent.45E8ACBB": "Data Size Limit", + "src.component.Task.ApplyTablePermission.CreateModal.76C327CA": "6 Months", + "src.component.ProfileFlow.customComponents.C22AD2CB": "{dataName} Total", + "src.component.Task.ApplyTablePermission.CreateModal.DFADB0AB": "30 Days", + "src.page.Project.User.ManageModal.Table.CreateAuth.994F4BA8": "Are you sure you want to cancel creating the authorization?", + "src.page.Project.User.ManageModal.Table.TaskApplyList.BC1F3BBD": "Actions", + "src.component.ExecuteSqlDetailModal.2129C7A3": "List View", + "src.page.Project.User.ManageModal.Table.UserAuthList.673AB3C0": "This permission will be revoked if it is expired for more than three months", + "src.component.helpDoc.5D9071C2": "Permission to execute queries within the SQL window", + "src.component.ExecuteSqlDetailModal.0DAD5E44": "Tree View", + "src.component.ProfileFlow.customComponents.E406DF5A": "I/O Statistics", + "src.component.Task.ApplyTablePermission.CreateModal.524AEC5C": "Project", + "src.component.Task.ApplyTablePermission.DetailContent.658E0B9E": "Table", + "src.component.Task.ApplyTablePermission.DetailContent.8CEA0610": "Ticket No.", + "src.component.helpDoc.A0958282": "Permission to create import and export result set tickets", + "src.page.Project.User.ManageModal.Database.1007E283": "Ticket Application", + "src.page.Project.User.ManageModal.Table.D53578CD": "Export", + "src.component.Task.ApplyTablePermission.CreateModal.B2D5729B": "Reason for Application", + "src.component.Task.ApplyTablePermission.CreateModal.D802CFB3": "Update", + "src.component.Task.ApplyTablePermission.CreateModal.F357A49C": "7 Days", + "src.component.Task.ApplyTablePermission.DetailContent.55EE2A17": "Reason for Application", + "src.page.Project.User.D1A92D2A": "Edit Role", + "src.component.ProfileFlow.customComponents.F4F9EB2A": "Data Volume: ", + "src.component.Task.ApplyTablePermission.DetailContent.3FE43B61": "Table", + "src.page.Project.User.ManageModal.Table.TaskApplyList.E80C6744": "Data Source", + "src.component.ExecuteSqlDetailModal.38BDF819": "Execution Details", + "src.component.Task.ApplyTablePermission.CreateModal.319F7B70": "The reason for the application cannot exceed 200 characters.", + "src.page.Workspace.components.SQLExplain.F472322D": "Estimated Cost", + "src.component.Task.ApplyTablePermission.DetailContent.7EEDDF7A": "Created At", + "src.page.Project.User.ManageModal.Table.CreateAuth.B6C313E1": "Authorization created successfully", + "src.component.Task.ApplyTablePermission.DetailContent.32776504": "Project", + "src.component.ProfileFlow.customComponents.12BFFE42": "Zoom Out", + "src.component.Task.ApplyTablePermission.CreateModal.F4D36D95": "Custom", + "src.component.Task.ApplyTablePermission.DetailContent.4B4A4E81": "Task Type", + "src.component.ExecuteSqlDetailModal.3AAA9DF9": "Trace View", + "src.component.Task.ApplyTablePermission.CreateModal.A004AEF5": "3 Years", + "src.component.Task.ApplyTablePermission.CreateModal.A92A0F62": "Please enter the reason for the application", + "src.page.Project.User.ManageModal.Table.UserAuthList.40DFC3A2": "Status", + "src.component.ProfileFlow.customComponents.422173C9": "Node Attribute", + "src.component.Task.ApplyTablePermission.CreateModal.8A62AFC4": "Table", + "src.page.Project.User.ManageModal.Table.TaskApplyList.D8B38717": "Status", + "src.component.ExecuteSqlDetailModal.D1E28701": "List View", + "src.component.Task.ApplyTablePermission.CreateModal.E06F8910": "90 Days", + "src.page.Project.User.ManageModal.Table.CreateAuth.69B76107": "Add Table Authorization", + "src.page.Workspace.components.SQLResultSet.6CF6ACD1": "Apply for Database Permissions", + "src.page.Project.User.ManageModal.Table.TaskApplyList.C0E75C97": "Ticket No.", + "src.component.Task.component.TableSelecter.C6AF0504": "Clear", + "src.page.Project.User.ManageModal.Table.CreateAuth.35C819CB": "Create", + "src.page.Project.User.ManageModal.Table.Status.FBAD95E6": "Active", + "src.page.Project.User.ManageModal.Table.UserAuthList.D245E1FF": "Actions", + "src.page.Workspace.components.SQLExplain.E0AB0E4C": "Actual Cost", + "src.component.Task.ApplyTablePermission.CreateModal.8955ACFE": "No projects available, please first " } diff --git a/src/locales/must/strings/zh-CN.json b/src/locales/must/strings/zh-CN.json index 069d84d02..307e3dc24 100644 --- a/src/locales/must/strings/zh-CN.json +++ b/src/locales/must/strings/zh-CN.json @@ -2472,7 +2472,6 @@ "odc.PermissionApplication.CreateModal.Custom": "自定义", "odc.SensitiveColumn.components.ScanForm.ScanningTheScanningTimeMay": "正在扫描中。扫描时间可能较长请耐心等待…", "odc.DataClearTask.DetailContent.TaskType": "任务类型", - "odc.Project.User.Edit": "编辑", "odc.component.SelectTransfer.CountItemSelected": "已选 {count} 项", "odc.Project.Project.AllProjects": "全部项目", "odc.ExternalIntegration.SSO.Name": "名称", @@ -3872,7 +3871,6 @@ "src.component.Task.ApplyDatabasePermission.CreateModal.B0247EF7": "请输入原因描述", "src.page.Project.User.ManageModal.B7377F46": "回收后不可撤回", "src.component.Task.StructureComparisonTask.CreateModal.A8C717F6": "取消", - "src.page.Project.User.ManageModal.1DCD8093": "工单授权", "src.component.helpDoc.AEEC5916": "关于注意事项第 3 条,由您指定将要锁定的账号,是为了保障表名切换期间数据一致性的同时尽可能降低对业务的影响。请您确保指定账号的准确性,若您未指定任何账号,ODC 将不会进行任何账号锁定及 Kill Session 操作,切换期间数据的一致性将需要由您来保障。", "src.component.Task.ApplyDatabasePermission.DetailContent.2C812515": "创建人", "src.component.EditorToolBar.actions.3BDAC881": "运行当前语句 ", @@ -3904,7 +3902,6 @@ "src.page.Project.User.ManageModal.CreateAuth.8BBA1BE1": "确认取消新增授权吗?", "src.component.ODCSetting.AB9A3FA4": "保存", "src.component.Task.component.PartitionPolicyFormTable.D97787FE": "表达式", - "src.page.Workspace.components.SQLResultSet.52CCC188": "缺少以下数据库对应权限,请先申请库权限", "src.page.Project.Notification.components.3380A1F2": "工单事件", "src.component.ODCSetting.654799D1": "已恢复到默认配置", "src.page.Project.Notification.components.B65E55FA": "删除", @@ -4141,7 +4138,6 @@ "src.page.Secure.Env.components.B264828F": "描述", "src.page.Secure.Env.components.B98439D0": "请选择标签样式", "src.page.Project.Notification.components.56685F5A": "消息内容", - "src.component.SQLConfig.C03B2372": "开启全链路诊断", "src.component.Task.ApplyDatabasePermission.CreateModal.8890FE39": "查询", "src.page.Workspace.components.SQLResultSet.D12A3FE9": "日志", "src.component.ODCSetting.config.BE020520": "关闭", @@ -4153,10 +4149,8 @@ "src.component.Task.StructureComparisonTask.CreateModal.45DB3909": "新建结构比对", "src.component.Task.PartitionTask.CreateModal.E454F701": "忽略错误继续任务", "src.component.Task.StructureComparisonTask.CreateModal.67E284BD": "描述不超过 200 个字符", - "src.page.Project.User.ManageModal.211FFE62": "管理库权限", "src.page.Project.Notification.components.A50DD7D6": "测试消息发送成功!", "src.component.Task.9B79BD20": "自动执行", - "src.page.Project.User.26C36450": "管理库权限", "src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.2E3212A5": "搜索群组查询时使用的起始点或基准点", "src.component.Task.PartitionTask.DetailContent.5FC1C8E8": "创建策略执行周期", "src.component.Task.ApplyDatabasePermission.CreateModal.1D6E4447": "新建", @@ -4349,7 +4343,6 @@ "src.component.Task.ApplyPermission.CreateModal.ED069A06": "允许查看项目基本信息,并自助申请库权限和提交工单", "src.component.Task.StructureComparisonTask.DetailContent.734F1D69": "进行查看", "src.page.Project.Notification.components.7C80562E": "请选择通道类型", - "src.component.helpDoc.5373CF9E": "新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL 计划、分区计划、数据归档和数据清理)的权限和执行变更语句的权限(SQL 窗口可否执行变更受安全规范配置约束)", "src.page.Project.Notification.components.76BA6F01": "通道名称", "src.component.Task.component.PartitionPolicyFormTable.E5DA1FA4": "请输入表达式", "src.component.Task.StructureComparisonTask.DetailContent.9DFA1E59": "删除表、索引、字段等风险变更 SQL 已修改为注释,如需执行,需手动修改 SQL", @@ -4464,7 +4457,6 @@ "src.page.Project.User.ManageModal.UserAuthList.AD0486C8": "请输入", "src.page.Project.User.ManageModal.CreateAuth.52A18A2F": "结束日期", "src.page.Project.User.ManageModal.28BC85BF": "用户授权", - "src.page.Workspace.components.SQLResultSet.0B7D4FBE": "申请", "src.page.Project.User.ManageModal.2DDCB471": "变更", "src.page.Project.Notification.components.099A08A2": "推送消息模版", "src.component.helpDoc.843310FE": "允许查看项目基本信息,并自助申请库权限和提交工单", @@ -4649,7 +4641,6 @@ "src.component.Task.component.PartitionTextArea.51B4FB10": "请输入分区名称,多个分区间用英文逗号隔开", "src.component.Task.MutipleAsyncTask.DetailContent.5FA1154F": "查询结果限制", "src.component.Task.DataClearTask.CreateModal.76AAE59E": "指定分区", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.0D1BC60D": "查看更多", "src.component.Task.DataArchiveTask.CreateModal.94BCB0E1": "目标表", "src.component.Task.MutipleAsyncTask.DetailContent.B6FF5C81": "所属项目", "src.component.Task.MutipleAsyncTask.DetailContent.9E276D6A": "执行方式", @@ -4705,7 +4696,6 @@ "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.ED30EF41": "全部", "src.component.Task.MutipleAsyncTask.CreateModal.2A98246D": "请输入", "src.component.Task.MutipleAsyncTask.DetailContent.B29F6A70": "忽略错误继续执行", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.D7B63CB7": "打开 SQL 窗口", "src.component.Task.MutipleAsyncTask.DetailContent.A6BC0EA9": "数据库详情", "src.component.Task.MutipleAsyncTask.DetailContent.7A621BB2": "风险等级", "src.component.Task.MutipleAsyncTask.CreateModal.3FBE491C": "取消", @@ -4715,7 +4705,6 @@ "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.E2C1F722": "申请表权限", "src.component.Task.DataClearTask.CreateModal.7E1F34E7": "目标表", "src.component.Task.MutipleAsyncTask.CreateModal.C3F2CC4E": "请选择SQL 执行处理", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.03B6F86A": "搜索数据库", "src.d.ts.90979FA9": "唯一性约束", "src.component.Task.MutipleAsyncTask.DetailContent.10038C15": "SQL 内容", "src.component.Task.MutipleAsyncTask.CreateModal.B13CF0A4": "确认", @@ -4723,7 +4712,6 @@ "src.component.Task.component.CommonDetailModal.99A2CD95": "表名", "src.component.Task.MutipleAsyncTask.CreateModal.DA9F492E": "可针对 Update、Delete 语句自动生成回滚方案,并以附件形式提供下载,该方案仅供参考", "src.component.Task.component.SynchronizationItem.3B43C19D": "开启目标表结构同步", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.69106FDA": "全部数据库", "src.component.Task.MutipleAsyncTask.CreateModal.533E6CE4": "点击或将多个文件拖拽到这里上传", "src.component.Task.MutipleAsyncTask.CreateModal.450BFD6C": "小时", "src.d.ts.071AA07B": "索引", @@ -4772,7 +4760,6 @@ "src.component.Task.MutipleAsyncTask.CreateModal.FF497D5B": "请输入分隔符", "src.page.Project.Database.components.DatabaseOwnerSelect.tsx.2882064F": "不设置管理员", "src.page.Project.Database.ChangeOwnerModal.22191CF9": "修改数据库管理员成功", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.9F4C3737": "全部数据库", "src.component.Task.MutipleAsyncTask.DetailContent.69E1BA99": "查看详情", "src.component.Task.MutipleAsyncTask.CreateModal.50FF5C74": "选择库并设置执行顺序;不同节点将依次执行变更,同一节点内的库将同时变更", "src.component.Task.MutipleAsyncTask.CreateModal.A8CB0B6F": "手动执行", @@ -4905,192 +4892,184 @@ "src.component.Task.MutipleAsyncTask.components.Template.8C08DC21": "所属项目", "src.component.Task.MutipleAsyncTask.components.Template.F76B71CA": "模版保存失败", "src.component.Task.MutipleAsyncTask.components.Template.7F26EEEC": "编辑模版", - "src.page.Workspace.components.SQLResultSet.A9F2E27A": "共有", - "src.page.Workspace.components.SQLResultSet.097EAD0C": "个 SQL 执行,当前正在执行第", - "src.page.Workspace.components.SQLResultSet.0B5B598B": "个", - "src.page.Workspace.components.SQLResultSet.9BDFC99E": "当前 Trace ID:", - "src.page.Workspace.components.SQLResultSet.4035B347": "查看执行画像", - "src.page.Workspace.components.SQLResultSet.D3F95049": "终 止", - "src.page.Workspace.components.SQLResultSet.73CA790E": "表", - "src.page.Workspace.components.SQLResultSet.455E73CE": "无法申请表权限:没有加入数据库所属项目", - "src.page.Workspace.components.SQLResultSet.3BA312DB": "无法申请表权限:表所属数据库没有归属项目", - "src.page.Workspace.components.SQLResultSet.6CF6ACD1": "申请库权限", + "src.component.Task.ApplyTablePermission.CreateModal.A92A0F62": "请输入原因描述", + "src.component.ExecuteSqlDetailModal.8A207B02": "执行计划", + "src.page.Project.User.ManageModal.Table.CreateAuth.69B76107": "新增表授权", + "src.component.Task.ApplyTablePermission.CreateModal.B2D5729B": "申请原因", + "src.component.ExecuteSqlDetailModal.3AAA9DF9": "Trace 视图", + "src.page.Project.User.ManageModal.Table.CreateAuth.35C819CB": "新建", + "src.constant.EB58961E": "同意申请表权限", + "src.component.Task.ApplyTablePermission.CreateModal.D802CFB3": "变更", + "src.component.Task.ApplyTablePermission.CreateModal.A004AEF5": "3 年", + "src.page.Project.User.D1A92D2A": "编辑角色", "src.page.Workspace.components.SQLResultSet.44FA6D77": "申请表权限", - "src.page.Workspace.components.SQLResultSet.DDB9284D": "缺少以下数据库表对应权限,请先申请权限", - "src.page.Workspace.components.SQLExplain.F472322D": "预估代价", - "src.page.Workspace.components.SQLExplain.E0965DAC": "实际行", + "src.component.ExecuteSqlDetailModal.0B221F0A": "全链路诊断", + "src.component.ProfileFlow.customComponents.12BFFE42": "缩小", + "src.page.Project.User.ManageModal.Table.UserAuthList.D245E1FF": "操作", + "src.component.ExecuteSqlDetailModal.A944EAD1": "执行计划详情", + "src.component.helpDoc.618FF120": "新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL 计划、分区计划、数据归档和数据清理)的权限和 SQL 窗口执行变更语句的权限(SQL 窗口可否执行变更受安全规范配置约束)", + "src.page.Project.User.ManageModal.Table.TaskApplyList.D8B38717": "状态", "src.page.Workspace.components.SQLExplain.E0AB0E4C": "实际代价", - "src.page.Workspace.components.DDLResultSet.E32AB474": "SQL 执行画像", - "src.page.Workspace.components.DDLResultSet.DBFC3F33": "支持 SQL 执行实时剖析,物理执行计划、全链路诊断也一段描述一段描述一段描述", - "src.page.Workspace.components.DDLResultSet.D7F6AF75": "我知道了", - "src.page.Workspace.components.DDLResultSet.22F863D6": "执行画像", - "src.page.Workspace.components.DDLResultSet.0B7666A0": "总耗时:{DBCostTime}", - "src.page.Project.User.3AE67EC2": "管理权限", - "src.page.Project.User.D1A92D2A": "编辑角色", - "src.page.Project.User.ManageModal.946C38DA": "库权限", - "src.page.Project.User.ManageModal.81C0C3D0": "表权限", - "src.page.Project.User.ManageModal.A4F73E8C": "管理权限", - "src.page.Project.User.ManageModal.Table.A3D05C57": "查询", - "src.page.Project.User.ManageModal.Table.D53578CD": "导出", - "src.page.Project.User.ManageModal.Table.070B09D0": "变更", - "src.page.Project.User.ManageModal.Table.7E23C899": "回收后不可撤回", - "src.page.Project.User.ManageModal.Table.C5AD844C": "取消", - "src.page.Project.User.ManageModal.Table.E297BA02": "确定", - "src.page.Project.User.ManageModal.Table.2E8F3BF1": "操作成功", - "src.page.Project.User.ManageModal.Table.CED524BB": "工单授权", - "src.page.Project.User.ManageModal.Table.92D4CD12": "用户授权", - "src.page.Project.User.ManageModal.Table.UserAuthList.9186B355": "数据库", - "src.page.Project.User.ManageModal.Table.UserAuthList.26E39901": "请输入", - "src.page.Project.User.ManageModal.Table.UserAuthList.012DC13E": "表", - "src.page.Project.User.ManageModal.Table.UserAuthList.E7BFBCC8": "请输入", - "src.page.Project.User.ManageModal.Table.UserAuthList.41C6A809": "所属数据源", - "src.page.Project.User.ManageModal.Table.UserAuthList.A644DA9A": "请输入", - "src.page.Project.User.ManageModal.Table.UserAuthList.12F7A572": "权限类型", - "src.page.Project.User.ManageModal.Table.UserAuthList.A02EBD96": "过期时间", + "src.component.Task.ApplyTablePermission.DetailContent.4B4A4E81": "任务类型", + "src.page.Project.User.ManageModal.Table.TaskApplyList.C0E75C97": "工单编号", + "src.page.Project.User.ManageModal.Table.UserAuthList.804D4C5D": "回收", + "src.component.Task.ApplyTablePermission.DetailContent.55EE2A17": "申请原因", + "src.component.Task.ApplyTablePermission.CreateModal.319F7B70": "申请原因不超过 200 个字符", + "src.component.Task.component.TableSelecter.C6AF0504": "清空", + "src.component.Task.ApplyTablePermission.DetailContent.32776504": "项目", + "src.component.Task.ApplyTablePermission.CreateModal.8A62AFC4": "表", + "src.component.Task.ApplyTablePermission.CreateModal.E06F8910": "90 天", "src.page.Project.User.ManageModal.Table.UserAuthList.40DFC3A2": "状态", - "src.page.Project.User.ManageModal.Table.UserAuthList.D245E1FF": "操作", + "src.component.Task.ApplyTablePermission.CreateModal.F4D36D95": "自定义", + "src.component.ExecuteSqlDetailModal.38BDF819": "执行详情", + "src.page.Project.User.ManageModal.Table.Status.FBAD95E6": "生效中", + "src.component.Task.ApplyTablePermission.CreateModal.F357A49C": "7 天", + "src.component.ExecuteSqlDetailModal.D1E28701": "列表视图", + "src.component.ExecuteSqlDetailModal.2129C7A3": "列表视图", "src.page.Project.User.ManageModal.Table.UserAuthList.673AB3C0": "过期超三个月后此权限将被清除", - "src.page.Project.User.ManageModal.Table.UserAuthList.804D4C5D": "回收", - "src.page.Project.User.ManageModal.Table.UserAuthList.DE0222B0": "批量回收", - "src.page.Project.User.ManageModal.Table.TaskApplyList.F9701758": "数据库", - "src.page.Project.User.ManageModal.Table.TaskApplyList.88257A65": "请输入", - "src.page.Project.User.ManageModal.Table.TaskApplyList.8F13E12E": "表", - "src.page.Project.User.ManageModal.Table.TaskApplyList.F38F822F": "请输入", - "src.page.Project.User.ManageModal.Table.TaskApplyList.E80C6744": "所属数据源", - "src.page.Project.User.ManageModal.Table.TaskApplyList.C0ABE640": "请输入", - "src.page.Project.User.ManageModal.Table.TaskApplyList.C0E75C97": "工单编号", - "src.page.Project.User.ManageModal.Table.TaskApplyList.3B1CD3B1": "请输入", + "src.page.Workspace.components.SQLResultSet.6CF6ACD1": "申请库权限", + "src.component.ProfileFlow.customComponents.422173C9": "节点属性", + "src.component.Task.ApplyTablePermission.CreateModal.DFADB0AB": "30 天", + "src.component.helpDoc.A0958282": "新建导入和导出结果集工单的权限", "src.page.Project.User.ManageModal.Table.TaskApplyList.9C75241F": "权限类型", - "src.page.Project.User.ManageModal.Table.TaskApplyList.EC52BFBC": "过期时间", - "src.page.Project.User.ManageModal.Table.TaskApplyList.D8B38717": "状态", - "src.page.Project.User.ManageModal.Table.TaskApplyList.BC1F3BBD": "操作", - "src.page.Project.User.ManageModal.Table.TaskApplyList.8BA76A12": "过期超三个月后此权限将被清除", - "src.page.Project.User.ManageModal.Table.TaskApplyList.9CDE663F": "回收", - "src.page.Project.User.ManageModal.Table.TaskApplyList.AEDC316B": "批量回收", - "src.page.Project.User.ManageModal.Table.Status.F4074114": "已过期", - "src.page.Project.User.ManageModal.Table.Status.3F56D2D7": "即将过期", - "src.page.Project.User.ManageModal.Table.Status.FBAD95E6": "生效中", - "src.page.Project.User.ManageModal.Table.CreateAuth.994F4BA8": "确认取消新增授权吗?", + "src.component.helpDoc.5D9071C2": "SQL窗口内执行查询语句的权限", + "src.page.Project.User.ManageModal.Table.UserAuthList.41C6A809": "所属数据源", + "src.page.Project.User.ManageModal.Table.UserAuthList.12F7A572": "权限类型", + "src.component.Task.ApplyTablePermission.CreateModal.DEF52B23": "加入项目", + "src.component.ProfileFlow.6B28FD92": "按吐行排序", + "src.component.ProfileFlow.C4791007": "按内存排序", + "src.component.ExecuteSqlDetailModal.68BF8995": "复制", "src.page.Project.User.ManageModal.Table.CreateAuth.B6C313E1": "新增授权成功!", - "src.page.Project.User.ManageModal.Table.CreateAuth.69B76107": "新增表授权", - "src.page.Project.User.ManageModal.Table.CreateAuth.680C9CFF": "新增授权", - "src.page.Project.User.ManageModal.Table.CreateAuth.9F6C8075": "取消", - "src.page.Project.User.ManageModal.Table.CreateAuth.35C819CB": "新建", - "src.page.Project.User.ManageModal.Table.CreateAuth.0635BFD4": "数据库", - "src.page.Project.User.ManageModal.Table.CreateAuth.5FD0D70D": "权限类型", - "src.page.Project.User.ManageModal.Table.CreateAuth.F34065CE": "请选择", - "src.page.Project.User.ManageModal.Table.CreateAuth.9C0612BE": "权限有效期", - "src.page.Project.User.ManageModal.Table.CreateAuth.705DD31B": "请选择", - "src.page.Project.User.ManageModal.Table.CreateAuth.1D45C292": "请选择", - "src.page.Project.User.ManageModal.Table.CreateAuth.6D949D9E": "结束日期", - "src.page.Project.User.ManageModal.Table.CreateAuth.E589EDA6": "请选择", - "src.page.Project.User.ManageModal.Database.1007E283": "工单授权", - "src.constant.A016D539": "申请表权限", + "src.page.Project.User.ManageModal.Table.CreateAuth.994F4BA8": "确认取消新增授权吗?", + "src.component.helpDoc.2207D608": "新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL 计划、分区计划、数据归档和数据清理)的权限和 SQL 窗口执行变更语句的权限(SQL 窗口可否执行变更受安全规范配置约束)", + "src.page.Project.User.ManageModal.Table.7E23C899": "回收后不可撤回", + "src.page.Project.User.ManageModal.Table.C5AD844C": "取消", + "src.component.Task.ApplyTablePermission.DetailContent.658E0B9E": "表", + "src.page.Project.User.ManageModal.Table.D53578CD": "导出", + "src.page.Project.User.ManageModal.Table.TaskApplyList.E80C6744": "所属数据源", + "src.constant.7DC84DC5": "回收表权限管理", + "src.component.Task.ApplyTablePermission.CreateModal.72AFD173": "请选择", "src.constant.16E15B2D": "表权限管理", "src.constant.6F5D437C": "申请表权限", - "src.constant.7CFF0BF7": "创建申请表权限", - "src.constant.EB58961E": "同意申请表权限", - "src.constant.77379A9D": "拒绝申请表权限", - "src.constant.6AF8D624": "停止申请表权限", - "src.constant.B59F26E3": "表权限管理", - "src.constant.E15D0656": "新增表权限管理", - "src.constant.7DC84DC5": "回收表权限管理", - "src.component.helpDoc.2207D608": "新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL 计划、分区计划、数据归档和数据清理)的权限和 SQL窗口执行变更语句的权限(SQL窗口可否执行变更受安全规范配置约束)", - "src.component.helpDoc.5D9071C2": "SQL窗口内执行查询语句的权限", - "src.component.helpDoc.A0958282": "新建导出和导出结果集工单的权限", - "src.component.helpDoc.618FF120": "新建数据库变更类工单(包括导入、模拟数据、数据库变更、影子表同步、SQL计划、分区计划、数据归档和数据清理)的权限和SQL窗口执行变更语句的权限(SQL窗口可否执行变更受安全规范配置约束)", + "src.page.Project.User.ManageModal.Table.CreateAuth.6D949D9E": "结束日期", "src.component.Task.D7396534": "申请表权限", - "src.component.Task.component.TaskTable.3236150E": "申请表权限", - "src.component.Task.component.TableSelecter.E836E630": "选择表", - "src.component.Task.component.TableSelecter.9995622C": "已选 {selectedTreeDataCount} 项", - "src.component.Task.component.TableSelecter.A56A8B2D": "确定要清空已选对象吗?", - "src.component.Task.component.TableSelecter.C6AF0504": "清空", - "src.component.Task.ApplyTablePermission.DetailContent.9E007486": "数据库", - "src.component.Task.ApplyTablePermission.DetailContent.658E0B9E": "表", - "src.component.Task.ApplyTablePermission.DetailContent.04825B86": "所属数据源", - "src.component.Task.ApplyTablePermission.DetailContent.8CEA0610": "任务编号", - "src.component.Task.ApplyTablePermission.DetailContent.4B4A4E81": "任务类型", - "src.component.Task.ApplyTablePermission.DetailContent.6C1A740A": "申请表权限", - "src.component.Task.ApplyTablePermission.DetailContent.32776504": "项目", - "src.component.Task.ApplyTablePermission.DetailContent.3FE43B61": "表", - "src.component.Task.ApplyTablePermission.DetailContent.64239A78": "权限类型", - "src.component.Task.ApplyTablePermission.DetailContent.FB4B30E0": "权限有效期", - "src.component.Task.ApplyTablePermission.DetailContent.55EE2A17": "申请原因", - "src.component.Task.ApplyTablePermission.DetailContent.2740E99B": "创建人", + "src.component.ProfileFlow.customComponents.E406DF5A": "I/O 统计", + "src.constant.B59F26E3": "表权限管理", "src.component.Task.ApplyTablePermission.DetailContent.7EEDDF7A": "创建时间", - "src.component.Task.ApplyTablePermission.CreateModal.BC4488C7": "永不过期", - "src.component.Task.ApplyTablePermission.CreateModal.82C8FE0E": "查询", - "src.component.Task.ApplyTablePermission.CreateModal.E26609A0": "导出", - "src.component.Task.ApplyTablePermission.CreateModal.D802CFB3": "变更", - "src.component.Task.ApplyTablePermission.CreateModal.F357A49C": "7 天", - "src.component.Task.ApplyTablePermission.CreateModal.DFADB0AB": "30 天", - "src.component.Task.ApplyTablePermission.CreateModal.E06F8910": "90 天", - "src.component.Task.ApplyTablePermission.CreateModal.76C327CA": "半 年", - "src.component.Task.ApplyTablePermission.CreateModal.D6E6AE6E": "1 年", - "src.component.Task.ApplyTablePermission.CreateModal.A004AEF5": "3年", - "src.component.Task.ApplyTablePermission.CreateModal.705AE4C3": "永不过期", - "src.component.Task.ApplyTablePermission.CreateModal.F4D36D95": "自定义", - "src.component.Task.ApplyTablePermission.CreateModal.11B637AA": "确认取消申请表权限吗?", - "src.component.Task.ApplyTablePermission.CreateModal.0D449988": "工单创建成功", - "src.component.Task.ApplyTablePermission.CreateModal.8955ACFE": "暂无项目,请先", - "src.component.Task.ApplyTablePermission.CreateModal.DEF52B23": "加入项目", - "src.component.Task.ApplyTablePermission.CreateModal.7DDD3557": "申请表权限", - "src.component.Task.ApplyTablePermission.CreateModal.95EB40E7": "取消", - "src.component.Task.ApplyTablePermission.CreateModal.AB5C56FA": "新建", "src.component.Task.ApplyTablePermission.CreateModal.524AEC5C": "项目", - "src.component.Task.ApplyTablePermission.CreateModal.77D8F632": "请选择项目", - "src.component.Task.ApplyTablePermission.CreateModal.DC9A3E27": "请选择", - "src.component.Task.ApplyTablePermission.CreateModal.8A62AFC4": "表", - "src.component.Task.ApplyTablePermission.CreateModal.78B63403": "请选择", - "src.component.Task.ApplyTablePermission.CreateModal.3BCFDC84": "权限类型", - "src.component.Task.ApplyTablePermission.CreateModal.72AFD173": "请选择", - "src.component.Task.ApplyTablePermission.CreateModal.472B1735": "权限有效期", + "src.page.Project.User.ManageModal.Table.TaskApplyList.8BA76A12": "过期超三个月后此权限将被清除", "src.component.Task.ApplyTablePermission.CreateModal.BC9BE9CE": "请选择", - "src.component.Task.ApplyTablePermission.CreateModal.A206D2B4": "请选择", + "src.page.Project.User.ManageModal.Table.CreateAuth.705DD31B": "请选择", "src.component.Task.ApplyTablePermission.CreateModal.06672C99": "结束日期", + "src.component.ExecuteSqlDetailModal.69A79B8E": "执行详情", + "src.component.Task.ApplyTablePermission.DetailContent.8CEA0610": "任务编号", + "src.component.ExecuteSqlDetailModal.14585364": "计划统计", + "src.component.ExecuteSqlDetailModal.0DAD5E44": "树视图", + "src.component.Task.ApplyTablePermission.DetailContent.64239A78": "权限类型", "src.component.Task.ApplyTablePermission.CreateModal.55D2BC4D": "请选择", - "src.component.Task.ApplyTablePermission.CreateModal.B2D5729B": "申请原因", - "src.component.Task.ApplyTablePermission.CreateModal.A92A0F62": "请输入原因描述", - "src.component.Task.ApplyTablePermission.CreateModal.319F7B70": "申请原因不超过 200 个字符", - "src.component.Task.ApplyTablePermission.CreateModal.8B90F708": "请输出原因描述", + "src.component.ExecuteSqlDetailModal.97782AAE": "文本视图", + "src.component.ExecuteSqlDetailModal.052B3894": "文本视图", + "src.page.Project.User.ManageModal.Table.A3D05C57": "查询", + "src.page.Project.User.ManageModal.Table.UserAuthList.26E39901": "请输入", + "src.page.Project.User.ManageModal.Table.TaskApplyList.BC1F3BBD": "操作", + "src.constant.6AF8D624": "停止申请表权限", + "src.component.ProfileFlow.customComponents.F4F9EB2A": "数据量:", + "src.component.ExecuteSqlDetailModal.D11F8620": "计划统计", + "src.component.ProfileFlow.customComponents.B32C7D03": "适应宽度", + "src.page.Project.User.ManageModal.Database.1007E283": "工单授权", + "src.component.Task.ApplyTablePermission.DetailContent.3FE43B61": "表", + "src.component.Task.ApplyTablePermission.CreateModal.76C327CA": "半 年", + "src.page.Project.User.ManageModal.Table.CreateAuth.0635BFD4": "数据库", + "src.component.ProfileFlow.customComponents.C22AD2CB": "{dataName}的汇总", "src.component.Task.AlterDdlTask.DetailContent.FE4166B2": "行限流", + "src.component.Task.ApplyTablePermission.CreateModal.95EB40E7": "取消", + "src.component.ExecuteSqlDetailModal.D47F3410": "全链路诊断", + "src.component.Task.ApplyTablePermission.CreateModal.472B1735": "权限有效期", + "src.component.Task.ApplyTablePermission.CreateModal.A206D2B4": "请选择", "src.component.Task.AlterDdlTask.DetailContent.45E8ACBB": "数据大小限流", + "src.page.Project.User.ManageModal.Table.UserAuthList.DE0222B0": "批量回收", + "src.component.ExecuteSqlDetailModal.FB8B6D0B": "列表视图", + "src.page.Workspace.components.SQLExplain.F472322D": "预估代价", + "src.component.Task.ApplyTablePermission.CreateModal.8B90F708": "请输入原因描述", + "src.component.Task.ApplyTablePermission.DetailContent.04825B86": "所属数据源", + "src.page.Project.User.ManageModal.Table.CreateAuth.5FD0D70D": "权限类型", + "src.component.Task.ApplyTablePermission.DetailContent.9E007486": "数据库", + "src.page.Project.User.ManageModal.Table.Status.3F56D2D7": "即将过期", + "src.page.Workspace.components.DDLResultSet.22F863D6": "执行画像", + "src.component.Task.ApplyTablePermission.CreateModal.11B637AA": "确认取消申请表权限吗?", + "src.component.Task.component.TableSelecter.A56A8B2D": "确定要清空已选对象吗?", + "src.page.Project.User.ManageModal.Table.TaskApplyList.F38F822F": "请输入", + "src.component.ProfileFlow.customComponents.2AB1AD68": "Node 执行概览", "src.component.SQLConfig.1A5CCA98": "SQL 执行", - "src.component.SQLConfig.A614A99E": "SQL 执行", + "src.page.Project.User.ManageModal.Table.TaskApplyList.EC52BFBC": "过期时间", + "src.component.Task.ApplyTablePermission.CreateModal.E26609A0": "导出", + "src.component.Task.ApplyTablePermission.CreateModal.BC4488C7": "永不过期", + "src.component.Task.component.TaskTable.3236150E": "申请表权限", + "src.component.Task.ApplyTablePermission.CreateModal.78B63403": "请选择", + "src.component.Task.component.TableSelecter.E836E630": "选择表", + "src.page.Workspace.components.DDLResultSet.0B7666A0": "总耗时:{DBCostTime}", + "src.page.Workspace.components.SQLResultSet.3BA312DB": "无法申请表权限:表所属数据库没有归属项目", + "src.component.Task.ApplyTablePermission.CreateModal.8955ACFE": "暂无项目,请先", + "src.component.Task.ApplyTablePermission.CreateModal.77D8F632": "请选择项目", + "src.page.Project.User.ManageModal.Table.CreateAuth.9F6C8075": "取消", + "src.component.ExecuteSqlDetailModal.5B8FA08A": "Trace ID 为 \"{modalStoreExecuteSqlDetailDataTraceId}\" 的执行画像", + "src.page.Project.User.ManageModal.Table.92D4CD12": "用户授权", + "src.page.Workspace.components.SQLResultSet.D3F95049": "终 止", + "src.page.Workspace.components.SQLResultSet.4035B347": "查看执行画像", "src.component.ProfileFlow.C966E64A": "按 DB 耗时排序", - "src.component.ProfileFlow.C4791007": "按内存排序", - "src.component.ProfileFlow.6B28FD92": "按吐行排序", - "src.component.ProfileFlow.customComponents.F4F9EB2A": "数据量:", - "src.component.ProfileFlow.customComponents.2AB1AD68": "Node 执行概览", - "src.component.ProfileFlow.customComponents.0E9A817E": "I/O 统计", - "src.component.ProfileFlow.customComponents.422173C9": "节点属性", "src.component.ProfileFlow.customComponents.7812E9AE": "{nodeName}的汇总", - "src.component.ProfileFlow.customComponents.C22AD2CB": "{dataName}的汇总", + "src.component.Task.ApplyTablePermission.CreateModal.7DDD3557": "申请表权限", + "src.page.Project.User.ManageModal.Table.UserAuthList.A02EBD96": "过期时间", + "src.constant.A016D539": "申请表权限", + "src.component.ExecuteSqlDetailModal.BF467954": "执行计划", + "src.page.Project.User.ManageModal.Table.E297BA02": "确定", + "src.page.Workspace.components.DDLResultSet.E32AB474": "SQL 执行画像", + "src.component.Task.ApplyTablePermission.CreateModal.82C8FE0E": "查询", + "src.page.Project.User.3AE67EC2": "管理权限", + "src.component.Task.ApplyTablePermission.DetailContent.2740E99B": "创建人", "src.component.ProfileFlow.customComponents.66C75D66": "耗时 Top5", - "src.component.ProfileFlow.customComponents.5FAB7852": "SQL 执行概览", - "src.component.ProfileFlow.customComponents.E406DF5A": "I/O 统计", - "src.component.ProfileFlow.customComponents.12BFFE42": "缩小", - "src.component.ProfileFlow.customComponents.3057F753": "放大", + "src.page.Project.User.ManageModal.Table.CreateAuth.F34065CE": "请选择", + "src.page.Project.User.ManageModal.Table.TaskApplyList.AEDC316B": "批量回收", + "src.page.Project.User.ManageModal.Table.CreateAuth.1D45C292": "请选择", + "src.component.ProfileFlow.customComponents.0E9A817E": "I/O 统计", + "src.page.Workspace.components.SQLResultSet.455E73CE": "无法申请表权限:没有加入数据库所属项目", + "src.page.Project.User.ManageModal.Table.CreateAuth.E589EDA6": "请选择", + "src.constant.E15D0656": "新增表权限管理", + "src.component.Task.component.TableSelecter.9995622C": "已选 {selectedTreeDataCount} 项", + "src.page.Project.User.ManageModal.Table.TaskApplyList.C0ABE640": "请输入", + "src.component.Task.ApplyTablePermission.CreateModal.AB5C56FA": "新建", + "src.page.Project.User.ManageModal.Table.UserAuthList.E7BFBCC8": "请输入", + "src.page.Project.User.ManageModal.Table.TaskApplyList.9CDE663F": "回收", + "src.component.Task.ApplyTablePermission.CreateModal.DC9A3E27": "请选择", + "src.constant.7CFF0BF7": "创建申请表权限", + "src.page.Project.User.ManageModal.Table.UserAuthList.A644DA9A": "请输入", "src.component.ProfileFlow.customComponents.89BEEE9E": "实际尺寸", - "src.component.ProfileFlow.customComponents.B32C7D03": "适应宽度", + "src.page.Project.User.ManageModal.Table.TaskApplyList.88257A65": "请输入", "src.component.ODCSetting.CFC0C3E8": "快捷键冲突, 请重新输入。", - "src.component.ExecuteSqlDetailModal.38BDF819": "执行详情", - "src.component.ExecuteSqlDetailModal.8A207B02": "执行计划", - "src.component.ExecuteSqlDetailModal.0B221F0A": "全链路诊断", - "src.component.ExecuteSqlDetailModal.14585364": "计划统计", + "src.page.Project.User.ManageModal.946C38DA": "库权限", + "src.component.Task.ApplyTablePermission.CreateModal.3BCFDC84": "权限类型", + "src.page.Project.User.ManageModal.Table.TaskApplyList.3B1CD3B1": "请输入", + "src.page.Workspace.components.SQLExplain.E0965DAC": "实际行", + "src.component.Task.ApplyTablePermission.DetailContent.6C1A740A": "申请表权限", + "src.page.Project.User.ManageModal.Table.CreateAuth.680C9CFF": "新增授权", + "src.page.Project.User.ManageModal.A4F73E8C": "管理权限", + "src.component.Task.ApplyTablePermission.CreateModal.0D449988": "工单创建成功", + "src.component.Task.ApplyTablePermission.CreateModal.D6E6AE6E": "1 年", + "src.page.Workspace.components.SQLResultSet.73CA790E": "表", + "src.page.Project.User.ManageModal.Table.TaskApplyList.8F13E12E": "表", + "src.page.Project.User.ManageModal.Table.070B09D0": "变更", + "src.component.Task.ApplyTablePermission.CreateModal.705AE4C3": "永不过期", "src.component.ExecuteSqlDetailModal.D6886430": "当前 SQL 正在执行中,执行完成后可查看", - "src.component.ExecuteSqlDetailModal.68BF8995": "复制", - "src.component.ExecuteSqlDetailModal.69A79B8E": "执行详情", - "src.component.ExecuteSqlDetailModal.BF467954": "执行计划", - "src.component.ExecuteSqlDetailModal.D47F3410": "全链路诊断", - "src.component.ExecuteSqlDetailModal.D11F8620": "计划统计", - "src.component.ExecuteSqlDetailModal.5B8FA08A": "Trace ID 为 \"{modalStoreExecuteSqlDetailDataTraceId}\" 的执行画像", - "src.component.ExecuteSqlDetailModal.A944EAD1": "执行计划详情", - "src.component.ExecuteSqlDetailModal.3AAA9DF9": "Trace 视图", - "src.component.ExecuteSqlDetailModal.D1E28701": "列表视图", - "src.component.ExecuteSqlDetailModal.FB8B6D0B": "列表视图", - "src.component.ExecuteSqlDetailModal.052B3894": "文本视图", - "src.component.ExecuteSqlDetailModal.0DAD5E44": "树视图", - "src.component.ExecuteSqlDetailModal.2129C7A3": "列表视图", - "src.component.ExecuteSqlDetailModal.97782AAE": "文本视图" + "src.page.Workspace.components.SQLResultSet.DDB9284D": "缺少以下数据库表对应权限,请先申请权限", + "src.page.Project.User.ManageModal.Table.CreateAuth.9C0612BE": "权限有效期", + "src.page.Project.User.ManageModal.Table.CED524BB": "工单授权", + "src.constant.77379A9D": "拒绝申请表权限", + "src.component.ProfileFlow.customComponents.5FAB7852": "SQL 执行概览", + "src.page.Project.User.ManageModal.Table.2E8F3BF1": "操作成功", + "src.page.Project.User.ManageModal.Table.UserAuthList.012DC13E": "表", + "src.component.Task.ApplyTablePermission.DetailContent.FB4B30E0": "权限有效期", + "src.page.Workspace.components.SQLResultSet.9BDFC99E": "当前 Trace ID:", + "src.component.ProfileFlow.customComponents.3057F753": "放大", + "src.page.Project.User.ManageModal.81C0C3D0": "表权限", + "src.page.Project.User.ManageModal.Table.Status.F4074114": "已过期" } diff --git a/src/locales/must/strings/zh-TW.json b/src/locales/must/strings/zh-TW.json index db5f9064d..4f29f478f 100644 --- a/src/locales/must/strings/zh-TW.json +++ b/src/locales/must/strings/zh-TW.json @@ -3035,7 +3035,6 @@ "odc.AlterDdlTask.CreateModal.TaskErrorHandling": "任務錯誤處理", "odc.DataClearTask.DetailContent.TaskType": "任務類型", "odc.ResourceTree.Nodes.table.Partition": "分區", - "odc.Project.User.Edit": "編輯", "odc.SSO.SSODetailDrawer.Close": "關閉", "odc.Workspace.ActivityBar.type.Database": "資料庫", "odc.component.SelectTransfer.CountItemSelected": "已選 {count} 項", @@ -3945,7 +3944,6 @@ "src.component.Task.ApplyDatabasePermission.DetailContent.CE83F40A": "所屬數據源", "src.component.Task.StructureComparisonTask.CreateModal.A8C717F6": "取消", "src.page.Project.Notification.components.3548BA07": "批量操作成功", - "src.page.Project.User.ManageModal.1DCD8093": "工單授權", "src.page.ExternalIntegration.SSO.SSODetailDrawer.F86DB093": "用戶 DN", "src.component.Task.DataClearTask.CreateModal.ED9CFF17": "是", "src.page.Project.User.ManageModal.TaskApplyList.D0AC4874": "數據庫", @@ -4009,7 +4007,6 @@ "src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.C6AB94A8": "起始", "src.page.Secure.Record.RecordPage.6F1F90F6": "庫權限管理", "src.page.Project.Notification.components.7C80562E": "請選擇通道類型", - "src.component.helpDoc.5373CF9E": "新建數據庫變更類工單(包括導入、模擬數據、數據庫變更、影子錶同步、SQL 計劃、分區計劃、數據歸檔和數據清理)的權限和執行變更語句的權限(SQL 窗口可否執行變更受安全規範配置約束)", "src.component.Task.component.ActionBar.A79907A3": "暫不可用", "src.page.Project.Notification.components.76BA6F01": "通道名稱", "src.component.Task.component.PartitionPolicyFormTable.90B10A59": "請輸入錶名", @@ -4076,7 +4073,6 @@ "src.component.Task.component.PartitionPolicyFormTable.C49FCEB6": "命名方式", "src.component.ODCSetting.config.DD62F7C6": "主題", "src.page.Project.Notification.components.D55443F5": "Webhook 地址", - "src.component.SQLConfig.C03B2372": "開啟全鏈路診斷", "src.page.Project.Notification.components.445FB17E": "查看", "src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.8368A05F": "請輸入", "src.page.Secure.Env.components.F65C4578": "禁用失敗", @@ -4188,7 +4184,6 @@ "src.page.Project.User.ManageModal.UserAuthList.AD0486C8": "請輸入", "src.component.Task.StructureComparisonTask.DetailContent.BB26A84B": "源端數據源", "src.component.ODCSetting.config.5C426BEE": "個人空間", - "src.page.Workspace.components.SQLResultSet.52CCC188": "缺少以下數據庫對應權限,請先申請庫權限", "src.component.Task.component.PartitionPolicyFormTable.16355175": "請輸入預創建分區數量", "src.page.Project.Notification.components.2D408702": "查看", "src.component.Task.ApplyDatabasePermission.DetailContent.176A9CCE": "申請庫權限", @@ -4216,12 +4211,10 @@ "src.component.ODCSetting.654799D1": "已恢復到默認配置", "src.page.Project.Notification.components.82FB9375": "通道名稱", "src.component.Task.StructureComparisonTask.DetailContent.3AB981EC": "源表結構", - "src.page.Workspace.components.SQLResultSet.0B7D4FBE": "申請", "src.page.Project.User.ManageModal.28BC85BF": "用戶授權", "src.component.Task.component.PartitionPolicyFormTable.RuleFormItem.DE258551": "請輸入", "src.component.Task.PartitionTask.CreateModal.05B817DF": "請輸入超時時間", "src.page.Project.Notification.components.B65E55FA": "刪除", - "src.page.Project.User.ManageModal.211FFE62": "管理庫權限", "src.page.Secure.Env.components.351C7EB6": "請選擇引用環境", "src.page.Project.User.ManageModal.Status.F648282E": "已過期", "src.component.Task.StructureComparisonTask.CreateModal.F20205E5": "不支持", @@ -4230,7 +4223,6 @@ "src.component.Task.ApplyDatabasePermission.CreateModal.B4654D83": "30 天", "src.component.Task.9B79BD20": "自動執行", "src.component.Task.component.TaskTable.E1E161BA": "申請庫權限", - "src.page.Project.User.26C36450": "管理庫權限", "src.page.ExternalIntegration.SSO.NewSSODrawerButton.SSOForm.2E3212A5": "搜索群組查詢時使用的起始點或基準點", "src.component.Task.ApplyDatabasePermission.DetailContent.3EE454F2": "數據庫", "src.component.ODCSetting.config.B0184654": "否", @@ -4672,7 +4664,6 @@ "src.component.Task.MutipleAsyncTask.CreateModal.7026E054": "停止執行", "src.component.Task.MutipleAsyncTask.CreateModal.20CA9283": "請填寫 SQL 內容", "src.component.Task.MutipleAsyncTask.CreateModal.0D0BC691": "更多設置", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.69106FDA": "全部數據庫", "src.component.Task.MutipleAsyncTask.CreateModal.533E6CE4": "點擊或將多個文件拖拽到這裡上傳", "src.component.Task.MutipleAsyncTask.DetailContent.E2E22162": "手動確認超時時間", "src.component.Task.MutipleAsyncTask.CreateModal.450BFD6C": "小時", @@ -4693,7 +4684,6 @@ "src.component.Task.MutipleAsyncTask.CreateModal.C0D9B0C7": "數據庫選擇", "src.component.Task.1EDC83CC": "多庫變更", "src.component.Task.DataArchiveTask.CreateModal.AEEF3B7C": "指定分區", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.03B6F86A": "搜索數據庫", "src.page.Secure.RiskLevel.components.9742C706": "項目-", "src.component.Task.MutipleAsyncTask.CreateModal.38358F62": "超時未確認執行後,任務將終止", "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.987D5B8A": "當前數據源: {selectDatasourceName}", @@ -4771,7 +4761,6 @@ "src.component.Task.MutipleAsyncTask.CreateModal.A95292C7": "保存模版", "src.component.Task.component.CommonDetailModal.FC1C254D": "執行順序", "src.component.Task.MutipleAsyncTask.DetailContent.5FA1154F": "查詢結果限制", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.D7B63CB7": "打開 SQL 窗口", "src.constant.CE5A59D0": "列存", "src.component.Task.MutipleAsyncTask.DetailContent.A6BC0EA9": "數據庫詳情", "src.page.Project.Database.components.DatabaseOwnerSelect.tsx.CBBD314E": "請輸入", @@ -4798,9 +4787,7 @@ "src.page.Project.Database.ChangeOwnerModal.22191CF9": "修改數據庫管理員成功", "src.page.Project.Database.components.DatabaseOwnerSelect.tsx.094820AF": "請選擇", "src.component.Crontab.0130A0C7": "每秒", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.9F4C3737": "全部數據庫", "src.component.Task.DataArchiveTask.DetailContent.FFC5907D": "是", - "src.page.Workspace.SideBar.ResourceTree.DatabaseSearchModal.components.0D1BC60D": "查看更多", "src.component.Task.MutipleAsyncTask.CreateModal.3FBE491C": "取消", "src.component.Task.DataArchiveTask.CreateModal.94BCB0E1": "目標表", "src.component.Task.MutipleAsyncTask.DetailContent.B6FF5C81": "所屬項目", diff --git a/src/main/server/main.ts b/src/main/server/main.ts index a200b3714..d382058b5 100644 --- a/src/main/server/main.ts +++ b/src/main/server/main.ts @@ -137,10 +137,10 @@ class MainServer { /** * 确认服务是否可用 */ - private async checkServerIsReady() { + private async checkServerIsReady(logError: boolean = false) { try { await new Promise((resolve, reject) => { - const res = get(`http://localhost:${this.port}/api/v1/info`, (resp) => { + const res = get(`http://127.0.0.1:${this.port}/api/v1/info`, (resp) => { log.info('check server api status: ', resp.statusCode); let data = ''; // A chunk of data has been recieved. @@ -159,6 +159,7 @@ class MainServer { }); }).on('error', (err) => { log.info('check server with resp err'); + logError && log.info(err); reject(err); }); res.setTimeout(2000); @@ -179,7 +180,7 @@ class MainServer { const getStatus = async (fn, reject) => { count++; log.info(`fetch server status count(${count})`); - const isReady = await this.checkServerIsReady(); + const isReady = await this.checkServerIsReady(count > 70); if (isReady) { log.info(`Server startup time:`, (Date.now() - now) / 1000); fn(true); diff --git a/src/main/store/index.ts b/src/main/store/index.ts index ae1f246a0..771697fc2 100644 --- a/src/main/store/index.ts +++ b/src/main/store/index.ts @@ -21,7 +21,7 @@ import log from '../utils/log'; export class PathnameStore { public static PROTOCOL = 'http'; private static defaultPathname: string = 'index.html'; - private static hostname: string = 'localhost'; + private static hostname: string = '127.0.0.1'; public static pathname: string = PathnameStore.defaultPathname; public static hash: string = ''; diff --git a/src/main/windows/mainWeb/event.ts b/src/main/windows/mainWeb/event.ts index bbbce4e41..fb2aef0a0 100644 --- a/src/main/windows/mainWeb/event.ts +++ b/src/main/windows/mainWeb/event.ts @@ -65,7 +65,7 @@ export function newWindowEvent(mainWindow: BrowserWindow) { mainWindow.on('close', (e) => { log.warn(`webcontent close, url: ${mainWindow.webContents.getURL()}`); const url = mainWindow.webContents?.getURL(); - if (url.includes('localhost') && !url.includes('help-doc')) { + if (url.includes('127.0.0.1') && !url.includes('help-doc')) { /** * odc workspace confirm */ diff --git a/src/page/Gateway/customConnect.ts b/src/page/Gateway/customConnect.ts index 7aba25959..d0335edb5 100644 --- a/src/page/Gateway/customConnect.ts +++ b/src/page/Gateway/customConnect.ts @@ -181,7 +181,7 @@ export const action = async (config: ICustomConnectAction) => { const project = (await listProjects(projectName, 1, 20, false, true))?.contents?.[0]; if (!project || project?.name !== projectName) { - return 'User Project Not Fount'; + return 'User project not found, please contact adminitrator, confirm the bastion integration is enabled'; } const params = resolveRemoteData({ diff --git a/src/page/Project/Database/index.tsx b/src/page/Project/Database/index.tsx index 90d109081..bae6d8101 100644 --- a/src/page/Project/Database/index.tsx +++ b/src/page/Project/Database/index.tsx @@ -50,6 +50,7 @@ import StatusName from './StatusName'; import ChangeOwnerModal from '@/page/Project/Database/ChangeOwnerModal'; import { ProjectRole } from '@/d.ts/project'; import MutipleAsyncTask from '@/component/Task/MutipleAsyncTask'; +import { databasePermissionTypeMap } from '@/page/Project/User/ManageModal/Database'; interface IProps { id: string; modalStore?: ModalStore; @@ -135,6 +136,7 @@ const Database: React.FC = ({ id, modalStore }) => { ); }; + const clearSelectedRowKeys = () => { setSelectedRowKeys([]); }; @@ -394,6 +396,7 @@ const Database: React.FC = ({ id, modalStore }) => { const hasQueryAuth = record.authorizedPermissionTypes?.includes( DatabasePermissionType.QUERY, ); + const curRoles = project?.currentUserResourceRoles || []; const hasChangeOwnerAuth = curRoles.some((role) => [ProjectRole.OWNER, ProjectRole.DBA].includes(role), diff --git a/src/page/Project/User/ManageModal/Database/index.tsx b/src/page/Project/User/ManageModal/Database/index.tsx index d21779424..a132f3f03 100644 --- a/src/page/Project/User/ManageModal/Database/index.tsx +++ b/src/page/Project/User/ManageModal/Database/index.tsx @@ -52,6 +52,10 @@ export const databasePermissionTypeMap = { }), //'变更' value: DatabasePermissionType.CHANGE, }, + [DatabasePermissionType.ACCESS]: { + text: '访问', + value: DatabasePermissionType.ACCESS, + }, }; export const databasePermissionTypeFilters = Object.values(databasePermissionTypeMap); @@ -109,7 +113,9 @@ const ManageModal: React.FC = (props) => { }; const handleReload = () => { - tableRef.current?.reload(); + const param = { ...params, pagination: { ...params?.pagination, current: 1 } }; + setParams(param); + loadData(param); }; const handleReclaim = async (ids: number[]) => { diff --git a/src/page/Project/User/ManageModal/Table/CreateAuth/index.tsx b/src/page/Project/User/ManageModal/Table/CreateAuth/index.tsx index 222193996..c6708a363 100644 --- a/src/page/Project/User/ManageModal/Table/CreateAuth/index.tsx +++ b/src/page/Project/User/ManageModal/Table/CreateAuth/index.tsx @@ -28,6 +28,7 @@ import TableSelecter, { import { Button, Checkbox, DatePicker, Drawer, Form, Modal, Select, Space, message } from 'antd'; import React, { useState } from 'react'; import styles from './index.less'; +import moment from 'moment'; const CheckboxGroup = Checkbox.Group; @@ -75,6 +76,10 @@ const CreateModal: React.FC = (props) => { } }; + const disabledDate = (current) => { + return current && current < moment().subtract(1, 'days').endOf('day'); + }; + const handleSubmit = () => { form .validateFields() @@ -237,7 +242,7 @@ const CreateModal: React.FC = (props) => { }, ]} > - + ) ); diff --git a/src/page/Project/User/ManageModal/Table/TaskApplyList/index.tsx b/src/page/Project/User/ManageModal/Table/TaskApplyList/index.tsx index cec8fc6f0..73fe82c5d 100644 --- a/src/page/Project/User/ManageModal/Table/TaskApplyList/index.tsx +++ b/src/page/Project/User/ManageModal/Table/TaskApplyList/index.tsx @@ -46,19 +46,20 @@ const getColumns = (params: { const { filters } = params.paramOptions ?? {}; return [ { - dataIndex: 'databaseName', + dataIndex: 'tableName', title: formatMessage({ - id: 'src.page.Project.User.ManageModal.Table.TaskApplyList.F9701758', - defaultMessage: '数据库', + id: 'src.page.Project.User.ManageModal.Table.TaskApplyList.8F13E12E', + defaultMessage: '表', }), + width: 140, ellipsis: true, filterDropdown: (props) => { return ( @@ -72,23 +73,21 @@ const getColumns = (params: { /> ), - filteredValue: filters?.databaseName || null, + filteredValue: filters?.tableName || null, filters: [], }, { - dataIndex: 'tableName', - title: formatMessage({ - id: 'src.page.Project.User.ManageModal.Table.TaskApplyList.8F13E12E', - defaultMessage: '表', - }), + dataIndex: 'databaseName', + title: '所属数据库', ellipsis: true, + width: 208, filterDropdown: (props) => { return ( @@ -102,7 +101,7 @@ const getColumns = (params: { /> ), - filteredValue: filters?.tableName || null, + filteredValue: filters?.databaseName || null, filters: [], }, { @@ -296,6 +295,11 @@ const TaskApplyList: React.FC = (props) => { onOk: onReclaim, }, ], + getCheckboxProps: (record: ITablePermission) => { + return { + disabled: record?.status === TablePermissionStatus.EXPIRED, + }; + }, } : null } @@ -304,13 +308,6 @@ const TaskApplyList: React.FC = (props) => { tableProps={{ columns: columns?.filter((item) => (isOwner ? true : item?.dataIndex !== 'action')), dataSource: dataSource?.contents ?? [], - rowSelection: { - getCheckboxProps: (record: ITablePermission) => { - return { - disabled: record?.status === TablePermissionStatus.EXPIRED, - }; - }, - }, rowKey: 'id', scroll: { x: 950, diff --git a/src/page/Project/User/ManageModal/Table/UserAuthList/index.tsx b/src/page/Project/User/ManageModal/Table/UserAuthList/index.tsx index d14276b48..ca8fa1e40 100644 --- a/src/page/Project/User/ManageModal/Table/UserAuthList/index.tsx +++ b/src/page/Project/User/ManageModal/Table/UserAuthList/index.tsx @@ -43,19 +43,20 @@ const getColumns = (params: { const { filters } = params.paramOptions ?? {}; return [ { - dataIndex: 'databaseName', + dataIndex: 'tableName', title: formatMessage({ - id: 'src.page.Project.User.ManageModal.Table.UserAuthList.9186B355', - defaultMessage: '数据库', + id: 'src.page.Project.User.ManageModal.Table.UserAuthList.012DC13E', + defaultMessage: '表', }), ellipsis: true, + width: 140, filterDropdown: (props) => { return ( @@ -69,23 +70,21 @@ const getColumns = (params: { /> ), - filteredValue: filters?.databaseName || null, + filteredValue: filters?.tableName || null, filters: [], }, { - dataIndex: 'tableName', - title: formatMessage({ - id: 'src.page.Project.User.ManageModal.Table.UserAuthList.012DC13E', - defaultMessage: '表', - }), + dataIndex: 'databaseName', + title: '所属数据库', + width: 208, ellipsis: true, filterDropdown: (props) => { return ( @@ -99,7 +98,7 @@ const getColumns = (params: { /> ), - filteredValue: filters?.tableName || null, + filteredValue: filters?.databaseName || null, filters: [], }, { @@ -243,6 +242,11 @@ const UserAuthList: React.FC = (props) => { onOk: onReclaim, }, ], + getCheckboxProps: (record: ITablePermission) => { + return { + disabled: record?.status === TablePermissionStatus.EXPIRED, + }; + }, } : null } @@ -252,13 +256,6 @@ const UserAuthList: React.FC = (props) => { columns: columns?.filter((item) => (isOwner ? true : item?.dataIndex !== 'action')), dataSource: dataSource?.contents ?? [], rowKey: 'id', - rowSelection: { - getCheckboxProps: (record: ITablePermission) => { - return { - disabled: record?.status === TablePermissionStatus.EXPIRED, - }; - }, - }, scroll: { x: 950, y: 800, diff --git a/src/page/Project/User/ManageModal/Table/index.tsx b/src/page/Project/User/ManageModal/Table/index.tsx index 1d99dcf5f..f028fcae0 100644 --- a/src/page/Project/User/ManageModal/Table/index.tsx +++ b/src/page/Project/User/ManageModal/Table/index.tsx @@ -81,7 +81,7 @@ const ManageModal: React.FC = (props) => { const loadData = useCallback( async (args?: ITableLoadOptions) => { const { filters, sorter, pagination, pageSize } = args ?? {}; - const { tableName, dataSourceName, ticketId, type, status } = filters ?? {}; + const { tableName, dataSourceName, ticketId, type, status, databaseName } = filters ?? {}; const { column, order } = sorter ?? {}; const { current = 1 } = pagination ?? {}; const params = { @@ -90,6 +90,7 @@ const ManageModal: React.FC = (props) => { userId, tableName, dataSourceName, + databaseName, ticketId, type, status, @@ -113,7 +114,9 @@ const ManageModal: React.FC = (props) => { }; const handleReload = () => { - tableRef.current?.reload(); + const param = { ...params, pagination: { ...params?.pagination, current: 1 } }; + setParams(param); + loadData(param); }; const handleReclaim = async (ids: number[]) => { diff --git a/src/page/Project/User/index.tsx b/src/page/Project/User/index.tsx index 412455ba3..f690c3fb7 100644 --- a/src/page/Project/User/index.tsx +++ b/src/page/Project/User/index.tsx @@ -131,7 +131,11 @@ const User: React.FC = ({ id, userStore }) => { : formatMessage({ id: 'src.page.Project.User.0C0586E8', defaultMessage: '暂无权限' }) } > - ); } + return 库内搜索; }; if (database && !searchKey) { return ( - +
+
openSql(e, database)}> + {`定位到数据库 "${database?.name}"`} +
+
); } return ( diff --git a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/components/ObjectList.tsx b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/components/ObjectList.tsx index c7dd6cb08..a94cc0123 100644 --- a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/components/ObjectList.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/components/ObjectList.tsx @@ -7,14 +7,14 @@ import { } from '../constant'; import { Tabs, Divider, Button, Empty, Tooltip, Spin } from 'antd'; import styles from '../index.less'; -import { DbObjectType } from '@/d.ts'; +import { DbObjectType, ConnectionMode } from '@/d.ts'; import { DbObjsIcon } from '@/constant'; import Icon from '@ant-design/icons'; import { useState } from 'react'; import { IDatabase, IDatabaseObject } from '@/d.ts/database'; import { getDataSourceStyleByConnectType } from '@/common/datasource'; import { ModalStore } from '@/store/modal'; - +import { openNewSQLPage } from '@/store/helper/page'; interface Iprops { database: IDatabase; objectlist: IDatabaseObject; @@ -24,6 +24,8 @@ interface Iprops { setActiveKey: React.Dispatch>; modalStore: ModalStore; loading: boolean; + selectProjectId: number; + currentDataSourceType: ConnectionMode; } const ObjectList = ({ @@ -35,10 +37,13 @@ const ObjectList = ({ setSearchKey, modalStore, loading, + selectProjectId, + currentDataSourceType, }: Iprops) => { const [activeDatabase, setActiveDatabase] = useState(); const ALL_TAB_MAX_LENGTH = 3; - const dbType = database?.dataSource?.dialectType || SEARCH_OBJECT_FROM_ALL_DATABASE; + const dbType = + currentDataSourceType || database?.dataSource?.dialectType || SEARCH_OBJECT_FROM_ALL_DATABASE; const getTyepBlock = () => { const typeList = objectTypeConfig[dbType]; const typeObjectTree = typeList?.map((i) => { @@ -146,6 +151,9 @@ const ObjectList = ({ ) : (
{typeObjectTree?.map((i) => { + const isDatabase = i.key === DbObjectType.database; + /* 在选择了库之后检索, 会检索到数据库本身(若数据库名包含searchkey), 需要前端屏蔽掉 */ + if (isDatabase && database) return; if (i?.data?.length) { return (
@@ -173,12 +181,14 @@ const ObjectList = ({ return (
openTree(e, object)} + onClick={(e) => + isDatabase ? openSql(e, object) : openTree(e, object) + } onMouseEnter={() => setActiveDatabase(object)} onMouseLeave={() => setActiveDatabase(null)} >
- {i.key === DbObjectType.database ? ( + {isDatabase ? (
- {i.key === DbObjectType.database - ? selectDbBtn(object) - : permissionBtn(object, i.key)} + {isDatabase ? selectDbBtn(object) : permissionBtn(object, i.key)}
); } @@ -243,7 +251,6 @@ const ObjectList = ({ tableName: dbObj?.name, tableId: dbObj?.id, }; - // debugger modalStore.changeApplyTablePermissionModal(true, { ...params, }); @@ -337,6 +344,13 @@ const ObjectList = ({ modalStore?.databaseSearchsSetExpandedKeysFunction?.(databaseId); }; + const openSql = (e, db) => { + e.stopPropagation(); + modalStore?.databaseSearchsSetExpandedKeysFunction?.(db.id); + modalStore?.changeDatabaseSearchModalVisible(false); + db.id && openNewSQLPage(db.id, selectProjectId ? 'project' : 'datasource'); + }; + const renderObjectTypeTabs = (type) => { const currentObjectList = typeObjectTree?.find((i) => i.key === type); const isDatabasetab = currentObjectList.key === DbObjectType.database; @@ -359,7 +373,7 @@ const ObjectList = ({
{ - !isDatabasetab ? openTree(e, object) : null; + isDatabasetab ? openSql(e, object) : openTree(e, object); }} onMouseEnter={() => setActiveDatabase(object)} onMouseLeave={() => setActiveDatabase(null)} diff --git a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.less b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.less index 7b4ab34c4..ad34a1cae 100644 --- a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.less +++ b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.less @@ -111,6 +111,9 @@ .ant-tabs-tab { margin: 0 6px; } + .ant-tabs-nav-more { + padding: 10px 7px; + } } .objectlistBox { max-height: 366px; diff --git a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.tsx b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.tsx index cadf5756d..119b14231 100644 --- a/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/DatabaseSearchModal/index.tsx @@ -23,8 +23,11 @@ const DatabaseSearchModal = ({ modalStore }: IProps) => { const [objectlist, setObjectlist] = useState(); const [activeKey, setActiveKey] = useState(SEARCH_OBJECT_FROM_ALL_DATABASE); const [loading, setLoading] = useState(false); - const { selectDatasourceId, selectProjectId, databaseList } = useContext(ResourceTreeContext); - + const { selectDatasourceId, selectProjectId, databaseList, datasourceList } = + useContext(ResourceTreeContext); + const currentDataSourceType = datasourceList?.find( + (item) => item.id === selectDatasourceId, + )?.dialectType; const handleCancel = () => { modalStore.changeDatabaseSearchModalVisible(false); }; @@ -96,6 +99,8 @@ const DatabaseSearchModal = ({ modalStore }: IProps) => { setSearchKey={setSearchKey} modalStore={modalStore} loading={loading} + selectProjectId={selectProjectId} + currentDataSourceType={currentDataSourceType} /> ); }; diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx index 25c6fe64b..7a7725d41 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/config/table.tsx @@ -29,7 +29,7 @@ import { formatMessage } from '@/util/intl'; import { downloadPLDDL } from '@/util/sqlExport'; import { PlusOutlined, QuestionCircleFilled, ReloadOutlined } from '@ant-design/icons'; import { message, Modal } from 'antd'; -import { hasExportPermission, hasChangePermission } from '../index'; +import { hasTableExportPermission, hasTableChangePermission } from '../index'; import { ResourceNodeType } from '../../type'; import { IMenuItemConfig } from '../type'; import { getDataSourceModeConfig } from '@/common/datasource'; @@ -131,8 +131,8 @@ export const tableMenusConfig: Partial { - return !hasChangePermission(session); + disabled: (session, node) => { + return !hasTableChangePermission(session, node); }, isHide: (session) => { return ( @@ -158,8 +158,8 @@ export const tableMenusConfig: Partial { - return !hasExportPermission(session); + disabled: (session, node) => { + return !hasTableExportPermission(session, node); }, isHide: (session) => { return !isSupportExport(session); @@ -199,8 +199,8 @@ export const tableMenusConfig: Partial { - return !hasChangePermission(session); + disabled: (session, node) => { + return !hasTableChangePermission(session, node); }, isHide: (session) => { return ( @@ -363,8 +363,8 @@ export const tableMenusConfig: Partial { - return !hasChangePermission(session); + disabled: (session, node) => { + return !hasTableChangePermission(session, node); }, run(session, node) { const table = node.data as ITableModel; diff --git a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx index 05c2a8cdb..8cce9acb8 100644 --- a/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx +++ b/src/page/Workspace/SideBar/ResourceTree/TreeNodeMenu/index.tsx @@ -36,6 +36,13 @@ export const hasExportPermission = (dbSession: SessionStore) => { export const hasChangePermission = (dbSession: SessionStore) => { return dbSession?.odcDatabase?.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); }; +export const hasTableExportPermission = (dbSession: SessionStore, node: TreeDataNode) => { + return node?.data?.info?.authorizedPermissionTypes?.includes(DatabasePermissionType.EXPORT); +}; + +export const hasTableChangePermission = (dbSession: SessionStore, node: TreeDataNode) => { + return node?.data?.info?.authorizedPermissionTypes?.includes(DatabasePermissionType.CHANGE); +}; const TreeNodeMenu = (props: IProps) => { const { type = '', dbSession, databaseFrom, node, showTip, pollingDatabase } = props; @@ -164,6 +171,13 @@ const TreeNodeMenu = (props: IProps) => { let allItemsProp: ItemType[] = getMenuItems(menuItems); function actionsRender() { + /* 只有表权限, 则隐藏 */ + if ( + node?.data?.authorizedPermissionTypes?.length === 1 && + node?.data?.authorizedPermissionTypes?.includes(DatabasePermissionType.ACCESS) + ) { + return; + } let ellipsisItems = menuItems.filter((item) => { return item.ellipsis; }); diff --git a/src/page/Workspace/components/DDLResultSet/StatusBar.tsx b/src/page/Workspace/components/DDLResultSet/StatusBar.tsx index 42d4a4d72..03fcd3539 100644 --- a/src/page/Workspace/components/DDLResultSet/StatusBar.tsx +++ b/src/page/Workspace/components/DDLResultSet/StatusBar.tsx @@ -136,15 +136,17 @@ const StatusBar: React.FC = function ({ ) : null} - - {formatMessage( - { - id: 'src.page.Workspace.components.DDLResultSet.0B7666A0', - defaultMessage: '总耗时:{DBCostTime}', - }, - { DBCostTime }, - )} - + {timer && ( + + {formatMessage( + { + id: 'src.page.Workspace.components.DDLResultSet.0B7666A0', + defaultMessage: '总耗时:{DBCostTime}', + }, + { DBCostTime }, + )} + + )} { formatMessage( diff --git a/src/page/Workspace/components/DDLResultSet/index.tsx b/src/page/Workspace/components/DDLResultSet/index.tsx index f51fb53b4..4e17b731b 100644 --- a/src/page/Workspace/components/DDLResultSet/index.tsx +++ b/src/page/Workspace/components/DDLResultSet/index.tsx @@ -150,6 +150,7 @@ interface IProps { autoCommit: boolean; withFullLinkTrace?: boolean; // SQL执行结果是否支持Trace功能 traceEmptyReason?: string; // 若不支持时要展示的Tooltip文本 + withQueryProfile?: boolean; // SQL执行结果是否支持执行剖析 /** * db 查询耗时 */ @@ -165,7 +166,12 @@ interface IProps { onShowExecuteDetail?: () => void; onShowTrace?: () => void; onUpdateEditing?: (editing: boolean) => void; - onOpenExecutingDetailModal?: (traceId: string, sql?: string) => void; + onOpenExecutingDetailModal?: ( + traceId: string, + sql?: string, + sessionId?: string, + traceEmptyReason?: string, + ) => void; } const DDLResultSet: React.FC = function (props) { const { @@ -192,6 +198,7 @@ const DDLResultSet: React.FC = function (props) { autoCommit, dbTotalDurationMicroseconds, withFullLinkTrace = false, + withQueryProfile = false, traceEmptyReason = '', onUpdateEditing, onRefresh, @@ -687,7 +694,7 @@ const DDLResultSet: React.FC = function (props) { if (guideCacheStore?.[guideCacheStore.cacheEnum.executePlan]) return null; return (
-
+
{formatMessage({ id: 'src.page.Workspace.components.DDLResultSet.E32AB474', defaultMessage: 'SQL 执行画像', @@ -707,7 +714,7 @@ const DDLResultSet: React.FC = function (props) { }; const getExecuteIcon = () => { - return showExecutePlan ? ( + return showExecutePlan && withQueryProfile ? ( = function (props) { })} icon={} onClick={() => { - updateExecutePlanGuideCache(); - onOpenExecutingDetailModal?.(traceId, originSql); + onOpenExecutingDetailModal?.(traceId, originSql, null, traceEmptyReason); + setTimeout(() => { + updateExecutePlanGuideCache(); + }, 1000); }} tip={executeGuideTipContent()} overlayInnerStyle={{ width: 300 }} diff --git a/src/page/Workspace/components/SQLResultSet/ExecuteHistory.tsx b/src/page/Workspace/components/SQLResultSet/ExecuteHistory.tsx index 5e3333285..306342874 100644 --- a/src/page/Workspace/components/SQLResultSet/ExecuteHistory.tsx +++ b/src/page/Workspace/components/SQLResultSet/ExecuteHistory.tsx @@ -41,7 +41,12 @@ interface IProps { onShowExecuteDetail: (sql: string, tag: string) => void; resultHeight: number; sqlStore?: SQLStore; - onOpenExecutingDetailModal?: (traceId: string, sql?: string, sessionId?: string) => void; + onOpenExecutingDetailModal?: ( + traceId: string, + sql?: string, + sessionId?: string, + traceEmptyReason?: string, + ) => void; } function getResultText(rs: ISqlExecuteResult) { @@ -203,7 +208,16 @@ const ExecuteHistory: React.FC = function (props) { render: (value: string, row: any) => { if (!value) return '-'; return row?.isSupportProfile ? ( - onOpenExecutingDetailModal(value, row?.originSql, row?.sessionId)}> + + onOpenExecutingDetailModal( + value, + row?.originSql, + row?.sessionId, + row?.traceEmptyReason, + ) + } + > {value} ) : ( diff --git a/src/page/Workspace/components/SQLResultSet/index.tsx b/src/page/Workspace/components/SQLResultSet/index.tsx index 3c333d813..1267e664d 100644 --- a/src/page/Workspace/components/SQLResultSet/index.tsx +++ b/src/page/Workspace/components/SQLResultSet/index.tsx @@ -38,6 +38,7 @@ import SQLResultLog from './SQLResultLog'; import DBPermissionTable from './DBPermissionTable'; import { IUnauthorizedDBResources } from '@/d.ts/table'; import { ProfileType } from '@/component/ExecuteSqlDetailModal/constant'; +import sessionManager from '@/store/sessionManager'; export const recordsTabKey = 'records'; export const sqlLintTabKey = 'sqlLint'; @@ -242,8 +243,13 @@ const SQLResultSet: React.FC = function (props) { const stopRunning = () => { sqlStore.stopExec(ctx.props.pageKey, ctx?.getSession()?.sessionId); }; - const onOpenExecutingDetailModal = (id: string, sql?: string, sessionId?: string) => { - const session = sessionId ? { sessionId: sessionId } : ctx?.getSession(); + const onOpenExecutingDetailModal = ( + id: string, + sql?: string, + sessionId?: string, + traceEmptyReason?: string, + ) => { + const session = sessionId ? sessionManager.sessionMap.get(sessionId) : ctx?.getSession(); modalStore.changeExecuteSqlDetailModalVisible( true, id, @@ -251,6 +257,7 @@ const SQLResultSet: React.FC = function (props) { session, ctx?.editor.getSelectionContent(), ProfileType.Execute, + traceEmptyReason, ); }; @@ -393,6 +400,7 @@ const SQLResultSet: React.FC = function (props) { isEditing={editingMap[set.uniqKey]} withFullLinkTrace={set?.withFullLinkTrace} traceEmptyReason={set?.traceEmptyReason} + withQueryProfile={set?.withQueryProfile} /> ), }; diff --git a/src/page/Workspace/components/Trace/TraceComp.tsx b/src/page/Workspace/components/Trace/TraceComponent.tsx similarity index 100% rename from src/page/Workspace/components/Trace/TraceComp.tsx rename to src/page/Workspace/components/Trace/TraceComponent.tsx diff --git a/src/page/Workspace/components/Trace/TraceTable.tsx b/src/page/Workspace/components/Trace/TraceTable.tsx index f27568815..6c64891bc 100644 --- a/src/page/Workspace/components/Trace/TraceTable.tsx +++ b/src/page/Workspace/components/Trace/TraceTable.tsx @@ -67,25 +67,25 @@ const TraceTable: React.FC<{
{ return ( diff --git a/src/store/modal.ts b/src/store/modal.ts index db2d7c63c..b31aa4888 100644 --- a/src/store/modal.ts +++ b/src/store/modal.ts @@ -431,6 +431,7 @@ export class ModalStore { session?: any; selectedSQL?: any; profileType?: ProfileType; + traceEmptyReason?: string; } = null; @action @@ -441,6 +442,7 @@ export class ModalStore { session?: any, selectedSQL?: any, profileType?: ProfileType, + traceEmptyReason?: string, ) { this.executeSqlDetailModalVisible = v; this.executeSqlDetailData = { @@ -449,6 +451,7 @@ export class ModalStore { session, selectedSQL: selectedSQL, profileType: profileType, + traceEmptyReason: traceEmptyReason, }; } diff --git a/src/store/sql/index.tsx b/src/store/sql/index.tsx index 7796f0213..d3d37b8c8 100644 --- a/src/store/sql/index.tsx +++ b/src/store/sql/index.tsx @@ -235,7 +235,7 @@ export class SQLStore { return { ...i, ...result, - isSupportProfile: isSupportProfile, + isSupportProfile: isSupportProfile && result?.withQueryProfile, sessionId, }; } else if (isExecutingSQLId) { @@ -290,6 +290,7 @@ export class SQLStore { connectionReset: false, checkViolations: [], withFullLinkTrace: false, + withQueryProfile: false, }; }); this.records = [ diff --git a/src/style/theme/white.less b/src/style/theme/white.less index 1633ce858..e53a98d93 100644 --- a/src/style/theme/white.less +++ b/src/style/theme/white.less @@ -144,7 +144,7 @@ --profile-secondry-background-color: var(--neutral-White100-color); --profile-border-color: var(--neutral-grey7-color); --profile-line-color: var(--neutral-grey7-color); - --profile-icon-color: var(--neutral-black45-color); + --profile-icon-color: var(--text-color-secondary); --profile-text-color: var(--neutral-black45-color); --profile-progress-primary-color: var(--progress-blue-color); --profile-progress-secondry-color: var(--progress-green-color);