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

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