You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by co...@apache.org on 2015/11/16 08:41:15 UTC
incubator-zeppelin git commit: ZEPPELIN-372 : fix for Export not
working on Firefox and Safari
Repository: incubator-zeppelin
Updated Branches:
refs/heads/master 4b94aa701 -> 498fdd6b2
ZEPPELIN-372 : fix for Export not working on Firefox and Safari
With reference to bug in https://github.com/apache/incubator-zeppelin/pull/376#issuecomment-154801136
The export link was not working on Firefox and Safari.
Have made a fix, this should enable download on Firefox and Safari.
Author: Prabhjyot Singh <pr...@gmail.com>
Closes #408 from prabhjyotsingh/ZEPPELIN-372_fix and squashes the following commits:
cc20de6 [Prabhjyot Singh] refactoring function into service and remove jQuery call
0833eb2 [Prabhjyot Singh] ZEPPELIN-372: fix for Export not working on IE
91fd7f9 [Prabhjyot Singh] fix for not working on Firefox and Safari
Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/498fdd6b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/498fdd6b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/498fdd6b
Branch: refs/heads/master
Commit: 498fdd6b2ebb5f62864918649f30c72e75c8a75c
Parents: 4b94aa7
Author: Prabhjyot Singh <pr...@gmail.com>
Authored: Tue Nov 10 12:04:08 2015 +0530
Committer: Damien CORNEAU <co...@gmail.com>
Committed: Mon Nov 16 16:40:56 2015 +0900
----------------------------------------------------------------------
.../src/app/notebook/notebook.controller.js | 12 ++---
.../browser-detect/browserDetect.service.js | 40 ++++++++++++++++
.../src/components/saveAs/saveAs.service.js | 48 ++++++++++++++++++++
zeppelin-web/src/index.html | 2 +
4 files changed, 95 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/498fdd6b/zeppelin-web/src/app/notebook/notebook.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js
index b671ead..848d66d 100644
--- a/zeppelin-web/src/app/notebook/notebook.controller.js
+++ b/zeppelin-web/src/app/notebook/notebook.controller.js
@@ -15,7 +15,9 @@
*/
'use strict';
-angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $route, $routeParams, $location, $rootScope, $http, websocketMsgSrv, baseUrlSrv, $timeout) {
+angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $route, $routeParams, $location,
+ $rootScope, $http, websocketMsgSrv, baseUrlSrv,
+ $timeout, SaveAsService) {
$scope.note = null;
$scope.showEditor = false;
$scope.editorToggled = false;
@@ -81,12 +83,8 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro
//Export notebook
$scope.exportNotebook = function() {
- var jsonContent = 'data:text/json;charset=utf-8,' + JSON.stringify($scope.note);
- var encodedUri = encodeURI(jsonContent);
- var link = document.createElement('a');
- link.setAttribute('href', encodedUri);
- link.setAttribute('download', $scope.note.name + '.json');
- link.click();
+ var jsonContent = JSON.stringify($scope.note);
+ SaveAsService.SaveAs(jsonContent, $scope.note.name, 'json');
};
//Clone note
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/498fdd6b/zeppelin-web/src/components/browser-detect/browserDetect.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/browser-detect/browserDetect.service.js b/zeppelin-web/src/components/browser-detect/browserDetect.service.js
new file mode 100644
index 0000000..2e70175
--- /dev/null
+++ b/zeppelin-web/src/components/browser-detect/browserDetect.service.js
@@ -0,0 +1,40 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+'use strict';
+
+angular.module('zeppelinWebApp').service('browserDetectService', function() {
+
+ this.detectIE = function() {
+ var ua = window.navigator.userAgent;
+ var msie = ua.indexOf('MSIE ');
+ if (msie > 0) {
+ // IE 10 or older => return version number
+ return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+ }
+ var trident = ua.indexOf('Trident/');
+ if (trident > 0) {
+ // IE 11 => return version number
+ var rv = ua.indexOf('rv:');
+ return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+ }
+ var edge = ua.indexOf('Edge/');
+ if (edge > 0) {
+ // IE 12 (aka Edge) => return version number
+ return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+ }
+ // other browser
+ return false;
+ };
+
+});
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/498fdd6b/zeppelin-web/src/components/saveAs/saveAs.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/saveAs/saveAs.service.js b/zeppelin-web/src/components/saveAs/saveAs.service.js
new file mode 100644
index 0000000..7026594
--- /dev/null
+++ b/zeppelin-web/src/components/saveAs/saveAs.service.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+'use strict';
+
+angular.module('zeppelinWebApp').service('SaveAsService', function(browserDetectService) {
+
+ this.SaveAs = function(content, filename, extension) {
+ if (browserDetectService.detectIE()) {
+ angular.element('body').append('<iframe id="SaveAsId" style="display: none"></iframe>');
+ var frameSaveAs = angular.element('body > iframe#SaveAsId')[0].contentWindow;
+ frameSaveAs.document.open('text/json', 'replace');
+ frameSaveAs.document.write(content);
+ frameSaveAs.document.close();
+ frameSaveAs.focus();
+ var t1 = Date.now();
+ frameSaveAs.document.execCommand('SaveAs', false, filename + '.' + extension);
+ var t2 = Date.now();
+
+ //This means, this version of IE dosen't support auto download of a file with extension provided in param
+ //falling back to ".txt"
+ if (t1 === t2) {
+ frameSaveAs.document.execCommand('SaveAs', true, filename + '.txt');
+ }
+ angular.element('body > iframe#SaveAsId').remove();
+ } else {
+ content = 'data:image/svg;charset=utf-8,' + encodeURIComponent(content);
+ angular.element('body').append('<a id="SaveAsId"></a>');
+ var saveAsElement = angular.element('body > a#SaveAsId');
+ saveAsElement.attr('href', content);
+ saveAsElement.attr('download', filename + '.' + extension);
+ saveAsElement.attr('target', '_blank');
+ saveAsElement[0].click();
+ saveAsElement.remove();
+ }
+ };
+
+});
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/498fdd6b/zeppelin-web/src/index.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html
index ea485e1..b8dd489 100644
--- a/zeppelin-web/src/index.html
+++ b/zeppelin-web/src/index.html
@@ -138,6 +138,8 @@ limitations under the License.
<script src="components/websocketEvents/websocketEvents.factory.js"></script>
<script src="components/notebookListDataFactory/notebookList.datafactory.js"></script>
<script src="components/baseUrl/baseUrl.service.js"></script>
+ <script src="components/browser-detect/browserDetect.service.js"></script>
+ <script src="components/saveAs/saveAs.service.js"></script>
<!-- endbuild -->
</body>
</html>