diff --git a/src/sql/workbench/contrib/notebook/browser/models/notebookTextFileModel.ts b/src/sql/workbench/contrib/notebook/browser/models/notebookTextFileModel.ts index 0ec6db9b01..4d9feb3f4d 100644 --- a/src/sql/workbench/contrib/notebook/browser/models/notebookTextFileModel.ts +++ b/src/sql/workbench/contrib/notebook/browser/models/notebookTextFileModel.ts @@ -129,28 +129,31 @@ export class NotebookTextFileModel { } public transformAndApplyEditForOutputUpdate(contentChange: NotebookContentChange, textEditorModel: ITextEditorModel): boolean { + this.transformAndApplyEditForClearOutput(contentChange, textEditorModel); if (Array.isArray(contentChange.cells[0].outputs) && contentChange.cells[0].outputs.length > 0) { - let newOutput = JSON.stringify(contentChange.cells[0].outputs[contentChange.cells[0].outputs.length - 1], undefined, ' '); - if (contentChange.cells[0].outputs.length > 1) { - newOutput = ', '.concat(newOutput); - } else { - newOutput = '\n'.concat(newOutput).concat('\n'); - } + for (let i = 0; i < contentChange.cells[0].outputs.length; i++) { + let newOutput = JSON.stringify(contentChange.cells[0].outputs[i], undefined, ' '); + if (i > 0) { + newOutput = ', '.concat(newOutput); + } else { + newOutput = '\n'.concat(newOutput).concat('\n'); + } - // Execution count will always be after the end of the outputs in JSON. This is a sanity mechanism. - let executionCountMatch = this.getExecutionCountRange(textEditorModel, contentChange.cells[0].cellGuid); - if (!executionCountMatch || !executionCountMatch.range) { - return false; - } + // Execution count will always be after the end of the outputs in JSON. This is a sanity mechanism. + let executionCountMatch = this.getExecutionCountRange(textEditorModel, contentChange.cells[0].cellGuid); + if (!executionCountMatch || !executionCountMatch.range) { + return false; + } - let endOutputsRange = this.getEndOfOutputs(textEditorModel, contentChange.cells[0].cellGuid); - if (endOutputsRange && endOutputsRange.startLineNumber < executionCountMatch.range.startLineNumber) { - textEditorModel.textEditorModel.applyEdits([{ - range: new Range(endOutputsRange.startLineNumber, endOutputsRange.startColumn, endOutputsRange.startLineNumber, endOutputsRange.startColumn), - text: newOutput - }]); - return true; + let endOutputsRange = this.getEndOfOutputs(textEditorModel, contentChange.cells[0].cellGuid); + if (endOutputsRange && endOutputsRange.startLineNumber < executionCountMatch.range.startLineNumber) { + textEditorModel.textEditorModel.applyEdits([{ + range: new Range(endOutputsRange.startLineNumber, endOutputsRange.startColumn, endOutputsRange.startLineNumber, endOutputsRange.startColumn), + text: newOutput + }]); + } } + return true; } return false; } diff --git a/src/sql/workbench/contrib/notebook/browser/outputs/gridOutput.component.ts b/src/sql/workbench/contrib/notebook/browser/outputs/gridOutput.component.ts index 41da62a7fb..95d3de2e65 100644 --- a/src/sql/workbench/contrib/notebook/browser/outputs/gridOutput.component.ts +++ b/src/sql/workbench/contrib/notebook/browser/outputs/gridOutput.component.ts @@ -392,6 +392,7 @@ export class DataResourceDataProvider implements IGridDataProvider { let rows = await this._queryRunner.getQueryRows(i, numRows, this._batchId, this._id); this.convertData(rows); } + this.cellModel.sendChangeToNotebook(NotebookChangeType.CellOutputUpdated); } private convertData(rows: ResultSetSubset): void { diff --git a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts index 5c0735c1d3..8e2fa2438f 100644 --- a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts +++ b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts @@ -693,9 +693,9 @@ suite('Notebook Editor Model', function (): void { assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(8), ' "source": ['); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(12), ' "azdata_cell_guid": "' + newCell.cellGuid + '"'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(14), ' "outputs": ['); - assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(23), ' }, {'); + assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(23), '}, {'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(31), '}'); - assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(32), ' ],'); + assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(32), '],'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(33), ' "execution_count": null'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(34), ' }'); @@ -734,7 +734,7 @@ suite('Notebook Editor Model', function (): void { assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(14), ' "outputs": ['); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(26), ' "text": "[0em"'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(27), '}'); - assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(28), ' ],'); + assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(28), '],'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(29), ' "execution_count": null'); assert.equal(notebookEditorModel.editorModel.textEditorModel.getLineContent(30), ' }');