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

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