From f7ad4a4786f800f338a3b323d6d54fd54e2d5f80 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Mon, 5 Jun 2017 14:48:50 +0100 Subject: [PATCH] WIP: basically working, with client sync --- .../Features/Labels/LabelsController.coffee | 5 +- .../Features/Labels/LabelsHandler.coffee | 10 ++- services/web/public/coffee/ide.coffee | 2 + .../ide/editor/directives/aceEditor.coffee | 5 +- .../aceEditor/labels/LabelsManager.coffee | 75 +++++++++++++------ 5 files changed, 68 insertions(+), 29 deletions(-) diff --git a/services/web/app/coffee/Features/Labels/LabelsController.coffee b/services/web/app/coffee/Features/Labels/LabelsController.coffee index 333276e136..fa54764402 100644 --- a/services/web/app/coffee/Features/Labels/LabelsController.coffee +++ b/services/web/app/coffee/Features/Labels/LabelsController.coffee @@ -11,7 +11,7 @@ module.exports = LabelsController = if err? logger.err {project_id, err}, "[LabelsController] error getting all labels from project" return next(err) - res.json {projectId: project_id, labels: projectLabels} + res.json {projectId: project_id, projectLabels: projectLabels} getLabelsForDoc: (req, res, next) -> project_id = req.params.Project_id @@ -20,4 +20,7 @@ module.exports = LabelsController = if err? logger.err {project_id, doc_id, err}, "[LabelsController] error getting labels from doc" return next(err) + EditorRealTimeController.emitToRoom project_id, 'doc:labels:updated', { + docId: doc_id, labels: docLabels + } res.json {projectId: project_id, docId: doc_id, labels: docLabels} diff --git a/services/web/app/coffee/Features/Labels/LabelsHandler.coffee b/services/web/app/coffee/Features/Labels/LabelsHandler.coffee index 2a4fad24c5..4e837cb9d2 100644 --- a/services/web/app/coffee/Features/Labels/LabelsHandler.coffee +++ b/services/web/app/coffee/Features/Labels/LabelsHandler.coffee @@ -1,4 +1,5 @@ ProjectEntityHandler = require "../Project/ProjectEntityHandler" +DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') module.exports = LabelsHandler = @@ -16,13 +17,16 @@ module.exports = LabelsHandler = callback(null, projectLabels) getLabelsForDoc: (projectId, docId, callback=(err, docLabels)->) -> - ProjectEntityHandler.getDoc projectId, docId, (err, lines, rev) -> + DocumentUpdaterHandler.flushDocToMongo projectId, docId, (err) -> if err? return callback(err) - LabelsHandler.extractLabelsFromDoc lines, (err, docLabels) -> + ProjectEntityHandler.getDoc projectId, docId, (err, lines, rev) -> if err? return callback(err) - callback(null, docLabels) + LabelsHandler.extractLabelsFromDoc lines, (err, docLabels) -> + if err? + return callback(err) + callback(null, docLabels) extractLabelsFromDoc: (lines, callback=(err, docLabels)->) -> docLabels = [] diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index dabf166578..161532cff0 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -172,5 +172,7 @@ define [ # User can append ?ft=somefeature to url to activate a feature toggle ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1] + ide.socket.on 'doc:labels:updated', (data) -> + $scope.$broadcast 'doc:labels:updated', data angular.bootstrap(document.body, ["SharelatexApp"]) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 377d5c0103..5affcb7217 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -92,8 +92,9 @@ define [ highlightsManager = new HighlightsManager(scope, editor, element) cursorPositionManager = new CursorPositionManager(scope, editor, element, localStorage) trackChangesManager = new TrackChangesManager(scope, editor, element) - labelsManager = new LabelsManager(scope, editor, element) - autoCompleteManager = new AutoCompleteManager(scope, editor, element, labelsManager) + if scope.name == 'editor' + labelsManager = new LabelsManager(scope, editor, element) + autoCompleteManager = new AutoCompleteManager(scope, editor, element, labelsManager) # Prevert Ctrl|Cmd-S from triggering save dialog editor.commands.addCommand diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/labels/LabelsManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/labels/LabelsManager.coffee index c30d6af4fd..8917f117e4 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/labels/LabelsManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/labels/LabelsManager.coffee @@ -15,63 +15,92 @@ define [ window.GET_LABELS = () => @loadProjectLabelsFromServer() + window.GET_DOC_LABELS = () => + @loadCurrentDocLabelsFromServer() + @state = documents: {} # map of DocId => List[Label] @loadLabelsTimeout = null + @$scope.$on 'doc:labels:updated', (e, data) => + if data.docId and data.labels + @state.documents[data.docId] = data.labels + onChange = (change) => + if change.remote + return cursorPosition = @editor.getCursorPosition() end = change.end range = new Range(end.row, 0, end.row, end.column) lineUpToCursor = @editor.getSession().getTextRange(range) commandFragment = getLastCommandFragment(lineUpToCursor) if ( - !change.remote and change.action in ['remove', 'insert'] and ((_.any(change.lines, (line) -> line.match(/\\label\{[^\}\n\\]{0,80}\}/))) or (commandFragment?.length > 2 and commandFragment.slice(0,7) == '\\label{')) ) - @scheduleLoadLabelsFromOpenDoc() + @scheduleLoadCurrentDocLabelsFromServer() + # @scheduleLoadLabelsFromOpenDoc() @editor.on "changeSession", (e) => e.oldSession.off "change", onChange e.session.on "change", onChange - setTimeout( - () => - # @scheduleLoadLabelsFromOpenDoc() - @loadProjectLabelsFromServer() - , 0 - ) + # setTimeout( + # () => + # # @scheduleLoadLabelsFromOpenDoc() + # @loadProjectLabelsFromServer() + # , 0 + # ) + + # Load now + @loadProjectLabelsFromServer() loadProjectLabelsFromServer: () -> $.get( "/project/#{window.project_id}/labels" , (data) => - console.log ">>", data - if data.labels - for docId, docLabels of data.labels + if data.projectLabels + for docId, docLabels of data.projectLabels @state.documents[docId] = docLabels - console.log @state.documents ) - loadLabelsFromOpenDoc: () -> - docId = @$scope.docId - docText = @editor.getValue() - labels = [] - re = /\\label\{([^\}\n\\]{0,80})\}/g - while (labelMatch = re.exec(docText)) and labels.length < 1000 - if labelMatch[1] - labels.push(labelMatch[1]) - @state.documents[docId] = labels + loadCurrentDocLabelsFromServer: () -> + $.get( + "/project/#{window.project_id}/#{@$scope.docId}/labels" + , (data) => + if data.docId and data.labels + @state.documents[data.docId] = data.labels + ) - scheduleLoadLabelsFromOpenDoc: () -> + # loadLabelsFromOpenDoc: () -> + # docId = @$scope.docId + # docText = @editor.getValue() + # labels = [] + # re = /\\label\{([^\}\n\\]{0,80})\}/g + # while (labelMatch = re.exec(docText)) and labels.length < 1000 + # if labelMatch[1] + # labels.push(labelMatch[1]) + # @state.documents[docId] = labels + + # scheduleLoadLabelsFromOpenDoc: () -> + # # De-bounce loading labels with a timeout + # if @loadLabelsTimeout + # clearTimeout(@loadLabelsTimeout) + # @loadLabelsTimeout = setTimeout( + # () => + # @loadLabelsFromOpenDoc() + # , 1000 + # , this + # ) + + scheduleLoadCurrentDocLabelsFromServer: () -> # De-bounce loading labels with a timeout if @loadLabelsTimeout clearTimeout(@loadLabelsTimeout) @loadLabelsTimeout = setTimeout( () => - @loadLabelsFromOpenDoc() + @loadCurrentDocLabelsFromServer() , 1000 , this )