From 2441930fe98339cd6f14fe3cd3d97eb5ecb4918e Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 20 May 2016 14:28:51 +0100 Subject: [PATCH] Add a spinner when waiting for image preview to load. --- .../app/views/project/editor/binary-file.jade | 4 ++++ .../controllers/BinaryFileController.coffee | 10 +++++++++- services/web/public/img/spinner.gif | Bin 0 -> 14742 bytes .../stylesheets/app/editor/binary-file.less | 5 +++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 services/web/public/img/spinner.gif diff --git a/services/web/app/views/project/editor/binary-file.jade b/services/web/app/views/project/editor/binary-file.jade index eaaa6e6c65..d0effce668 100644 --- a/services/web/app/views/project/editor/binary-file.jade +++ b/services/web/app/views/project/editor/binary-file.jade @@ -7,16 +7,20 @@ div.binary-file.full-size( ng-show="!failedLoad" ng-src="/project/{{ project_id }}/file/{{ openFile.id }}" ng-if="['png', 'jpg', 'jpeg', 'gif'].indexOf(extension(openFile)) > -1" + ng-class="{'img-preview': !imgLoaded}" onerror="sl_binaryFilePreviewError()" onabort="sl_binaryFilePreviewError()" + onload="sl_binaryFilePreviewLoaded()" ) img( ng-show="!failedLoad" ng-src="/project/{{ project_id }}/file/{{ openFile.id }}?format=png" ng-if="['pdf', 'eps'].indexOf(extension(openFile)) > -1" + ng-class="{'img-preview': !imgLoaded}" onerror="sl_binaryFilePreviewError()" onabort="sl_binaryFilePreviewError()" + onload="sl_binaryFilePreviewLoaded()" ) div(ng-if="(['bib'].indexOf(extension(openFile)) > -1) && !bibtexPreview.error") diff --git a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee index 7dceeff965..b1457532b5 100644 --- a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee +++ b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee @@ -11,12 +11,20 @@ define [ error: false data: null + # Callback fired when the `img` tag fails to load, + # `failedLoad` used to show the "No Preview" message $scope.failedLoad = false - window.sl_binaryFilePreviewError = () => $scope.failedLoad = true $scope.$apply() + # Callback fired when the `img` tag is done loading, + # `imgLoaded` is used to show the spinner gif while loading + $scope.imgLoaded = false + window.sl_binaryFilePreviewLoaded = () => + $scope.imgLoaded = true + $scope.$apply() + $scope.extension = (file) -> return file.name.split(".").pop()?.toLowerCase() diff --git a/services/web/public/img/spinner.gif b/services/web/public/img/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..22220a221447ac15cb9690fe78375e17620c04dc GIT binary patch literal 14742 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