diff --git a/webapp/packages/core-app/src/shared/NodesManager/ConnectionDialogsService.ts b/webapp/packages/core-app/src/shared/NodesManager/ConnectionDialogsService.ts index 518be18daf..006bf32a81 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/ConnectionDialogsService.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/ConnectionDialogsService.ts @@ -46,6 +46,7 @@ export class ConnectionDialogsService { order: 2, title: 'app_shared_connectionMenu_disconnect', onClick: () => this.connectionsManagerService.closeAllConnections(), + isDisabled: () => !this.connectionsManagerService.hasAnyConnection(true), } ); diff --git a/webapp/packages/core-connections/src/ConnectionsManagerService.ts b/webapp/packages/core-connections/src/ConnectionsManagerService.ts index aa3b499bb9..48184d2187 100644 --- a/webapp/packages/core-connections/src/ConnectionsManagerService.ts +++ b/webapp/packages/core-connections/src/ConnectionsManagerService.ts @@ -83,7 +83,10 @@ export class ConnectionsManagerService { await this.afterConnectionClose(id); } - hasAnyConnection(): boolean { + hasAnyConnection(connected?: boolean): boolean { + if (connected) { + return Array.from(this.connectionInfo.data.values()).some(connection => connection.connected); + } return !!Array.from(this.connectionInfo.data.values()).length; } diff --git a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts index e7b407f994..19259f3a40 100644 --- a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts +++ b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts @@ -99,6 +99,7 @@ export class AgGridTableController implements IInitializableController, IDestruc this.subscriptions.push(gridModel.tableDataModel.onRowsUpdate.subscribe(this.updateRows.bind(this))); this.subscriptions.push(gridModel.tableEditor.onRowsUpdate.subscribe(this.updateRows.bind(this))); + this.subscriptions.push(gridModel.tableEditor.onCancelChanges.subscribe(this.cancelEditing.bind(this))); this.subscriptions.push(gridModel.onChunkSizeChange.subscribe(this.changeChunkSize.bind(this))); this.subscriptions.push(gridModel.onReset.subscribe(this.resetData.bind(this))); } @@ -165,6 +166,12 @@ export class AgGridTableController implements IInitializableController, IDestruc return this.gridModel.isCellEdited(rowIndex, column); } + private cancelEditing() { + if (this.api) { + this.api.stopEditing(true); + } + } + private updateRows(rows: number[]) { if (this.api) { const updatedRows: RowNode[] = []; diff --git a/webapp/packages/plugin-data-viewer/src/TableViewer/TableDataModel/TableEditor.ts b/webapp/packages/plugin-data-viewer/src/TableViewer/TableDataModel/TableEditor.ts index 8d40659787..7502cb0691 100644 --- a/webapp/packages/plugin-data-viewer/src/TableViewer/TableDataModel/TableEditor.ts +++ b/webapp/packages/plugin-data-viewer/src/TableViewer/TableDataModel/TableEditor.ts @@ -18,13 +18,17 @@ import { TableRow, SomeTableRows } from './TableRow'; */ export class TableEditor { readonly onRowsUpdate: Observable + readonly onCancelChanges: Observable @observable private editedRows = new Map(); private rowsUpdateSubject: Subject + private cancelChangesSubject: Subject constructor(private dataModel: TableDataModel) { this.rowsUpdateSubject = new Subject(); + this.cancelChangesSubject = new Subject(); this.onRowsUpdate = this.rowsUpdateSubject.asObservable(); + this.onCancelChanges = this.cancelChangesSubject.asObservable(); } /** @@ -120,6 +124,7 @@ export class TableEditor { const rows = Array.from(this.editedRows.keys()); this.editedRows.clear(); if (!skipUpdate) { + this.cancelChangesSubject.next(null); this.rowsUpdateSubject.next(rows); } }