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

364 lines 11.1 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 objects = {};
329 google.charts.load("current", {packages: ["corechart", "geochart", "gauge", "table", "timeline"], mapsApiKey: v.map_api_key, 'language' : v.language});
330 google.charts.setOnLoadCallback(function() {
331 gv = google.visualization;
332 all_charts = v.charts;
333 render();
334 });
335 });
336
337 $('body').on('visualizer:render:specificchart:start', function(event, v){
338 objects = {};
339 gv = google.visualization;
340 renderSpecificChart(v.id, v.chart);
341 });
342
343 // front end actions
344 $('body').on('visualizer:action:specificchart', function(event, v){
345 switch(v.action){
346 case 'print':
347 var id = v.id;
348 if(typeof rendered_charts[id] === 'undefined'){
349 return;
350 }
351 var arr = id.split('-');
352 var img = __visualizer_chart_images[ arr[0] + '-' + arr[1] ];
353 // for charts that have no rendered image defined, we print the data instead.
354 var html = v.data;
355 if(img !== ''){
356 html = "<html><body><img src='" + img + "' /></body></html>";
357 }
358 $('body').trigger('visualizer:action:specificchart:defaultprint', {data: html});
359 break;
360 }
361 });
362
363 })(jQuery);
364