mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Sync track changes state between sessions and client
This commit is contained in:
parent
85c613e161
commit
f31fa98679
10 changed files with 42 additions and 7 deletions
|
@ -201,7 +201,7 @@ module.exports = ProjectController =
|
||||||
|
|
||||||
async.parallel {
|
async.parallel {
|
||||||
project: (cb)->
|
project: (cb)->
|
||||||
ProjectGetter.getProject project_id, { name: 1, lastUpdated: 1}, cb
|
ProjectGetter.getProject project_id, { name: 1, lastUpdated: 1, track_changes: 1 }, cb
|
||||||
user: (cb)->
|
user: (cb)->
|
||||||
if !user_id?
|
if !user_id?
|
||||||
cb null, defaultSettingsForAnonymousUser(user_id)
|
cb null, defaultSettingsForAnonymousUser(user_id)
|
||||||
|
@ -267,6 +267,7 @@ module.exports = ProjectController =
|
||||||
pdfViewer : user.ace.pdfViewer
|
pdfViewer : user.ace.pdfViewer
|
||||||
syntaxValidation: user.ace.syntaxValidation
|
syntaxValidation: user.ace.syntaxValidation
|
||||||
}
|
}
|
||||||
|
trackChangesEnabled: !!project.track_changes
|
||||||
privilegeLevel: privilegeLevel
|
privilegeLevel: privilegeLevel
|
||||||
chatUrl: Settings.apis.chat.url
|
chatUrl: Settings.apis.chat.url
|
||||||
anonymous: anonymous
|
anonymous: anonymous
|
||||||
|
|
|
@ -3,6 +3,7 @@ logger = require "logger-sharelatex"
|
||||||
UserInfoController = require "../User/UserInfoController"
|
UserInfoController = require "../User/UserInfoController"
|
||||||
DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler"
|
DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler"
|
||||||
EditorRealTimeController = require("../Editor/EditorRealTimeController")
|
EditorRealTimeController = require("../Editor/EditorRealTimeController")
|
||||||
|
TrackChangesManager = require "./TrackChangesManager"
|
||||||
|
|
||||||
module.exports = TrackChangesController =
|
module.exports = TrackChangesController =
|
||||||
getAllRanges: (req, res, next) ->
|
getAllRanges: (req, res, next) ->
|
||||||
|
@ -29,3 +30,11 @@ module.exports = TrackChangesController =
|
||||||
EditorRealTimeController.emitToRoom project_id, "accept-change", doc_id, change_id, (err)->
|
EditorRealTimeController.emitToRoom project_id, "accept-change", doc_id, change_id, (err)->
|
||||||
res.send 204
|
res.send 204
|
||||||
|
|
||||||
|
toggleTrackChanges: (req, res, next) ->
|
||||||
|
{project_id} = req.params
|
||||||
|
track_changes_on = !!req.body.on
|
||||||
|
logger.log {project_id, track_changes_on}, "request to toggle track changes"
|
||||||
|
TrackChangesManager.toggleTrackChanges project_id, track_changes_on, (error) ->
|
||||||
|
return next(error) if error?
|
||||||
|
EditorRealTimeController.emitToRoom project_id, "toggle-track-changes", track_changes_on, (err)->
|
||||||
|
res.send 204
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
Project = require("../../models/Project").Project
|
||||||
|
|
||||||
|
module.exports = TrackChangesManager =
|
||||||
|
toggleTrackChanges: (project_id, track_changes_on, callback = (error) ->) ->
|
||||||
|
Project.update {_id: project_id}, {track_changes: track_changes_on}, callback
|
|
@ -32,6 +32,7 @@ ProjectSchema = new Schema
|
||||||
archived : { type: Boolean }
|
archived : { type: Boolean }
|
||||||
deletedDocs : [DeletedDocSchema]
|
deletedDocs : [DeletedDocSchema]
|
||||||
imageName : { type: String }
|
imageName : { type: String }
|
||||||
|
track_changes : { type: Boolean }
|
||||||
|
|
||||||
ProjectSchema.statics.getProject = (project_or_id, fields, callback)->
|
ProjectSchema.statics.getProject = (project_or_id, fields, callback)->
|
||||||
if project_or_id._id?
|
if project_or_id._id?
|
||||||
|
|
|
@ -180,6 +180,7 @@ module.exports = class Router
|
||||||
webRouter.get "/project/:project_id/ranges", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllRanges
|
webRouter.get "/project/:project_id/ranges", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllRanges
|
||||||
webRouter.get "/project/:project_id/changes/users", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllChangesUsers
|
webRouter.get "/project/:project_id/changes/users", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllChangesUsers
|
||||||
webRouter.post "/project/:project_id/doc/:doc_id/changes/:change_id/accept", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, TrackChangesController.acceptChange
|
webRouter.post "/project/:project_id/doc/:doc_id/changes/:change_id/accept", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, TrackChangesController.acceptChange
|
||||||
|
webRouter.post "/project/:project_id/track_changes", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, TrackChangesController.toggleTrackChanges
|
||||||
|
|
||||||
webRouter.get '/Project/:Project_id/download/zip', AuthorizationMiddlewear.ensureUserCanReadProject, ProjectDownloadsController.downloadProject
|
webRouter.get '/Project/:Project_id/download/zip', AuthorizationMiddlewear.ensureUserCanReadProject, ProjectDownloadsController.downloadProject
|
||||||
webRouter.get '/project/download/zip', AuthorizationMiddlewear.ensureUserCanReadMultipleProjects, ProjectDownloadsController.downloadMultipleProjects
|
webRouter.get '/project/download/zip', AuthorizationMiddlewear.ensureUserCanReadMultipleProjects, ProjectDownloadsController.downloadMultipleProjects
|
||||||
|
|
|
@ -107,6 +107,7 @@ block requirejs
|
||||||
window.csrfToken = "!{csrfToken}";
|
window.csrfToken = "!{csrfToken}";
|
||||||
window.anonymous = #{anonymous};
|
window.anonymous = #{anonymous};
|
||||||
window.maxDocLength = #{maxDocLength};
|
window.maxDocLength = #{maxDocLength};
|
||||||
|
window.trackChangesEnabled = #{trackChangesEnabled};
|
||||||
window.wikiEnabled = #{!!(settings.apis.wiki && settings.apis.wiki.url)};
|
window.wikiEnabled = #{!!(settings.apis.wiki && settings.apis.wiki.url)};
|
||||||
window.requirejs = {
|
window.requirejs = {
|
||||||
"paths" : {
|
"paths" : {
|
||||||
|
|
|
@ -9,11 +9,11 @@
|
||||||
on-delete="deleteComment(entryId, threadId);"
|
on-delete="deleteComment(entryId, threadId);"
|
||||||
is-loading="reviewPanel.dropdown.loading"
|
is-loading="reviewPanel.dropdown.loading"
|
||||||
)
|
)
|
||||||
span.review-panel-toolbar-label(ng-click="editor.wantTrackChanges = true;", ng-if="editor.wantTrackChanges === false") Track Changes is
|
span.review-panel-toolbar-label(ng-click="toggleTrackChanges(true)", ng-if="editor.wantTrackChanges === false") Track Changes is
|
||||||
strong off
|
strong off
|
||||||
span.review-panel-toolbar-label(ng-click="editor.wantTrackChanges = false;", ng-if="editor.wantTrackChanges === true") Track Changes is
|
span.review-panel-toolbar-label(ng-click="toggleTrackChanges(false)", ng-if="editor.wantTrackChanges === true") Track Changes is
|
||||||
strong on
|
strong on
|
||||||
review-panel-toggle(ng-if="editor.wantTrackChanges == editor.trackChanges", ng-model="editor.wantTrackChanges")
|
review-panel-toggle(ng-if="editor.wantTrackChanges == editor.trackChanges", ng-model="editor.wantTrackChanges", on-toggle="toggleTrackChanges")
|
||||||
span.review-panel-toolbar-spinner(ng-if="editor.wantTrackChanges != editor.trackChanges")
|
span.review-panel-toolbar-spinner(ng-if="editor.wantTrackChanges != editor.trackChanges")
|
||||||
i.fa.fa-spin.fa-spinner
|
i.fa.fa-spin.fa-spinner
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ define [
|
||||||
open_doc_name: null
|
open_doc_name: null
|
||||||
opening: true
|
opening: true
|
||||||
trackChanges: false
|
trackChanges: false
|
||||||
wantTrackChanges: false
|
wantTrackChanges: window.trackChangesEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
@$scope.$on "entity:selected", (event, entity) =>
|
@$scope.$on "entity:selected", (event, entity) =>
|
||||||
|
|
|
@ -308,6 +308,15 @@ define [
|
||||||
|
|
||||||
$scope.gotoEntry = (doc_id, entry) ->
|
$scope.gotoEntry = (doc_id, entry) ->
|
||||||
ide.editorManager.openDocId(doc_id, { gotoOffset: entry.offset })
|
ide.editorManager.openDocId(doc_id, { gotoOffset: entry.offset })
|
||||||
|
|
||||||
|
$scope.toggleTrackChanges = (value) ->
|
||||||
|
console.log "Toggling track changes", value
|
||||||
|
$scope.editor.wantTrackChanges = value
|
||||||
|
$http.post "/project/#{$scope.project_id}/track_changes", {_csrf: window.csrfToken, on: value}
|
||||||
|
|
||||||
|
ide.socket.on "toggle-track-changes", (value) ->
|
||||||
|
$scope.$apply () ->
|
||||||
|
$scope.editor.wantTrackChanges = value
|
||||||
|
|
||||||
_refreshingRangeUsers = false
|
_refreshingRangeUsers = false
|
||||||
_refreshedForUserIds = {}
|
_refreshedForUserIds = {}
|
||||||
|
|
|
@ -4,10 +4,18 @@ define [
|
||||||
App.directive "reviewPanelToggle", () ->
|
App.directive "reviewPanelToggle", () ->
|
||||||
restrict: "E"
|
restrict: "E"
|
||||||
scope:
|
scope:
|
||||||
innerModel: '=ngModel'
|
onToggle: '='
|
||||||
|
ngModel: '='
|
||||||
|
link: (scope) ->
|
||||||
|
scope.onChange = (args...) ->
|
||||||
|
scope.onToggle(scope.localModel)
|
||||||
|
scope.localModel = scope.ngModel
|
||||||
|
scope.$watch "ngModel", (value) ->
|
||||||
|
scope.localModel = value
|
||||||
|
|
||||||
template: """
|
template: """
|
||||||
<div class="rp-toggle">
|
<div class="rp-toggle">
|
||||||
<input id="rp-toggle-{{$id}}" type="checkbox" class="rp-toggle-hidden-input" ng-model="innerModel" />
|
<input id="rp-toggle-{{$id}}" type="checkbox" class="rp-toggle-hidden-input" ng-model="localModel" ng-change="onChange()" />
|
||||||
<label for="rp-toggle-{{$id}}" class="rp-toggle-btn"></label>
|
<label for="rp-toggle-{{$id}}" class="rp-toggle-btn"></label>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue