PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 1.4.2.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v1.4.2.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 / media / view.js

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

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