mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-09-22 12:35:11 +08:00
style
This commit is contained in:
@ -2,6 +2,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 2px 20px;
|
padding: 2px 20px;
|
||||||
|
height: 42px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border-bottom: 1px solid var(--color-border-secondary);
|
border-bottom: 1px solid var(--color-border-secondary);
|
||||||
}
|
}
|
||||||
|
@ -152,6 +152,17 @@ function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
|
|||||||
}
|
}
|
||||||
}, [editorRef.current, isActive]);
|
}, [editorRef.current, isActive]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// 监听浏览器窗口大小变化,重新渲染编辑器
|
||||||
|
const resize = () => {
|
||||||
|
editorRef.current?.layout();
|
||||||
|
};
|
||||||
|
window.addEventListener('resize', resize);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('resize', resize);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
// 监听主题色变化切换编辑器主题色
|
// 监听主题色变化切换编辑器主题色
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (options?.theme) {
|
if (options?.theme) {
|
||||||
|
@ -8,10 +8,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ant-spin-container {
|
.ant-spin-container {
|
||||||
height: calc(100% - 48px);
|
height: calc(100% - 40px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.consoleEditor {
|
.consoleEditor {
|
||||||
@ -19,14 +18,17 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.consoleEditorWithChat {
|
.consoleEditorWithChat {
|
||||||
height: calc(100% - 56px);
|
height: calc(100% - 42px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.consoleOptionsWrapper {
|
.consoleOptionsWrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 8px;
|
bottom: 0px;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
height: 40px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
margin: 0 12px;
|
margin: 0 12px;
|
||||||
|
@ -4,9 +4,26 @@
|
|||||||
url('../../assets/font/iconfont.ttf') format('truetype');
|
url('../../assets/font/iconfont.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.iconBox {
|
||||||
|
height: var(--icon-box-size);
|
||||||
|
width: var(--icon-box-size);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-hover-bg);
|
||||||
|
.iconfont {
|
||||||
|
size: var(--icon-size);
|
||||||
|
color: var(--color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
font-family: 'iconfont' !important;
|
font-family: 'iconfont' !important;
|
||||||
font-size: 14px;
|
font-size: var(--icon-size);
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
|
@ -20,16 +20,43 @@ if (__ENV__ === 'local') {
|
|||||||
style.appendChild(document.createTextNode(container));
|
style.appendChild(document.createTextNode(container));
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Iconfont extends PureComponent<
|
interface IProps {
|
||||||
{
|
|
||||||
code: string;
|
code: string;
|
||||||
} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>
|
box?: boolean;
|
||||||
> {
|
boxSize?: number;
|
||||||
render() {
|
size?: number;
|
||||||
return (
|
className?: string;
|
||||||
<i {...this.props} className={classnames(this.props.className, styles.iconfont)}>
|
classNameBox?: string;
|
||||||
{this.props.code}
|
}
|
||||||
|
|
||||||
|
const Iconfont = (props: IProps) => {
|
||||||
|
const { box, boxSize = 32, size = 14, className, classNameBox, ...args } = props;
|
||||||
|
return box ? (
|
||||||
|
<div
|
||||||
|
{...args}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
'--icon-box-size': `${boxSize}px`,
|
||||||
|
'--icon-size': `${size}px`,
|
||||||
|
} as any
|
||||||
|
}
|
||||||
|
className={classnames(classNameBox, styles.iconBox)}
|
||||||
|
>
|
||||||
|
<i className={classnames(className, styles.iconfont)}>{props.code}</i>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<i
|
||||||
|
{...args}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
'--icon-size': `${size}px`,
|
||||||
|
} as any
|
||||||
|
}
|
||||||
|
className={classnames(className, styles.iconfont)}
|
||||||
|
>
|
||||||
|
{props.code}
|
||||||
</i>
|
</i>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
}
|
|
||||||
|
export default Iconfont;
|
||||||
|
@ -2,19 +2,15 @@ import React, { memo, useEffect } from 'react';
|
|||||||
import styles from './index.less';
|
import styles from './index.less';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { Table } from 'antd';
|
import { Table } from 'antd';
|
||||||
import historyService, { IGetHistoryListParams } from '@/service/history';
|
import historyService, { IHistoryRecord } from '@/service/history';
|
||||||
import { set } from 'lodash';
|
|
||||||
|
|
||||||
export interface IGetOutputParams extends IGetHistoryListParams {}
|
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
className?: string;
|
className?: string;
|
||||||
params: IGetOutputParams;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default memo<IProps>((props) => {
|
export default memo<IProps>((props) => {
|
||||||
const { className, params } = props;
|
const { className } = props;
|
||||||
const [dataSource, setDataSource] = React.useState<any[]>([]);
|
const [dataSource, setDataSource] = React.useState<IHistoryRecord[]>([]);
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@ -36,21 +32,32 @@ export default memo<IProps>((props) => {
|
|||||||
title: '数据库/schema',
|
title: '数据库/schema',
|
||||||
dataIndex: 'databaseName',
|
dataIndex: 'databaseName',
|
||||||
key: 'databaseName',
|
key: 'databaseName',
|
||||||
|
render: (value: string, record: IHistoryRecord) => {
|
||||||
|
return <span>{`${record.dataSourceName}/${record.databaseName}`}</span>;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'ddl',
|
||||||
|
dataIndex: 'ddl',
|
||||||
|
key: 'ddl',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '状态',
|
title: '状态',
|
||||||
dataIndex: 'state',
|
dataIndex: 'status',
|
||||||
key: 'state',
|
key: 'status',
|
||||||
|
render: (value: boolean) => {
|
||||||
|
return <span style={{ color: value ? 'green' : 'red' }}>{value ? '成功' : '失败'}</span>;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'sql',
|
title: '影响行数',
|
||||||
dataIndex: 'name',
|
dataIndex: 'operationRows',
|
||||||
key: 'name',
|
key: 'operationRows',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '执行耗时',
|
title: '执行耗时',
|
||||||
dataIndex: 'executionTime',
|
dataIndex: 'useTime',
|
||||||
key: 'executionTime',
|
key: 'useTime',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -59,7 +66,12 @@ export default memo<IProps>((props) => {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const getHistoryList = () => {
|
const getHistoryList = () => {
|
||||||
historyService.getHistoryList(params).then((res) => {
|
historyService
|
||||||
|
.getHistoryList({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 100,
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
setDataSource(res.data);
|
setDataSource(res.data);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
|
flex-shrink: 0;
|
||||||
background-color: var(--color-bg-base);
|
background-color: var(--color-bg-base);
|
||||||
border-bottom: 1px solid var(--color-border);
|
border-bottom: 1px solid var(--color-border);
|
||||||
&::-webkit-scrollbar {
|
&::-webkit-scrollbar {
|
||||||
|
@ -22,10 +22,10 @@ export const editorDefaultOptions: IEditorOptions = {
|
|||||||
scrollbar: { // 滚动条
|
scrollbar: { // 滚动条
|
||||||
alwaysConsumeMouseWheel: false, // 总是消耗鼠标滚轮
|
alwaysConsumeMouseWheel: false, // 总是消耗鼠标滚轮
|
||||||
},
|
},
|
||||||
padding: {
|
// padding: {
|
||||||
top: 2,
|
// top: 2,
|
||||||
bottom: 2,
|
// bottom: 2,
|
||||||
},
|
// },
|
||||||
minimap: { // 缩略图
|
minimap: { // 缩略图
|
||||||
enabled: false, // 启用
|
enabled: false, // 启用
|
||||||
},
|
},
|
||||||
|
@ -115,7 +115,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
i {
|
i {
|
||||||
margin-right: 4px;
|
margin-right: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ const TableList = dvaModel((props: any) => {
|
|||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
|
|
||||||
reader.onload = function (event) {
|
reader.onload = function (event) {
|
||||||
const sqlContent = event.target?.result ?? '';
|
const sqlContent = (event.target?.result ?? '') as string;
|
||||||
addConsole(sqlContent);
|
addConsole(sqlContent);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,17 +14,30 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.workspaceRightMain {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rightBar {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 38px;
|
||||||
|
border-left: 1px solid var(--color-border);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 10px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
.tabs {
|
.tabs {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabBox {
|
.tabBox {
|
||||||
position: absolute;
|
flex: 1;
|
||||||
top: 0;
|
width: 100%;
|
||||||
right: 0;
|
height: 100%;
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.activeConsoleBox {
|
.activeConsoleBox {
|
||||||
|
@ -337,6 +337,7 @@ const WorkspaceRight = memo<IProps>((props: IProps) => {
|
|||||||
registerIntelliSenseTable(data, databaseType, dataSourceId, databaseName, schemaName);
|
registerIntelliSenseTable(data, databaseType, dataSourceId, databaseName, schemaName);
|
||||||
registerIntelliSenseField(tableList.current, dataSourceId, databaseName, schemaName);
|
registerIntelliSenseField(tableList.current, dataSourceId, databaseName, schemaName);
|
||||||
});
|
});
|
||||||
|
console.log('getAllTable Before:', window._BaseURL);
|
||||||
}
|
}
|
||||||
}, [curWorkspaceParams.databaseType, curWorkspaceParams.databaseName, curWorkspaceParams.schemaName]);
|
}, [curWorkspaceParams.databaseType, curWorkspaceParams.databaseName, curWorkspaceParams.schemaName]);
|
||||||
|
|
||||||
@ -575,7 +576,7 @@ const WorkspaceRight = memo<IProps>((props: IProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classnames(styles.workspaceRight, className)}>
|
<div className={classnames(styles.workspaceRight, className)}>
|
||||||
<LoadingContent data={workspaceTabList} handleEmpty empty={renderEmpty()}>
|
<LoadingContent className={styles.workspaceRightMain} data={workspaceTabList} handleEmpty empty={renderEmpty()}>
|
||||||
<div className={styles.tabBox}>
|
<div className={styles.tabBox}>
|
||||||
<TabsNew
|
<TabsNew
|
||||||
className={styles.tabs}
|
className={styles.tabs}
|
||||||
@ -587,6 +588,14 @@ const WorkspaceRight = memo<IProps>((props: IProps) => {
|
|||||||
// lastTabCannotClosed
|
// lastTabCannotClosed
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className={styles.rightBar}>
|
||||||
|
<div className={styles.rightBarFront}>
|
||||||
|
<Iconfont code="" box size={16} />
|
||||||
|
</div>
|
||||||
|
<div className={styles.rightBarAfter}>
|
||||||
|
<Iconfont code="" box size={20} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</LoadingContent>
|
</LoadingContent>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { extend, ResponseError, type RequestOptionsInit } from 'umi-request';
|
import { extend, ResponseError, type RequestOptionsInit } from 'umi-request';
|
||||||
import { message } from 'antd';
|
import { message } from 'antd';
|
||||||
import { navigate } from '@/utils'
|
import { navigate } from '@/utils';
|
||||||
|
|
||||||
export type IErrorLevel = 'toast' | 'prompt' | 'critical' | false;
|
export type IErrorLevel = 'toast' | 'prompt' | 'critical' | false;
|
||||||
export interface IOptions {
|
export interface IOptions {
|
||||||
@ -127,11 +127,22 @@ request.interceptors.response.use(async (response) => {
|
|||||||
|
|
||||||
export default function createRequest<P = void, R = {}>(url: string, options?: IOptions) {
|
export default function createRequest<P = void, R = {}>(url: string, options?: IOptions) {
|
||||||
// 路由跳转
|
// 路由跳转
|
||||||
const { method = 'get', mock = false, errorLevel = 'toast', delayTime, outside, isFullPath, dynamicUrl } = options || {};
|
const {
|
||||||
|
method = 'get',
|
||||||
|
mock = false,
|
||||||
|
errorLevel = 'toast',
|
||||||
|
delayTime,
|
||||||
|
outside,
|
||||||
|
isFullPath,
|
||||||
|
dynamicUrl,
|
||||||
|
} = options || {};
|
||||||
|
|
||||||
|
return function (params: P, restParams?: RequestOptionsInit) {
|
||||||
// 是否需要mock
|
// 是否需要mock
|
||||||
const _baseURL = (mock ? mockUrl : baseURL) || '';
|
const _baseURL = (mock ? mockUrl : baseURL) || '';
|
||||||
return function (params: P, restParams?: RequestOptionsInit) {
|
// if (url === '/api/rdb/ddl/list') {
|
||||||
|
// debugger;
|
||||||
|
// }
|
||||||
// 在url上按照定义规则拼接params
|
// 在url上按照定义规则拼接params
|
||||||
const paramsInUrl: string[] = [];
|
const paramsInUrl: string[] = [];
|
||||||
|
|
||||||
|
@ -25,6 +25,61 @@ export interface IUpdateConsoleParams {
|
|||||||
id: number;
|
id: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IHistoryRecord {
|
||||||
|
/**
|
||||||
|
* 是否可连接
|
||||||
|
*/
|
||||||
|
connectable?: boolean | null;
|
||||||
|
/**
|
||||||
|
* DB名称
|
||||||
|
*/
|
||||||
|
databaseName?: null | string;
|
||||||
|
/**
|
||||||
|
* 数据源id
|
||||||
|
*/
|
||||||
|
dataSourceId?: number | null;
|
||||||
|
/**
|
||||||
|
* 数据源名称
|
||||||
|
*/
|
||||||
|
dataSourceName?: null | string;
|
||||||
|
/**
|
||||||
|
* ddl内容
|
||||||
|
*/
|
||||||
|
ddl?: null | string;
|
||||||
|
/**
|
||||||
|
* 扩展信息
|
||||||
|
*/
|
||||||
|
extendInfo?: null | string;
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
id?: number | null;
|
||||||
|
/**
|
||||||
|
* 文件别名
|
||||||
|
*/
|
||||||
|
name?: null | string;
|
||||||
|
/**
|
||||||
|
* 操作行数
|
||||||
|
*/
|
||||||
|
operationRows?: number | null;
|
||||||
|
/**
|
||||||
|
* schema名称
|
||||||
|
*/
|
||||||
|
schemaName?: null | string;
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
status?: null | string;
|
||||||
|
/**
|
||||||
|
* ddl语言类型
|
||||||
|
*/
|
||||||
|
type?: null | string;
|
||||||
|
/**
|
||||||
|
* 使用时长
|
||||||
|
*/
|
||||||
|
useTime?: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
const saveConsole = createRequest<ICreateConsole, number>('/api/operation/saved/create', { method: 'post' });
|
const saveConsole = createRequest<ICreateConsole, number>('/api/operation/saved/create', { method: 'post' });
|
||||||
|
|
||||||
// orderByDesc true 降序
|
// orderByDesc true 降序
|
||||||
|
@ -111,10 +111,19 @@ const updateTableExample = createRequest<{ dbType: DatabaseTypeCode }, string>('
|
|||||||
const exportCreateTableSql = createRequest<ITableParams, string>('/api/rdb/ddl/export', { method: 'get' });
|
const exportCreateTableSql = createRequest<ITableParams, string>('/api/rdb/ddl/export', { method: 'get' });
|
||||||
const executeTable = createRequest<IExecuteTableParams, string>('/api/rdb/ddl/execute', { method: 'post' });
|
const executeTable = createRequest<IExecuteTableParams, string>('/api/rdb/ddl/execute', { method: 'post' });
|
||||||
|
|
||||||
const getColumnList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/column_list', { method: 'get', delayTime: 200 });
|
const getColumnList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/column_list', {
|
||||||
const getIndexList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/index_list', { method: 'get', delayTime: 200 });
|
method: 'get',
|
||||||
|
delayTime: 200,
|
||||||
|
});
|
||||||
|
const getIndexList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/index_list', {
|
||||||
|
method: 'get',
|
||||||
|
delayTime: 200,
|
||||||
|
});
|
||||||
const getKeyList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/key_list', { method: 'get', delayTime: 200 });
|
const getKeyList = createRequest<ITableParams, IColumn[]>('/api/rdb/ddl/key_list', { method: 'get', delayTime: 200 });
|
||||||
const getSchemaList = createRequest<ISchemaParams, ISchemaResponse[]>('/api/rdb/ddl/schema_list', { method: 'get', delayTime: 200 });
|
const getSchemaList = createRequest<ISchemaParams, ISchemaResponse[]>('/api/rdb/ddl/schema_list', {
|
||||||
|
method: 'get',
|
||||||
|
delayTime: 200,
|
||||||
|
});
|
||||||
|
|
||||||
const getDatabaseSchemaList = createRequest<{ dataSourceId: number }, MetaSchemaVO>(
|
const getDatabaseSchemaList = createRequest<{ dataSourceId: number }, MetaSchemaVO>(
|
||||||
'/api/rdb/ddl/database_schema_list',
|
'/api/rdb/ddl/database_schema_list',
|
||||||
@ -239,7 +248,7 @@ const getTableDetails = createRequest<
|
|||||||
|
|
||||||
/** 获取库的所有表 */
|
/** 获取库的所有表 */
|
||||||
const getAllTableList = createRequest<
|
const getAllTableList = createRequest<
|
||||||
{ dataSourceId: number; databaseName: string; schemaName?: string | null },
|
{ dataSourceId: number; databaseName?: string | null; schemaName?: string | null },
|
||||||
Array<{ name: string; comment: string }>
|
Array<{ name: string; comment: string }>
|
||||||
>('/api/rdb/table/table_list', { method: 'get' });
|
>('/api/rdb/table/table_list', { method: 'get' });
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ const registerIntelliSenseTable = (
|
|||||||
tableList: Array<{ name: string; comment: string }>,
|
tableList: Array<{ name: string; comment: string }>,
|
||||||
databaseCode?: DatabaseTypeCode,
|
databaseCode?: DatabaseTypeCode,
|
||||||
dataSourceId?: number,
|
dataSourceId?: number,
|
||||||
databaseName?: string,
|
databaseName?: string | null,
|
||||||
schemaName?: string | null,
|
schemaName?: string | null,
|
||||||
) => {
|
) => {
|
||||||
monaco.editor.registerCommand('addFieldList', (_: any, ...args: any[]) => {
|
monaco.editor.registerCommand('addFieldList', (_: any, ...args: any[]) => {
|
||||||
@ -55,7 +55,7 @@ const registerIntelliSenseTable = (
|
|||||||
|
|
||||||
intelliSenseTable.dispose();
|
intelliSenseTable.dispose();
|
||||||
intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
|
intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
|
||||||
triggerCharacters: [' ', ],
|
triggerCharacters: [' '],
|
||||||
provideCompletionItems: (model, position) => {
|
provideCompletionItems: (model, position) => {
|
||||||
const lineContentUntilPosition = model.getValueInRange({
|
const lineContentUntilPosition = model.getValueInRange({
|
||||||
startLineNumber: position.lineNumber,
|
startLineNumber: position.lineNumber,
|
||||||
|
Reference in New Issue
Block a user