PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.5
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.5
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.js

render.js in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.5, at js/render.js

389 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 (function(v, g) {
5 var gv;
6
7 v.objects = {};
8
9 v.renderChart = function(id) {
10 var chart, render, container, series, data, table, settings, i, j, row, date, axis, property, format, formatter;
11
12 chart = v.charts[id];
13 series = chart.series;
14 data = chart.data;
15 settings = chart.settings;
16
17 container = document.getElementById(id);
18 if (container == null) {
19 return;
20 }
21 table = new gv.DataTable({cols: series});
22
23 render = v.objects[id] || null;
24 if (!render) {
25 switch (chart.type) {
26 case "gauge":
27 case "table":
28 case "timeline":
29 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1);
30 break;
31 default:
32 render = chart.type.charAt(0).toUpperCase() + chart.type.slice(1) + 'Chart';
33 break;
34 }
35
36 render = new gv[render](container);
37 }
38
39 switch (chart.type) {
40 case 'pie':
41 if (settings.slices) {
42 for (i in settings.slices) {
43 if (settings.slices[i]['color'] === '') {
44 delete settings.slices[i]['color'];
45 }
46 }
47 }
48 break;
49 case 'line':
50 case 'bar':
51 case 'column':
52 case 'area':
53 case 'scatter':
54 case 'candlestick':
55 if (settings.series) {
56 for (i in settings.series) {
57 if (settings.series[i]['color'] === '') {
58 delete settings.series[i]['color'];
59 }
60 }
61 }
62
63 if (settings.series && settings.legend && settings.legend.position === "left")
64 {
65 settings.targetAxisIndex = 1;
66 }
67 break;
68 case 'geo':
69 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
70 settings['region'] = 'world';
71 }
72 break;
73 case 'table':
74 if (parseInt(settings['pagination']) !== 1)
75 {
76 delete settings['pageSize'];
77 }
78 break;
79 case 'gauge':
80 break;
81 case 'timeline':
82 settings['timeline'] = [];
83 settings['timeline']['groupByRowLabel'] = settings['groupByRowLabel'] ? true : false;
84 settings['timeline']['colorByRowLabel'] = settings['colorByRowLabel'] ? true : false;
85 settings['timeline']['showRowLabels'] = settings['showRowLabels'] ? true : false;
86 if(settings['singleColor'] !== '') {
87 settings['timeline']['singleColor'] = settings['singleColor'];
88 }
89 break;
90 case 'combo':
91 if (settings.series) {
92 for (i in settings.series) {
93 if (settings.series[i]['type'] === '') {
94 delete settings.series[i]['type'];
95 }
96 if (settings.series[i]['color'] === '') {
97 delete settings.series[i]['color'];
98 }
99 }
100 }
101
102 if (settings.series && settings.legend && settings.legend.position === "left")
103 {
104 settings.targetAxisIndex = 1;
105 }
106 break;
107 default:
108 return;
109 }
110
111 if (series[0] && (series[0].type === 'date' || series[0].type === 'datetime')) {
112 axis = false;
113 switch (chart.type) {
114 case 'line':
115 case 'area':
116 case 'scatter':
117 case 'candlestick':
118 case 'column':
119 axis = settings.hAxis;
120 break;
121 case 'bar':
122 axis = settings.vAxis;
123 break;
124 }
125
126 if (axis) {
127 for (property in axis.viewWindow) {
128 date = new Date(axis.viewWindow[property]);
129 if (Object.prototype.toString.call(date) === "[object Date]") {
130 if (!isNaN(date.getTime())) {
131 axis.viewWindow[property] = date;
132 continue;
133 }
134 }
135
136 delete axis.viewWindow[property];
137 }
138 }
139 }
140
141 if(settings.hAxis){
142 if(settings.hAxis.textStyle && settings.hAxis.textStyle !== ''){
143 if(typeof(settings.hAxis.textStyle) === "string") {
144 settings.hAxis.textStyle = {color: settings.hAxis.textStyle};
145 }
146 }
147 }
148
149 if(settings.vAxis){
150 if(settings.vAxis.textStyle && settings.vAxis.textStyle !== ''){
151 if(typeof(settings.vAxis.textStyle) === "string") {
152 settings.vAxis.textStyle = {color: settings.vAxis.textStyle};
153 }
154 }
155 }
156
157 for (i = 0; i < data.length; i++) {
158 row = [];
159 for (j = 0; j < series.length; j++) {
160 if (series[j].type === 'date' || series[j].type === 'datetime') {
161 date = new Date(data[i][j]);
162 data[i][j] = null;
163 if (Object.prototype.toString.call(date) === "[object Date]") {
164 if (!isNaN(date.getTime())) {
165 data[i][j] = date;
166 }
167 }
168 }
169 row.push(data[i][j]);
170 }
171 table.addRow(row);
172 }
173
174 if (settings.series) {
175 for (i = 0; i < settings.series.length; i++) {
176 format = settings.series[i].format;
177 if (!format || format === '' || !series[i + 1]) {
178 continue;
179 }
180
181 formatter = null;
182 switch (series[i + 1].type) {
183 case 'number':
184 formatter = new g.visualization.NumberFormat({pattern: format});
185 break;
186 case 'date':
187 case 'datetime':
188 case 'timeofday':
189 formatter = new g.visualization.DateFormat({pattern: format});
190 break;
191 }
192
193 if (formatter) {
194 formatter.format(table, i + 1);
195 }
196 }
197 } else if (chart.type === 'pie' && settings.format && settings.format !== '') {
198 formatter = new g.visualization.NumberFormat({pattern: settings.format});
199 formatter.format(table, 1);
200 }
201
202 v.override(settings);
203
204 render.draw(table, settings);
205 };
206
207 v.override = function(settings) {
208 if (settings.manual) {
209 try{
210 var options = JSON.parse(settings.manual);
211 jQuery.extend(settings, options);
212 delete settings.manual;
213 }catch(error){
214 console.error("Error while adding manual configuration override " + settings.manual);
215 }
216 }
217 };
218
219 v.render = function() {
220 for (var id in (v.charts || {})) {
221 v.renderChart(id);
222 }
223 };
224
225 g.charts.load("current", {packages: ["corechart", "geochart", "gauge", "table", "timeline"], mapsApiKey: v.map_api_key});
226 g.charts.setOnLoadCallback(function() {
227 gv = g.visualization;
228 v.render();
229 });
230 })(visualizer, google);
231
232 (function($, v) {
233 var resizeTimeout;
234
235 $(document).ready(function() {
236 $(window).resize(function() {
237 clearTimeout(resizeTimeout);
238 resizeTimeout = setTimeout(v.render, 100);
239 });
240
241 resizeHiddenContainers(true);
242 initActionsButtons();
243 });
244
245 $(window).load(function(){
246 resizeHiddenContainers(true);
247 });
248
249 function initActionsButtons() {
250 if($('a.visualizer-action[data-visualizer-type=copy]').length > 0) {
251 var clipboard = new Clipboard('a.visualizer-action[data-visualizer-type=copy]'); // jshint ignore:line
252 clipboard.on('success', function(e) {
253 window.alert(v.i10n['copied']);
254 });
255 }
256 $('a.visualizer-action[data-visualizer-type!=copy]').on('click', function(e) {
257 var type = $(this).attr( 'data-visualizer-type' );
258 var chart = $(this).attr( 'data-visualizer-chart-id' );
259 var lock = $('.visualizer-front.visualizer-front-' + chart);
260 lock.lock();
261 e.preventDefault();
262 $.ajax({
263 url : v.rest_url.replace('#id#', chart).replace('#type#', type),
264 success: function(data) {
265 if (data && data.data) {
266 switch(type){
267 case 'csv':
268 var a = document.createElement("a");
269 document.body.appendChild(a);
270 a.style = "display: none";
271 var blob = new Blob([data.data.csv], {type: $(this).attr( 'data-visualizer-mime' ) }),
272 url = window.URL.createObjectURL(blob);
273 a.href = url;
274 a.download = data.data.name;
275 a.click();
276 setTimeout(function () {
277 window.URL.revokeObjectURL(url);
278 }, 100);
279 break;
280 case 'xls':
281 var $a = $("<a>");
282 $a.attr("href",data.data.csv);
283 $("body").append($a);
284 $a.attr("download",data.data.name);
285 $a[0].click();
286 $a.remove();
287 break;
288 case 'print':
289 var iframe = $('<iframe>').attr("name", "print-visualization").attr("id", "print-visualization").css("position", "absolute");
290 iframe.appendTo($('body'));
291 var iframe_doc = iframe.get(0).contentWindow || iframe.get(0).contentDocument.document || iframe.get(0).contentDocument;
292 iframe_doc.document.open();
293 iframe_doc.document.write(data.data.csv);
294 iframe_doc.document.close();
295 setTimeout(function(){
296 window.frames['print-visualization'].focus();
297 window.frames['print-visualization'].print();
298 iframe.remove();
299 }, 500);
300 break;
301 default:
302 if(window.visualizer_perform_action) {
303 window.visualizer_perform_action(type, chart, data.data);
304 }
305 break;
306 }
307 }
308 lock.unlock();
309 }
310 });
311 });
312 }
313
314 function resizeHiddenContainers(everytime){
315 $(".visualizer-front").parents().each(function(){
316 if(!$(this).is(":visible") && !$(this).hasClass("visualizer-hidden-container")){
317 $(this).addClass("visualizer-hidden-container");
318 }
319 });
320
321 var mutateObserver = new MutationObserver(function(records) {
322 records.forEach(function(record) {
323 if(record.attributeName === "style" || record.attributeName === "class"){
324 var element = $(record.target);
325 var displayStyle = window.getComputedStyle(element[0]).getPropertyValue("display");
326 if(element.hasClass("visualizer-hidden-container-resized") || displayStyle === "none") { return ; }
327 element.find(".visualizer-front").resize();
328 if(!everytime) {
329 element.addClass("visualizer-hidden-container-resized");
330 }
331 }
332 });
333 });
334
335 $('.visualizer-hidden-container').each(function(){
336 mutateObserver.observe($(this)[0], {attributes: true});
337 });
338 }
339
340 })(jQuery, visualizer);
341
342 (function ($) {
343 $.fn.lock = function () {
344 $(this).each(function () {
345 var $this = $(this);
346 var position = $this.css('position');
347
348 if (!position) {
349 position = 'static';
350 }
351
352 switch (position) {
353 case 'absolute':
354 case 'relative':
355 break;
356 default:
357 $this.css('position', 'relative');
358 break;
359 }
360 $this.data('position', position);
361
362 var width = $this.width(),
363 height = $this.height();
364
365 var locker = $('<div class="locker"></div>');
366 locker.width(width).height(height);
367
368 var loader = $('<div class="locker-loader"></div>');
369 loader.width(width).height(height);
370
371 locker.append(loader);
372 $this.append(locker);
373 $(window).resize(function () {
374 $this.find('.locker,.locker-loader').width($this.width()).height($this.height());
375 });
376 });
377
378 return $(this);
379 };
380
381 $.fn.unlock = function () {
382 $(this).each(function () {
383 $(this).find('.locker').remove();
384 $(this).css('position', $(this).data('position'));
385 });
386
387 return $(this);
388 };
389 })(jQuery);