Przeglądaj źródła

Merge branch 'master' into pr-human-readable-logs

Paulo Reis 10 lat temu
rodzic
commit
ada018263a
59 zmienionych plików z 96 dodań i 5112 usunięć
  1. 24 2
      services/web/Gruntfile.coffee
  2. 36 17
      services/web/app/coffee/Features/Compile/CompileController.coffee
  3. 5 3
      services/web/app/coffee/router.coffee
  4. 2 2
      services/web/app/views/beta_program/opt_in.jade
  5. 2 2
      services/web/app/views/layout.jade
  6. 1 1
      services/web/app/views/user/settings.jade
  7. 3 2
      services/web/package.json
  8. 1 1
      services/web/public/coffee/filters/formatDate.coffee
  9. 17 6
      services/web/public/coffee/ide/pdf/controllers/PdfController.coffee
  10. BIN
      services/web/public/img/about/brian_gough.jpg
  11. BIN
      services/web/public/img/about/geri.jpg
  12. BIN
      services/web/public/img/about/henry_oswald.jpg
  13. BIN
      services/web/public/img/about/james_allen.jpg
  14. BIN
      services/web/public/img/about/kiri_channon.jpg
  15. BIN
      services/web/public/img/about/michael.jpg
  16. BIN
      services/web/public/img/about/paulo_reis.jpg
  17. BIN
      services/web/public/img/about/shane_kilkelly.jpg
  18. BIN
      services/web/public/img/crests/cambridge.png
  19. BIN
      services/web/public/img/crests/durham.png
  20. BIN
      services/web/public/img/crests/icl.png
  21. BIN
      services/web/public/img/crests/liverpool.jpg
  22. BIN
      services/web/public/img/crests/mit.gif
  23. BIN
      services/web/public/img/crests/nasa.png
  24. BIN
      services/web/public/img/crests/oxford.gif
  25. BIN
      services/web/public/img/crests/stanford.png
  26. BIN
      services/web/public/img/crests/tokyo.png
  27. BIN
      services/web/public/img/crests/yale.png
  28. BIN
      services/web/public/img/dropbox/document_updated_modal.png
  29. BIN
      services/web/public/img/dropbox/dropbox_banner.png
  30. BIN
      services/web/public/img/dropbox/dropbox_banner_tall.png
  31. BIN
      services/web/public/img/dropbox/dropbox_logo.png
  32. BIN
      services/web/public/img/dropbox/dropbox_progress_bar.png
  33. BIN
      services/web/public/img/dropbox/history_diff.png
  34. BIN
      services/web/public/img/dropbox/share_dropbox_folder.png
  35. BIN
      services/web/public/img/dropbox/simple_logo.png
  36. BIN
      services/web/public/img/enago.png
  37. BIN
      services/web/public/img/faileupload.png
  38. BIN
      services/web/public/img/favicon@2x.png
  39. BIN
      services/web/public/img/flags/24/en.png
  40. BIN
      services/web/public/img/flags/24/pt.png
  41. BIN
      services/web/public/img/flags/32/en.png
  42. BIN
      services/web/public/img/flags/32/ja.png
  43. BIN
      services/web/public/img/flags/32/ko.png
  44. BIN
      services/web/public/img/github/octocat.jpg
  45. BIN
      services/web/public/img/lion-128.png
  46. BIN
      services/web/public/img/lion-sad-128.png
  47. BIN
      services/web/public/img/logo.png
  48. BIN
      services/web/public/img/logo@2x.png
  49. BIN
      services/web/public/img/pattern-home.png
  50. BIN
      services/web/public/img/references-search/search_example.gif
  51. BIN
      services/web/public/img/screen.png
  52. BIN
      services/web/public/img/screen@2x.png
  53. BIN
      services/web/public/img/social/facebook-32.png
  54. BIN
      services/web/public/img/social/link-32.png
  55. BIN
      services/web/public/img/social/mail-32.png
  56. BIN
      services/web/public/img/spellcheck-underline.png
  57. BIN
      services/web/public/img/spinner.gif
  58. 4 2037
      services/web/public/js/libs/algolia-2.5.2.js
  59. 1 3039
      services/web/public/js/libs/moment-2.9.0.js

+ 24 - 2
services/web/Gruntfile.coffee

@@ -17,6 +17,8 @@ module.exports = (grunt) ->
 	grunt.loadNpmTasks 'grunt-contrib-watch'
 	grunt.loadNpmTasks 'grunt-parallel'
 	grunt.loadNpmTasks 'grunt-exec'
+	grunt.loadNpmTasks 'grunt-contrib-imagemin'
+	grunt.loadNpmTasks 'grunt-contrib-cssmin'
 
 	config =
 
@@ -27,7 +29,7 @@ module.exports = (grunt) ->
 
 		watch:
 			coffee:
-				files: '**/*.coffee'
+				files: 'public/**/*.coffee'
 				tasks: ['quickcompile:coffee']
 				options: {}
 
@@ -44,6 +46,21 @@ module.exports = (grunt) ->
 					grunt:true
 					stream:true
 
+
+		imagemin:
+			dynamic:                       
+				files: [{
+					expand: true
+					cwd: 'public/img/'
+					src: ['**/*.{png,jpg,gif}']
+					dest: 'public/img/'
+				}]
+			options:
+				interlaced:false
+				optimizationLevel: 7
+
+
+
 		coffee:
 			app_dir: 
 				expand: true,
@@ -108,6 +125,11 @@ module.exports = (grunt) ->
 				files:
 					"public/stylesheets/style.css": "public/stylesheets/style.less"
 
+		cssmin:
+			target:
+				files:
+					"public/stylesheets/style.css": "public/stylesheets/style.css"
+
 		env:
 			run:
 				add: 
@@ -332,7 +354,7 @@ module.exports = (grunt) ->
 	grunt.registerTask 'compile:server', 'Compile the server side coffee script', ['clean:app', 'coffee:app', 'coffee:app_dir', 'compile:modules:server']
 	grunt.registerTask 'compile:client', 'Compile the client side coffee script', ['coffee:client', 'coffee:sharejs', 'wrap_sharejs', "compile:modules:client", 'compile:modules:inject_clientside_includes']
 	grunt.registerTask 'compile:css', 'Compile the less files to css', ['less']
-	grunt.registerTask 'compile:minify', 'Concat and minify the client side js', ['requirejs', "file_append"]
+	grunt.registerTask 'compile:minify', 'Concat and minify the client side js', ['requirejs', "file_append", "cssmin"]
 	grunt.registerTask 'compile:unit_tests', 'Compile the unit tests', ['clean:unit_tests', 'coffee:unit_tests']
 	grunt.registerTask 'compile:acceptance_tests', 'Compile the acceptance tests', ['clean:acceptance_tests', 'coffee:acceptance_tests']
 	grunt.registerTask 'compile:smoke_tests', 'Compile the smoke tests', ['coffee:smoke_tests']

+ 36 - 17
services/web/app/coffee/Features/Compile/CompileController.coffee

@@ -44,11 +44,20 @@ module.exports = CompileController =
 				}
 
 	_compileAsUser: (req, callback) ->
+		# callback with user_id if isolated flag is set on request, undefined otherwise
 		isolated = req.query?.isolated is "true"
 		if isolated
-			AuthenticationController.getLoggedInUserId req, callback
+			AuthenticationController.getLoggedInUserId req, callback # -> (error, user_id)
 		else
-			callback()
+			callback() # do a per-project compile, not per-user
+
+	_downloadAsUser: (req, callback) ->
+		# callback with user_id if isolated flag or user_id param is set on request, undefined otherwise
+		isolated = req.query?.isolated is "true" or req.params.user_id?
+		if isolated
+			AuthenticationController.getLoggedInUserId req, callback # -> (error, user_id)
+		else
+			callback() # do a per-project compile, not per-user
 
 	downloadPdf: (req, res, next = (error) ->)->
 		Metrics.inc "pdf-downloads"
@@ -82,7 +91,9 @@ module.exports = CompileController =
 					logger.log project_id:project_id, ip:req.ip, "rate limit hit downloading pdf"
 					res.send 500
 				else
-					CompileController.proxyToClsi(project_id, "/project/#{project_id}/output/output.pdf", req, res, next)
+					CompileController._downloadAsUser req, (error, user_id) ->
+						url = CompileController._getFileUrl project_id, user_id, req.params.build_id, "output.pdf"
+						CompileController.proxyToClsi(project_id, url, req, res, next)
 
 	deleteAuxFiles: (req, res, next) ->
 		project_id = req.params.Project_id
@@ -92,29 +103,37 @@ module.exports = CompileController =
 				return next(error) if error?
 				res.sendStatus(200)
 
+	# this is only used by templates, so is not called with a user_id
 	compileAndDownloadPdf: (req, res, next)->
 		project_id = req.params.project_id
-		CompileController._compileAsUser req, (error, user_id) ->
-			return next(error) if error?
-			CompileManager.compile project_id, user_id, {}, (err)->
-				if err?
-					logger.err err:err, project_id:project_id, "something went wrong compile and downloading pdf"
-					res.sendStatus 500
-				url = "/project/#{project_id}/output/output.pdf"
-				CompileController.proxyToClsi project_id, url, req, res, next
+		# pass user_id as null, since templates are an "anonymous" compile
+		CompileManager.compile project_id, null, {}, (err)->
+			if err?
+				logger.err err:err, project_id:project_id, "something went wrong compile and downloading pdf"
+				res.sendStatus 500
+			url = "/project/#{project_id}/output/output.pdf"
+			CompileController.proxyToClsi project_id, url, req, res, next
 
 	getFileFromClsi: (req, res, next = (error) ->) ->
 		project_id = req.params.Project_id
-		build_id = req.params.build_id
-		user_id = req.params.user_id
+		CompileController._downloadAsUser req, (error, user_id) ->
+			return next(error) if error?
+			url = CompileController._getFileUrl project_id, user_id, req.params.build_id, req.params.file
+			CompileController.proxyToClsi(project_id, url, req, res, next)
+
+	# compute a GET file url for a given project, user (optional), build (optional) and file
+	_getFileUrl: (project_id, user_id, build_id, file) ->
 		if user_id? and build_id?
-			url = "/project/#{project_id}/user/#{user_id}/build/#{build_id}/output/#{req.params.file}"
+			url = "/project/#{project_id}/user/#{user_id}/build/#{build_id}/output/#{file}"
+		else if user_id?
+			url = "/project/#{project_id}/user/#{user_id}/output/#{file}"
 		else if build_id?
-			url = "/project/#{project_id}/build/#{build_id}/output/#{req.params.file}"
+			url = "/project/#{project_id}/build/#{build_id}/output/#{file}"
 		else
-			url = "/project/#{project_id}/output/#{req.params.file}"
-		CompileController.proxyToClsi(project_id, url, req, res, next)
+			url = "/project/#{project_id}/output/#{file}"
+		return url
 
+	# compute a POST url for a project, user (optional) and action
 	_getUrl: (project_id, user_id, action) ->
 		path = "/project/#{project_id}"
 		path += "/user/#{user_id}" if user_id?

+ 5 - 3
services/web/app/coffee/router.coffee

@@ -106,7 +106,9 @@ module.exports = class Router
 		webRouter.post '/project/:Project_id/settings/admin', AuthorizationMiddlewear.ensureUserCanAdminProject, ProjectController.updateProjectAdminSettings
 
 		webRouter.post '/project/:Project_id/compile', AuthorizationMiddlewear.ensureUserCanReadProject, CompileController.compile
-		webRouter.get  '/Project/:Project_id/output/output.pdf', AuthorizationMiddlewear.ensureUserCanReadProject, CompileController.downloadPdf
+		# Used by the web download buttons, adds filename header
+		webRouter.get  '/project/:Project_id/output/output.pdf', AuthorizationMiddlewear.ensureUserCanReadProject, CompileController.downloadPdf
+		# Used by the pdf viewers
 		webRouter.get  /^\/project\/([^\/]*)\/output\/(.*)$/,
 			((req, res, next) ->
 				params =
@@ -236,8 +238,8 @@ module.exports = class Router
 			res.send("websharelatex is up")
 
 
-		webRouter.get '/health_check', HealthCheckController.check
-		webRouter.get '/health_check/redis', HealthCheckController.checkRedis
+		apiRouter.get '/health_check', HealthCheckController.check
+		apiRouter.get '/health_check/redis', HealthCheckController.checkRedis
 
 		apiRouter.get "/status/compiler/:Project_id", AuthorizationMiddlewear.ensureUserCanReadProject, (req, res) ->
 			sendRes = _.once (statusCode, message)->

+ 2 - 2
services/web/app/views/beta_program/opt_in.jade

@@ -27,7 +27,7 @@ block content
 									.col-md-12
 										if user.betaProgram
 											p #{translate("beta_program_already_participating")}
-											form(method="post", action="/beta/opt-out", novalidate)
+											form(id="beta-program-opt-out", method="post", action="/beta/opt-out", novalidate)
 												.form-group
 													input(type="hidden", name="_csrf", value=csrfToken)
 													button.btn.btn-primary(
@@ -37,7 +37,7 @@ block content
 												.form-group
 													a(href="/project").btn.btn-info #{translate("back_to_your_projects")}
 										else
-											form(method="post", action="/beta/opt-in", novalidate)
+											form(id="beta-program-opt-in", method="post", action="/beta/opt-in", novalidate)
 												.form-group
 													input(type="hidden", name="_csrf", value=csrfToken)
 													button.btn.btn-primary(

+ 2 - 2
services/web/app/views/layout.jade

@@ -66,7 +66,6 @@ html(itemscope, itemtype='http://schema.org/Product')
 		block scripts
 		script(src="#{jsPath}libs/jquery-1.11.1.min.js")
 		script(src="#{jsPath}libs/angular-1.3.15.min.js")
-		include sentry
 		script.
 			window.sharelatex = {
 				siteUrl: '#{settings.siteUrl}',
@@ -141,6 +140,7 @@ html(itemscope, itemtype='http://schema.org/Product')
 			)
 
 		include contact-us-modal
-
+		include sentry
+		
 
 

+ 1 - 1
services/web/app/views/user/settings.jade

@@ -108,7 +108,7 @@ block content
 								p.small
 									| #{translate("beta_program_already_participating")}
 								div
-									a(href="/beta/participate") #{translate("manage_beta_program_membership")}
+									a(id="beta-program-participate-link" href="/beta/participate") #{translate("manage_beta_program_membership")}
 
 							hr
 

+ 3 - 2
services/web/package.json

@@ -69,17 +69,18 @@
     "grunt-bunyan": "0.5.0",
     "grunt-contrib-clean": "0.5.0",
     "grunt-contrib-coffee": "0.10.0",
+    "grunt-contrib-cssmin": "^1.0.1",
+    "grunt-contrib-imagemin": "^1.0.1",
     "grunt-contrib-less": "0.9.0",
     "grunt-contrib-requirejs": "0.4.1",
     "grunt-contrib-watch": "^1.0.0",
     "grunt-env": "0.4.4",
     "grunt-exec": "^0.4.7",
-    "grunt-parallel": "^0.5.1",
-    
     "grunt-file-append": "0.0.6",
     "grunt-git-rev-parse": "^0.1.4",
     "grunt-mocha-test": "0.9.0",
     "grunt-newer": "^1.2.0",
+    "grunt-parallel": "^0.5.1",
     "grunt-sed": "^0.1.1",
     "sandboxed-module": "0.2.0",
     "sinon": "",

+ 1 - 1
services/web/public/coffee/filters/formatDate.coffee

@@ -2,7 +2,7 @@ define [
 	"base"
 	"libs/moment-2.9.0"
 ], (App, moment) ->
-	moment.locale "en", calendar:
+	moment.updateLocale "en", calendar:
 		lastDay : '[Yesterday]'
 		sameDay : '[Today]'
 		nextDay : '[Tomorrow]'

+ 17 - 6
services/web/public/coffee/ide/pdf/controllers/PdfController.coffee

@@ -19,6 +19,11 @@ define [
 		else
 			$scope.modifierKey = "Ctrl"
 
+		# utility for making a query string from a hash, could use jquery $.param
+		createQueryString = (args) ->
+			qs_args = ("#{k}=#{v}" for k, v of args)
+			if qs_args.length then "?" + qs_args.join("&") else ""
+
 		$scope.$on "project:joined", () ->
 			return if !autoCompile
 			autoCompile = false
@@ -112,10 +117,14 @@ define [
 					qs.clsiserverid = response.clsiServerId
 					ide.clsiServerId = response.clsiServerId
 				# convert the qs hash into a query string and append it
-				qs_args = ("#{k}=#{v}" for k, v of qs)
-				$scope.pdf.qs = if qs_args.length then "?" + qs_args.join("&") else ""
+				$scope.pdf.qs = createQueryString qs
 				$scope.pdf.url += $scope.pdf.qs
-				$scope.pdf.downloadUrl = "/Project/#{$scope.project_id}/output/output.pdf" + $scope.pdf.qs
+				# special case for the download url
+				if perUserCompile
+					qs.isolated = true
+				# Save all downloads as files
+				qs.popupDownload = true
+				$scope.pdf.downloadUrl = "/project/#{$scope.project_id}/output/output.pdf" + createQueryString(qs)
 
 				fetchLogs(fileByPath['output.log'], fileByPath['output.blg'])
 
@@ -131,10 +140,12 @@ define [
 						file.name = "#{file.path.replace(/^output\./, "")} file"
 					else
 						file.name = file.path
-					if not file.url?
-						file.url = "/project/#{project_id}/output/#{file.path}"
+					qs = {}
+					if perUserCompile
+						qs.isolated = true
 					if response.clsiServerId?
-						file.url = file.url + "?clsiserverid=#{response.clsiServerId}"
+						qs.clsiserverid = response.clsiServerId
+					file.url = "/project/#{project_id}/output/#{file.path}" +	createQueryString qs
 					$scope.pdf.outputFiles.push file
 
 

BIN
services/web/public/img/about/brian_gough.jpg


BIN
services/web/public/img/about/geri.jpg


BIN
services/web/public/img/about/henry_oswald.jpg


BIN
services/web/public/img/about/james_allen.jpg


BIN
services/web/public/img/about/kiri_channon.jpg


BIN
services/web/public/img/about/michael.jpg


BIN
services/web/public/img/about/paulo_reis.jpg


BIN
services/web/public/img/about/shane_kilkelly.jpg


BIN
services/web/public/img/crests/cambridge.png


BIN
services/web/public/img/crests/durham.png


BIN
services/web/public/img/crests/icl.png


BIN
services/web/public/img/crests/liverpool.jpg


BIN
services/web/public/img/crests/mit.gif


BIN
services/web/public/img/crests/nasa.png


BIN
services/web/public/img/crests/oxford.gif


BIN
services/web/public/img/crests/stanford.png


BIN
services/web/public/img/crests/tokyo.png


BIN
services/web/public/img/crests/yale.png


BIN
services/web/public/img/dropbox/document_updated_modal.png


BIN
services/web/public/img/dropbox/dropbox_banner.png


BIN
services/web/public/img/dropbox/dropbox_banner_tall.png


BIN
services/web/public/img/dropbox/dropbox_logo.png


BIN
services/web/public/img/dropbox/dropbox_progress_bar.png


BIN
services/web/public/img/dropbox/history_diff.png


BIN
services/web/public/img/dropbox/share_dropbox_folder.png


BIN
services/web/public/img/dropbox/simple_logo.png


BIN
services/web/public/img/enago.png


BIN
services/web/public/img/faileupload.png


BIN
services/web/public/img/favicon@2x.png


BIN
services/web/public/img/flags/24/en.png


BIN
services/web/public/img/flags/24/pt.png


BIN
services/web/public/img/flags/32/en.png


BIN
services/web/public/img/flags/32/ja.png


BIN
services/web/public/img/flags/32/ko.png


BIN
services/web/public/img/github/octocat.jpg


BIN
services/web/public/img/lion-128.png


BIN
services/web/public/img/lion-sad-128.png


BIN
services/web/public/img/logo.png


BIN
services/web/public/img/logo@2x.png


BIN
services/web/public/img/pattern-home.png


BIN
services/web/public/img/references-search/search_example.gif


BIN
services/web/public/img/screen.png


BIN
services/web/public/img/screen@2x.png


BIN
services/web/public/img/social/facebook-32.png


BIN
services/web/public/img/social/link-32.png


BIN
services/web/public/img/social/mail-32.png


BIN
services/web/public/img/spellcheck-underline.png


BIN
services/web/public/img/spinner.gif


Plik diff jest za duży
+ 4 - 2037
services/web/public/js/libs/algolia-2.5.2.js


Plik diff jest za duży
+ 1 - 3039
services/web/public/js/libs/moment-2.9.0.js


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików