PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.11
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.11
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
visualizer / js / render.js

render.js in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.11, at js/render.js

427 lines 14.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* global google */
2 /* global visualizer */
3 /* global console */
4
5 // this will store the images for each chart rendered.
6 var __visualizer_chart_images = [];
7
8 (function(v, g) {
9 var gv;
10
11 v.objects = {};
12
13 v.renderChart = function(id) {
14 var chart, render, container, series, data, table, settings, i, j, row, date, axis, property, format, formatter;
15
16 chart = v.charts[id];
17 series = chart.series;
18 data = chart.data;
19 settings = chart.settings;
20
21 container = document.getElementById(id);
22 if (container == null) {
23 return;
24 }
25 table = new gv.DataTable({cols: series});
26
27 render = v.objects[id] || null;
28 if (!render) {
29 switch (chart.type) {
30 case "gauge":
31 case "table":
32 case "timeline":
33 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1);
34 break;
35 default:
36 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1) + 'Chart';
37 break;
38 }
39
40 render = new gv[render](container);
41 }
42
43 if (settings['animation'] && parseInt(settings['animation']['startup']) === 1)
44 {
45 settings['animation']['startup'] = true;
46 settings['animation']['duration'] = parseInt(settings['animation']['duration']);
47 }
48
49 switch (chart.type) {
50 case 'pie':
51 if (settings.slices) {
52 for (i in settings.slices) {
53 if (settings.slices[i]['color'] === '') {
54 delete settings.slices[i]['color'];
55 }
56 }
57 }
58 break;
59 case 'line':
60 case 'bar':
61 case 'column':
62 case 'area':
63 case 'scatter':
64 case 'candlestick':
65 if (settings.series) {
66 for (i in settings.series) {
67 if (settings.series[i]['color'] === '') {
68 delete settings.series[i]['color'];
69 }
70 }
71 }
72
73 if (settings.series && settings.legend && settings.legend.position === "left")
74 {
75 settings.targetAxisIndex = 1;
76 }
77 break;
78 case 'geo':
79 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
80 settings['region'] = 'world';
81 }
82 break;
83 case 'table':
84 if (parseInt(settings['pagination']) !== 1)
85 {
86 delete settings['pageSize'];
87 }
88 break;
89 case 'gauge':
90 break;
91 case 'timeline':
92 settings['timeline'] = [];
93 settings['timeline']['groupByRowLabel'] = settings['groupByRowLabel'] ? true : false;
94 settings['timeline']['colorByRowLabel'] = settings['colorByRowLabel'] ? true : false;
95 settings['timeline']['showRowLabels'] = settings['showRowLabels'] ? true : false;
96 if(settings['singleColor'] !== '') {
97 settings['timeline']['singleColor'] = settings['singleColor'];
98 }
99 break;
100 case 'combo':
101 if (settings.series) {
102 for (i in settings.series) {
103 if (settings.series[i]['type'] === '') {
104 delete settings.series[i]['type'];
105 }
106 if (settings.series[i]['color'] === '') {
107 delete settings.series[i]['color'];
108 }
109 }
110 }
111
112 if (settings.series && settings.legend && settings.legend.position === "left")
113 {
114 settings.targetAxisIndex = 1;
115 }
116 break;
117 default:
118 return;
119 }
120
121 if (series[0] && (series[0].type === 'date' || series[0].type === 'datetime')) {
122 axis = false;
123 switch (chart.type) {
124 case 'line':
125 case 'area':
126 case 'scatter':
127 case 'candlestick':
128 case 'column':
129 axis = settings.hAxis;
130 break;
131 case 'bar':
132 axis = settings.vAxis;
133 break;
134 }
135
136 if (axis) {
137 for (property in axis.viewWindow) {
138 date = new Date(axis.viewWindow[property]);
139 if (Object.prototype.toString.call(date) === "[object Date]") {
140 if (!isNaN(date.getTime())) {
141 axis.viewWindow[property] = date;
142 continue;
143 }
144 }
145
146 delete axis.viewWindow[property];
147 }
148 }
149 }
150
151 if(settings.hAxis){
152 if(settings.hAxis.textStyle && settings.hAxis.textStyle !== ''){
153 if(typeof(settings.hAxis.textStyle) === "string") {
154 settings.hAxis.textStyle = {color: settings.hAxis.textStyle};
155 }
156 }
157 }
158
159 if(settings.vAxis){
160 if(settings.vAxis.textStyle && settings.vAxis.textStyle !== ''){
161 if(typeof(settings.vAxis.textStyle) === "string") {
162 settings.vAxis.textStyle = {color: settings.vAxis.textStyle};
163 }
164 }
165 }
166
167 for (i = 0; i < data.length; i++) {
168 row = [];
169 for (j = 0; j < series.length; j++) {
170 if (series[j].type === 'date' || series[j].type === 'datetime') {
171 date = new Date(data[i][j]);
172 data[i][j] = null;
173 if (Object.prototype.toString.call(date) === "[object Date]") {
174 if (!isNaN(date.getTime())) {
175 data[i][j] = date;
176 }
177 }
178 }
179 row.push(data[i][j]);
180 }
181 table.addRow(row);
182 }
183
184 if (settings.series) {
185 switch(chart.type){
186 case 'table':
187 for(i in settings.series){
188 i = parseInt(i);
189 if (!series[i + 1]) {
190 continue;
191 }
192 v.format_data(table, series[i + 1].type, settings.series[i].format, i + 1);
193 }
194 break;
195 default:
196 for (i = 0; i < settings.series.length; i++) {
197 if (!series[i + 1]) {
198 continue;
199 }
200 v.format_data(table, series[i + 1].type, settings.series[i].format, i + 1);
201 }
202 break;
203 }
204 } else if (chart.type === 'pie' && settings.format && settings.format !== '') {
205 v.format_data(table, 'number', settings.format, 1);
206 }
207 v.override(settings);
208
209 g.visualization.events.addListener(render, 'ready', function () {
210 var arr = id.split('-');
211 try{
212 var img = render.getImageURI();
213 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = img;
214 jQuery('body').trigger('visualizer:render:chart', {id: arr[1], image: img});
215 }catch(error){
216 console.warn('render.getImageURI not defined for ' + arr[0] + '-' + arr[1]);
217 }
218 });
219
220 render.draw(table, settings);
221 };
222
223 v.format_data = function(table, type, format, index) {
224 if (!format || format === '') {
225 return;
226 }
227
228 var formatter = null;
229 switch (type) {
230 case 'number':
231 formatter = new g.visualization.NumberFormat({pattern: format});
232 break;
233 case 'date':
234 case 'datetime':
235 case 'timeofday':
236 formatter = new g.visualization.DateFormat({pattern: format});
237 break;
238 }
239
240 if (formatter) {
241 formatter.format(table, index);
242 }
243 };
244
245 v.override = function(settings) {
246 if (settings.manual) {
247 try{
248 var options = JSON.parse(settings.manual);
249 jQuery.extend(settings, options);
250 delete settings.manual;
251 }catch(error){
252 console.error("Error while adding manual configuration override " + settings.manual);
253 }
254 }
255 };
256
257 v.render = function() {
258 for (var id in (v.charts || {})) {
259 v.renderChart(id);
260 }
261 };
262
263 g.charts.load("current", {packages: ["corechart", "geochart", "gauge", "table", "timeline"], mapsApiKey: v.map_api_key, 'language' : v.language});
264 g.charts.setOnLoadCallback(function() {
265 gv = g.visualization;
266 v.render();
267 });
268 })(visualizer, google);
269
270 (function($, v) {
271 var resizeTimeout;
272
273 $(document).ready(function() {
274 $(window).resize(function() {
275 clearTimeout(resizeTimeout);
276 resizeTimeout = setTimeout(v.render, 100);
277 });
278
279 resizeHiddenContainers(true);
280 initActionsButtons();
281 });
282
283 $(window).load(function(){
284 resizeHiddenContainers(true);
285 });
286
287 function initActionsButtons() {
288 if($('a.visualizer-action[data-visualizer-type=copy]').length > 0) {
289 var clipboard = new Clipboard('a.visualizer-action[data-visualizer-type=copy]'); // jshint ignore:line
290 clipboard.on('success', function(e) {
291 window.alert(v.i10n['copied']);
292 });
293 }
294 $('a.visualizer-action[data-visualizer-type!=copy]').on('click', function(e) {
295 var type = $(this).attr( 'data-visualizer-type' );
296 var chart = $(this).attr( 'data-visualizer-chart-id' );
297 var lock = $('.visualizer-front.visualizer-front-' + chart);
298 lock.lock();
299 e.preventDefault();
300 $.ajax({
301 url : v.rest_url.replace('#id#', chart).replace('#type#', type),
302 success: function(data) {
303 if (data && data.data) {
304 switch(type){
305 case 'csv':
306 var a = document.createElement("a");
307 document.body.appendChild(a);
308 a.style = "display: none";
309 var blob = new Blob([data.data.csv], {type: $(this).attr( 'data-visualizer-mime' ) }),
310 url = window.URL.createObjectURL(blob);
311 a.href = url;
312 a.download = data.data.name;
313 a.click();
314 setTimeout(function () {
315 window.URL.revokeObjectURL(url);
316 }, 100);
317 break;
318 case 'xls':
319 var $a = $("<a>");
320 $a.attr("href",data.data.csv);
321 $("body").append($a);
322 $a.attr("download",data.data.name);
323 $a[0].click();
324 $a.remove();
325 break;
326 case 'print':
327 var iframe = $('<iframe>').attr("name", "print-visualization").attr("id", "print-visualization").css("position", "absolute");
328 iframe.appendTo($('body'));
329 var iframe_doc = iframe.get(0).contentWindow || iframe.get(0).contentDocument.document || iframe.get(0).contentDocument;
330 iframe_doc.document.open();
331 iframe_doc.document.write(data.data.csv);
332 iframe_doc.document.close();
333 setTimeout(function(){
334 window.frames['print-visualization'].focus();
335 window.frames['print-visualization'].print();
336 iframe.remove();
337 }, 500);
338 break;
339 default:
340 if(window.visualizer_perform_action) {
341 window.visualizer_perform_action(type, chart, data.data);
342 }
343 break;
344 }
345 }
346 lock.unlock();
347 }
348 });
349 });
350 }
351
352 function resizeHiddenContainers(everytime){
353 $(".visualizer-front").parents().each(function(){
354 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
355 $(this).addClass("visualizer-hidden-container");
356 }
357 });
358
359 var mutateObserver = new MutationObserver(function(records) {
360 records.forEach(function(record) {
361 if(record.attributeName === "style" || record.attributeName === "class"){
362 var element = $(record.target);
363 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
364 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
365 element.find(".visualizer-front").resize();
366 if(!everytime) {
367 element.addClass("visualizer-hidden-container-resized");
368 }
369 }
370 });
371 });
372
373 $('.visualizer-hidden-container').each(function(){
374 mutateObserver.observe($(this)[0], {attributes: true});
375 });
376 }
377
378 })(jQuery, visualizer);
379
380 (function ($) {
381 $.fn.lock = function () {
382 $(this).each(function () {
383 var $this = $(this);
384 var position = $this.css('position');
385
386 if (!position) {
387 position = 'static';
388 }
389
390 switch (position) {
391 case 'absolute':
392 case 'relative':
393 break;
394 default:
395 $this.css('position', 'relative');
396 break;
397 }
398 $this.data('position', position);
399
400 var width = $this.width(),
401 height = $this.height();
402
403 var locker = $('<div class="locker"></div>');
404 locker.width(width).height(height);
405
406 var loader = $('<div class="locker-loader"></div>');
407 loader.width(width).height(height);
408
409 locker.append(loader);
410 $this.append(locker);
411 $(window).resize(function () {
412 $this.find('.locker,.locker-loader').width($this.width()).height($this.height());
413 });
414 });
415
416 return $(this);
417 };
418
419 $.fn.unlock = function () {
420 $(this).each(function () {
421 $(this).find('.locker').remove();
422 $(this).css('position', $(this).data('position'));
423 });
424
425 return $(this);
426 };
427 })(jQuery);