From 65b2c42fadb36c89818c1727d5c3c189a83159f0 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 1 Sep 2017 10:32:26 +0100 Subject: [PATCH 01/21] Emit event when op is acknowledged --- services/web/public/coffee/ide/editor/Document.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index d1aa883734..229e791c67 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -309,6 +309,9 @@ define [ @ide.pushEvent "op:acknowledged", doc_id: @doc_id op: op + @ide.$scope.$emit "ide:opAcknowledged", + doc_id: @doc_id + op: op @trigger "op:acknowledged" @doc.on "op:timeout", (op) => @ide.pushEvent "op:timeout", From c42b08fcffa26774ecb313baef158db425dba6bb Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 1 Sep 2017 17:54:35 +0100 Subject: [PATCH 02/21] Dispatch linting error event when changed --- .../coffee/ide/editor/directives/aceEditor.coffee | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 1cb527fc40..5107c89a7e 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -35,7 +35,7 @@ define [ url = ace.config._moduleUrl(args...) + "?fingerprint=#{window.aceFingerprint}" return url - App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, graphics, preamble) -> + App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, graphics, preamble, ide) -> monkeyPatchSearch($rootScope, $compile) return { @@ -374,6 +374,18 @@ define [ if scope.eventsBridge? session.on "changeScrollTop", onScroll + hasLintingError = null + session.on('changeAnnotation', () -> + hasErrors = session + .getAnnotations() + .filter((annotation) -> annotation.type == 'error') + .length > 0 + + if (hasLintingError != hasErrors) + ide.$scope.$broadcast('ide:lintingError', hasErrors) + hasLintingError = hasErrors + ) + setTimeout () -> # Let any listeners init themselves onScroll(editor.renderer.getScrollTop()) From dab799a81b9a8beb2eed1f89ffc60379763410fd Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 1 Sep 2017 15:31:08 +0100 Subject: [PATCH 03/21] First pass at auto compile ctrl --- services/web/app/views/project/editor/pdf.pug | 1 + .../web/public/coffee/ide/pdf/PdfManager.coffee | 3 ++- .../pdf/controllers/AutoCompileController.coffee | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 960d4bf2c9..5cc360afe1 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -1,4 +1,5 @@ div.full-size.pdf(ng-controller="PdfController") + .FIXME(ng-controller="AutoCompileController") .toolbar.toolbar-tall .btn-group( dropdown, diff --git a/services/web/public/coffee/ide/pdf/PdfManager.coffee b/services/web/public/coffee/ide/pdf/PdfManager.coffee index 56fe7b1e68..871257031a 100644 --- a/services/web/public/coffee/ide/pdf/PdfManager.coffee +++ b/services/web/public/coffee/ide/pdf/PdfManager.coffee @@ -1,7 +1,8 @@ define [ "ide/pdf/controllers/PdfController" "ide/pdf/controllers/PdfViewToggleController" - "ide/pdfng/directives/pdfJs" + "ide/pdfng/directives/pdfJs", + "ide/pdf/controllers/AutoCompileController" ], () -> class PdfManager constructor: (@ide, @$scope) -> diff --git a/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee b/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee new file mode 100644 index 0000000000..6d59aa7703 --- /dev/null +++ b/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee @@ -0,0 +1,14 @@ +define [ + "base" +], (App) -> + App.controller "AutoCompileController", ["$scope", "ide", ($scope, ide) -> + hasLintingError = false + + ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> + if (!hasLintingError) + $scope.recompile() + , 3000) + + ide.$scope.$on "ide:lintingError", (e, hasError) -> + hasLintingError = hasError + ] \ No newline at end of file From 53bb4fdde081107131a239922addb7544be8fa10 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 4 Sep 2017 11:38:28 +0100 Subject: [PATCH 04/21] Use var in root scope instead of event to track linting error --- .../public/coffee/ide/editor/directives/aceEditor.coffee | 9 ++++----- .../ide/pdf/controllers/AutoCompileController.coffee | 7 +------ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 5107c89a7e..7660178182 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -35,7 +35,7 @@ define [ url = ace.config._moduleUrl(args...) + "?fingerprint=#{window.aceFingerprint}" return url - App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, graphics, preamble, ide) -> + App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, graphics, preamble) -> monkeyPatchSearch($rootScope, $compile) return { @@ -374,16 +374,15 @@ define [ if scope.eventsBridge? session.on "changeScrollTop", onScroll - hasLintingError = null + $rootScope.hasLintingError = false session.on('changeAnnotation', () -> hasErrors = session .getAnnotations() .filter((annotation) -> annotation.type == 'error') .length > 0 - if (hasLintingError != hasErrors) - ide.$scope.$broadcast('ide:lintingError', hasErrors) - hasLintingError = hasErrors + if ($rootScope.hasLintingError != hasErrors) + $rootScope.hasLintingError = hasErrors ) setTimeout () -> diff --git a/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee b/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee index 6d59aa7703..7e28153262 100644 --- a/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee @@ -2,13 +2,8 @@ define [ "base" ], (App) -> App.controller "AutoCompileController", ["$scope", "ide", ($scope, ide) -> - hasLintingError = false - ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> - if (!hasLintingError) + if (!ide.$scope.hasLintingError) $scope.recompile() , 3000) - - ide.$scope.$on "ide:lintingError", (e, hasError) -> - hasLintingError = hasError ] \ No newline at end of file From 9f1adfd0c0b5bbe8157f6f70ec4be474780454af Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 4 Sep 2017 11:41:52 +0100 Subject: [PATCH 05/21] Replace separate autocompile ctrl with listener in PdfController --- services/web/app/views/project/editor/pdf.pug | 1 - services/web/public/coffee/ide/pdf/PdfManager.coffee | 3 +-- .../ide/pdf/controllers/AutoCompileController.coffee | 9 --------- .../coffee/ide/pdf/controllers/PdfController.coffee | 5 +++++ 4 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 5cc360afe1..960d4bf2c9 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -1,5 +1,4 @@ div.full-size.pdf(ng-controller="PdfController") - .FIXME(ng-controller="AutoCompileController") .toolbar.toolbar-tall .btn-group( dropdown, diff --git a/services/web/public/coffee/ide/pdf/PdfManager.coffee b/services/web/public/coffee/ide/pdf/PdfManager.coffee index 871257031a..56fe7b1e68 100644 --- a/services/web/public/coffee/ide/pdf/PdfManager.coffee +++ b/services/web/public/coffee/ide/pdf/PdfManager.coffee @@ -1,8 +1,7 @@ define [ "ide/pdf/controllers/PdfController" "ide/pdf/controllers/PdfViewToggleController" - "ide/pdfng/directives/pdfJs", - "ide/pdf/controllers/AutoCompileController" + "ide/pdfng/directives/pdfJs" ], () -> class PdfManager constructor: (@ide, @$scope) -> diff --git a/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee b/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee deleted file mode 100644 index 7e28153262..0000000000 --- a/services/web/public/coffee/ide/pdf/controllers/AutoCompileController.coffee +++ /dev/null @@ -1,9 +0,0 @@ -define [ - "base" -], (App) -> - App.controller "AutoCompileController", ["$scope", "ide", ($scope, ide) -> - ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> - if (!ide.$scope.hasLintingError) - $scope.recompile() - , 3000) - ] \ No newline at end of file diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 42c1cd1bc8..23770faef7 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -73,6 +73,11 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.renderingError = true + ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> + if (!ide.$scope.hasLintingError) + $scope.recompile() + , 3000) + # abort compile if syntax checks fail $scope.stop_on_validation_error = localStorage("stop_on_validation_error:#{$scope.project_id}") $scope.stop_on_validation_error ?= true # turn on for all users by default From fc4a260d95d47b03105ddcaff20e82e4da5fb925 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 4 Sep 2017 13:22:49 +0100 Subject: [PATCH 06/21] Ensure error is from linting not compile logs --- .../web/public/coffee/ide/editor/directives/aceEditor.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 7660178182..b6455d8e93 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -378,7 +378,7 @@ define [ session.on('changeAnnotation', () -> hasErrors = session .getAnnotations() - .filter((annotation) -> annotation.type == 'error') + .filter((annotation) -> annotation.fromLinting && annotation.type == 'error') .length > 0 if ($rootScope.hasLintingError != hasErrors) From 64f70942d0b133a256fcc3106de90dbd0e8c99b8 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 11:41:11 +0100 Subject: [PATCH 07/21] Ensure user is in beta program --- .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 23770faef7..abbf6b401c 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -6,7 +6,6 @@ define [ "services/log-hints-feedback" ], (App, Ace, HumanReadableLogs, BibLogParser) -> App.controller "PdfController", ($scope, $http, ide, $modal, synctex, event_tracking, logHintsFeedback, localStorage) -> - # enable per-user containers by default perUserCompile = true autoCompile = true @@ -76,7 +75,7 @@ define [ ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> if (!ide.$scope.hasLintingError) $scope.recompile() - , 3000) + , 3000) if window.user?.betaProgram # abort compile if syntax checks fail $scope.stop_on_validation_error = localStorage("stop_on_validation_error:#{$scope.project_id}") From cca7f553221562aebe9bd2388d78a2bc2a7915bd Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 12:21:23 +0100 Subject: [PATCH 08/21] Add autocompile setting --- services/web/app/views/project/editor/pdf.pug | 9 +++++++++ .../coffee/ide/pdf/controllers/PdfController.coffee | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 960d4bf2c9..6e040f304e 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -26,6 +26,15 @@ div.full-size.pdf(ng-controller="PdfController") ) span.caret ul.dropdown-menu.dropdown-menu-left + // Only show on beta program? + li.dropdown-header Auto-compile + li + a(href, ng-click="autocompile_enabled = true") + i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}") + |  On + a(href, ng-click="autocompile_enabled = false") + i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}") + |  Off li.dropdown-header #{translate("compile_mode")} li a(href, ng-click="draft = false") diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index abbf6b401c..3406f36f51 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -72,10 +72,16 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.renderingError = true + $scope.autocompile_enabled = localStorage("autocompile_enabled:#{$scope.project_id}") or false + $scope.$watch "autocompile_enabled", (newValue, oldValue) -> + if newValue? and oldValue != newValue + localStorage("autocompile_enabled:#{$scope.project_id}", newValue) + +# TODO: toggle listener when setting changed? ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> if (!ide.$scope.hasLintingError) $scope.recompile() - , 3000) if window.user?.betaProgram + , 3000) if window.user?.betaProgram and $scope.autocompile_enabled # abort compile if syntax checks fail $scope.stop_on_validation_error = localStorage("stop_on_validation_error:#{$scope.project_id}") From a9e94f6a6d02040640a8e2c5ebc3d771e295b04a Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 13:57:11 +0100 Subject: [PATCH 09/21] Unsubscribe autocompile listener if disabled --- .../ide/pdf/controllers/PdfController.coffee | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 3406f36f51..3c9915cdfa 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -72,16 +72,26 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.renderingError = true + triggerAutoCompile = () -> + if (!ide.$scope.hasLintingError) + $scope.recompile() + + autoCompileListener = null + toggleAutoCompile = (enabling) -> + if enabling + autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, 3000) + else + autoCompileListener() if autoCompileListener + autoCompileListener = null + $scope.autocompile_enabled = localStorage("autocompile_enabled:#{$scope.project_id}") or false $scope.$watch "autocompile_enabled", (newValue, oldValue) -> if newValue? and oldValue != newValue localStorage("autocompile_enabled:#{$scope.project_id}", newValue) + toggleAutoCompile(newValue) -# TODO: toggle listener when setting changed? - ide.$scope.$on "ide:opAcknowledged", _.debounce(() -> - if (!ide.$scope.hasLintingError) - $scope.recompile() - , 3000) if window.user?.betaProgram and $scope.autocompile_enabled + if window.user?.betaProgram and $scope.autocompile_enabled + toggleAutoCompile(true) # abort compile if syntax checks fail $scope.stop_on_validation_error = localStorage("stop_on_validation_error:#{$scope.project_id}") From ce630e4971172d71fe9d410995082078302eb333 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 14:00:14 +0100 Subject: [PATCH 10/21] Extract timeout constant --- .../public/coffee/ide/pdf/controllers/PdfController.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 3c9915cdfa..2d2eac5a51 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -5,6 +5,8 @@ define [ "libs/bib-log-parser" "services/log-hints-feedback" ], (App, Ace, HumanReadableLogs, BibLogParser) -> + AUTO_COMPILE_TIMEOUT = 3000 + App.controller "PdfController", ($scope, $http, ide, $modal, synctex, event_tracking, logHintsFeedback, localStorage) -> # enable per-user containers by default perUserCompile = true @@ -79,7 +81,7 @@ define [ autoCompileListener = null toggleAutoCompile = (enabling) -> if enabling - autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, 3000) + autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, AUTO_COMPILE_TIMEOUT) else autoCompileListener() if autoCompileListener autoCompileListener = null From 42ae7a6479b4ebe337097592665eb6c878410158 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 14:56:28 +0100 Subject: [PATCH 11/21] Only show auto compile option for beta program users --- services/web/app/views/project/editor/pdf.pug | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 6e040f304e..4b70fe566d 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -27,14 +27,16 @@ div.full-size.pdf(ng-controller="PdfController") span.caret ul.dropdown-menu.dropdown-menu-left // Only show on beta program? - li.dropdown-header Auto-compile - li - a(href, ng-click="autocompile_enabled = true") - i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}") - |  On - a(href, ng-click="autocompile_enabled = false") - i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}") - |  Off + if user.betaProgram + li.dropdown-header Auto-compile + li + a(href, ng-click="autocompile_enabled = true") + i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}") + |  On + li + a(href, ng-click="autocompile_enabled = false") + i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}") + |  Off li.dropdown-header #{translate("compile_mode")} li a(href, ng-click="draft = false") From 32b849faf7f8ccfb107e0817a1dcf11ed3fcbecc Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 5 Sep 2017 14:56:48 +0100 Subject: [PATCH 12/21] Use translations --- services/web/app/views/project/editor/pdf.pug | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 4b70fe566d..db4a0e9dd3 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -28,15 +28,15 @@ div.full-size.pdf(ng-controller="PdfController") ul.dropdown-menu.dropdown-menu-left // Only show on beta program? if user.betaProgram - li.dropdown-header Auto-compile + li.dropdown-header #{translate("auto_compile")} li a(href, ng-click="autocompile_enabled = true") i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}") - |  On + |  #{translate('on')} li a(href, ng-click="autocompile_enabled = false") i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}") - |  Off + |  #{translate('off')} li.dropdown-header #{translate("compile_mode")} li a(href, ng-click="draft = false") From 0c76b06a97a57bc0505f11e08b297f3a3acdef56 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 10:02:48 +0100 Subject: [PATCH 13/21] Increase timeout to 5 seconds --- .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 2d2eac5a51..68ded26551 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -5,7 +5,7 @@ define [ "libs/bib-log-parser" "services/log-hints-feedback" ], (App, Ace, HumanReadableLogs, BibLogParser) -> - AUTO_COMPILE_TIMEOUT = 3000 + AUTO_COMPILE_TIMEOUT = 5000 App.controller "PdfController", ($scope, $http, ide, $modal, synctex, event_tracking, logHintsFeedback, localStorage) -> # enable per-user containers by default From 8a8d98935b6ff15dff25748f51f3e95feaadc88c Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 10:04:10 +0100 Subject: [PATCH 14/21] Remove unnecessary linting check in annotations listener When user starts typing, compile log annotations are replaced with linter ones, so log errrors can be ignored for this purpose. Because we don't try to autocompile unless the user types something --- .../web/public/coffee/ide/editor/directives/aceEditor.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index b6455d8e93..7660178182 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -378,7 +378,7 @@ define [ session.on('changeAnnotation', () -> hasErrors = session .getAnnotations() - .filter((annotation) -> annotation.fromLinting && annotation.type == 'error') + .filter((annotation) -> annotation.type == 'error') .length > 0 if ($rootScope.hasLintingError != hasErrors) From 11386eb817f61bd5ec4e5d0416c4b62455f3129a Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 10:20:21 +0100 Subject: [PATCH 15/21] Add option to autocompile, so can be identified in event tracking --- .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 68ded26551..cc569a9465 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -76,7 +76,7 @@ define [ triggerAutoCompile = () -> if (!ide.$scope.hasLintingError) - $scope.recompile() + $scope.recompile(isBackgroundAutoCompile: true) autoCompileListener = null toggleAutoCompile = (enabling) -> From a8cdfb7ecc86625b462993f8abc40e0df1a54dfe Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 11:13:38 +0100 Subject: [PATCH 16/21] Track autocompile setting change --- .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index cc569a9465..65b0263163 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -91,6 +91,7 @@ define [ if newValue? and oldValue != newValue localStorage("autocompile_enabled:#{$scope.project_id}", newValue) toggleAutoCompile(newValue) + event_tracking.sendMB "autocompile-setting-changed", newValue if window.user?.betaProgram and $scope.autocompile_enabled toggleAutoCompile(true) From 9cde236bc8da2d7f7bc9fe6ead7ff475deeb5b03 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 11:28:36 +0100 Subject: [PATCH 17/21] Add comment explaining lint errors vs compile log errors --- .../web/public/coffee/ide/editor/directives/aceEditor.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 7660178182..0b22e75221 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -376,6 +376,10 @@ define [ $rootScope.hasLintingError = false session.on('changeAnnotation', () -> + # Both linter errors and compile logs are set as error annotations, + # however when the user types something, the compile logs are + # replaced with linter errors. When we check for lint errors before + # autocompile we are guaranteed to get linter errors hasErrors = session .getAnnotations() .filter((annotation) -> annotation.type == 'error') From e2523c569e3eaf88153322b21877ef1d08bfa88b Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 7 Sep 2017 17:45:16 +0100 Subject: [PATCH 18/21] Filter linting warnings --- .../web/public/coffee/ide/editor/directives/aceEditor.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 0b22e75221..40ae0bb06f 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -382,7 +382,7 @@ define [ # autocompile we are guaranteed to get linter errors hasErrors = session .getAnnotations() - .filter((annotation) -> annotation.type == 'error') + .filter((annotation) -> annotation.type != 'info') .length > 0 if ($rootScope.hasLintingError != hasErrors) From 4a490aafbf9fb5d6268115730340aabaf5528baf Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 8 Sep 2017 10:42:54 +0100 Subject: [PATCH 19/21] Improve UX of triggering autocompile. If a user is making infrequent edits (i.e. if reading and making small changes), then waiting 5 seconds for a recompile is bad. Therefore we track the time since the last recompile and use this to decide whether a recompile should be run. This reduces the time to recompile, unless the user is typing for a significant amount of time. --- .../ide/pdf/controllers/PdfController.coffee | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 65b0263163..d55203c267 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -6,6 +6,7 @@ define [ "services/log-hints-feedback" ], (App, Ace, HumanReadableLogs, BibLogParser) -> AUTO_COMPILE_TIMEOUT = 5000 + OP_ACKNOWLEDGEMENT_TIMEOUT = 1100 App.controller "PdfController", ($scope, $http, ide, $modal, synctex, event_tracking, logHintsFeedback, localStorage) -> # enable per-user containers by default @@ -74,14 +75,26 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.renderingError = true + autoCompileTimeout = null triggerAutoCompile = () -> - if (!ide.$scope.hasLintingError) - $scope.recompile(isBackgroundAutoCompile: true) + return if autoCompileTimeout + + timeSinceLastCompile = Date.now() - $scope.recompiledAt + + if timeSinceLastCompile >= AUTO_COMPILE_TIMEOUT + if (!ide.$scope.hasLintingError) + $scope.recompile(isBackgroundAutoCompile: true) + else + # Extend remainder of timeout + autoCompileTimeout = setTimeout () -> + autoCompileTimeout = null + triggerAutoCompile() + , AUTO_COMPILE_TIMEOUT - timeSinceLastCompile autoCompileListener = null toggleAutoCompile = (enabling) -> if enabling - autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, AUTO_COMPILE_TIMEOUT) + autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, OP_ACKNOWLEDGEMENT_TIMEOUT) else autoCompileListener() if autoCompileListener autoCompileListener = null @@ -422,6 +435,8 @@ define [ $scope.pdf.renderingError = false $scope.pdf.error = true $scope.pdf.view = 'errors' + .finally () -> + $scope.recompiledAt = Date.now() # This needs to be public. ide.$scope.recompile = $scope.recompile From 38eaf82c65b979c0b328883e1c4d47fd475e582c Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 8 Sep 2017 11:00:46 +0100 Subject: [PATCH 20/21] Ensure that time is monotonic when running autocompile --- .../public/coffee/ide/pdf/controllers/PdfController.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index d55203c267..897983f47a 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -80,8 +80,11 @@ define [ return if autoCompileTimeout timeSinceLastCompile = Date.now() - $scope.recompiledAt + # If time is non-monotonic, assume that the user's system clock has been + # changed and continue with recompile + isTimeNonMonotonic = timeSinceLastPoll < 0; - if timeSinceLastCompile >= AUTO_COMPILE_TIMEOUT + if isTimeNonMonotonic || timeSinceLastCompile >= AUTO_COMPILE_TIMEOUT if (!ide.$scope.hasLintingError) $scope.recompile(isBackgroundAutoCompile: true) else From 963a14b33cf1311a47c5e2aaa055053707415ef9 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 19 Sep 2017 14:25:30 +0100 Subject: [PATCH 21/21] Fix incorrectly named var and remove unneccessary semicolon --- .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 897983f47a..067a85f0d2 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -82,7 +82,7 @@ define [ timeSinceLastCompile = Date.now() - $scope.recompiledAt # If time is non-monotonic, assume that the user's system clock has been # changed and continue with recompile - isTimeNonMonotonic = timeSinceLastPoll < 0; + isTimeNonMonotonic = timeSinceLastCompile < 0 if isTimeNonMonotonic || timeSinceLastCompile >= AUTO_COMPILE_TIMEOUT if (!ide.$scope.hasLintingError)