PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.12
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.12
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.12, at js/render.js

431 lines 14.3 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' || series[0].type === 'timeofday')) {
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(id, 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(id, 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(id, 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(id, 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 var arr = id.split('-');
245 jQuery('body').trigger('visualizer:format:chart', {id: parseInt(arr[1]), data: table, column: index});
246
247 };
248
249 v.override = function(settings) {
250 if (settings.manual) {
251 try{
252 var options = JSON.parse(settings.manual);
253 jQuery.extend(settings, options);
254 delete settings.manual;
255 }catch(error){
256 console.error("Error while adding manual configuration override " + settings.manual);
257 }
258 }
259 };
260
261 v.render = function() {
262 for (var id in (v.charts || {})) {
263 v.renderChart(id);
264 }
265 };
266
267 g.charts.load("current", {packages: ["corechart", "geochart", "gauge", "table", "timeline"], mapsApiKey: v.map_api_key, 'language' : v.language});
268 g.charts.setOnLoadCallback(function() {
269 gv = g.visualization;
270 v.render();
271 });
272 })(visualizer, google);
273
274 (function($, v) {
275 var resizeTimeout;
276
277 $(document).ready(function() {
278 $(window).resize(function() {
279 clearTimeout(resizeTimeout);
280 resizeTimeout = setTimeout(v.render, 100);
281 });
282
283 resizeHiddenContainers(true);
284 initActionsButtons();
285 });
286
287 $(window).load(function(){
288 resizeHiddenContainers(true);
289 });
290
291 function initActionsButtons() {
292 if($('a.visualizer-action[data-visualizer-type=copy]').length > 0) {
293 var clipboard = new Clipboard('a.visualizer-action[data-visualizer-type=copy]'); // jshint ignore:line
294 clipboard.on('success', function(e) {
295 window.alert(v.i10n['copied']);
296 });
297 }
298 $('a.visualizer-action[data-visualizer-type!=copy]').on('click', function(e) {
299 var type = $(this).attr( 'data-visualizer-type' );
300 var chart = $(this).attr( 'data-visualizer-chart-id' );
301 var lock = $('.visualizer-front.visualizer-front-' + chart);
302 lock.lock();
303 e.preventDefault();
304 $.ajax({
305 url : v.rest_url.replace('#id#', chart).replace('#type#', type),
306 success: function(data) {
307 if (data && data.data) {
308 switch(type){
309 case 'csv':
310 var a = document.createElement("a");
311 document.body.appendChild(a);
312 a.style = "display: none";
313 var blob = new Blob([data.data.csv], {type: $(this).attr( 'data-visualizer-mime' ) }),
314 url = window.URL.createObjectURL(blob);
315 a.href = url;
316 a.download = data.data.name;
317 a.click();
318 setTimeout(function () {
319 window.URL.revokeObjectURL(url);
320 }, 100);
321 break;
322 case 'xls':
323 var $a = $("<a>");
324 $a.attr("href",data.data.csv);
325 $("body").append($a);
326 $a.attr("download",data.data.name);
327 $a[0].click();
328 $a.remove();
329 break;
330 case 'print':
331 var iframe = $('<iframe>').attr("name", "print-visualization").attr("id", "print-visualization").css("position", "absolute");
332 iframe.appendTo($('body'));
333 var iframe_doc = iframe.get(0).contentWindow || iframe.get(0).contentDocument.document || iframe.get(0).contentDocument;
334 iframe_doc.document.open();
335 iframe_doc.document.write(data.data.csv);
336 iframe_doc.document.close();
337 setTimeout(function(){
338 window.frames['print-visualization'].focus();
339 window.frames['print-visualization'].print();
340 iframe.remove();
341 }, 500);
342 break;
343 default:
344 if(window.visualizer_perform_action) {
345 window.visualizer_perform_action(type, chart, data.data);
346 }
347 break;
348 }
349 }
350 lock.unlock();
351 }
352 });
353 });
354 }
355
356 function resizeHiddenContainers(everytime){
357 $(".visualizer-front").parents().each(function(){
358 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
359 $(this).addClass("visualizer-hidden-container");
360 }
361 });
362
363 var mutateObserver = new MutationObserver(function(records) {
364 records.forEach(function(record) {
365 if(record.attributeName === "style" || record.attributeName === "class"){
366 var element = $(record.target);
367 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
368 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
369 element.find(".visualizer-front").resize();
370 if(!everytime) {
371 element.addClass("visualizer-hidden-container-resized");
372 }
373 }
374 });
375 });
376
377 $('.visualizer-hidden-container').each(function(){
378 mutateObserver.observe($(this)[0], {attributes: true});
379 });
380 }
381
382 })(jQuery, visualizer);
383
384 (function ($) {
385 $.fn.lock = function () {
386 $(this).each(function () {
387 var $this = $(this);
388 var position = $this.css('position');
389
390 if (!position) {
391 position = 'static';
392 }
393
394 switch (position) {
395 case 'absolute':
396 case 'relative':
397 break;
398 default:
399 $this.css('position', 'relative');
400 break;
401 }
402 $this.data('position', position);
403
404 var width = $this.width(),
405 height = $this.height();
406
407 var locker = $('<div class="locker"></div>');
408 locker.width(width).height(height);
409
410 var loader = $('<div class="locker-loader"></div>');
411 loader.width(width).height(height);
412
413 locker.append(loader);
414 $this.append(locker);
415 $(window).resize(function () {
416 $this.find('.locker,.locker-loader').width($this.width()).height($this.height());
417 });
418 });
419
420 return $(this);
421 };
422
423 $.fn.unlock = function () {
424 $(this).each(function () {
425 $(this).find('.locker').remove();
426 $(this).css('position', $(this).data('position'));
427 });
428
429 return $(this);
430 };
431 })(jQuery);