PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.9
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.9
4.0.8 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 All 149 releases
visualizer / js / media / view.js

view.js in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.9, at js/media/view.js

527 lines 12.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*jshint scripturl:true*/
2 /* global google */
3 /* global visualizer */
4 /* global showNotice */
5 (function($, wpm, visualizer) {
6 var libraryWidth, libraryHeight, wpmv, wpmV, wpmvv, wpmvvl, wpmvvb, l10n;
7
8 wpmv = wpm.view;
9 wpmV = wpm.View;
10 wpmvv = wpmv.visualizer = {};
11 l10n = wpmv.l10n.visualizer;
12
13 /**
14 * =========================================================================
15 * COMMON
16 * =========================================================================
17 */
18
19 if (!_.isFunction(wpmV.prototype.make)) {
20 wpmV.prototype.make = function(tag, attrs, val) {
21 var html, attr;
22
23 html = '<' + tag;
24 for (attr in attrs) {
25 html += ' ' + attr + '="' + attrs[attr] + '"';
26 }
27 html += '>' + val + '</' + tag + '>';
28
29 return html;
30 };
31 }
32
33 wpmvv.Chart = wpmV.extend({
34 className: 'visualizer-library-chart-canvas',
35
36 constructor: function(options) {
37 this.id = 'visualizer-chart-' + options.model.get('id');
38 wpmV.apply(this, arguments);
39 },
40
41 render: function() {
42 var self, model, chart, gv, type, series, data, table, settings, i, j, row, date, format, formatter, axis, property;
43
44 self = this;
45 gv = google.visualization;
46 model = self.model;
47
48 self.$el
49 .width(self.options.width)
50 .height(self.options.height)
51 .css('background-image', 'none');
52
53 type = model.get('type');
54 series = model.get('series');
55 data = model.get('data');
56 settings = model.get('settings');
57
58 settings.width = self.options.width;
59 settings.height = self.options.height;
60
61 table = new gv.DataTable({cols: series});
62
63 switch (type) {
64 case "gauge":
65 case "table":
66 case "timeline":
67 chart = type.charAt(0).toUpperCase() + type.slice(1);
68 break;
69 default:
70 chart = type.charAt(0).toUpperCase() + type.slice(1) + 'Chart';
71 break;
72 }
73
74 chart = new gv[chart](self.el);
75
76 switch (type) {
77 case 'pie':
78 if (settings.slices) {
79 for (i in settings.slices) {
80 if (settings.slices[i]['color'] === '') {
81 delete settings.slices[i]['color'];
82 }
83 }
84 }
85 break;
86 case 'line':
87 case 'bar':
88 case 'column':
89 case 'area':
90 case 'scatter':
91 case 'candlestick':
92 if (settings.series) {
93 for (i in settings.series) {
94 if (settings.series[i]['color'] === '') {
95 delete settings.series[i]['color'];
96 }
97 }
98 }
99 break;
100 case 'geo':
101 if (settings.region !== undefined && settings.region.replace(/^\s+|\s+$/g, '') === '') {
102 settings['region'] = 'world';
103 }
104 break;
105 case 'gauge':
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 (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 for (i = 0; i < data.length; i++) {
142 row = [];
143 for (j = 0; j < series.length; j++) {
144 if (series[j].type === 'date' || series[j].type === 'datetime') {
145 date = new Date(data[i][j]);
146 data[i][j] = null;
147 if (Object.prototype.toString.call(date) === "[object Date]") {
148 if (!isNaN(date.getTime())) {
149 data[i][j] = date;
150 }
151 }
152 }
153 row.push(data[i][j]);
154 }
155 table.addRow(row);
156 }
157
158 if (settings.series) {
159 for (i = 0; i < settings.series.length; i++) {
160 format = settings.series[i].format;
161 if (!format || format === '') {
162 continue;
163 }
164
165 formatter = null;
166 switch (series[i + 1].type) {
167 case 'number':
168 formatter = new gv.NumberFormat({pattern: format});
169 break;
170 case 'date':
171 case 'datetime':
172 case 'timeofday':
173 formatter = new gv.DateFormat({pattern: format});
174 break;
175 }
176
177 if (formatter) {
178 formatter.format(table, i + 1);
179 }
180 }
181 }
182
183 chart.draw(table, settings);
184 }
185 });
186
187 /**
188 * =========================================================================
189 * LIBRARY
190 * =========================================================================
191 */
192
193 wpmvvl = wpmvv.Library = wpmV.extend({
194 id: 'visualizer-library-view',
195 className: 'visualizer-clearfix',
196 template: wpm.template('visualizer-library-empty'),
197
198 initialize: function() {
199 var self = this;
200
201 _.defaults(self.options, {
202 filter: 'all',
203 page: 1
204 });
205
206 self.controller.on('visualizer:library:filter', self.onFilterChanged, self);
207 self.controller.on('visualizer:library:page', self.onPageChanged, self);
208 self.collection.on('reset', self.renderCollection, self);
209
210 self.resetCollection();
211 },
212
213 onFilterChanged: function(filter) {
214 this.options.filter = filter;
215 this.options.page = 1;
216 this.resetCollection();
217 },
218
219 onPageChanged: function(page) {
220 this.options.page = page;
221 this.resetCollection();
222 },
223
224 render: function() {},
225
226 renderCollection: function() {
227 var self = this;
228
229 if (self.collection.length > 0) {
230 self.$el.html('');
231 self.collection.each(self.addChart, self);
232 } else {
233 self.$el.html(self.template({}));
234 }
235 },
236
237 addChart: function(chart) {
238 var self = this,
239 view = new wpmvvl.Chart({ model: chart });
240
241 self.$el.append(view.$el);
242 self.views.set('#visualizer-chart-' + chart.get('id'), view, { silent: true });
243 view.render();
244 },
245
246 resetCollection: function() {
247 var self = this,
248 controller = self.controller,
249 content = controller.$el.find(controller.content.selector);
250
251 content.lock();
252 self.collection.fetch({
253 silent: false,
254 data: {
255 filter: self.options.filter,
256 page: self.options.page
257 },
258 statusCode: {
259 200: function(response) {
260 var paginationView = controller.toolbar.get('toolbar').get('pagination');
261
262 if (self.options.page > response.total) {
263 self.options.page = response.total;
264 self.resetCollection();
265 } else {
266 paginationView.options.page = self.options.page;
267 paginationView.options.total = response.total || 1;
268 paginationView.render();
269 }
270
271 self.renderCollection();
272 $('.visualizer-library-chart').css('position', 'relative')
273 .append($(
274 // jshint ignore:start
275 '<div class="visualizer-chart-bg"></div>'
276 + '<div class="visualizer-chart-insert-bg">'
277 + '<button class="button button-primary visualizer-library-chart-insert">' + visualizer.i10n.insert + '</button>'
278 + '</div>'
279 // jshint ignore:end
280 ))
281 .on('mouseover', function(){
282 $(this).addClass('hover');
283 });
284 content.unlock();
285 }
286 }
287 });
288 }
289 });
290
291 wpmvvl.Chart = wpmV.extend({
292 className: 'visualizer-library-chart',
293 template: wpm.template('visualizer-library-chart'),
294
295 events: {
296 'click .visualizer-library-chart-delete': 'deleteChart',
297 'click .visualizer-library-chart-insert': 'insertChart',
298 'click .visualizer-library-chart-shortcode': 'selectShortcode'
299 },
300
301 initialize: function() {
302 var self = this;
303
304 if (!libraryWidth && !libraryHeight) {
305 libraryWidth = $('#visualizer-library-view').width() / 3 - 40;
306 libraryHeight = libraryWidth * 3 / 4;
307
308 libraryWidth = Math.floor(libraryWidth);
309 libraryHeight = Math.floor(libraryHeight);
310 }
311
312 self._view = new wpmvv.Chart({
313 model: self.model,
314 width: libraryWidth,
315 height: libraryHeight
316 });
317
318 self.$el.html(self.template(self.model.toJSON())).prepend(self._view.$el);
319 self.views.set('#' + self._view.id, self._view, { silent: true });
320 },
321
322 render: function() {
323 this._view.render();
324 },
325
326 deleteChart: function() {
327 var self = this;
328
329 if (showNotice.warn()) {
330 self.model.destroy({
331 wait: true,
332 success: function() {
333 self.views.parent.resetCollection();
334 }
335 });
336 }
337 },
338
339 insertChart: function() {
340 wpm.editor.insert('[visualizer id="' + this.model.get('id') + '"]');
341 },
342
343 selectShortcode: function(e) {
344 var range, selection;
345
346 if (window.getSelection && document.createRange) {
347 selection = window.getSelection();
348 range = document.createRange();
349 range.selectNodeContents(e.target);
350 selection.removeAllRanges();
351 selection.addRange(range);
352 } else if (document.selection && document.body.createTextRange) {
353 range = document.body.createTextRange();
354 range.moveToElementText(e.target);
355 range.select();
356 }
357 }
358 });
359
360 wpmvvl.Types = wpmV.extend({
361 tagName: 'select',
362 className: 'visualizer-library-filters',
363
364 events: {
365 change: 'onFilterChange'
366 },
367
368 initialize: function() {
369 var self = this;
370
371 self.createFilters();
372 self.$el.html(_.chain(self.filters).map(function(filter) {
373 return {
374 el: self.make('option', {value: filter.key}, filter.text),
375 priority: filter.priority || 50
376 };
377 }).sortBy('priority').pluck('el').value());
378 },
379
380 createFilters: function() {
381 var self = this;
382
383 self.filters = {};
384 _.each(l10n.library.types, function(type, i) {
385 self.filters[type] = {
386 text: l10n.library.filters[type],
387 key: type,
388 priority: (i + 1) * 10
389 };
390 });
391 },
392
393 onFilterChange: function() {
394 this.controller.trigger('visualizer:library:filter', this.el.value);
395 }
396 });
397
398 wpmvvl.Pagination = wpmV.extend({
399 id: 'visualizer-library-pagination',
400 tagName: 'ul',
401
402 events: {
403 'click a.visualizer-library-pagination-page': 'onPageChange'
404 },
405
406 initialize: function() {
407 _.defaults(this.options, {
408 total: 1,
409 page: 1
410 });
411 },
412
413 render: function() {
414 var self, items;
415
416 self = this;
417 if (self.options.page <= 1 && self.options.total <= 1) {
418 self.$el.html('');
419 return;
420 }
421
422 items = self._pagination(self.options.page, self.options.total, 7);
423
424 self.$el.html(_.chain(items).map(function(item) {
425 var content, className;
426
427 content = item === '...' || item === self.options.page ? self.make('span', { class: 'visualizer-library-pagination-page' }, item) : self.make('a', { class: 'visualizer-library-pagination-page', href: 'javascript:;', 'data-page': item }, item);
428
429 className = item === self.options.page ? 'visualizer-library-pagination-item visualizer-library-pagination-active' : 'visualizer-library-pagination-item';
430
431 return self.make('li', { class: className }, content);
432 }).value());
433 },
434
435 _pagination: function(current, total, max) {
436 var i, tmp, pagenation = [];
437
438 if ( total <= max ) {
439 for ( i = 1; i <= total; i++ ) {
440 pagenation.push(i);
441 }
442 } else {
443 tmp = current - Math.floor( max / 2 );
444
445 if ( max % 2 === 0 ) {
446 tmp++;
447 }
448
449 if ( tmp < 1 ) {
450 tmp = 1;
451 }
452
453 if ( tmp + max > total ) {
454 tmp = total - max + 1;
455 }
456
457 for ( i = 1; i <= max; i++ ) {
458 pagenation.push(tmp++);
459 }
460
461 if ( pagenation[0] !== 1 ) {
462 pagenation[0] = 1;
463 pagenation[1] = '...';
464 }
465
466 if ( pagenation[max - 1] !== total ) {
467 pagenation[max - 1] = total;
468 pagenation[max - 2] = '...';
469 }
470 }
471
472 return pagenation;
473 },
474
475 onPageChange: function(e) {
476 this.controller.trigger('visualizer:library:page', $(e.target).data('page'));
477 }
478 });
479 })(jQuery, wp.media, visualizer);
480
481 (function($) {
482 $.fn.lock = function() {
483 $(this).each(function() {
484 var locker = $('<div class="locker"></div>'),
485 loader = $('<div class="locker-loader"></div>'),
486 $this = $(this),
487 position = $this.css('position');
488
489 if ($this.find('.locker').length > 0) {
490 return;
491 }
492
493 if (!position) {
494 position = 'static';
495 }
496
497 $this.css('overflow', 'hidden');
498 switch(position) {
499 case 'absolute':
500 case 'relative':
501 break;
502 default:
503 $this.css('position', 'relative');
504 break;
505 }
506 $this.data('position', position);
507
508 locker.css('top', $this.scrollTop() + 'px').append(loader);
509 $this.append(locker);
510 });
511
512 return $(this);
513 };
514
515 $.fn.unlock = function() {
516 $(this).each(function() {
517 var $this = $(this);
518
519 $this.css({
520 position: $this.data('position'),
521 overflow: 'auto'
522 }).find('.locker').remove();
523 });
524
525 return $(this);
526 };
527 })(jQuery);