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

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