diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index d449dd1fb01f01ed920042e4f4115a865a086039..56f5fade812e9824e5e603d68a6bca03ce8a62c5 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -1223,6 +1223,11 @@ export interface CommentThreadChangedEvent { * Changed comment threads. */ readonly changed: CommentThread[]; + + /** + * changed draft mode. + */ + readonly draftMode: DraftMode; } /** diff --git a/src/vs/workbench/api/node/extHostComments.ts b/src/vs/workbench/api/node/extHostComments.ts index 31bfc4fd6dc0ff56216329f64d8a11034f8aed82..5f7945bf73e6d1b46e74df6fed3006982d89b261 100644 --- a/src/vs/workbench/api/node/extHostComments.ts +++ b/src/vs/workbench/api/node/extHostComments.ts @@ -180,7 +180,8 @@ export class ExtHostComments implements ExtHostCommentsShape { this._proxy.$onDidCommentThreadsChange(handle, { changed: event.changed.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)), added: event.added.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)), - removed: event.removed.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)) + removed: event.removed.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)), + draftMode: !!(provider as vscode.DocumentCommentProvider).startDraft && !!(provider as vscode.DocumentCommentProvider).finishDraft ? (event.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported }); }); } @@ -190,7 +191,7 @@ function convertCommentInfo(owner: number, provider: vscode.DocumentCommentProvi return { threads: vscodeCommentInfo.threads.map(x => convertToCommentThread(provider, x, commandsConverter)), commentingRanges: vscodeCommentInfo.commentingRanges ? vscodeCommentInfo.commentingRanges.map(range => extHostTypeConverter.Range.from(range)) : [], - draftMode: provider.startDraft ? (vscodeCommentInfo.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported + draftMode: provider.startDraft && provider.finishDraft ? (vscodeCommentInfo.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported }; } diff --git a/src/vs/workbench/parts/comments/electron-browser/commentNode.ts b/src/vs/workbench/parts/comments/electron-browser/commentNode.ts index 85e4f03c7d9df2e81281864e4a50e8e49c424f53..df6bd52ebed8efc2c020345cf3713c382b3fe436 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentNode.ts +++ b/src/vs/workbench/parts/comments/electron-browser/commentNode.ts @@ -46,6 +46,7 @@ export class CommentNode extends Disposable { private _commentEditorModel: ITextModel; private _updateCommentButton: Button; private _errorEditingContainer: HTMLElement; + private _isPendingLabel: HTMLElement; private _deleteAction: Action; private _onDidDelete = new Emitter(); @@ -99,9 +100,10 @@ export class CommentNode extends Disposable { const author = dom.append(header, dom.$('strong.author')); author.innerText = this.comment.userName; + this._isPendingLabel = dom.append(header, dom.$('span.isPending')); + if (this.comment.isDraft) { - const isPendingLabel = dom.append(header, dom.$('span.isPending')); - isPendingLabel.innerText = 'Pending'; + this._isPendingLabel.innerText = 'Pending'; } const actions: Action[] = []; @@ -281,6 +283,12 @@ export class CommentNode extends Disposable { this._body.appendChild(this._md); } + if (newComment.isDraft) { + this._isPendingLabel.innerText = 'Pending'; + } else { + this._isPendingLabel.innerText = ''; + } + this.comment = newComment; } diff --git a/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts b/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts index 021ac0f0fb895b47fc16dbf9bb2acd9784bcbc97..8dcd514262063ee85de07f11022a6e6cdd92d928 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts +++ b/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts @@ -71,6 +71,7 @@ export class ReviewZoneWidget extends ZoneWidget { private _globalToDispose: IDisposable[]; private _markdownRenderer: MarkdownRenderer; private _styleElement: HTMLStyleElement; + private _formActions: HTMLElement; private _error: HTMLElement; public get owner(): string { @@ -105,6 +106,7 @@ export class ReviewZoneWidget extends ZoneWidget { this._isCollapsed = commentThread.collapsibleState !== modes.CommentThreadCollapsibleState.Expanded; this._globalToDispose = []; this._localToDispose = []; + this._formActions = null; this.create(); this._styleElement = dom.createStyleSheet(this.domNode); @@ -262,6 +264,16 @@ export class ReviewZoneWidget extends ZoneWidget { this.createThreadLabel(); } + updateDraftMode(draftMode: modes.DraftMode) { + this._draftMode = draftMode; + + if (this._formActions) { + let model = this._commentEditor.getModel(); + dom.clearNode(this._formActions); + this.createCommentWidgetActions(this._formActions, model); + } + } + protected _doLayout(heightInPixel: number, widthInPixel: number): void { this._commentEditor.layout({ height: (this._commentEditor.hasWidgetFocus() ? 5 : 1) * 18, width: widthInPixel - 54 /* margin 20px * 10 + scrollbar 14px*/ }); } @@ -332,8 +344,8 @@ export class ReviewZoneWidget extends ZoneWidget { this._error = dom.append(this._commentForm, dom.$('.validation-error.hidden')); - const formActions = dom.append(this._commentForm, dom.$('.form-actions')); - this.createCommentWidgetActions(formActions, model); + this._formActions = dom.append(this._commentForm, dom.$('.form-actions')); + this.createCommentWidgetActions(this._formActions, model); this._resizeObserver = new MutationObserver(this._refresh.bind(this)); @@ -401,6 +413,8 @@ export class ReviewZoneWidget extends ZoneWidget { submitdraftButton.enabled = true; submitdraftButton.onDidClick(async () => { + let lineNumber = this._commentGlyph.getPosition().position.lineNumber; + await this.createComment(lineNumber); await this.commentService.finishDraft(this._owner); }); diff --git a/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts b/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts index 1ed89785369e9951f8f08c036861c529b9c07d26..77b4aba3c3be5f0a10b211d7d17ce5e8852666c7 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts +++ b/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts @@ -380,11 +380,13 @@ export class ReviewController implements IEditorContribution { return; } - let draftMode = commentInfo[0].draftMode; - let added = e.added.filter(thread => thread.resource.toString() === editorURI.toString()); let removed = e.removed.filter(thread => thread.resource.toString() === editorURI.toString()); let changed = e.changed.filter(thread => thread.resource.toString() === editorURI.toString()); + let draftMode = e.draftMode; + + commentInfo.forEach(info => info.draftMode = draftMode); + this._commentWidgets.filter(ZoneWidget => ZoneWidget.owner === e.owner).forEach(widget => widget.updateDraftMode(draftMode)); removed.forEach(thread => { let matchedZones = this._commentWidgets.filter(zoneWidget => zoneWidget.owner === e.owner && zoneWidget.commentThread.threadId === thread.threadId); @@ -408,6 +410,7 @@ export class ReviewController implements IEditorContribution { this._commentWidgets.push(zoneWidget); this._commentInfos.filter(info => info.owner === e.owner)[0].threads.push(thread); }); + })); this.beginCompute();