1/* global console */ 2/* global visualizer */ 3/* global jQuery */ 4window['vizClipboard1'] = window['vizClipboard1'] || null; 5window['vizClipboard2'] = window['vizClipboard2'] || null; 6(function($, visualizer){ 7 8 function initActionsButtons(v) { 9 if($('a.visualizer-chart-shortcode').length > 0 && vizClipboard1 === null) { 10 vizClipboard1 = new ClipboardJS('a.visualizer-chart-shortcode'); // jshint ignore:line 11 vizClipboard1.on('success', function(e) { 12 window.alert(v.i10n['copied']); 13 14 }); 15 } 16 17 if($('a.visualizer-action[data-visualizer-type=copy]').length > 0 && vizClipboard2 === null) { 18 $('a.visualizer-action[data-visualizer-type=copy]').on('click', function(e) { 19 e.preventDefault(); 20 }); 21 vizClipboard2 = new ClipboardJS('a.visualizer-action[data-visualizer-type=copy]'); // jshint ignore:line 22 vizClipboard2.on('success', function(e) { 23 window.alert(v.i10n['copied']); 24 }); 25 } 26 $('a.visualizer-action[data-visualizer-type!=copy]').off('click').on('click', function(e) { 27 var type = $(this).attr( 'data-visualizer-type' ); 28 var chart = $(this).attr( 'data-visualizer-chart-id' ); 29 var container = $(this).attr( 'data-visualizer-container-id' ); 30 var lock = $('.visualizer-front.visualizer-front-' + chart); 31 var mime = $(this).attr( 'data-visualizer-mime' ); 32 lock.lock(); 33 e.preventDefault(); 34 $.ajax({ 35 url : v.rest_url.replace('#id#', chart).replace('#type#', type), 36 beforeSend: function ( xhr ) { 37 xhr.setRequestHeader( 'X-WP-Nonce', v.wp_nonce ); 38 }, 39 success: function(data) { 40 if (data && data.data) { 41 switch(type){ 42 case 'csv': 43 var blob = new Blob([data.data.csv], {type: mime }); 44 if(window.navigator.msSaveOrOpenBlob){ 45 window.navigator.msSaveOrOpenBlob(blob, data.data.name); 46 } else { 47 var url = window.URL.createObjectURL(blob); 48 var $a = $("<a>"); 49 $a.attr("href", url); 50 $("body").append($a); 51 $a.attr("download", data.data.name); 52 $a[0].click(); 53 setTimeout(function () { 54 window.URL.revokeObjectURL(url); 55 $a.remove(); 56 }, 100); 57 } 58 break; 59 case 'xls': 60 if(window.navigator.msSaveOrOpenBlob){ 61 blob = new Blob([s2ab(atob(data.data.raw))], {type: '' }); 62 window.navigator.msSaveOrOpenBlob(blob, data.data.name); 63 } else { 64 var $a = $("<a>"); // jshint ignore:line 65 $a.attr("href", data.data.csv); 66 $("body").append($a); 67 $a.attr("download", data.data.name); 68 $a[0].click(); 69 $a.remove(); 70 } 71 break; 72 case 'print': 73 case 'image': 74 $('body').trigger('visualizer:action:specificchart', {action: type, id: container, data: data.data.csv, dataObj: data.data}); 75 break; 76 default: 77 if(window.visualizer_perform_action) { 78 window.visualizer_perform_action(type, chart, data.data); 79 } 80 break; 81 } 82 } 83 lock.unlock(); 84 } 85 }); 86 }); 87 } 88 89 function s2ab(s) { 90 var buf = new ArrayBuffer(s.length); 91 var view = new Uint8Array(buf); 92 for (var i=0; i !== s.length; ++i) {
93 view[i] = s.charCodeAt(i) & 0xFF; 94 } 95 return buf; 96 } 97 98 $(document).ready(function(){ 99 100 // for updating the currently displayed chart (preview mode) 101 window.vizUpdateChartPreview = function(){ 102 var event = new CustomEvent('visualizer:render:currentchart:update', {detail: {visualizer: visualizer}}); 103 document.body.dispatchEvent(event); 104 }; 105 106 initChartDisplay(); 107 initActionsButtons(visualizer); 108 registerDefaultActions(); 109 }); 110 111 function initChartDisplay() { 112 if(visualizer.is_front == true){ // jshint ignore:line 113 displayChartsOnFrontEnd(); 114 } else { 115 showChart(); 116 } 117 } 118 119 /** 120 * If an `id` is provided, that particular chart will load. 121 */ 122 function showChart(id) { 123 // clone the visualizer object so that the original object is not affected. 124 var viz = Object.assign(visualizer, window.visualizer || {}); 125 if(id){ 126 viz.id = id; 127 } 128 $('body').trigger('visualizer:render:chart:start', viz); 129 } 130 131 function displayChartsOnFrontEnd() { 132 function renderVisibleLazyCharts() { 133 $('div.visualizer-front:not(.viz-facade-loaded):not(.visualizer-lazy):not(.visualizer-cw-error):empty').each(function(index, element){ 134 // Do not render charts that are intentionally hidden. 135 const style = window.getComputedStyle(element); 136 if (style.display === 'none' || style.visibility === 'hidden') { 137 return; 138 } 139 140 // Only render charts that are currently within the viewport. 141 const rect = element.getBoundingClientRect(); 142 const inViewport = rect.bottom >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight); 143 if (!inViewport) { 144 return; 145 } 146 147 const id = $(element).addClass('viz-facade-loaded').attr('id'); 148 setTimeout(function(){ 149 // Add a short delay between each chart to avoid overloading the browser event loop. 150 showChart(id); 151 }, ( index + 1 ) * 100); 152 }); 153 } 154 155 $(window).on('scroll', renderVisibleLazyCharts); 156 157 // Run once on page load to render any lazy charts already in the viewport. 158 renderVisibleLazyCharts(); 159 160 $('div.visualizer-front-container:not(.visualizer-lazy-render)').each(function(index, element){ 161 // Do not render charts that are intentionally hidden. 162 const style = window.getComputedStyle($(element).find('.visualizer-front')[0]); 163 if (style.display === 'none' || style.visibility === 'hidden') { 164 return; 165 } 166 167 const id = $(element).find('.visualizer-front').addClass('viz-facade-loaded').attr('id'); 168 setTimeout(function(){ 169 // Add a short delay between each chart to avoid overloading the browser event loop. 170 showChart(id); 171 }, ( index + 1 ) * 100); 172 }); 173 174 // interate through all charts that are to be lazy-loaded and observe each one. 175 $('div.visualizer-front.visualizer-lazy').each(function(index, element){ 176 var id = $(element).attr('id'); 177 var limit = $(element).attr('data-lazy-limit'); 178 if(!limit){ 179 limit = 300; 180 } 181 var target = document.querySelector('#' + id); 182 183 // configure the intersection observer instance 184 var intersectionObserverOptions = { 185 root: null, 186 rootMargin: limit + 'px', 187 threshold: 0 188 }; 189 190 var observer = new IntersectionObserver(function(entries) { 191 entries.forEach(function(entry) { 192 if (entry.isIntersecting) { 193 observer.unobserve(target); 194 showChart($(entry.target).attr('id')); 195 } 196 }); 197 }, intersectionObserverOptions); 198 199 // start observing. 200 observer.observe(target); 201 }); 202 } 203 204 function registerDefaultActions(){ 205 $('body').off('visualizer:action:specificchart:defaultprint').on('visualizer:action:specificchart:defaultprint', function(event, v){ 206 var iframe = $('<iframe>').attr("name", "print-visualization").attr("id", "print-visualization").css("position", "absolute"); 207 iframe.appendTo($('body')); 208 var iframe_doc = iframe.get(0).contentWindow || iframe.get(0).contentDocument.document || iframe.get(0).contentDocument; 209 iframe_doc.document.open(); 210 iframe_doc.document.write(v.data); 211 iframe_doc.document.close(); 212 setTimeout(function(){ 213 window.frames['print-visualization'].focus(); 214 window.frames['print-visualization'].print(); 215 iframe.remove(); 216 }, 500); 217 }); 218 } 219})(jQuery, visualizer); 220 221(function ($) { 222 $.fn.lock = function () { 223 $(this).each(function () { 224 var $this = $(this); 225 var position = $this.css('position'); 226 227 if (!position) { 228 position = 'static'; 229 } 230 231 switch (position) { 232 case 'absolute': 233 case 'relative': 234 break; 235 default: 236 $this.css('position', 'relative'); 237 break; 238 } 239 $this.data('position', position); 240 241 var width = $this.width(), 242 height = $this.height(); 243
244 var locker = $('<div class="locker"></div>'); 245 locker.width(width).height(height); 246 247 var loader = $('<div class="locker-loader"></div>'); 248 loader.width(width).height(height); 249 250 locker.append(loader); 251 $this.append(locker); 252 $(window).resize(function () { 253 $this.find('.locker,.locker-loader').width($this.width()).height($this.height()); 254 }); 255 }); 256 257 return $(this); 258 }; 259 260 $.fn.unlock = function () { 261 $(this).each(function () { 262 $(this).find('.locker').remove(); 263 $(this).css('position', $(this).data('position')); 264 }); 265 266 return $(this); 267 }; 268})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.