diff --git a/services/web/app/coffee/Features/Compile/ClsiManager.coffee b/services/web/app/coffee/Features/Compile/ClsiManager.coffee old mode 100644 new mode 100755 index b7930f5cf3..639511154e --- a/services/web/app/coffee/Features/Compile/ClsiManager.coffee +++ b/services/web/app/coffee/Features/Compile/ClsiManager.coffee @@ -8,8 +8,8 @@ logger = require "logger-sharelatex" url = require("url") module.exports = ClsiManager = - sendRequest: (project_id, callback = (error, success) ->) -> - ClsiManager._buildRequest project_id, (error, req) -> + sendRequest: (project_id, settingsOverride = {}, callback = (error, success) ->) -> + ClsiManager._buildRequest project_id, settingsOverride, (error, req) -> return callback(error) if error? logger.log project_id: project_id, "sending compile to CLSI" ClsiManager._postToClsi project_id, req, (error, response) -> @@ -52,7 +52,7 @@ module.exports = ClsiManager = return outputFiles VALID_COMPILERS: ["pdflatex", "latex", "xelatex", "lualatex"] - _buildRequest: (project_id, callback = (error, request) ->) -> + _buildRequest: (project_id, settingsOverride={}, callback = (error, request) ->) -> Project.findById project_id, {compiler: 1, rootDoc_id: 1}, (error, project) -> return callback(error) if error? return callback(new Errors.NotFoundError("project does not exist: #{project_id}")) if !project? @@ -67,6 +67,7 @@ module.exports = ClsiManager = resources = [] rootResourcePath = null + rootResourcePathOverride = null for path, doc of docs path = path.replace(/^\//, "") # Remove leading / @@ -75,6 +76,10 @@ module.exports = ClsiManager = content: doc.lines.join("\n") if project.rootDoc_id? and doc._id.toString() == project.rootDoc_id.toString() rootResourcePath = path + if settingsOverride.rootDoc_id? and doc._id.toString() == settingsOverride.rootDoc_id.toString() + rootResourcePathOverride = path + + rootResourcePath = rootResourcePathOverride if rootResourcePathOverride? for path, file of files path = path.replace(/^\//, "") # Remove leading / diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee old mode 100644 new mode 100755 index aa4fab9e30..0d919fbd75 --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -11,9 +11,11 @@ module.exports = CompileController = compile: (req, res, next = (error) ->) -> project_id = req.params.Project_id isAutoCompile = !!req.query?.auto_compile + settingsOverride = req.body?.settingsOverride ? {}; + logger.log "root doc overriden" if settingsOverride.rootDoc_id? AuthenticationController.getLoggedInUserId req, (error, user_id) -> return next(error) if error? - CompileManager.compile project_id, user_id, { isAutoCompile }, (error, status, outputFiles) -> + CompileManager.compile project_id, user_id, { isAutoCompile, settingsOverride }, (error, status, outputFiles) -> return next(error) if error? res.contentType("application/json") res.send 200, JSON.stringify { diff --git a/services/web/app/coffee/Features/Compile/CompileManager.coffee b/services/web/app/coffee/Features/Compile/CompileManager.coffee old mode 100644 new mode 100755 index a0b242e95f..972b7d3286 --- a/services/web/app/coffee/Features/Compile/CompileManager.coffee +++ b/services/web/app/coffee/Features/Compile/CompileManager.coffee @@ -25,12 +25,12 @@ module.exports = CompileManager = return callback(error) if error? if recentlyCompiled return callback new Error("project was recently compiled so not continuing") - + CompileManager._ensureRootDocumentIsSet project_id, (error) -> return callback(error) if error? DocumentUpdaterHandler.flushProjectToMongo project_id, (error) -> return callback(error) if error? - ClsiManager.sendRequest project_id, (error, status, outputFiles) -> + ClsiManager.sendRequest project_id, opt.settingsOverride, (error, status, outputFiles) -> return callback(error) if error? logger.log files: outputFiles, "output files" callback(null, status, outputFiles) diff --git a/services/web/public/coffee/pdf/CompiledView.coffee b/services/web/public/coffee/pdf/CompiledView.coffee old mode 100644 new mode 100755 index 4f12007379..74afc1e11b --- a/services/web/public/coffee/pdf/CompiledView.coffee +++ b/services/web/public/coffee/pdf/CompiledView.coffee @@ -204,7 +204,12 @@ define [ recompilePdf: () -> @options.manager.trigger "compile:pdf" - @options.manager.refreshPdf() + rootDocOverride_id = null + for line in @ide.editor.getLines() + match = line.match /(.*)\\documentclass/ + if match and !match[1].match /%/ + rootDocOverride_id = @ide.editor.getCurrentDocId() + @options.manager.refreshPdf {rootDocOverride_id} toggleFlatViewButton: () -> @$("#flatViewButton").button("toggle") toggleSplitViewButton: () -> @$("#splitViewButton").button("toggle") diff --git a/services/web/public/coffee/pdf/PdfManager.coffee b/services/web/public/coffee/pdf/PdfManager.coffee index 04bb682bf9..d988797904 100644 --- a/services/web/public/coffee/pdf/PdfManager.coffee +++ b/services/web/public/coffee/pdf/PdfManager.coffee @@ -143,7 +143,7 @@ define [ @view.onCompiling() @syncButtonsView?.hide() @compiling = true - @_doCompile opts.isAutoCompile, (error, status, outputFiles) => + @_doCompile opts, (error, status, outputFiles) => @compiling = false doneCompiling() @@ -172,16 +172,19 @@ define [ if outputFiles? @view.showOutputFileDownloadLinks(outputFiles) - _doCompile: (isAutoCompile, callback = (error, status, outputFiles) ->) -> + _doCompile: (opts, callback = (error, status, outputFiles) ->) -> url = "/project/#{@ide.project_id}/compile" - if isAutoCompile + if opts.isAutoCompile url += "?auto_compile=true" $.ajax( url: url type: "POST" headers: "X-CSRF-Token": window.csrfToken + contentType: "application/json; charset=utf-8" dataType: 'json' + data: JSON.stringify settingsOverride: + rootDoc_id: opts.rootDocOverride_id ? null success: (body, status, response) -> callback null, body.status, body.outputFiles error: (error) -> diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index 6791443c9a..6915529b95 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -24,7 +24,7 @@ describe "ClsiManager", -> describe "sendRequest", -> beforeEach -> - @ClsiManager._buildRequest = sinon.stub().callsArgWith(1, null, @request = "mock-request") + @ClsiManager._buildRequest = sinon.stub().callsArgWith(2, null, @request = "mock-request") describe "with a successful compile", -> beforeEach -> @@ -39,7 +39,7 @@ describe "ClsiManager", -> type: "log" }] }) - @ClsiManager.sendRequest @project_id, @callback + @ClsiManager.sendRequest @project_id, {}, @callback it "should build the request", -> @ClsiManager._buildRequest @@ -67,7 +67,7 @@ describe "ClsiManager", -> compile: status: @status = "failure" }) - @ClsiManager.sendRequest @project_id, @callback + @ClsiManager.sendRequest @project_id, {}, @callback it "should call the callback with a failure statue", -> @callback.calledWith(null, @status).should.equal true @@ -121,7 +121,7 @@ describe "ClsiManager", -> describe "with a valid project", -> beforeEach (done) -> - @ClsiManager._buildRequest @project_id, (error, request) => + @ClsiManager._buildRequest @project_id, null, (error, request) => @request = request done() @@ -159,10 +159,32 @@ describe "ClsiManager", -> }] ) + + describe "when root doc override is valid", -> + beforeEach (done) -> + @ClsiManager._buildRequest @project_id, {rootDoc_id:"mock-doc-id-2"}, (error, request) => + @request = request + done() + + it "should change root path", -> + @request.compile.rootResourcePath.should.equal "chapters/chapter1.tex" + + + describe "when root doc override is invalid", -> + beforeEach (done) -> + @ClsiManager._buildRequest @project_id, {rootDoc_id:"invalid-id"}, (error, request) => + @request = request + done() + + it "should fallback to default root doc", -> + @request.compile.rootResourcePath.should.equal "main.tex" + + + describe "when the project has an invalid compiler", -> beforeEach (done) -> @project.compiler = "context" - @ClsiManager._buildRequest @project, (error, request) => + @ClsiManager._buildRequest @project, null, (error, request) => @request = request done() @@ -172,7 +194,7 @@ describe "ClsiManager", -> describe "when there is no valid root document", -> beforeEach (done) -> @project.rootDoc_id = "not-valid" - @ClsiManager._buildRequest @project, (@error, @request) => + @ClsiManager._buildRequest @project, null, (@error, @request) => done() it "should return an error", -> diff --git a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee index 0820c0431c..fe456995ad 100644 --- a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee @@ -44,7 +44,7 @@ describe "CompileController", -> it "should do the compile without the auto compile flag", -> @CompileManager.compile - .calledWith(@project_id, @user_id, { isAutoCompile: false }) + .calledWith(@project_id, @user_id, { isAutoCompile: false, settingsOverride:{} }) .should.equal true it "should set the content-type of the response to application/json", -> @@ -71,7 +71,7 @@ describe "CompileController", -> it "should do the compile with the auto compile flag", -> @CompileManager.compile - .calledWith(@project_id, @user_id, { isAutoCompile: true }) + .calledWith(@project_id, @user_id, { isAutoCompile: true, settingsOverride:{} }) .should.equal true describe "downloadPdf", -> diff --git a/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee index f1b963a8c5..c284341bf2 100644 --- a/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee @@ -36,7 +36,7 @@ describe "CompileManager", -> @CompileManager._checkIfRecentlyCompiled = sinon.stub().callsArgWith(2, null, false) @CompileManager._ensureRootDocumentIsSet = sinon.stub().callsArgWith(1, null) @DocumentUpdaterHandler.flushProjectToMongo = sinon.stub().callsArgWith(1, null) - @ClsiManager.sendRequest = sinon.stub().callsArgWith(1, null, @status = "mock-status") + @ClsiManager.sendRequest = sinon.stub().callsArgWith(2, null, @status = "mock-status") describe "succesfully", -> beforeEach ->