Просмотр исходного кода

Merge branch 'ja-review-panel' of github.com:sharelatex/web-sharelatex into ja-review-panel

Paulo Reis 10 лет назад
Родитель
Сommit
9a4ee0470a

+ 15 - 74
services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee

@@ -53,6 +53,9 @@ define [
 			
 			@$scope.$on "comment:unresolve", (e, comment_id) =>
 				@unresolveCommentId(comment_id)
+			
+			@$scope.$on "review-panel:recalculate-screen-positions", () =>
+				@recalculateReviewEntriesScreenPositions()
 
 			onChange = (e) =>
 				if !@editor.initing and @enabled
@@ -255,77 +258,15 @@ define [
 			op = @_aceChangeToShareJs(delta)
 			@changesTracker.applyOp(op, metadata)
 		
-		updateReviewEntriesScope: () ->
-			entries = @_getCurrentDocEntries()
-			
-			# Assume we'll delete everything until we see it, then we'll remove it from this object
-			delete_changes = {}
-			delete_changes[change_id] = true for change_id, change of entries
-
-			for change in @changesTracker.changes
-				delete delete_changes[change.id]
-				entries[change.id] ?= {}
-					
-				# Update in place to avoid a full DOM redraw via angular
-				metadata = {}
-				metadata[key] = value for key, value of change.metadata
-				new_entry = {
-					type: if change.op.i then "insert" else "delete"
-					content: change.op.i or change.op.d
-					offset: change.op.p
-					metadata: change.metadata
-				}
-				for key, value of new_entry
-					entries[change.id][key] = value
-
-			for comment in @changesTracker.comments
-				delete delete_changes[comment.id]
-				entries[comment.id] ?= {}
-				new_entry = {
-					type: "comment"
-					thread: comment.metadata.thread
-					resolved: comment.metadata.resolved
-					offset: comment.offset
-					length: comment.length
-				}
-				for key, value of new_entry
-					entries[comment.id][key] = value
-
-			for change_id, _ of delete_changes
-				delete entries[change_id]	
-			
-			@updateFocus()
-			@recalculateReviewEntriesScreenPositions()
-		
 		updateFocus: () ->
-			@updateEntryGeneration()
 			selection = @editor.getSelectionRange()
 			cursor_offset = @_aceRangeToShareJs(selection.start)
 			entries = @_getCurrentDocEntries()
-
-			if selection.start.column == selection.end.column and selection.start.row == selection.end.row
-				# No selection
-				delete entries["add-comment"]
-			else
-				entries["add-comment"] = {
-					type: "add-comment"
-					offset: cursor_offset
-				}
-
-			for id, entry of entries
-				if entry.type == "comment" and not entry.resolved
-					entry.focused = (entry.offset <= cursor_offset <= entry.offset + entry.length)
-				else if entry.type == "insert"
-					entry.focused = (entry.offset <= cursor_offset <= entry.offset + entry.content.length)
-				else if entry.type == "delete"
-					entry.focused = (entry.offset == cursor_offset)
-				else if entry.type == "add-comment" and !selection.isEmpty()
-					entry.focused = true
+			selection = !(selection.start.column == selection.end.column and selection.start.row == selection.end.row)
+			@$scope.$emit "editor:focus:changed", cursor_offset, selection
 		
-		updateEntryGeneration: () ->
-			# Rather than making angular deep watch the whole entries array
-			@$scope.reviewPanel.entryGeneration ?= 0
-			@$scope.reviewPanel.entryGeneration++
+		broadcastChange: () ->
+			@$scope.$emit "editor:track-changes:changed", @$scope.docId
 		
 		recalculateReviewEntriesScreenPositions: () ->
 			session = @editor.getSession()
@@ -376,7 +317,7 @@ define [
 			background_marker_id = session.addMarker background_range, "track-changes-marker track-changes-added-marker", "text"
 			callout_marker_id = @_createCalloutMarker(start, "track-changes-added-marker-callout")
 			@changeIdToMarkerIdMap[change.id] = { background_marker_id, callout_marker_id }
-			@updateReviewEntriesScope()
+			@broadcastChange()
 
 		_onDeleteAdded: (change) ->
 			position = @_shareJsOffsetToAcePosition(change.op.p)
@@ -391,7 +332,7 @@ define [
 
 			callout_marker_id = @_createCalloutMarker(position, "track-changes-deleted-marker-callout")
 			@changeIdToMarkerIdMap[change.id] = { background_marker_id, callout_marker_id }
-			@updateReviewEntriesScope()
+			@broadcastChange()
 		
 		_onInsertRemoved: (change) ->
 			{background_marker_id, callout_marker_id} = @changeIdToMarkerIdMap[change.id]
@@ -399,7 +340,7 @@ define [
 			session = @editor.getSession()
 			session.removeMarker background_marker_id
 			session.removeMarker callout_marker_id
-			@updateReviewEntriesScope()
+			@broadcastChange()
 		
 		_onDeleteRemoved: (change) ->
 			{background_marker_id, callout_marker_id} = @changeIdToMarkerIdMap[change.id]
@@ -407,7 +348,7 @@ define [
 			session = @editor.getSession()
 			session.removeMarker background_marker_id
 			session.removeMarker callout_marker_id
-			@updateReviewEntriesScope()
+			@broadcastChange()
 		
 		_onCommentAdded: (comment) ->
 			if !@changeIdToMarkerIdMap[comment.id]?
@@ -420,7 +361,7 @@ define [
 				background_marker_id = session.addMarker background_range, "track-changes-marker track-changes-comment-marker", "text"
 				callout_marker_id = @_createCalloutMarker(start, "track-changes-comment-marker-callout")
 				@changeIdToMarkerIdMap[comment.id] = { background_marker_id, callout_marker_id }
-			@updateReviewEntriesScope()
+			@broadcastChange()
 		
 		_onCommentRemoved: (comment) ->
 			if @changeIdToMarkerIdMap[comment.id]?
@@ -430,7 +371,7 @@ define [
 				session = @editor.getSession()
 				session.removeMarker background_marker_id
 				session.removeMarker callout_marker_id
-			@updateReviewEntriesScope()
+			@broadcastChange()
 
 		_aceRangeToShareJs: (range) ->
 			lines = @editor.getSession().getDocument().getLines 0, range.row
@@ -472,14 +413,14 @@ define [
 					end = start
 				@_updateMarker(change.id, start, end)
 			@editor.renderer.updateBackMarkers()
-			@updateReviewEntriesScope()
+			@broadcastChange()
 		
 		_onCommentMoved: (comment) ->
 			start = @_shareJsOffsetToAcePosition(comment.offset)
 			end = @_shareJsOffsetToAcePosition(comment.offset + comment.length)
 			@_updateMarker(comment.id, start, end)
 			@editor.renderer.updateBackMarkers()
-			@updateReviewEntriesScope()
+			@broadcastChange()
 	
 		_updateMarker: (change_id, start, end) ->
 			return if !@changeIdToMarkerIdMap[change_id]?

+ 84 - 3
services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee

@@ -26,6 +26,14 @@ define [
 
 		changesTrackers = {}
 
+		getDocEntries = (doc_id) ->
+			$scope.reviewPanel.entries[doc_id] ?= {}
+			return $scope.reviewPanel.entries[doc_id]
+
+		getChangeTracker = (doc_id) ->
+			changesTrackers[doc_id] ?= new ChangesTracker()
+			return changesTrackers[doc_id]
+
 		# TODO Just for prototyping purposes; remove afterwards.
 		mockedUserId = 'mock_user_id_1'
 		mockedUserId2 = 'mock_user_id_2'
@@ -107,11 +115,13 @@ define [
 			ide.$scope.$on "file-tree:initialized", () ->
 				ide.fileTreeManager.forEachEntity (entity) ->
 					if mock_changes[entity.name]?
-						changesTrackers[entity.id] ?= new ChangesTracker()
+						changesTracker = getChangeTracker(entity.id)
 						for change in mock_changes[entity.name].changes
-							changesTrackers[entity.id]._addOp change.op, change.metadata 
+							changesTracker._addOp change.op, change.metadata 
 						for comment in mock_changes[entity.name].comments
-							changesTrackers[entity.id].addComment comment.offset, comment.length, comment.metadata 
+							changesTracker.addComment comment.offset, comment.length, comment.metadata 
+						for doc_id, changesTracker of changesTrackers
+							updateEntries(doc_id)
 
 		scrollbar = {}
 		$scope.reviewPanelEventsBridge.on "aceScrollbarVisibilityChanged", (isVisible, scrollbarWidth) ->
@@ -155,6 +165,77 @@ define [
 				$scope.$broadcast "review-panel:toggle"
 				$scope.$broadcast "review-panel:layout"
 		
+		updateEntries = (doc_id) ->
+			changesTracker = getChangeTracker(doc_id)
+			entries = getDocEntries(doc_id)
+			
+			# Assume we'll delete everything until we see it, then we'll remove it from this object
+			delete_changes = {}
+			delete_changes[change_id] = true for change_id, change of entries
+
+			for change in changesTracker.changes
+				delete delete_changes[change.id]
+				entries[change.id] ?= {}
+					
+				# Update in place to avoid a full DOM redraw via angular
+				metadata = {}
+				metadata[key] = value for key, value of change.metadata
+				new_entry = {
+					type: if change.op.i then "insert" else "delete"
+					content: change.op.i or change.op.d
+					offset: change.op.p
+					metadata: change.metadata
+				}
+				for key, value of new_entry
+					entries[change.id][key] = value
+
+			for comment in changesTracker.comments
+				delete delete_changes[comment.id]
+				entries[comment.id] ?= {}
+				new_entry = {
+					type: "comment"
+					thread: comment.metadata.thread
+					resolved: comment.metadata.resolved
+					offset: comment.offset
+					length: comment.length
+				}
+				for key, value of new_entry
+					entries[comment.id][key] = value
+
+			for change_id, _ of delete_changes
+				delete entries[change_id]
+
+		$scope.$on "editor:track-changes:changed", () ->
+			doc_id = $scope.editor.open_doc_id
+			updateEntries(doc_id)
+			$scope.$broadcast "review-panel:recalculate-screen-positions"
+			$scope.$broadcast "review-panel:layout"
+		
+		$scope.$on "editor:focus:changed", (e, cursor_offset, selection) ->
+			doc_id = $scope.editor.open_doc_id
+			entries = getDocEntries(doc_id)
+
+			if !selection
+				delete entries["add-comment"]
+			else
+				entries["add-comment"] = {
+					type: "add-comment"
+					offset: cursor_offset
+				}
+			
+			for id, entry of entries
+				if entry.type == "comment" and not entry.resolved
+					entry.focused = (entry.offset <= cursor_offset <= entry.offset + entry.length)
+				else if entry.type == "insert"
+					entry.focused = (entry.offset <= cursor_offset <= entry.offset + entry.content.length)
+				else if entry.type == "delete"
+					entry.focused = (entry.offset == cursor_offset)
+				else if entry.type == "add-comment" and selection
+					entry.focused = true
+			
+			$scope.$broadcast "review-panel:recalculate-screen-positions"
+			$scope.$broadcast "review-panel:layout"
+		
 		$scope.acceptChange = (entry_id) ->
 			$scope.$broadcast "change:accept", entry_id
 		

+ 0 - 4
services/web/public/coffee/ide/review-panel/directives/reviewPanelSorted.coffee

@@ -81,10 +81,6 @@ define [
 				
 				scope.$applyAsync () ->
 					layout()
-
-				scope.$watch "reviewPanel.entryGeneration", (value) ->
-					scope.$applyAsync () ->
-						layout()
 				
 				scope.$on "review-panel:layout", () ->
 					scope.$applyAsync () ->