diff --git a/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts b/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts index adbb6c8c64..8a6543a1c3 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts +++ b/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts @@ -77,10 +77,10 @@ export class NavigationTreeService { } getView(): IActiveView | null { - const context = this.selectedNodes[0]; - if (!context) { + if (!this.selectedNodes.length) { return null; } + const context = this.selectedNodes[0]; return { context, diff --git a/webapp/packages/core-extensions/src/ExtensionUtils.ts b/webapp/packages/core-extensions/src/ExtensionUtils.ts index 013e52a2be..e6d792f431 100644 --- a/webapp/packages/core-extensions/src/ExtensionUtils.ts +++ b/webapp/packages/core-extensions/src/ExtensionUtils.ts @@ -13,6 +13,7 @@ interface ExtensionExecutor { predicate: (extension: IExtension) => extension is T, action: (extension: T) => void ) => this; + has: (checker: (extension: IExtension) => boolean) => boolean; } export const ExtensionUtils = { @@ -29,6 +30,9 @@ export const ExtensionUtils = { } return this; }, + has(checker: (extension: IExtension) => boolean): boolean { + return extensions.some(extension => checker(extension)); + }, }; }, }; diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditorBootstrap.ts b/webapp/packages/plugin-sql-editor/src/SqlEditorBootstrap.ts index ae864d8e50..72926230d5 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditorBootstrap.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditorBootstrap.ts @@ -14,7 +14,7 @@ import { NavNode, ConnectionSchemaManagerService, isObjectCatalogProvider, isObjectSchemaProvider } from '@cloudbeaver/core-app'; -import { ConnectionsManagerService, isConnectionProvider } from '@cloudbeaver/core-connections'; +import { isConnectionProvider } from '@cloudbeaver/core-connections'; import { injectable } from '@cloudbeaver/core-di'; import { ContextMenuService, IMenuContext } from '@cloudbeaver/core-dialogs'; import { ExtensionUtils } from '@cloudbeaver/core-extensions'; @@ -27,11 +27,10 @@ export class SqlEditorBootstrap { constructor( private mainMenuService: MainMenuService, private contextMenuService: ContextMenuService, - private connectionsManagerService: ConnectionsManagerService, private sqlEditorNavigatorService: SqlEditorNavigatorService, private connectionSchemaManagerService: ConnectionSchemaManagerService, private activeViewService: ActiveViewService - ) {} + ) { } async bootstrap() { this.mainMenuService.registerRootItem( @@ -40,7 +39,7 @@ export class SqlEditorBootstrap { title: 'SQL', order: 2, onClick: this.openSQLEditor.bind(this), - isDisabled: () => !this.connectionsManagerService.hasAnyConnection(), + isDisabled: () => this.isSQLEntryDisabled(), } ); this.contextMenuService.addMenuItem(this.contextMenuService.getRootMenuToken(), { @@ -59,6 +58,14 @@ export class SqlEditorBootstrap { }); } + private isSQLEntryDisabled() { + const activeView = this.activeViewService.view; + if (activeView && ExtensionUtils.from(activeView.extensions).has(isConnectionProvider)) { + return false; + } + return !this.connectionSchemaManagerService.currentConnectionId; + } + private openSQLEditor() { let connectionId: string | undefined; let catalogId: string | undefined;