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

408 lines 12.5 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 switch (chart.type) {
59 case 'pie':
60 if (settings.slices) {
61 for (i in settings.slices) {
62 if (settings.slices[i]['color'] === '') {
63 delete settings.slices[i]['color'];
64 }
65 }
66 }
67 break;
68 case 'line':
69 case 'bar':
70 case 'column':
71 case 'area':
72 case 'scatter':
73 case 'candlestick':
74 if (settings.series) {
75 for (i in settings.series) {
76 if (settings.series[i]['color'] === '') {
77 delete settings.series[i]['color'];
78 }
79 }
80 }
81
82 if (settings.series && settings.legend && settings.legend.position === "left")
83 {
84 settings.targetAxisIndex = 1;
85 }
86 break;
87 case 'geo':
88 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
89 settings['region'] = 'world';
90 }
91 break;
92 case 'table':
93 if (parseInt(settings['pagination']) !== 1)
94 {
95 delete settings['pageSize'];
96 }
97 break;
98 case 'gauge':
99 break;
100 case 'timeline':
101 settings['timeline'] = [];
102 settings['timeline']['groupByRowLabel'] = settings['groupByRowLabel'] ? true : false;
103 settings['timeline']['colorByRowLabel'] = settings['colorByRowLabel'] ? true : false;
104 settings['timeline']['showRowLabels'] = settings['showRowLabels'] ? true : false;
105 if(settings['singleColor'] !== '') {
106 settings['timeline']['singleColor'] = settings['singleColor'];
107 }
108 break;
109 case 'combo':
110 if (settings.series) {
111 for (i in settings.series) {
112 if (settings.series[i]['type'] === '') {
113 delete settings.series[i]['type'];
114 }
115 if (settings.series[i]['color'] === '') {
116 delete settings.series[i]['color'];
117 }
118 }
119 }
120
121 if (settings.series && settings.legend && settings.legend.position === "left")
122 {
123 settings.targetAxisIndex = 1;
124 }
125 break;
126 default:
127 return;
128 }
129
130 if (series[0] && (series[0].type === 'date' || series[0].type === 'datetime' || series[0].type === 'timeofday')) {
131 axis = false;
132 switch (chart.type) {
133 case 'line':
134 case 'area':
135 case 'scatter':
136 case 'candlestick':
137 case 'column':
138 case 'combo':
139 axis = settings.hAxis;
140 break;
141 case 'bar':
142 axis = settings.vAxis;
143 break;
144 }
145
146 if (axis) {
147 for (property in axis.viewWindow) {
148 date = new Date(axis.viewWindow[property]);
149 if (Object.prototype.toString.call(date) === "[object Date]") {
150 if (!isNaN(date.getTime())) {
151 axis.viewWindow[property] = date;
152 continue;
153 }
154 }
155
156 delete axis.viewWindow[property];
157 }
158 }
159 }
160
161 if(settings.hAxis){
162 if(settings.hAxis.textStyle && settings.hAxis.textStyle !== ''){
163 if(typeof(settings.hAxis.textStyle) === "string") {
164 settings.hAxis.textStyle = {color: settings.hAxis.textStyle};
165 }
166 }
167 }
168
169 if(settings.vAxis){
170 if(settings.vAxis.textStyle && settings.vAxis.textStyle !== ''){
171 if(typeof(settings.vAxis.textStyle) === "string") {
172 settings.vAxis.textStyle = {color: settings.vAxis.textStyle};
173 }
174 }
175 }
176
177 for (i = 0; i < data.length; i++) {
178 row = [];
179 for (j = 0; j < series.length; j++) {
180 if (series[j].type === 'date' || series[j].type === 'datetime') {
181 date = new Date(data[i][j]);
182 data[i][j] = null;
183 if (Object.prototype.toString.call(date) === "[object Date]") {
184 if (!isNaN(date.getTime())) {
185 data[i][j] = date;
186 }
187 }
188 }
189 row.push(data[i][j]);
190 }
191 table.addRow(row);
192 }
193
194 if (settings.series) {
195 switch(chart.type){
196 case 'table':
197 for(i in settings.series){
198 i = parseInt(i);
199 if (!series[i + 1]) {
200 continue;
201 }
202 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
203 }
204 break;
205 default:
206 for (i = 0; i < settings.series.length; i++) {
207 if (!series[i + 1]) {
208 continue;
209 }
210 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
211 }
212 break;
213 }
214 } else if (chart.type === 'pie' && settings.format && settings.format !== '') {
215 format_data(id, table, 'number', settings.format, 1);
216 }
217
218
219 if(settings.hAxis) {
220 format_data(id, table, series[0].type, settings.hAxis.format, 0);
221 }
222
223 override(settings);
224
225 gv.events.addListener(render, 'ready', function () {
226 var arr = id.split('-');
227 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = '';
228 try{
229 var img = render.getImageURI();
230 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = img;
231 $('body').trigger('visualizer:render:chart', {id: arr[1], image: img});
232 }catch(error){
233 console.warn('render.getImageURI not defined for ' + arr[0] + '-' + arr[1]);
234 }
235 });
236
237 $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
238
239 render.draw(table, settings);
240 }
241
242 function format_data(id, table, type, format, index) {
243 if (!format || format === '') {
244 return;
245 }
246
247 var formatter = null;
248 switch (type) {
249 case 'number':
250 formatter = new gv.NumberFormat({pattern: format});
251 break;
252 case 'date':
253 case 'datetime':
254 case 'timeofday':
255 formatter = new gv.DateFormat({pattern: format});
256 break;
257 }
258
259 if (formatter) {
260 formatter.format(table, index);
261 }
262
263 var arr = id.split('-');
264 $('body').trigger('visualizer:format:chart', {id: parseInt(arr[1]), data: table, column: index});
265
266 }
267
268 function override(settings) {
269 if (settings.manual) {
270 try{
271 var options = JSON.parse(settings.manual);
272 $.extend(settings, options);
273 delete settings.manual;
274 }catch(error){
275 console.error("Error while adding manual configuration override " + settings.manual);
276 }
277 }
278 }
279
280 function render() {
281 for (var id in (all_charts || {})) {
282 renderChart(id);
283 }
284 }
285
286 if(typeof visualizer !== 'undefined'){
287 // called while updating the chart.
288 visualizer.update = function(){
289 renderChart('canvas');
290 };
291 }
292
293
294 var resizeTimeout;
295
296 $(document).ready(function() {
297 $(window).resize(function() {
298 clearTimeout(resizeTimeout);
299 resizeTimeout = setTimeout(render, 100);
300 });
301
302 resizeHiddenContainers(true);
303 });
304
305 $(window).on('load', function(){
306 resizeHiddenContainers(true);
307 });
308
309 function resizeHiddenContainers(everytime){
310 $(".visualizer-front").parents().each(function(){
311 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
312 $(this).addClass("visualizer-hidden-container");
313 }
314 });
315
316 var mutateObserver = new MutationObserver(function(records) {
317 records.forEach(function(record) {
318 if(record.attributeName === "style" || record.attributeName === "class"){
319 var element = $(record.target);
320 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
321 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
322 element.find(".visualizer-front").resize();
323 if(!everytime) {
324 element.addClass("visualizer-hidden-container-resized");
325 }
326 }
327 });
328 });
329
330 $('.visualizer-hidden-container').each(function(){
331 mutateObserver.observe($(this)[0], {attributes: true});
332 });
333 }
334
335 $('body').on('visualizer:render:chart:start', function(event, v){
336 var $chart_types = ['corechart', 'geochart', 'gauge', 'table', 'timeline'];
337 if(v.is_front == true){ // jshint ignore:line
338 // check what all chart types to load.
339 $chart_types = [];
340 $.each(v.charts, function(i, c){
341 var $type = c.type;
342 switch($type){
343 case 'bar':
344 case 'column':
345 case 'line':
346 case 'area':
347 case 'stepped area':
348 case 'bubble':
349 case 'pie':
350 case 'donut':
351 case 'combo':
352 case 'candlestick':
353 case 'histogram':
354 case 'scatter':
355 $type = 'corechart';
356 break;
357 case 'geo':
358 $type = 'geochart';
359 break;
360 case 'dataTable':
361 case 'polarArea':
362 case 'radar':
363 $type = null;
364 break;
365 }
366 if($type != null){
367 $chart_types.push($type);
368 }
369 });
370 }
371
372 objects = {};
373 google.charts.load("current", {packages: $chart_types, mapsApiKey: v.map_api_key, 'language' : v.language});
374 google.charts.setOnLoadCallback(function() {
375 gv = google.visualization;
376 all_charts = v.charts;
377 render();
378 });
379 });
380
381 $('body').on('visualizer:render:specificchart:start', function(event, v){
382 objects = {};
383 gv = google.visualization;
384 renderSpecificChart(v.id, v.chart);
385 });
386
387 // front end actions
388 $('body').on('visualizer:action:specificchart', function(event, v){
389 switch(v.action){
390 case 'print':
391 var id = v.id;
392 if(typeof rendered_charts[id] === 'undefined'){
393 return;
394 }
395 var arr = id.split('-');
396 var img = __visualizer_chart_images[ arr[0] + '-' + arr[1] ];
397 // for charts that have no rendered image defined, we print the data instead.
398 var html = v.data;
399 if(img !== ''){
400 html = "<html><body><img src='" + img + "' /></body></html>";
401 }
402 $('body').trigger('visualizer:action:specificchart:defaultprint', {data: html});
403 break;
404 }
405 });
406
407 })(jQuery);
408