77 */
88import { observable } from 'mobx' ;
99import { observer } from 'mobx-react-lite' ;
10- import { useEffect } from 'react' ;
10+ import { useCallback , useEffect } from 'react' ;
1111import { compressToEncodedURIComponent } from 'lz-string' ;
1212
1313import { Button , IconOrImage , Placeholder , s , useErrorDetails , useObservableRef , useS , useStateDelay , useTranslate } from '@cloudbeaver/core-blocks' ;
@@ -20,7 +20,11 @@ import { DataViewerService } from '../DataViewerService.js';
2020import styles from './TableError.module.css' ;
2121import { ConnectionSchemaManagerService } from '@cloudbeaver/plugin-datasource-context-switch' ;
2222import { NavigationTabsService } from '@cloudbeaver/plugin-navigation-tabs' ;
23- import { SqlDataSourceService } from '@cloudbeaver/plugin-sql-editor' ;
23+ import { ConnectionInfoResource , createConnectionParam } from '@cloudbeaver/core-connections' ;
24+ import { CommonDialogService , DialogueStateResult } from '@cloudbeaver/core-dialogs' ;
25+ import { LocalStorageSqlDataSource , SqlDataSourceService } from '@cloudbeaver/plugin-sql-editor' ;
26+ import { isSQLEditorTab , SqlEditorNavigatorService } from '@cloudbeaver/plugin-sql-editor-navigation-tab' ;
27+ import { SqlEditorSessionClosedDialog } from './SqlEditorSessionClosedDialog.js' ;
2428
2529interface Props {
2630 model : IDatabaseDataModel ;
@@ -41,6 +45,9 @@ export const TableError = observer<Props>(function TableError({ model, loading,
4145 const connectionSchemaManagerService = useService ( ConnectionSchemaManagerService ) ;
4246 const sqlDataSourceService = useService ( SqlDataSourceService ) ;
4347 const navigationTabsService = useService ( NavigationTabsService ) ;
48+ const commonDialogService = useService ( CommonDialogService ) ;
49+ const sqlEditorNavigatorService = useService ( SqlEditorNavigatorService ) ;
50+ const connectionInfo = useService ( ConnectionInfoResource ) ;
4451
4552 const style = useS ( styles ) ;
4653 const dataViewerService = useService ( DataViewerService ) ;
@@ -113,6 +120,48 @@ export const TableError = observer<Props>(function TableError({ model, loading,
113120 }
114121 } , [ errorInfo , model . source . error ] ) ;
115122
123+ const handleReopenEditor = useCallback ( async ( ) => {
124+ const contextId = navigationTabsService . getView ( ) ?. context . id ?? '' ;
125+ const dataSource = sqlDataSourceService . get ( contextId ) ;
126+
127+ if ( dataSource ) {
128+ const query = dataSource . script || '' ;
129+ const shouldReopen = await commonDialogService . open ( SqlEditorSessionClosedDialog , { query } ) ;
130+ if ( shouldReopen === true || shouldReopen === DialogueStateResult . Resolved ) {
131+ const relatedTab = navigationTabsService . findTab ( isSQLEditorTab ( tab => tab . id === contextId ) ) ;
132+ if ( relatedTab ) {
133+ await navigationTabsService . closeTab ( relatedTab . id , true ) ;
134+
135+ const executionContext = dataSource ?. executionContext ;
136+
137+ if ( executionContext ) {
138+ const connection = executionContext
139+ ? connectionInfo . get ( createConnectionParam ( executionContext . projectId , executionContext . connectionId ) )
140+ : undefined ;
141+
142+ await sqlEditorNavigatorService . openNewEditor ( {
143+ dataSourceKey : LocalStorageSqlDataSource . key ,
144+ connectionKey : connection && createConnectionParam ( connection ) ,
145+ query : query ,
146+ } ) ;
147+ }
148+ }
149+ }
150+ }
151+ } , [ navigationTabsService , sqlDataSourceService , commonDialogService , connectionInfo , sqlEditorNavigatorService ] ) ;
152+
153+ useEffect ( ( ) => {
154+ const SQL_CONTEXT_ERROR_CODE = '508' ;
155+ if ( errorInfo . error !== model . source . error ) {
156+ errorInfo . error = model . source . error || null ;
157+ errorInfo . display = ! ! model . source . error ;
158+ }
159+ const isSqlContextError = error . errorCode === SQL_CONTEXT_ERROR_CODE || / S Q L c o n t e x t .* n o t f o u n d / i. test ( error . message || '' ) ;
160+ if ( isSqlContextError ) {
161+ handleReopenEditor ( ) ;
162+ }
163+ } , [ error . message , handleReopenEditor , model . source . error , errorInfo ] ) ;
164+
116165 return (
117166 < div
118167 role = "status"
0 commit comments