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

339 lines 10.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
12 function renderChart(id) {
13 renderSpecificChart(id, all_charts[id]);
14 }
15
16 function renderSpecificChart(id, chart) {
17 var render, container, series, data, table, settings, i, j, row, date, axis, property, format, formatter;
18
19 if(chart.library !== 'google'){
20 return;
21 }
22
23 series = chart.series;
24 data = chart.data;
25 settings = chart.settings;
26
27 container = document.getElementById(id);
28 if (container == null) {
29 return;
30 }
31 table = new gv.DataTable({cols: series});
32
33 render = objects[id] || null;
34 if (!render) {
35 switch (chart.type) {
36 case "gauge":
37 case "table":
38 case "timeline":
39 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1);
40 break;
41 default:
42 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1) + 'Chart';
43 break;
44 }
45
46 render = new gv[render](container);
47 }
48
49 if (settings['animation'] && parseInt(settings['animation']['startup']) === 1)
50 {
51 settings['animation']['startup'] = true;
52 settings['animation']['duration'] = parseInt(settings['animation']['duration']);
53 }
54
55 switch (chart.type) {
56 case 'pie':
57 if (settings.slices) {
58 for (i in settings.slices) {
59 if (settings.slices[i]['color'] === '') {
60 delete settings.slices[i]['color'];
61 }
62 }
63 }
64 break;
65 case 'line':
66 case 'bar':
67 case 'column':
68 case 'area':
69 case 'scatter':
70 case 'candlestick':
71 if (settings.series) {
72 for (i in settings.series) {
73 if (settings.series[i]['color'] === '') {
74 delete settings.series[i]['color'];
75 }
76 }
77 }
78
79 if (settings.series && settings.legend && settings.legend.position === "left")
80 {
81 settings.targetAxisIndex = 1;
82 }
83 break;
84 case 'geo':
85 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
86 settings['region'] = 'world';
87 }
88 break;
89 case 'table':
90 if (parseInt(settings['pagination']) !== 1)
91 {
92 delete settings['pageSize'];
93 }
94 break;
95 case 'gauge':
96 break;
97 case 'timeline':
98 settings['timeline'] = [];
99 settings['timeline']['groupByRowLabel'] = settings['groupByRowLabel'] ? true : false;
100 settings['timeline']['colorByRowLabel'] = settings['colorByRowLabel'] ? true : false;
101 settings['timeline']['showRowLabels'] = settings['showRowLabels'] ? true : false;
102 if(settings['singleColor'] !== '') {
103 settings['timeline']['singleColor'] = settings['singleColor'];
104 }
105 break;
106 case 'combo':
107 if (settings.series) {
108 for (i in settings.series) {
109 if (settings.series[i]['type'] === '') {
110 delete settings.series[i]['type'];
111 }
112 if (settings.series[i]['color'] === '') {
113 delete settings.series[i]['color'];
114 }
115 }
116 }
117
118 if (settings.series && settings.legend && settings.legend.position === "left")
119 {
120 settings.targetAxisIndex = 1;
121 }
122 break;
123 default:
124 return;
125 }
126
127 if (series[0] && (series[0].type === 'date' || series[0].type === 'datetime' || series[0].type === 'timeofday')) {
128 axis = false;
129 switch (chart.type) {
130 case 'line':
131 case 'area':
132 case 'scatter':
133 case 'candlestick':
134 case 'column':
135 axis = settings.hAxis;
136 break;
137 case 'bar':
138 axis = settings.vAxis;
139 break;
140 }
141
142 if (axis) {
143 for (property in axis.viewWindow) {
144 date = new Date(axis.viewWindow[property]);
145 if (Object.prototype.toString.call(date) === "[object Date]") {
146 if (!isNaN(date.getTime())) {
147 axis.viewWindow[property] = date;
148 continue;
149 }
150 }
151
152 delete axis.viewWindow[property];
153 }
154 }
155 }
156
157 if(settings.hAxis){
158 if(settings.hAxis.textStyle && settings.hAxis.textStyle !== ''){
159 if(typeof(settings.hAxis.textStyle) === "string") {
160 settings.hAxis.textStyle = {color: settings.hAxis.textStyle};
161 }
162 }
163 }
164
165 if(settings.vAxis){
166 if(settings.vAxis.textStyle && settings.vAxis.textStyle !== ''){
167 if(typeof(settings.vAxis.textStyle) === "string") {
168 settings.vAxis.textStyle = {color: settings.vAxis.textStyle};
169 }
170 }
171 }
172
173 for (i = 0; i < data.length; i++) {
174 row = [];
175 for (j = 0; j < series.length; j++) {
176 if (series[j].type === 'date' || series[j].type === 'datetime') {
177 date = new Date(data[i][j]);
178 data[i][j] = null;
179 if (Object.prototype.toString.call(date) === "[object Date]") {
180 if (!isNaN(date.getTime())) {
181 data[i][j] = date;
182 }
183 }
184 }
185 row.push(data[i][j]);
186 }
187 table.addRow(row);
188 }
189
190 if (settings.series) {
191 switch(chart.type){
192 case 'table':
193 for(i in settings.series){
194 i = parseInt(i);
195 if (!series[i + 1]) {
196 continue;
197 }
198 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
199 }
200 break;
201 default:
202 for (i = 0; i < settings.series.length; i++) {
203 if (!series[i + 1]) {
204 continue;
205 }
206 format_data(id, table, series[i + 1].type, settings.series[i].format, i + 1);
207 }
208 break;
209 }
210 } else if (chart.type === 'pie' && settings.format && settings.format !== '') {
211 format_data(id, table, 'number', settings.format, 1);
212 }
213 override(settings);
214
215 gv.events.addListener(render, 'ready', function () {
216 var arr = id.split('-');
217 try{
218 var img = render.getImageURI();
219 __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = img;
220 $('body').trigger('visualizer:render:chart', {id: arr[1], image: img});
221 }catch(error){
222 console.warn('render.getImageURI not defined for ' + arr[0] + '-' + arr[1]);
223 }
224 });
225
226 render.draw(table, settings);
227 }
228
229 function format_data(id, table, type, format, index) {
230 if (!format || format === '') {
231 return;
232 }
233
234 var formatter = null;
235 switch (type) {
236 case 'number':
237 formatter = new gv.NumberFormat({pattern: format});
238 break;
239 case 'date':
240 case 'datetime':
241 case 'timeofday':
242 formatter = new gv.DateFormat({pattern: format});
243 break;
244 }
245
246 if (formatter) {
247 formatter.format(table, index);
248 }
249
250 var arr = id.split('-');
251 $('body').trigger('visualizer:format:chart', {id: parseInt(arr[1]), data: table, column: index});
252
253 }
254
255 function override(settings) {
256 if (settings.manual) {
257 try{
258 var options = JSON.parse(settings.manual);
259 $.extend(settings, options);
260 delete settings.manual;
261 }catch(error){
262 console.error("Error while adding manual configuration override " + settings.manual);
263 }
264 }
265 }
266
267 function render() {
268 for (var id in (all_charts || {})) {
269 renderChart(id);
270 }
271 }
272
273 if(typeof visualizer !== 'undefined'){
274 // called while updating the chart.
275 visualizer.update = function(){
276 renderChart('canvas');
277 };
278 }
279
280
281 var resizeTimeout;
282
283 $(document).ready(function() {
284 $(window).resize(function() {
285 clearTimeout(resizeTimeout);
286 resizeTimeout = setTimeout(render, 100);
287 });
288
289 resizeHiddenContainers(true);
290 });
291
292 $(window).load(function(){
293 resizeHiddenContainers(true);
294 });
295
296 function resizeHiddenContainers(everytime){
297 $(".visualizer-front").parents().each(function(){
298 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
299 $(this).addClass("visualizer-hidden-container");
300 }
301 });
302
303 var mutateObserver = new MutationObserver(function(records) {
304 records.forEach(function(record) {
305 if(record.attributeName === "style" || record.attributeName === "class"){
306 var element = $(record.target);
307 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
308 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
309 element.find(".visualizer-front").resize();
310 if(!everytime) {
311 element.addClass("visualizer-hidden-container-resized");
312 }
313 }
314 });
315 });
316
317 $('.visualizer-hidden-container').each(function(){
318 mutateObserver.observe($(this)[0], {attributes: true});
319 });
320 }
321
322 $('body').on('visualizer:render:chart:start', function(event, v){
323 objects = {};
324 google.charts.load("current", {packages: ["corechart", "geochart", "gauge", "table", "timeline"], mapsApiKey: v.map_api_key, 'language' : v.language});
325 google.charts.setOnLoadCallback(function() {
326 gv = google.visualization;
327 all_charts = v.charts;
328 render();
329 });
330 });
331
332 $('body').on('visualizer:render:specificchart:start', function(event, v){
333 objects = {};
334 gv = google.visualization;
335 renderSpecificChart(v.id, v.chart);
336 });
337
338 })(jQuery);
339