diff --git a/services/web/public/coffee/track-changes/DiffView.coffee b/services/web/public/coffee/track-changes/DiffView.coffee index 7fc95e77ba..bfa82923e6 100644 --- a/services/web/public/coffee/track-changes/DiffView.coffee +++ b/services/web/public/coffee/track-changes/DiffView.coffee @@ -20,6 +20,7 @@ define [ @insertMarkers() @insertNameTag() @insertMoreChangeLabels() + @bindToScrollEvents() @scrollToFirstChange() return @ @@ -43,7 +44,8 @@ define [ e.position = position @updateVisibleNames(e) - session.on "changeScrollTop", (e) => + bindToScrollEvents: () -> + @aceEditor.getSession().on "changeScrollTop", (e) => @updateMoreChangeLabels() getPlainDiffContent: () -> @@ -116,17 +118,23 @@ define [ @$ace.append(@$nameTagEl) insertMoreChangeLabels: () -> - @$changesBefore = $("
") - @$changesAfter = $("
") + @$changesBefore = $(" ") + @$changesAfter = $(" ") @$ace.append(@$changesBefore) @$ace.append(@$changesAfter) + @$changesBefore.on "click", () => + @gotoLastHiddenChangeBefore() + @$changesAfter.on "click", () => + @gotoFirstHiddenChangeAfter() @updateMoreChangeLabels() scrollToFirstChange: () -> - if @entries? and @entries[0]? - row = @entries[0].range.start.row - @aceEditor.gotoLine(0) - @aceEditor.gotoLine(row, 0, true) + @aceEditor.scrollToLine(0) + setTimeout () => + if @entries? and @entries[0]? + row = @entries[0].range.start.row + @aceEditor.scrollToLine(row, true, false) + , 10 _drawNameTag: (entry, position) -> @$nameTagEl.show() @@ -181,25 +189,40 @@ define [ updateMoreChangeLabels: () -> return if !@$changesBefore or !@$changesAfter - firstRow = @aceEditor.renderer.getFirstFullyVisibleRow() - lastRow = @aceEditor.renderer.getLastFullyVisibleRow() - changesBefore = 0 - changesAfter = 0 - for entry in @entries or [] - if entry.range.start.row < firstRow - changesBefore += 1 - if entry.range.end.row > lastRow - changesAfter += 1 - if changesBefore > 0 - @$changesBefore.find("span").text("#{changesBefore} more change#{if changesBefore > 1 then "s" else ""} above") - @$changesBefore.show() - else - @$changesBefore.hide() - if changesAfter > 0 - @$changesAfter.find("span").text("#{changesAfter} more change#{if changesAfter > 1 then "s" else ""} below") - @$changesAfter.show() - else - @$changesAfter.hide() + setTimeout () => + firstRow = @aceEditor.getFirstVisibleRow() + lastRow = @aceEditor.getLastVisibleRow() + changesBefore = 0 + changesAfter = 0 + @lastHiddenChangeBefore = null + @firstHiddenChangeAfter = null + for entry in @entries or [] + if entry.range.start.row < firstRow + changesBefore += 1 + @lastHiddenChangeBefore = entry + if entry.range.end.row > lastRow + changesAfter += 1 + @firstHiddenChangeAfter ||= entry + + if changesBefore > 0 + @$changesBefore.find("span").text("#{changesBefore} more change#{if changesBefore > 1 then "s" else ""} above") + @$changesBefore.show() + else + @$changesBefore.hide() + if changesAfter > 0 + @$changesAfter.find("span").text("#{changesAfter} more change#{if changesAfter > 1 then "s" else ""} below") + @$changesAfter.show() + else + @$changesAfter.hide() + , 100 + + gotoLastHiddenChangeBefore: () -> + return if !@lastHiddenChangeBefore + @aceEditor.scrollToLine(@lastHiddenChangeBefore.range.start.row, true, false) + + gotoFirstHiddenChangeAfter: () -> + return if !@firstHiddenChangeAfter + @aceEditor.scrollToLine(@firstHiddenChangeAfter.range.end.row, true, false) resize: () -> @aceEditor.resize()