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

402 lines 12.4 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 override(settings);
218
219 gv.events.addListener(render, 'ready', function () {
220 var arr = id.split('-');
221 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = '';
222 try{
223 var img = render.getImageURI();
224 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = img;
225 $('body').trigger('visualizer:render:chart', {id: arr[1], image: img});
226 }catch(error){
227 console.warn('render.getImageURI not defined for ' + arr[0] + '-' + arr[1]);
228 }
229 });
230
231 $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
232
233 render.draw(table, settings);
234 }
235
236 function format_data(id, table, type, format, index) {
237 if (!format || format === '') {
238 return;
239 }
240
241 var formatter = null;
242 switch (type) {
243 case 'number':
244 formatter = new gv.NumberFormat({pattern: format});
245 break;
246 case 'date':
247 case 'datetime':
248 case 'timeofday':
249 formatter = new gv.DateFormat({pattern: format});
250 break;
251 }
252
253 if (formatter) {
254 formatter.format(table, index);
255 }
256
257 var arr = id.split('-');
258 $('body').trigger('visualizer:format:chart', {id: parseInt(arr[1]), data: table, column: index});
259
260 }
261
262 function override(settings) {
263 if (settings.manual) {
264 try{
265 var options = JSON.parse(settings.manual);
266 $.extend(settings, options);
267 delete settings.manual;
268 }catch(error){
269 console.error("Error while adding manual configuration override " + settings.manual);
270 }
271 }
272 }
273
274 function render() {
275 for (var id in (all_charts || {})) {
276 renderChart(id);
277 }
278 }
279
280 if(typeof visualizer !== 'undefined'){
281 // called while updating the chart.
282 visualizer.update = function(){
283 renderChart('canvas');
284 };
285 }
286
287
288 var resizeTimeout;
289
290 $(document).ready(function() {
291 $(window).resize(function() {
292 clearTimeout(resizeTimeout);
293 resizeTimeout = setTimeout(render, 100);
294 });
295
296 resizeHiddenContainers(true);
297 });
298
299 $(window).on('load', function(){
300 resizeHiddenContainers(true);
301 });
302
303 function resizeHiddenContainers(everytime){
304 $(".visualizer-front").parents().each(function(){
305 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
306 $(this).addClass("visualizer-hidden-container");
307 }
308 });
309
310 var mutateObserver = new MutationObserver(function(records) {
311 records.forEach(function(record) {
312 if(record.attributeName === "style" || record.attributeName === "class"){
313 var element = $(record.target);
314 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
315 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
316 element.find(".visualizer-front").resize();
317 if(!everytime) {
318 element.addClass("visualizer-hidden-container-resized");
319 }
320 }
321 });
322 });
323
324 $('.visualizer-hidden-container').each(function(){
325 mutateObserver.observe($(this)[0], {attributes: true});
326 });
327 }
328
329 $('body').on('visualizer:render:chart:start', function(event, v){
330 var $chart_types = ['corechart', 'geochart', 'gauge', 'table', 'timeline'];
331 if(v.is_front == true){ // jshint ignore:line
332 // check what all chart types to load.
333 $chart_types = [];
334 $.each(v.charts, function(i, c){
335 var $type = c.type;
336 switch($type){
337 case 'bar':
338 case 'column':
339 case 'line':
340 case 'area':
341 case 'stepped area':
342 case 'bubble':
343 case 'pie':
344 case 'donut':
345 case 'combo':
346 case 'candlestick':
347 case 'histogram':
348 case 'scatter':
349 $type = 'corechart';
350 break;
351 case 'geo':
352 $type = 'geochart';
353 break;
354 case 'dataTable':
355 case 'polarArea':
356 case 'radar':
357 $type = null;
358 break;
359 }
360 if($type != null){
361 $chart_types.push($type);
362 }
363 });
364 }
365
366 objects = {};
367 google.charts.load("current", {packages: $chart_types, mapsApiKey: v.map_api_key, 'language' : v.language});
368 google.charts.setOnLoadCallback(function() {
369 gv = google.visualization;
370 all_charts = v.charts;
371 render();
372 });
373 });
374
375 $('body').on('visualizer:render:specificchart:start', function(event, v){
376 objects = {};
377 gv = google.visualization;
378 renderSpecificChart(v.id, v.chart);
379 });
380
381 // front end actions
382 $('body').on('visualizer:action:specificchart', function(event, v){
383 switch(v.action){
384 case 'print':
385 var id = v.id;
386 if(typeof rendered_charts[id] === 'undefined'){
387 return;
388 }
389 var arr = id.split('-');
390 var img = __visualizer_chart_images[ arr[0] + '-' + arr[1] ];
391 // for charts that have no rendered image defined, we print the data instead.
392 var html = v.data;
393 if(img !== ''){
394 html = "<html><body><img src='" + img + "' /></body></html>";
395 }
396 $('body').trigger('visualizer:action:specificchart:defaultprint', {data: html});
397 break;
398 }
399 });
400
401 })(jQuery);
402