| @@ -15,8 +15,10 @@ | ||
| 15 | 15 | var type = $(this).attr( 'data-visualizer-type' ); |
| 16 | 16 | var chart = $(this).attr( 'data-visualizer-chart-id' ); |
| 17 | 17 | var container = $(this).attr( 'data-visualizer-container-id' ); |
| 18 | 18 | var lock = $('.visualizer-front.visualizer-front-' + chart); |
| 19 | + var mime = $(this).attr( 'data-visualizer-mime' ); | |
| 20 | + console.log(mime); | |
| 19 | 21 | lock.lock(); |
| 20 | 22 | e.preventDefault(); |
| 21 | 23 | $.ajax({ |
| 22 | 24 | url : v.rest_url.replace('#id#', chart).replace('#type#', type), |
| @@ -23,27 +25,36 @@ | ||
| 23 | 25 | success: function(data) { |
| 24 | 26 | if (data && data.data) { |
| 25 | 27 | switch(type){ |
| 26 | 28 | case 'csv': |
| 27 | - var a = document.createElement("a"); | |
| 28 | - document.body.appendChild(a); | |
| 29 | - a.style = "display: none"; | |
| 30 | - var blob = new Blob([data.data.csv], {type: $(this).attr( 'data-visualizer-mime' ) }), | |
| 31 | - url = window.URL.createObjectURL(blob); | |
| 32 | - a.href = url; | |
| 33 | - a.download = data.data.name; | |
| 34 | - a.click(); | |
| 35 | - setTimeout(function () { | |
| 36 | - window.URL.revokeObjectURL(url); | |
| 37 | - }, 100); | |
| 29 | + var blob = new Blob([data.data.csv], {type: mime }); | |
| 30 | + if(window.navigator.msSaveOrOpenBlob){ | |
| 31 | + window.navigator.msSaveOrOpenBlob(blob, data.data.name); | |
| 32 | + } else { | |
| 33 | + var url = window.URL.createObjectURL(blob); | |
| 34 | + var $a = $("<a>"); | |
| 35 | + $a.attr("href", url); | |
| 36 | + $("body").append($a); | |
| 37 | + $a.attr("download", data.data.name); | |
| 38 | + $a[0].click(); | |
| 39 | + setTimeout(function () { | |
| 40 | + window.URL.revokeObjectURL(url); | |
| 41 | + $a.remove(); | |
| 42 | + }, 100); | |
| 43 | + } | |
| 38 | 44 | break; |
| 39 | 45 | case 'xls': |
| 40 | - var $a = $("<a>"); | |
| 41 | - $a.attr("href",data.data.csv); | |
| 42 | - $("body").append($a); | |
| 43 | - $a.attr("download",data.data.name); | |
| 44 | - $a[0].click(); | |
| 45 | - $a.remove(); | |
| 46 | + if(window.navigator.msSaveOrOpenBlob){ | |
| 47 | + blob = new Blob([s2ab(atob(data.data.raw))], {type: '' }); | |
| 48 | + window.navigator.msSaveOrOpenBlob(blob, data.data.name); | |
| 49 | + } else { | |
| 50 | + var $a = $("<a>"); // jshint ignore:line | |
| 51 | + $a.attr("href", data.data.csv); | |
| 52 | + $("body").append($a); | |
| 53 | + $a.attr("download", data.data.name); | |
| 54 | + $a[0].click(); | |
| 55 | + $a.remove(); | |
| 56 | + } | |
| 46 | 57 | break; |
| 47 | 58 | case 'print': |
| 48 | 59 | $('body').trigger('visualizer:action:specificchart', {action: 'print', id: container, data: data.data.csv}); |
| 49 | 60 | break; |
| @@ -59,9 +70,43 @@ | ||
| 59 | 70 | }); |
| 60 | 71 | }); |
| 61 | 72 | } |
| 62 | 73 | |
| 74 | + function s2ab(s) { | |
| 75 | + var buf = new ArrayBuffer(s.length); | |
| 76 | + var view = new Uint8Array(buf); | |
| 77 | + for (var i=0; i !== s.length; ++i) { | |
| 78 | + view[i] = s.charCodeAt(i) & 0xFF; | |
| 79 | + } | |
| 80 | + return buf; | |
| 81 | + } | |
| 82 | + | |
| 63 | 83 | $(document).ready(function(){ |
| 84 | + | |
| 85 | + // for updating the currently displayed chart (preview mode) | |
| 86 | + window.updateChartPreview = function(){ | |
| 87 | + var event = new CustomEvent('visualizer:render:currentchart:update', {detail: {visualizer: visualizer}}); | |
| 88 | + document.body.dispatchEvent(event); | |
| 89 | + }; | |
| 90 | + | |
| 91 | + // facade loads N times in the library (where N = the number of different chart libraries supported) | |
| 92 | + // so all charts are also loaded N times | |
| 93 | + // this will ensure that no matter how many times facade is loaded, it initializes all charts only once. | |
| 94 | + // fixed as part of the issue to add annotations. | |
| 95 | + if(visualizer.page_type === 'library'){ | |
| 96 | + if(localStorage.getItem( 'viz-facade-loaded' ) === '1'){ | |
| 97 | + // prevent library from hanging. | |
| 98 | + setTimeout( function(){ | |
| 99 | + localStorage.removeItem( 'viz-facade-loaded' ); | |
| 100 | + }, 2000); | |
| 101 | + return; | |
| 102 | + } | |
| 103 | + localStorage.setItem( 'viz-facade-loaded', '1'); | |
| 104 | + // remove the flag so that repeated loading of the library does not cause problems. | |
| 105 | + setTimeout( function(){ | |
| 106 | + localStorage.removeItem( 'viz-facade-loaded' ); | |
| 107 | + }, 2000); | |
| 108 | + } | |
| 64 | 109 | $('body').trigger('visualizer:render:chart:start', visualizer); |
| 65 | 110 | initActionsButtons(visualizer); |
| 66 | 111 | registerDefaultActions(); |
| 67 | 112 | }); |
| @@ -129,5 +174,5 @@ | ||
| 129 | 174 | }); |
| 130 | 175 | |
| 131 | 176 | return $(this); |
| 132 | 177 | }; |
| 133 | -})(jQuery); | |
| 178 | +})(jQuery); | |