Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/d.ts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ export interface IUserConfig {
// 系统配置
export interface ISystemConfig {
'odc.data.export.enabled': string;
'odc.data.result-set.copy.enabled': string;
[key: string]: string;
}

Expand Down
12 changes: 9 additions & 3 deletions src/page/Workspace/components/DDLResultSet/ColumnModeModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ import React, {
useMemo,
useRef
} from 'react';
import { inject, observer } from 'mobx-react';

import type { ResultSetColumn } from '@/d.ts';
import type { SettingStore } from '@/store/setting';
import { LeftSquareOutlined, RightSquareOutlined } from '@ant-design/icons';
import type {
DataGridRef,
Expand All @@ -47,6 +49,7 @@ interface IProps {
total: number;
onClose: () => void;
setSelectedRowIndex: (rowIdx: number) => void;
settingStore?: SettingStore;
}

interface DataInColumnMode extends RowType {
Expand Down Expand Up @@ -80,7 +83,8 @@ const ColumnModeModal: React.FC<IProps> = function (props) {
total,
currentIdx,
setSelectedRowIndex,
onClose
onClose,
settingStore
} = props;

const resultContext = useContext(ResultContext);
Expand Down Expand Up @@ -190,7 +194,9 @@ const ColumnModeModal: React.FC<IProps> = function (props) {
enableColumnRecord={false}
enableRowRecord={false}
readonly={true}
onCopy={handleForbidCopy}
onCopy={
settingStore?.enableResultSetCopy ? undefined : handleForbidCopy
}
contextMenuRender={ResultSetContextMenu}
/>
</ResultContext.Provider>
Expand Down Expand Up @@ -246,4 +252,4 @@ const ColumnModeModal: React.FC<IProps> = function (props) {
);
};

export default ColumnModeModal;
export default inject('settingStore')(observer(ColumnModeModal));
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import type {
ContextMenuConfig,
ContextMenuRenderProps
} from '@oceanbase-odc/ob-react-data-grid/lib/types';
import settingStore from '@/store/setting';
import { Menu } from 'antd';
import React, { useContext, useEffect, useMemo } from 'react';
import ResultContext from './ResultContext';
Expand Down Expand Up @@ -79,15 +80,25 @@ function ResultSetContextMenu<R>(props: ContextMenuRenderProps<R>) {
setContextMenuVisible(false);
};

// 与格子复制共用 enableResultSetCopy:开态允许行选中/多行渲染 isShowRowSelected(clipMenu)
const enableResultSetCopy = settingStore.enableResultSetCopy;

const menuItems = useMemo(() => {
if (isSelectMultiRow) {
return [];
}
if (isRowSelected && !isEditing) {
if (
!enableResultSetCopy &&
(isSelectMultiRow || (isRowSelected && !isEditing))
) {
return [];
}
return renderConfigMenuItems(visibleConfig, row, closeMenu);
}, [isSelectMultiRow, isRowSelected, isEditing, visibleConfig, row]);
}, [
enableResultSetCopy,
isSelectMultiRow,
isRowSelected,
isEditing,
visibleConfig,
row
]);

useEffect(() => {
if (!menuItems.length) {
Expand Down
88 changes: 84 additions & 4 deletions src/page/Workspace/components/DDLResultSet/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ import Icon, {
VerticalRightOutlined
} from '@ant-design/icons';
import type { DataGridRef } from '@oceanbase-odc/ob-react-data-grid';
import {
defaultOnCopy,
defaultOnCopyCsv
} from '@oceanbase-odc/ob-react-data-grid';
import type { CalculatedColumn } from '@oceanbase-odc/ob-react-data-grid/lib/types';
import { useControllableValue, useUpdate } from 'ahooks';
import {
Expand Down Expand Up @@ -105,6 +109,7 @@ import styles from './index.less';
import ResultContext from './ResultContext';
import ResultSetContextMenu from './ResultSetContextMenu';
import StatusBar from './StatusBar';
import { copyToSQL, getColumnNameByColumnKey } from './util';
import Sync from './Sync';
import {
BasicInputNumber,
Expand Down Expand Up @@ -512,16 +517,80 @@ const DDLResultSet: React.FC<IProps> = function (props) {
selectedRange?.columnIdx === selectedRange?.endColumnIdx &&
selectedRange?.rowIdx === selectedRange?.endRowIdx;
const tableColumns: Partial<ITableColumn>[] = table?.columns;
const columnName = getColumnNameByColumnKey(columnKey, columns);
const column: Partial<ResultSetColumn> = columns?.find((column) => {
return column?.key === columnKey;
});
const isMasked = column?.masked;
const isSelectedRow = !!gridRef.current?.selectedRows?.size;
const enableCopy = settingStore.enableResultSetCopy;
const clipMenu = enableCopy
? {
key: 'clip',
text: formatMessage({
id: 'odc.components.DDLResultSet.OutputToShearPlate',
defaultMessage: '输出到剪切板'
}),
isShowRowSelected: true,
// 输出到剪切板
children: [
{
key: 'clip-sql',
text: 'SQL',
// SQL 文件
onClick: clipSQL
},
{
key: 'clip-csv',
text: 'CSV',
// CSV 文件
onClick: clipCsv
}
]
}
: null;
function copy() {
defaultOnCopy(gridRef.current);
}
function clipSQL() {
if (!tableColumns || (!columnName && !isSelectedRow)) {
copyToSQL(
gridRef.current,
columns,
undefined,
session?.connection?.dialectType,
rows
);
} else {
copyToSQL(
gridRef.current,
columns,
table?.tableName,
session?.connection?.dialectType,
rows
);
}
}
function clipCsv() {
defaultOnCopyCsv(gridRef.current);
}
if (isSelectedRow) {
return [];
return [clipMenu].filter(Boolean);
}
if (!tableColumns) {
return [];
return enableCopy
? [
{
key: 'copy',
text: formatMessage({
id: 'odc.components.ConnectionCardList.Copy',
defaultMessage: '复制'
}),
onClick: copy
},
clipMenu
].filter(Boolean)
: [];
}
if (!column) {
return [];
Expand All @@ -534,6 +603,15 @@ const DDLResultSet: React.FC<IProps> = function (props) {
settingStore.enableDataExport &&
!isMasked;
return [
enableCopy && {
key: 'copy',
text: formatMessage({
id: 'odc.components.ConnectionCardList.Copy',
defaultMessage: '复制'
}),
onClick: copy
},
clipMenu,
isEditing &&
isSingleSelected && {
key: 'setnull',
Expand Down Expand Up @@ -642,7 +720,7 @@ const DDLResultSet: React.FC<IProps> = function (props) {
}
].filter(Boolean);
},
[table, columns, isEditing, gridRef, downloadObjectData, rows, sessionId]
[table, columns, isEditing, gridRef, downloadObjectData, rows, sessionId, session, settingStore]
);
const getContextMenuConfig = useCallback(
function (row: any, column: CalculatedColumn<any, any>) {
Expand Down Expand Up @@ -1425,7 +1503,9 @@ const DDLResultSet: React.FC<IProps> = function (props) {
contextMenuRender={ResultSetContextMenu}
enableFrozenRow={true}
pasteFormatter={pasteFormatter}
onCopy={handleForbidCopy}
onCopy={
settingStore.enableResultSetCopy ? undefined : handleForbidCopy
}
/>
<ColumnModeModal
visible={showColumnMode}
Expand Down
8 changes: 8 additions & 0 deletions src/store/setting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ export class SettingStore {
@observable
public enableDataExport: boolean = false;

/**
* 是否允许 SQL 工作台结果集直接复制及输出为 INSERT/CSV
*/
@observable
public enableResultSetCopy: boolean = false;

/**
* 多库变更
*/
Expand Down Expand Up @@ -411,6 +417,8 @@ export class SettingStore {
Number.MAX_SAFE_INTEGER;
this.enableDataExport =
res?.['odc.data.export.enabled'] === 'true' || false;
this.enableResultSetCopy =
res?.['odc.data.result-set.copy.enabled'] === 'true' || false;
this.enableOBClient =
res?.['odc.features.obclient.enabled'] === 'true' && !isMacClient;
this.maxResultSetRows =
Expand Down