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

446 lines 10.4 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;
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 table = new gv.DataTable({cols: series});
55 chart = type == 'gauge' ? 'Gauge' : type.charAt(0).toUpperCase() + type.slice(1) + 'Chart';
56 chart = new gv[chart](self.el);
57
58 switch (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 break;
82 case 'geo':
83 if (settings.region != undefined && settings.region.replace(/^\s+|\s+$/g, '') == '') {
84 settings['region'] = 'world';
85 }
86 break;
87 case 'gauge':
88 break;
89 default:
90 return;
91 }
92
93 for (i = 0; i < data.length; i++) {
94 row = [];
95 for (j = 0; j < series.length; j++) {
96 if (series[j].type == 'date' || series[j].type == 'datetime') {
97 date = new Date(data[i][j]);
98 data[i][j] = null;
99 if (Object.prototype.toString.call(date) === "[object Date]") {
100 if (!isNaN(date.getTime())) {
101 data[i][j] = date;
102 }
103 }
104 }
105 row.push(data[i][j]);
106 }
107 table.addRow(row);
108 }
109
110 chart.draw(table, settings);
111 }
112 });
113
114 /**
115 * =========================================================================
116 * LIBRARY
117 * =========================================================================
118 */
119
120 wpmvvl = wpmvv.Library = wpmV.extend({
121 id: 'visualizer-library-view',
122 className: 'visualizer-clearfix',
123 template: wpm.template('visualizer-library-empty'),
124
125 initialize: function() {
126 var self = this;
127
128 _.defaults(self.options, {
129 filter: 'all',
130 page: 1
131 });
132
133 self.controller.on('visualizer:library:filter', self.onFilterChanged, self);
134 self.controller.on('visualizer:library:page', self.onPageChanged, self);
135 self.collection.on('reset', self.renderCollection, self);
136
137 self.resetCollection();
138 },
139
140 onFilterChanged: function(filter) {
141 this.options.filter = filter;
142 this.options.page = 1;
143 this.resetCollection();
144 },
145
146 onPageChanged: function(page) {
147 this.options.page = page;
148 this.resetCollection();
149 },
150
151 render: function() {},
152
153 renderCollection: function() {
154 var self = this;
155
156 if (self.collection.length > 0) {
157 self.$el.html('');
158 self.collection.each(self.addChart, self);
159 } else {
160 self.$el.html(self.template({}));
161 }
162 },
163
164 addChart: function(chart) {
165 var self = this,
166 view = new wpmvvl.Chart({ model: chart });
167
168 self.$el.append(view.$el);
169 self.views.set('#visualizer-chart-' + chart.get('id'), view, { silent: true });
170 view.render();
171 },
172
173 resetCollection: function() {
174 var self = this,
175 controller = self.controller,
176 content = controller.$el.find(controller.content.selector);
177
178 content.lock();
179 self.collection.fetch({
180 silent: false,
181 data: {
182 filter: self.options.filter,
183 page: self.options.page
184 },
185 statusCode: {
186 200: function(response) {
187 var paginationView = controller.toolbar.get('toolbar').get('pagination');
188
189 if (self.options.page > response.total) {
190 self.options.page = response.total;
191 self.resetCollection();
192 } else {
193 paginationView.options.page = self.options.page;
194 paginationView.options.total = response.total || 1;
195 paginationView.render();
196 }
197
198 self.renderCollection();
199 content.unlock();
200 }
201 }
202 });
203 }
204 });
205
206 wpmvvl.Chart = wpmV.extend({
207 className: 'visualizer-library-chart',
208 template: wpm.template('visualizer-library-chart'),
209
210 events: {
211 'click .visualizer-library-chart-delete': 'deleteChart',
212 'click .visualizer-library-chart-insert': 'insertChart',
213 'click .visualizer-library-chart-shortcode': 'selectShortcode'
214 },
215
216 initialize: function() {
217 var self = this;
218
219 if (!libraryWidth && !libraryHeight) {
220 libraryWidth = $('#visualizer-library-view').width() / 3 - 40;
221 libraryHeight = libraryWidth * 3 / 4;
222
223 libraryWidth = Math.floor(libraryWidth);
224 libraryHeight = Math.floor(libraryHeight);
225 }
226
227 self._view = new wpmvv.Chart({
228 model: self.model,
229 width: libraryWidth,
230 height: libraryHeight
231 });
232
233 self.$el.html(self.template(self.model.toJSON())).prepend(self._view.$el);
234 self.views.set('#' + self._view.id, self._view, { silent: true });
235 },
236
237 render: function() {
238 this._view.render();
239 },
240
241 deleteChart: function() {
242 var self = this;
243
244 if (showNotice.warn()) {
245 self.model.destroy({
246 wait: true,
247 success: function() {
248 self.views.parent.resetCollection();
249 }
250 });
251 }
252 },
253
254 insertChart: function() {
255 wpm.editor.insert('[visualizer id="' + this.model.get('id') + '"]');
256 },
257
258 selectShortcode: function(e) {
259 var range, selection;
260
261 if (window.getSelection && document.createRange) {
262 selection = window.getSelection();
263 range = document.createRange();
264 range.selectNodeContents(e.target);
265 selection.removeAllRanges();
266 selection.addRange(range);
267 } else if (document.selection && document.body.createTextRange) {
268 range = document.body.createTextRange();
269 range.moveToElementText(e.target);
270 range.select();
271 }
272 }
273 });
274
275 wpmvvl.Types = wpmV.extend({
276 tagName: 'select',
277 className: 'visualizer-library-filters',
278
279 events: {
280 change: 'onFilterChange'
281 },
282
283 initialize: function() {
284 var self = this;
285
286 self.createFilters();
287 self.$el.html(_.chain(self.filters).map(function(filter) {
288 return {
289 el: self.make('option', {value: filter.key}, filter.text),
290 priority: filter.priority || 50
291 };
292 }).sortBy('priority').pluck('el').value());
293 },
294
295 createFilters: function() {
296 var self = this;
297
298 self.filters = {};
299 _.each(['all', 'pie', 'line', 'area', 'bar', 'column', 'geo', 'scatter', 'gauge', 'candlestick'], function(type, i) {
300 self.filters[type] = {
301 text: l10n.library.filters[type],
302 key: type,
303 priority: (i + 1) * 10
304 };
305 });
306 },
307
308 onFilterChange: function() {
309 this.controller.trigger('visualizer:library:filter', this.el.value);
310 }
311 });
312
313 wpmvvl.Pagination = wpmV.extend({
314 id: 'visualizer-library-pagination',
315 tagName: 'ul',
316
317 events: {
318 'click a.visualizer-library-pagination-page': 'onPageChange'
319 },
320
321 initialize: function() {
322 _.defaults(this.options, {
323 total: 1,
324 page: 1
325 });
326 },
327
328 render: function() {
329 var self, items;
330
331 self = this;
332 if (self.options.page <= 1 && self.options.total <= 1) {
333 self.$el.html('');
334 return;
335 }
336
337 items = self._pagination(self.options.page, self.options.total, 7);
338
339 self.$el.html(_.chain(items).map(function(item) {
340 var content, className;
341
342 content = item == '...' || item == self.options.page
343 ? self.make('span', { class: 'visualizer-library-pagination-page' }, item)
344 : self.make('a', { class: 'visualizer-library-pagination-page', href: 'javascript:;', 'data-page': item }, item);
345
346 className = item == self.options.page
347 ? 'visualizer-library-pagination-item visualizer-library-pagination-active'
348 : 'visualizer-library-pagination-item';
349
350 return self.make('li', { class: className }, content);
351 }).value());
352 },
353
354 _pagination: function(current, total, max) {
355 var i, tmp, pagenation = [];
356
357 if ( total <= max ) {
358 for ( i = 1; i <= total; i++ ) {
359 pagenation.push(i);
360 }
361 } else {
362 tmp = current - Math.floor( max / 2 );
363
364 if ( max % 2 == 0 ) {
365 tmp++;
366 }
367
368 if ( tmp < 1 ) {
369 tmp = 1;
370 }
371
372 if ( tmp + max > total ) {
373 tmp = total - max + 1;
374 }
375
376 for ( i = 1; i <= max; i++ ) {
377 pagenation.push(tmp++);
378 }
379
380 if ( pagenation[0] != 1 ) {
381 pagenation[0] = 1;
382 pagenation[1] = '...';
383 }
384
385 if ( pagenation[max - 1] != total ) {
386 pagenation[max - 1] = total;
387 pagenation[max - 2] = '...';
388 }
389 }
390
391 return pagenation;
392 },
393
394 onPageChange: function(e) {
395 this.controller.trigger('visualizer:library:page', $(e.target).data('page'));
396 }
397 });
398 })(jQuery, wp.media);
399
400 (function($) {
401 $.fn.lock = function() {
402 $(this).each(function() {
403 var locker = $('<div class="locker"></div>'),
404 loader = $('<div class="locker-loader"></div>'),
405 $this = $(this),
406 position = $this.css('position');
407
408 if ($this.find('.locker').length > 0) {
409 return;
410 }
411
412 if (!position) {
413 position = 'static';
414 }
415
416 $this.css('overflow', 'hidden');
417 switch(position) {
418 case 'absolute':
419 case 'relative':
420 break;
421 default:
422 $this.css('position', 'relative');
423 break;
424 }
425 $this.data('position', position);
426
427 locker.css('top', $this.scrollTop() + 'px').append(loader);
428 $this.append(locker);
429 });
430
431 return $(this);
432 }
433
434 $.fn.unlock = function() {
435 $(this).each(function() {
436 var $this = $(this);
437
438 $this.css({
439 position: $this.data('position'),
440 overflow: 'auto'
441 }).find('.locker').remove();
442 });
443
444 return $(this);
445 }
446 })(jQuery);