PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.2
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-google.js

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

455 lines 14.8 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($) {
9 var gv;
10 var all_charts, objects;
11 // so that we know which charts belong to our library.
12 var rendered_charts = [];
13
14 function renderChart(id) {
15 renderSpecificChart(id, all_charts[id]);
16 }
17
18 function renderSpecificChart(id, chart) {
19 var render, container, series, data, table, settings, i, j, row, date, axis, property, format, formatter;
20
21 if(chart.library !== 'google'){
22 return;
23 }
24 rendered_charts[id] = 'yes';
25
26 series = chart.series;
27 data = chart.data;
28 settings = chart.settings;
29
30 container = document.getElementById(id);
31 if (container == null) {
32 return;
33 }
34 table = new gv.DataTable({cols: series});
35
36 render = objects[id] || null;
37 if (!render) {
38 switch (chart.type) {
39 case "gauge":
40 case "table":
41 case "timeline":
42 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1);
43 break;
44 default:
45 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1) + 'Chart';
46 break;
47 }
48
49 render = new gv[render](container);
50 }
51
52 if (settings['animation'] && parseInt(settings['animation']['startup']) === 1)
53 {
54 settings['animation']['startup'] = true;
55 settings['animation']['duration'] = parseInt(settings['animation']['duration']);
56 }
57
58 // mark roles for series that have specified a role
59 // and then remove them from future processing
60 // and also adjust the indices of the series array so that
61 // the ones with a role are ignored
62 // e.g. if there are 6 columns (0-5) out of which 1, 3 and 5 are annotations
63 // the final series will only include 0, 2, 4 (reindexed as 0, 1, 2)
64 if (settings.series) {
65 var adjusted_series = [];
66 for (i = 0; i < settings.series.length; i++) {
67 if (!series[i + 1] || typeof settings.series[i] === 'undefined') {
68 continue;
69 }
70 if(typeof settings.series[i].role !== 'undefined'){
71 table.setColumnProperty(i + 1, 'role', settings.series[i].role);
72 if(settings.series[i].role === '') {
73 adjusted_series.push(settings.series[i]);
74 }
75 }
76 }
77 if(adjusted_series.length > 0){
78 settings.series = adjusted_series;
79 }
80 }
81
82 if ( settings['explorer_enabled'] && settings['explorer_enabled'] == 'true' ) { // jshint ignore:line
83 var $explorer = {};
84 $explorer['keepInBounds'] = true;
85
86 if ( settings['explorer_actions'] ) {
87 $explorer['actions'] = settings['explorer_actions'];
88 }
89 settings['explorer'] = $explorer;
90 }
91
92 switch (chart.type) {
93 case 'pie':
94 if (settings.slices) {
95 for (i in settings.slices) {
96 if (settings.slices[i]['color'] === '') {
97 delete settings.slices[i]['color'];
98 }
99 }
100 }
101 break;
102 case 'line':
103 case 'bar':
104 case 'column':
105 case 'area':
106 case 'scatter':
107 case 'candlestick':
108 if (settings.series) {
109 for (i in settings.series) {
110 if (settings.series[i]['color'] === '') {
111 delete settings.series[i]['color'];
112 }
113 }
114 }
115
116 if (settings.series && settings.legend && settings.legend.position === "left")
117 {
118 settings.targetAxisIndex = 1;
119 }
120 break;
121 case 'geo':
122 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
123 settings['region'] = 'world';
124 }
125 break;
126 case 'table':
127 if (parseInt(settings['pagination']) !== 1)
128 {
129 delete settings['pageSize'];
130 }
131 break;
132 case 'gauge':
133 break;
134 case 'bubble':
135 settings.sortBubblesBySize = settings.sortBubblesBySize ? settings.sortBubblesBySize == 1 : false; // jshint ignore:line
136 break;
137 case 'timeline':
138 settings['timeline'] = [];
139 settings['timeline']['groupByRowLabel'] = settings['groupByRowLabel'] ? true : false;
140 settings['timeline']['colorByRowLabel'] = settings['colorByRowLabel'] ? true : false;
141 settings['timeline']['showRowLabels'] = settings['showRowLabels'] ? true : false;
142 if(settings['singleColor'] !== '') {
143 settings['timeline']['singleColor'] = settings['singleColor'];
144 }
145 break;
146 case 'combo':
147 if (settings.series) {
148 for (i in settings.series) {
149 if (settings.series[i]['type'] === '') {
150 delete settings.series[i]['type'];
151 }
152 if (settings.series[i]['color'] === '') {
153 delete settings.series[i]['color'];
154 }
155 }
156 }
157
158 if (settings.series && settings.legend && settings.legend.position === "left")
159 {
160 settings.targetAxisIndex = 1;
161 }
162 break;
163 default:
164 return;
165 }
166
167 if (series[0] && (series[0].type === 'date' || series[0].type === 'datetime' || series[0].type === 'timeofday')) {
168 axis = false;
169 switch (chart.type) {
170 case 'line':
171 case 'area':
172 case 'scatter':
173 case 'candlestick':
174 case 'column':
175 case 'combo':
176 axis = settings.hAxis;
177 break;
178 case 'bar':
179 axis = settings.vAxis;
180 break;
181 }
182
183 if (axis) {
184 for (property in axis.viewWindow) {
185 date = new Date(axis.viewWindow[property]);
186 if (Object.prototype.toString.call(date) === "[object Date]") {
187 if (!isNaN(date.getTime())) {
188 axis.viewWindow[property] = date;
189 continue;
190 }
191 }
192
193 delete axis.viewWindow[property];
194 }
195 }
196 }
197
198 if(settings.hAxis){
199 if(settings.hAxis.textStyle && settings.hAxis.textStyle !== ''){
200 if(typeof(settings.hAxis.textStyle) === "string") {
201 settings.hAxis.textStyle = {color: settings.hAxis.textStyle};
202 }
203 }
204 }
205
206 if(settings.vAxis){
207 if(settings.vAxis.textStyle && settings.vAxis.textStyle !== ''){
208 if(typeof(settings.vAxis.textStyle) === "string") {
209 settings.vAxis.textStyle = {color: settings.vAxis.textStyle};
210 }
211 }
212 }
213
214 for (i = 0; i < data.length; i++) {
215 row = [];
216 for (j = 0; j < series.length; j++) {
217 switch(series[j].type) {
218 case 'string':
219 if(data[i][j] === ''){
220 data[i][j] = null;
221 }
222 break;
223 case 'boolean':
224 if (typeof data[i][j] === 'string'){
225 data[i][j] = data[i][j] === 'true';
226 }
227 break;
228 case 'date':
229 // fall-through.
230 case 'datetime':
231 date = new Date(data[i][j]);
232 data[i][j] = null;
233 if (Object.prototype.toString.call(date) === "[object Date]") {
234 if (!isNaN(date.getTime())) {
235 data[i][j] = date;
236 }
237 }
238 break;
239 }
240 row.push(data[i][j]);
241 }
242 table.addRow(row);
243 }
244
245 if (settings.series) {
246 switch(chart.type){
247 case 'table':
248 for(i in settings.series){
249 i = parseInt(i);
250 if (!series[i + 1]) {
251 continue;
252 }
253 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
254 }
255 break;
256 default:
257 for (i = 0; i < settings.series.length; i++) {
258 if (!series[i + 1] || typeof settings.series[i] === 'undefined') {
259 continue;
260 }
261 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
262 }
263 break;
264 }
265 } else if (chart.type === 'pie' && settings.format && settings.format !== '') {
266 format_data(id, table, 'number', settings.format, 1);
267 }
268
269 if(settings.hAxis && series[0]) {
270 format_data(id, table, series[0].type, settings.hAxis.format, 0);
271 }
272
273 override(settings);
274
275 gv.events.addListener(render, 'ready', function () {
276 var arr = id.split('-');
277 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = '';
278 try{
279 var img = render.getImageURI();
280 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = img;
281 $('body').trigger('visualizer:render:chart', {id: arr[1], image: img});
282 }catch(error){
283 console.warn('render.getImageURI not defined for ' + arr[0] + '-' + arr[1]);
284 }
285 });
286
287 $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
288
289 render.draw(table, settings);
290 }
291
292 function format_data(id, table, type, format, index) {
293 if (!format || format === '') {
294 return;
295 }
296
297 var formatter = null;
298 switch (type) {
299 case 'number':
300 formatter = new gv.NumberFormat({pattern: format});
301 break;
302 case 'date':
303 case 'datetime':
304 case 'timeofday':
305 formatter = new gv.DateFormat({pattern: format});
306 break;
307 }
308
309 if (formatter) {
310 formatter.format(table, index);
311 }
312
313 var arr = id.split('-');
314 $('body').trigger('visualizer:format:chart', {id: parseInt(arr[1]), data: table, column: index});
315
316 }
317
318 function override(settings) {
319 if (settings.manual) {
320 try{
321 var options = JSON.parse(settings.manual);
322 $.extend(settings, options);
323 delete settings.manual;
324 }catch(error){
325 console.error("Error while adding manual configuration override " + settings.manual);
326 }
327 }
328 }
329
330 function render() {
331 for (var id in (all_charts || {})) {
332 renderChart(id);
333 }
334 }
335
336 var resizeTimeout;
337
338 $(document).ready(function() {
339 $(window).resize(function() {
340 clearTimeout(resizeTimeout);
341 resizeTimeout = setTimeout(render, 100);
342 });
343
344 resizeHiddenContainers(true);
345 });
346
347 $(window).on('load', function(){
348 resizeHiddenContainers(true);
349 });
350
351 function resizeHiddenContainers(everytime){
352 $(".visualizer-front").parents().each(function(){
353 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
354 $(this).addClass("visualizer-hidden-container");
355 }
356 });
357
358 var mutateObserver = new MutationObserver(function(records) {
359 records.forEach(function(record) {
360 if(record.attributeName === "style" || record.attributeName === "class"){
361 var element = $(record.target);
362 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
363 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
364 element.find(".visualizer-front").resize();
365 if(!everytime) {
366 element.addClass("visualizer-hidden-container-resized");
367 }
368 }
369 });
370 });
371
372 $('.visualizer-hidden-container').each(function(){
373 mutateObserver.observe($(this)[0], {attributes: true});
374 });
375 }
376
377 $('body').on('visualizer:render:chart:start', function(event, v){
378 var $chart_types = ['corechart', 'geochart', 'gauge', 'table', 'timeline'];
379 if(v.is_front == true){ // jshint ignore:line
380 // check what all chart types to load.
381 $chart_types = [];
382 $.each(v.charts, function(i, c){
383 var $type = c.type;
384 switch($type){
385 case 'bar':
386 case 'column':
387 case 'line':
388 case 'area':
389 case 'stepped area':
390 case 'bubble':
391 case 'pie':
392 case 'donut':
393 case 'combo':
394 case 'candlestick':
395 case 'histogram':
396 case 'scatter':
397 case 'bubble':
398 $type = 'corechart';
399 break;
400 case 'geo':
401 $type = 'geochart';
402 break;
403 case 'dataTable':
404 case 'polarArea':
405 case 'radar':
406 $type = null;
407 break;
408 }
409 if($type != null){
410 $chart_types.push($type);
411 }
412 });
413 }
414
415 objects = {};
416 google.charts.load("current", {packages: $chart_types, mapsApiKey: v.map_api_key, 'language' : v.language});
417 google.charts.setOnLoadCallback(function() {
418 gv = google.visualization;
419 all_charts = v.charts;
420 render();
421 });
422 });
423
424 $('body').on('visualizer:render:specificchart:start', function(event, v){
425 objects = {};
426 gv = google.visualization;
427 renderSpecificChart(v.id, v.chart);
428 });
429
430 $('body').on('visualizer:render:currentchart:update', function(event, v){
431 renderChart('canvas');
432 });
433
434 // front end actions
435 $('body').on('visualizer:action:specificchart', function(event, v){
436 switch(v.action){
437 case 'print':
438 var id = v.id;
439 if(typeof rendered_charts[id] === 'undefined'){
440 return;
441 }
442 var arr = id.split('-');
443 var img = __visualizer_chart_images[ arr[0] + '-' + arr[1] ];
444 // for charts that have no rendered image defined, we print the data instead.
445 var html = v.data;
446 if(img !== ''){
447 html = "<html><body><img src='" + img + "' /></body></html>";
448 }
449 $('body').trigger('visualizer:action:specificchart:defaultprint', {data: html});
450 break;
451 }
452 });
453
454 })(jQuery);
455