@@ -6,16 +6,22 @@ import IndexList, { IIndexListRef } from './IndexList';
66import ColumnList , { IColumnListRef } from './ColumnList' ;
77import BaseInfo , { IBaseInfoRef } from './BaseInfo' ;
88import sqlService , { IModifyTableSqlParams , IExecuteSqlParams } from '@/service/sql' ;
9- import MonacoEditor from '@/components/Console/MonacoEditor' ;
10- import { IEditTableInfo } from '@/typings' ;
9+ import MonacoEditor , { IExportRefFunction } from '@/components/Console/MonacoEditor' ;
10+ import { IEditTableInfo , IWorkspaceTab } from '@/typings' ;
11+ import { DatabaseTypeCode } from '@/constants' ;
1112import i18n from '@/i18n' ;
1213import lodash from 'lodash' ;
14+ import Iconfont from '@/components/Iconfont' ;
15+ import { formatSql } from '@/utils' ;
1316
1417interface IProps {
1518 dataSourceId : number ;
1619 databaseName : string ;
1720 schemaName : string | undefined ;
1821 tableName ?: string ;
22+ databaseType : DatabaseTypeCode ;
23+ changeTabDetails : ( data : IWorkspaceTab ) => void ;
24+ tabDetails : IWorkspaceTab ;
1925}
2026
2127interface ITabItem {
@@ -35,14 +41,17 @@ interface IContext extends IProps {
3541export const Context = createContext < IContext > ( { } as any ) ;
3642
3743export default memo ( ( props : IProps ) => {
38- const { databaseName, dataSourceId, tableName, schemaName } = props ;
44+ const { databaseName, dataSourceId, tableName, schemaName, changeTabDetails , tabDetails , databaseType } = props ;
3945 const [ tableDetails , setTableDetails ] = useState < IEditTableInfo > ( { } as any ) ;
4046 const [ oldTableDetails , setOldTableDetails ] = useState < IEditTableInfo > ( { } as any ) ;
41- const [ viewSqlModal , setViewSqlModal ] = useState < string | false > ( false ) ;
42- const [ newTableName , setNewTableName ] = useState < string | null | undefined > ( tableName ) ;
47+ const [ viewSqlModal , setViewSqlModal ] = useState < boolean > ( false ) ;
4348 const baseInfoRef = useRef < IBaseInfoRef > ( null ) ;
4449 const columnListRef = useRef < IColumnListRef > ( null ) ;
4550 const indexListRef = useRef < IIndexListRef > ( null ) ;
51+ const monacoEditorRef = useRef < IExportRefFunction > ( null ) ;
52+ const [ executeSqlResult , setExecuteSqlResult ] = useState < string | null > ( null ) ;
53+ const [ executeLoading , setExecuteLoading ] = useState < boolean > ( false ) ;
54+ const [ appendValue , setAppendValue ] = useState < string > ( '' ) ;
4655 const tabList = useMemo ( ( ) => {
4756 return [
4857 {
@@ -71,18 +80,24 @@ export default memo((props: IProps) => {
7180 setCurrentTab ( item ) ;
7281 }
7382
83+ useEffect ( ( ) => {
84+ if ( ! viewSqlModal ) {
85+ setExecuteSqlResult ( null ) ;
86+ }
87+ } , [ viewSqlModal ] ) ;
88+
7489 useEffect ( ( ) => {
7590 if ( tableName ) {
76- getTableDetails ( ) ;
91+ getTableDetails ( { } ) ;
7792 }
7893 } , [ ] ) ;
7994
80- const getTableDetails = ( ) => {
81- if ( ! newTableName ) return ;
95+ const getTableDetails = ( { tableNameProps } : { tableNameProps ?: string } ) => {
96+ if ( ! tableName ) return ;
8297 const params = {
8398 databaseName,
8499 dataSourceId,
85- tableName : newTableName ,
100+ tableName : tableNameProps || tableName ,
86101 schemaName,
87102 refresh : true ,
88103 } ;
@@ -110,29 +125,71 @@ export default memo((props: IProps) => {
110125 newTable,
111126 } ;
112127
113- if ( newTableName ) {
128+ if ( tableName ) {
114129 // params.tableName = tableName;
115130 params . oldTable = oldTableDetails ;
116131 }
117132 sqlService . getModifyTableSql ( params ) . then ( ( res ) => {
118- setNewTableName ( newTable . name ) ;
119- setViewSqlModal ( res ?. [ 0 ] . sql ) ;
133+ setViewSqlModal ( true ) ;
134+ setAppendValue ( res ?. [ 0 ] . sql ) ;
120135 } ) ;
121136 }
122137 }
123138
124139 const executeSql = ( ) => {
125140 const executeSQLParams : IExecuteSqlParams = {
126- sql : viewSqlModal || '' ,
141+ sql : monacoEditorRef . current ?. getAllContent ( ) || '' ,
127142 dataSourceId,
128143 databaseName,
129144 schemaName,
130145 } ;
146+ setExecuteLoading ( true ) ;
147+ sqlService
148+ . executeDDL ( executeSQLParams )
149+ . then ( ( res ) => {
150+ if ( res . success ) {
151+ setViewSqlModal ( false ) ;
152+ message . success ( i18n ( 'common.text.successfulExecution' ) ) ;
153+ const newTableName = baseInfoRef . current ?. getBaseInfo ( ) . name ;
154+ getTableDetails ( { tableNameProps : newTableName } ) ;
155+ if ( ! tableName ) {
156+ changeTabDetails ( {
157+ ...tabDetails ,
158+ title : `edit-${ newTableName } ` ,
159+ uniqueData : {
160+ ...( tabDetails . uniqueData || { } ) ,
161+ tableName : newTableName ,
162+ } ,
163+ } ) ;
164+ }
165+ } else {
166+ setExecuteSqlResult ( res . message ) ;
167+ }
168+ } )
169+ . finally ( ( ) => {
170+ setExecuteLoading ( false ) ;
171+ } ) ;
172+ } ;
131173
132- sqlService . executeSql ( executeSQLParams ) . then ( ( ) => {
133- message . success ( i18n ( 'common.text.successfulExecution' ) ) ;
134- getTableDetails ( ) ;
135- setViewSqlModal ( false ) ;
174+ //
175+ const renderMonacoEditor = useMemo ( ( ) => {
176+ return (
177+ < MonacoEditor
178+ className = { styles . monacoEditor }
179+ id = "view_sql"
180+ ref = { monacoEditorRef }
181+ appendValue = { {
182+ text : appendValue ,
183+ range : 'reset' ,
184+ } }
185+ />
186+ ) ;
187+ } , [ appendValue ] ) ;
188+
189+ const handleFormatSql = ( ) => {
190+ const sql = monacoEditorRef . current ?. getAllContent ( ) || '' ;
191+ formatSql ( sql , databaseType ) . then ( ( res ) => {
192+ setAppendValue ( res ) ;
136193 } ) ;
137194 } ;
138195
@@ -183,19 +240,32 @@ export default memo((props: IProps) => {
183240 onCancel = { ( ) => {
184241 setViewSqlModal ( false ) ;
185242 } }
186- okText = "执行"
187- onOk = { executeSql }
188243 width = "60vw"
189244 maskClosable = { false }
245+ footer = { false }
190246 >
191- < div className = { styles . monacoEditor } >
192- < MonacoEditor
193- id = "view_sql"
194- appendValue = { {
195- text : viewSqlModal ,
196- range : 'reset' ,
197- } }
198- />
247+ < div className = { styles . monacoEditorModal } >
248+ < div className = { styles . monacoEditorContent } >
249+ < div className = { styles . monacoEditorHeader } >
250+ < div className = { styles . formatButton } onClick = { handleFormatSql } >
251+ < Iconfont code = "" />
252+ { i18n ( 'common.button.format' ) }
253+ </ div >
254+ < Button className = { styles . executeButton } type = "primary" onClick = { executeSql } loading = { executeLoading } >
255+ < Iconfont code = "" />
256+ { i18n ( 'common.button.execute' ) }
257+ </ Button >
258+ </ div >
259+ { renderMonacoEditor }
260+ </ div >
261+ { executeSqlResult && (
262+ < div className = { styles . result } >
263+ < div className = { styles . resultHeader } > { i18n ( 'common.text.errorMessage' ) } </ div >
264+ < div className = { styles . resultContent } >
265+ < div className = { styles . errorMessage } > { executeSqlResult } </ div >
266+ </ div >
267+ </ div >
268+ ) }
199269 </ div >
200270 </ Modal >
201271 </ Context . Provider >
0 commit comments