diff --git a/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee b/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee index bb7193b5a7..f548cadde6 100644 --- a/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee +++ b/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee @@ -1,13 +1,21 @@ logger = require "logger-sharelatex" request = require "request" settings = require "settings-sharelatex" +AuthenticationController = require "../Authentication/AuthenticationController" module.exports = TrackChangesController = proxyToTrackChangesApi: (req, res, next = (error) ->) -> - url = settings.apis.trackchanges.url + req.url - logger.log url: url, "proxying to track-changes api" - getReq = request.get(url) - getReq.pipe(res) - getReq.on "error", (error) -> - logger.error err: error, "track-changes API error" - next(error) \ No newline at end of file + AuthenticationController.getLoggedInUserId req, (error, user_id) -> + return next(error) if error? + url = settings.apis.trackchanges.url + req.url + logger.log url: url, "proxying to track-changes api" + getReq = request( + url: url + method: req.method + headers: + "X-User-Id": user_id + ) + getReq.pipe(res) + getReq.on "error", (error) -> + logger.error err: error, "track-changes API error" + next(error) \ No newline at end of file diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 4c9f88b31a..46d702f13f 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -125,6 +125,7 @@ module.exports = class Router app.get "/project/:Project_id/doc/:doc_id/updates", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi app.get "/project/:Project_id/doc/:doc_id/diff", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi + app.post "/project/:Project_id/doc/:doc_id/version/:version_id/restore", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi app.post '/project/:project_id/leave', AuthenticationController.requireLogin(), CollaboratorsController.removeSelfFromProject app.get '/project/:Project_id/collaborators', SecutiryManager.requestCanAccessProject(allow_auth_token: true), CollaboratorsController.getCollaborators diff --git a/services/web/app/views/templates.jade b/services/web/app/views/templates.jade index ca7c07fa78..04b152dbf5 100644 --- a/services/web/app/views/templates.jade +++ b/services/web/app/views/templates.jade @@ -140,8 +140,7 @@ button.btn.btn-primary ok script(type="text/template")#genericModalButtonTemplate - a(href="#",class="btn {{ class }}") {{ text }} - + button(class="btn {{ class }}") {{ text }} script(type="text/template")#editorPanelTemplate #editorArea(style='display: none;') @@ -440,10 +439,16 @@ input(type="radio",name="toVersion").change-selector-to div(class='change-description') - div(class='change-date') {{date}} - div(class='change-name') - div.color-square(style="background-color: hsl({{hue}}, 100%, 70%);") - span {{name}} + div(class='change-date') {{date}} + div {{{users}}} + + div(class='restore') + a(href="#") Restore to here + + script(type='text/template')#changeListItemUserTemplate + div(class='change-name') + div.color-square(style="background-color: hsl({{hue}}, 100%, 70%);") + span {{name}} script(type='text/template')#changeListTemplate ul.change-list.nav.nav-pills.nav-stacked diff --git a/services/web/public/coffee/editor/Editor.coffee b/services/web/public/coffee/editor/Editor.coffee index 7c86598ad6..d4313fe6eb 100644 --- a/services/web/public/coffee/editor/Editor.coffee +++ b/services/web/public/coffee/editor/Editor.coffee @@ -224,7 +224,7 @@ define [ document.on "externalUpdate", () => Modal.createModal title: "Document Updated Externally" - message: "This document was just updated externally (probably via Dropbox). Any recent changes you have made may have been overwritten. To see previous versions please look in the history." + message: "This document was just updated externally. Any recent changes you have made may have been overwritten. To see previous versions please look in the history." buttons:[ text: "Ok" ] diff --git a/services/web/public/coffee/file-tree/FileTreeManager.coffee b/services/web/public/coffee/file-tree/FileTreeManager.coffee index 6d7364dd02..6526d91dad 100644 --- a/services/web/public/coffee/file-tree/FileTreeManager.coffee +++ b/services/web/public/coffee/file-tree/FileTreeManager.coffee @@ -144,6 +144,11 @@ define [ # it's not the root folder so keep going path = entity.get("name") + "/" + path return path + + getNameOfEntityId: (entity_id) -> + entity = @getEntity(entity_id) + return if !entity? + return entity.get("name") # RENAMING renameSelected: () -> diff --git a/services/web/public/coffee/models/User.coffee b/services/web/public/coffee/models/User.coffee index 1e101bee34..f83df16139 100644 --- a/services/web/public/coffee/models/User.coffee +++ b/services/web/public/coffee/models/User.coffee @@ -49,4 +49,7 @@ define [ find: (id) -> @loadedModel ||= {} return @loadedModel[id] + + getAnonymousUser: () -> + return User.findOrBuild("anonymous", { first_name: "Anonymous", email: "anon@sharelatex.com" }) } diff --git a/services/web/public/coffee/pdf/PdfManager.coffee b/services/web/public/coffee/pdf/PdfManager.coffee index ee98a1b179..8315a6a311 100644 --- a/services/web/public/coffee/pdf/PdfManager.coffee +++ b/services/web/public/coffee/pdf/PdfManager.coffee @@ -143,7 +143,6 @@ define [ @view.showLog() if outputFiles? - console.log "outputFiles", outputFiles @view.showOutputFileDownloadLinks(outputFiles) fetchLogAndUpdateView: (pdfExists) -> diff --git a/services/web/public/coffee/track-changes/ChangeListView.coffee b/services/web/public/coffee/track-changes/ChangeListView.coffee index 6456e912b4..ac8e918622 100644 --- a/services/web/public/coffee/track-changes/ChangeListView.coffee +++ b/services/web/public/coffee/track-changes/ChangeListView.coffee @@ -7,7 +7,7 @@ define [ template: $("#changeListTemplate").html() events: - "scroll" : "loadUntilFull" + "scroll" : () -> @loadUntilFull() initialize: () -> @itemViews = [] @@ -39,20 +39,13 @@ define [ view.$el.insertBefore(elementAtIndex) view.on "click", (e, v) => - @selectedToIndex = index - @selectedFromIndex = index - @resetAllSelectors() - @triggerChangeDiff() + @setSelectionRange(index, index) view.on "selected:to", (e, v) => - @selectedToIndex = index - @resetAllSelectors() - @triggerChangeDiff() + @setSelectionRange(@selectedFromIndex, index) view.on "selected:from", (e, v) => - @selectedFromIndex = index - @resetAllSelectors() - @triggerChangeDiff() + @setSelectionRange(index, @selectedToIndex) view.on "mouseenter:to", (e) => @hoverToIndex = index @@ -70,18 +63,27 @@ define [ delete @hoverFromIndex @resetHoverStates() + view.on "click:restore", (e) => + @trigger "restore", view.model + view.resetSelector(index, @selectedFromIndex, @selectedToIndex) + setSelectionRange: (fromIndex, toIndex) -> + @selectedFromIndex = fromIndex + @selectedToIndex = toIndex + @resetAllSelectors() + @triggerChangeDiff() + resetAllSelectors: () -> for view, i in @itemViews view.resetSelector(i, @selectedFromIndex, @selectedToIndex) resetHoverStates: () -> - if @hoverToIndex? + if @hoverToIndex? and @hoverToIndex != @selectedToIndex @$("ul").addClass("hover-state") for view, i in @itemViews view.resetHoverState(i, @selectedFromIndex, @hoverToIndex) - else if @hoverFromIndex? + else if @hoverFromIndex? and @hoverFromIndex != @selectedFromIndex @$("ul").addClass("hover-state") for view, i in @itemViews view.resetHoverState(i, @hoverFromIndex, @selectedToIndex) @@ -99,23 +101,23 @@ define [ atEndOfListView: -> @$el.scrollTop() + @$el.height() >= @$(".change-list").height() - 30 - loadUntilFull: (e, callback) -> + loadUntilFull: (callback = (error) ->) -> if (@listShorterThanContainer() or @atEndOfListView()) and not @atEndOfCollection and not @loading @showLoading() @hideEmptyMessage() @collection.fetchNextBatch - error: => + error: (error) => @hideLoading() @showEmptyMessageIfCollectionEmpty() - callback() if callback? + callback(error) success: (collection, response) => @hideLoading() if response.updates.length == @collection.batchSize - @loadUntilFull(e, callback) + @loadUntilFull(callback) else @atEndOfCollection = true @showEmptyMessageIfCollectionEmpty() - callback() if callback? + callback() else callback() if callback? @@ -152,26 +154,29 @@ define [ @trigger "mouseenter:from", args... "mouseleave .change-selector-from": (args...) -> @trigger "mouseleave:from", args... + "click .restore a": "onRestoreClick" - template : $("#changeListItemTemplate").html() + templates: + item: $("#changeListItemTemplate").html() + user: $("#changeListItemUserTemplate").html() initialize: -> @render() render: -> - @$el.html Mustache.to_html(@template, @modelView()) - return this - - modelView: -> - modelView = { - hue: @model.get("user").hue() + userHtml = for user in @model.get("users") + Mustache.to_html @templates.user, { + hue: user.hue() + name: user.name() + } + data = { date: moment(parseInt(@model.get("end_ts"), 10)).calendar() - name: @model.get("user").name() + users: userHtml.join("") } - # modelView.start_ts = util.formatDate(modelView.start_ts) - # modelView.end_ts = util.formatDate(modelView.end_ts) - return modelView + + @$el.html Mustache.to_html(@templates.item, data) + return this onClick: (e) -> e.preventDefault() @@ -183,6 +188,10 @@ define [ onFromSelectorClick: (e) -> @trigger "selected:from", e, @ + onRestoreClick: (e) -> + e.preventDefault() + @trigger "click:restore", e, @ + isSelectedFrom: () -> @$(".change-selector-from").is(":checked") diff --git a/services/web/public/coffee/track-changes/DiffView.coffee b/services/web/public/coffee/track-changes/DiffView.coffee index 9c433b24d2..396de3de67 100644 --- a/services/web/public/coffee/track-changes/DiffView.coffee +++ b/services/web/public/coffee/track-changes/DiffView.coffee @@ -2,8 +2,9 @@ define [ "ace/ace" "ace/mode/latex" "ace/range" + "moment" "libs/backbone" -], (Ace, LatexMode, Range)-> +], (Ace, LatexMode, Range, moment)-> DiffView = Backbone.View.extend initialize: () -> @model.on "change:diff", () => @render() @@ -19,6 +20,7 @@ define [ session.setMode(new LatexMode.Mode()) session.setUseWrapMode(true) @insertMarkers() + @insertNameTag() return @ createAceEditor: () -> @@ -44,6 +46,7 @@ define [ insertMarkers: () -> row = 0 column = 0 + @entries = [] for entry, i in @model.get("diff") or [] content = entry.u or entry.i or entry.d content ||= "" @@ -62,9 +65,12 @@ define [ range = new Range.Range( startRow, startColumn, endRow, endColumn ) - @addMarker(range, "change-marker-#{i}", entry) + entry.range = range + @addMarker(range, entry) + if entry.i? or entry.d? + @entries.push entry - addMarker: (range, id, entry) -> + addMarker: (range, entry) -> session = @aceEditor.getSession() markerBackLayer = @aceEditor.renderer.$markerBack markerFrontLayer = @aceEditor.renderer.$markerFront @@ -72,10 +78,9 @@ define [ if entry.i? or entry.d? hue = entry.meta.user.hue() if entry.i? - @_addMarkerWithCustomStyle session, markerBackLayer, range, "deleted-change-background", false, """ + @_addMarkerWithCustomStyle session, markerBackLayer, range, "inserted-change-background", false, """ background-color : hsl(#{hue}, 70%, 85%); """ - tag = "Added by #{entry.meta.user.name()}" if entry.d? @_addMarkerWithCustomStyle session, markerBackLayer, range, "deleted-change-background", false, """ background-color : hsl(#{hue}, 70%, 95%); @@ -84,13 +89,6 @@ define [ height: #{Math.round(lineHeight/2) - 1}px; border-bottom: 2px solid hsl(#{hue}, 70%, 40%); """ - tag = "Deleted by #{entry.meta.user.name()}" - - date = moment(parseInt(entry.meta.end_ts, 10)).format("Do MMM YYYY, h:mm:ss a") - tag += " on #{date}" - @_addNameTag session, id, range, tag, """ - background-color : hsl(#{hue}, 70%, 95%); - """ _addMarkerWithCustomStyle: (session, markerLayer, range, klass, foreground, style) -> session.addMarker range, klass, (html, range, left, top, config) -> @@ -100,42 +98,65 @@ define [ markerLayer.drawSingleLineMarker(html, range, "#{klass} ace_start", config, 0, style) , foreground - _addNameTag: (session, id, range, content, style) -> - @nameMarkers ||= [] - @nameMarkers.push - range: range - id: id - startRange = new Range.Range( - range.start.row, range.start.column - range.start.row, range.start.column + 1 - ) - session.addMarker startRange, "change-name-marker", (html, range, left, top, config) -> - html.push """ -