PluginProbe ʕ •ᴥ•ʔ
Menu Icons by Themeisle – Add Icons to Navigation Menus / 0.10.2
Menu Icons by Themeisle – Add Icons to Navigation Menus v0.10.2
trunk 0.1.0 0.1.1 0.1.2 0.1.3 0.1.4 0.1.5 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.11.2 0.11.3 0.11.4 0.11.5 0.12.0 0.12.1 0.12.10 0.12.11 0.12.12 0.12.2 0.12.3 0.12.4 0.12.5 0.12.6 0.12.7 0.12.8 0.12.9 0.13.0 0.13.1 0.13.10 0.13.11 0.13.12 0.13.13 0.13.14 0.13.15 0.13.16 0.13.17 0.13.18 0.13.19 0.13.2 0.13.20 0.13.21 0.13.22 0.13.23 0.13.3 0.13.4 0.13.5 0.13.6 0.13.7 0.13.8 0.13.9 0.2.0 0.2.1 0.2.2 0.2.3 0.3.0 0.3.1 0.3.2 0.4.0 0.5.0 0.5.1 0.6.0 0.7.0 0.8.0 0.8.1 0.9.0 0.9.2
menu-icons / js / admin.js
menu-icons / js Last commit date
admin.js 10 years ago admin.min.js 10 years ago
admin.js
588 lines
1 (function( $ ) {
2 /**
3 * Settings box tabs
4 *
5 * We can't use core's tabs script here because it will clear the
6 * checkboxes upon tab switching
7 */
8 $( '#menu-icons-settings-tabs' )
9 .on( 'click', 'a.mi-settings-nav-tab', function( e ) {
10 var $el = $( this ).blur(),
11 $target = $( '#' + $el.data( 'type' ) );
12
13 e.preventDefault();
14 e.stopPropagation();
15
16 $el.parent().addClass( 'tabs' ).siblings().removeClass( 'tabs' );
17 $target
18 .removeClass( 'tabs-panel-inactive' )
19 .addClass( 'tabs-panel-active' )
20 .show()
21 .siblings( 'div.tabs-panel' )
22 .hide()
23 .addClass( 'tabs-panel-inactive' )
24 .removeClass( 'tabs-panel-active' );
25 })
26 .find( 'a.mi-settings-nav-tab' ).first().click();
27
28 // Settings meta box
29 $( '#menu-icons-settings-save' ).on( 'click', function( e ) {
30 var $button = $( this ).prop( 'disabled', true ),
31 $spinner = $button.siblings( 'span.spinner' );
32
33 e.preventDefault();
34 e.stopPropagation();
35
36 $spinner.css({
37 display: 'inline-block',
38 visibility: 'visible'
39 });
40
41 $.ajax({
42 type: 'POST',
43 url: menuIcons.ajaxUrls.update,
44 data: $( '#menu-icons-settings :input' ).serialize(),
45
46 success: function( response ) {
47 if ( true === response.success && response.data.redirectUrl ) {
48 window.location = response.data.redirectUrl;
49 } else {
50 $button.prop( 'disabled', false );
51 }
52 },
53
54 always: function() {
55 $spinner.hide();
56 }
57 });
58 });
59 })( jQuery );
60
61 (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
62 wp.media.model.MenuIconsItemSettingField = require( './models/item-setting-field.js' );
63 wp.media.model.MenuIconsItemSettings = require( './models/item-settings.js' );
64 wp.media.model.MenuIconsItem = require( './models/item.js' );
65
66 wp.media.view.MenuIconsItemSettingField = require( './views/item-setting-field.js' );
67 wp.media.view.MenuIconsItemSettings = require( './views/item-settings.js' );
68 wp.media.view.MenuIconsItemPreview = require( './views/item-preview.js' );
69 wp.media.view.MenuIconsSidebar = require( './views/sidebar.js' );
70 wp.media.view.MediaFrame.MenuIcons = require( './views/frame.js' );
71
72 },{"./models/item-setting-field.js":2,"./models/item-settings.js":3,"./models/item.js":4,"./views/frame.js":5,"./views/item-preview.js":6,"./views/item-setting-field.js":7,"./views/item-settings.js":8,"./views/sidebar.js":9}],2:[function(require,module,exports){
73 /**
74 * wp.media.model.MenuIconsItemSettingField
75 *
76 * @class
77 * @augments Backbone.Model
78 */
79 var MenuIconsItemSettingField = Backbone.Model.extend({
80 defaults: {
81 id: '',
82 label: '',
83 value: '',
84 type: 'text'
85 }
86 });
87
88 module.exports = MenuIconsItemSettingField;
89
90 },{}],3:[function(require,module,exports){
91 /**
92 * wp.media.model.MenuIconsItemSettings
93 *
94 * @class
95 * @augments Backbone.Collection
96 */
97 var MenuIconsItemSettings = Backbone.Collection.extend({
98 model: wp.media.model.MenuIconsItemSettingField
99 });
100
101 module.exports = MenuIconsItemSettings;
102
103 },{}],4:[function(require,module,exports){
104 /**
105 * wp.media.model.MenuIconsItem
106 *
107 * @class
108 * @augments Backbone.Model
109 */
110 var Item = Backbone.Model.extend({
111 initialize: function() {
112 this.on( 'change', this.updateValues, this );
113 },
114
115 /**
116 * Update the values of menu item's settings fields
117 *
118 * @fires mi:update
119 */
120 updateValues: function() {
121 _.each( this.get( '$inputs' ), function( $input, key ) {
122 $input.val( this.get( key ) );
123 }, this );
124
125 // Trigger the 'mi:update' event to regenerate the icon on the field.
126 this.get( '$el' ).trigger( 'mi:update' );
127 }
128 });
129
130 module.exports = Item;
131
132 },{}],5:[function(require,module,exports){
133 /**
134 * wp.media.view.MediaFrame.MenuIcons
135 *
136 * @class
137 * @augments wp.media.view.MediaFrame.IconPicker
138 * @augments wp.media.view.MediaFrame.Select
139 * @augments wp.media.view.MediaFrame
140 * @augments wp.media.view.Frame
141 * @augments wp.media.View
142 * @augments wp.Backbone.View
143 * @augments Backbone.View
144 */
145 var MenuIcons = wp.media.view.MediaFrame.IconPicker.extend({
146 initialize: function() {
147 this.menuItems = new Backbone.Collection( [], {
148 model: wp.media.model.MenuIconsItem
149 });
150
151 wp.media.view.MediaFrame.IconPicker.prototype.initialize.apply( this, arguments );
152
153 this.listenTo( this.target, 'change', this.miUpdateItemProps );
154 this.on( 'select', this.miClearTarget, this );
155 },
156
157 miUpdateItemProps: function( props ) {
158 var model = this.menuItems.get( props.id );
159
160 model.set( props.changed );
161 },
162
163 miClearTarget: function() {
164 this.target.clear({ silent: true });
165 }
166 });
167
168 module.exports = MenuIcons;
169
170 },{}],6:[function(require,module,exports){
171 /**
172 * wp.media.view.MenuIconsItemPreview
173 *
174 * @class
175 * @augments wp.media.View
176 * @augments wp.Backbone.View
177 * @augments Backbone.View
178 */
179 var MenuIconsItemPreview = wp.media.View.extend({
180 tagName: 'p',
181 className: 'mi-preview menu-item attachment-info',
182 events: {
183 'click a': 'preventDefault'
184 },
185
186 initialize: function() {
187 wp.media.View.prototype.initialize.apply( this, arguments );
188 this.model.on( 'change', this.render, this );
189 },
190
191 render: function() {
192 var frame = this.controller,
193 state = frame.state(),
194 selected = state.get( 'selection' ).single(),
195 props = this.model.toJSON(),
196 data = _.extend( props, {
197 type: state.id,
198 icon: selected.id,
199 title: this.model.get( '$title' ).val(),
200 url: state.ipGetIconUrl( selected, props.image_size )
201 }),
202 template = 'menu-icons-item-sidebar-preview-' + iconPicker.types[ state.id ].templateId + '-';
203
204 if ( data.hide_label ) {
205 template += 'hide_label';
206 } else {
207 template += data.position;
208 }
209
210 this.template = wp.media.template( template );
211 this.$el.html( this.template( data ) );
212
213 return this;
214 },
215
216 preventDefault: function( e ) {
217 e.preventDefault();
218 }
219 });
220
221 module.exports = MenuIconsItemPreview;
222
223 },{}],7:[function(require,module,exports){
224 var $ = jQuery,
225 MenuIconsItemSettingField;
226
227 /**
228 * wp.media.view.MenuIconsItemSettingField
229 *
230 * @class
231 * @augments wp.media.View
232 * @augments wp.Backbone.View
233 * @augments Backbone.View
234 */
235 MenuIconsItemSettingField = wp.media.View.extend({
236 tagName: 'label',
237 className: 'setting',
238 events: {
239 'change :input': '_update'
240 },
241
242 initialize: function() {
243 wp.media.View.prototype.initialize.apply( this, arguments );
244
245 this.template = wp.media.template( 'menu-icons-settings-field-' + this.model.get( 'type' ) );
246 this.model.on( 'change', this.render, this );
247 },
248
249 prepare: function() {
250 return this.model.toJSON();
251 },
252
253 _update: function( e ) {
254 var value = $( e.currentTarget ).val();
255
256 this.model.set( 'value', value );
257 this.options.item.set( this.model.id, value );
258 }
259 });
260
261 module.exports = MenuIconsItemSettingField;
262
263 },{}],8:[function(require,module,exports){
264 /**
265 * wp.media.view.MenuIconsItemSettings
266 *
267 * @class
268 * @augments wp.media.view.PriorityList
269 * @augments wp.media.View
270 * @augments wp.Backbone.View
271 * @augments Backbone.View
272 */
273 var MenuIconsItemSettings = wp.media.view.PriorityList.extend({
274 className: 'mi-settings attachment-info',
275
276 prepare: function() {
277 _.each( this.collection.map( this.createField, this ), function( view ) {
278 this.set( view.model.id, view );
279 }, this );
280 },
281
282 createField: function( model ) {
283 var field = new wp.media.view.MenuIconsItemSettingField({
284 item: this.model,
285 model: model,
286 collection: this.collection
287 });
288
289 return field;
290 }
291 });
292
293 module.exports = MenuIconsItemSettings;
294
295 },{}],9:[function(require,module,exports){
296 /**
297 * wp.media.view.MenuIconsSidebar
298 *
299 * @class
300 * @augments wp.media.view.IconPickerSidebar
301 * @augments wp.media.view.Sidebar
302 * @augments wp.media.view.PriorityList
303 * @augments wp.media.View
304 * @augments wp.Backbone.View
305 * @augments Backbone.View
306 */
307 var MenuIconsSidebar = wp.media.view.IconPickerSidebar.extend({
308 initialize: function() {
309 var title = new wp.media.View({
310 tagName: 'h3',
311 priority: -10
312 });
313
314 var info = new wp.media.View({
315 tagName: 'p',
316 className: '_info',
317 priority: 1000
318 });
319
320 wp.media.view.IconPickerSidebar.prototype.initialize.apply( this, arguments );
321
322 title.$el.text( menuIcons.text.preview );
323 this.set( 'title', title );
324
325 info.$el.html( menuIcons.text.settingsInfo );
326 this.set( 'info', info );
327 },
328
329 createSingle: function() {
330 this.createPreview();
331 this.createSettings();
332 },
333
334 disposeSingle: function() {
335 this.unset( 'preview' );
336 this.unset( 'settings' );
337 },
338
339 createPreview: function() {
340 var self = this,
341 frame = self.controller,
342 state = frame.state();
343
344 // If the selected icon is still being downloaded (image or svg type),
345 // wait for it to complete before creating the preview.
346 if ( state.dfd && 'pending' === state.dfd.state() ) {
347 state.dfd.done( function() {
348 self.createPreview();
349 });
350
351 return;
352 }
353
354 self.set( 'preview', new wp.media.view.MenuIconsItemPreview({
355 controller: frame,
356 model: frame.target,
357 priority: 80
358 }) );
359 },
360
361 createSettings: function() {
362 var frame = this.controller,
363 state = frame.state(),
364 fieldIds = state.get( 'data' ).settingsFields,
365 fields = [];
366
367 _.each( fieldIds, function( fieldId ) {
368 var field = menuIcons.settingsFields[ fieldId ],
369 model;
370
371 if ( ! field ) {
372 return;
373 }
374
375 model = _.defaults({
376 value: frame.target.get( fieldId ) || field['default']
377 }, field );
378
379 fields.push( model );
380 } );
381
382 if ( ! fields.length ) {
383 return;
384 }
385
386 this.set( 'settings', new wp.media.view.MenuIconsItemSettings({
387 controller: this.controller,
388 collection: new wp.media.model.MenuIconsItemSettings( fields ),
389 model: frame.target,
390 type: this.options.type,
391 priority: 120
392 }) );
393 }
394 });
395
396 module.exports = MenuIconsSidebar;
397
398 },{}]},{},[1]);
399
400 (function( $ ) {
401 'use strict';
402
403 var miPicker;
404
405 if ( ! menuIcons.activeTypes || _.isEmpty( menuIcons.activeTypes ) ) {
406 return;
407 }
408
409 /**
410 * @namespace
411 * @property {object} templates - Cached templates for the item previews on the fields
412 * @property {string} wrapClass - Field wrapper's class
413 * @property {object} frame - Menu Icons' media frame instance
414 * @property {object} target - Frame's target model
415 */
416 miPicker = {
417 templates: {},
418 wrapClass: 'div.menu-icons-wrap',
419 frame: null,
420 target: new wp.media.model.IconPickerTarget(),
421
422 /**
423 * Callback function to filter active icon types
424 *
425 * TODO: Maybe move to frame view?
426 *
427 * @param {string} type - Icon type.
428 */
429 typesFilter: function( type ) {
430 return ( -1 < $.inArray( type.id, menuIcons.activeTypes ) );
431 },
432
433 /**
434 * Create Menu Icons' media frame
435 */
436 createFrame: function() {
437 miPicker.frame = new wp.media.view.MediaFrame.MenuIcons({
438 target: miPicker.target,
439 ipTypes: _.filter( iconPicker.types, miPicker.typesFilter ),
440 SidebarView: wp.media.view.MenuIconsSidebar
441 });
442 },
443
444 /**
445 * Pick icon for a menu item and open the frame
446 *
447 * @param {object} model - Menu item model.
448 */
449 pickIcon: function( model ) {
450 miPicker.frame.target.set( model, { silent: true } );
451 miPicker.frame.open();
452 },
453
454 /**
455 * Set or unset icon
456 *
457 * @param {object} e - jQuery click event.
458 */
459 setUnset: function( e ) {
460 var $el = $( e.currentTarget ),
461 $clicked = $( e.target );
462
463 e.preventDefault();
464
465 if ( $clicked.hasClass( '_select' ) || $clicked.hasClass( '_icon' ) ) {
466 miPicker.setIcon( $el );
467 } else if ( $clicked.hasClass( '_remove' ) ) {
468 miPicker.unsetIcon( $el );
469 }
470 },
471
472 /**
473 * Set Icon
474 *
475 * @param {object} $el - jQuery object.
476 */
477 setIcon: function( $el ) {
478 var id = $el.data( 'id' ),
479 frame = miPicker.frame,
480 items = frame.menuItems,
481 model = items.get( id );
482
483 if ( model ) {
484 miPicker.pickIcon( model.toJSON() );
485 return;
486 }
487
488 model = {
489 id: id,
490 $el: $el,
491 $title: $( '#edit-menu-item-title-' + id ),
492 $inputs: {}
493 };
494
495 // Collect menu item's settings fields and use them
496 // as the model's attributes.
497 $el.find( 'div._settings input' ).each( function() {
498 var $input = $( this ),
499 key = $input.attr( 'class' ).replace( '_mi-', '' ),
500 value = $input.val();
501
502 if ( ! value ) {
503 if ( _.has( menuIcons.menuSettings, key ) ) {
504 value = menuIcons.menuSettings[ key ];
505 } else if ( _.has( menuIcons.settingsFields, key ) ) {
506 value = menuIcons.settingsFields[ key ]['default'];
507 }
508 }
509
510 model[ key ] = value;
511 model.$inputs[ key ] = $input;
512 });
513
514 items.add( model );
515 miPicker.pickIcon( model );
516 },
517
518 /**
519 * Unset icon
520 *
521 * @param {object} $el - jQuery object.
522 */
523 unsetIcon: function( $el ) {
524 var id = $el.data( 'id' );
525
526 $el.find( 'div._settings input' ).val( '' );
527 $el.trigger( 'mi:update' );
528 miPicker.frame.menuItems.remove( id );
529 },
530
531 /**
532 * Update valeus of menu item's setting fields
533 *
534 * When the type and icon is set, this will (re)generate the icon
535 * preview on the menu item field.
536 *
537 * @param {object} e - jQuery event.
538 */
539 updateField: function( e ) {
540 var $el = $( e.currentTarget ),
541 $set = $el.find( 'a._select' ),
542 $unset = $el.find( 'a._remove' ),
543 type = $el.find( 'input._mi-type' ).val(),
544 icon = $el.find( 'input._mi-icon' ).val(),
545 url = $el.find( 'input._mi-url' ).val(),
546 template;
547
548 if ( '' === type || '' === icon || 0 > _.indexOf( menuIcons.activeTypes, type ) ) {
549 $set.text( menuIcons.text.select ).attr( 'title', '' );
550 $unset.addClass( 'hidden' );
551
552 return;
553 }
554
555 if ( miPicker.templates[ type ] ) {
556 template = miPicker.templates[ type ];
557 } else {
558 template = miPicker.templates[ type ] = wp.template( 'menu-icons-item-field-preview-' + iconPicker.types[ type ].templateId );
559 }
560
561 $unset.removeClass( 'hidden' );
562 $set.attr( 'title', menuIcons.text.change );
563 $set.html( template({
564 type: type,
565 icon: icon,
566 url: url
567 }) );
568 },
569
570 /**
571 * Initialize picker functionality
572 *
573 * @fires mi:update
574 */
575 init: function() {
576 miPicker.createFrame();
577 $( document )
578 .on( 'click', miPicker.wrapClass, miPicker.setUnset )
579 .on( 'mi:update', miPicker.wrapClass, miPicker.updateField );
580
581 // Trigger 'mi:update' event to generate the icons on the item fields.
582 $( miPicker.wrapClass ).trigger( 'mi:update' );
583 }
584 };
585
586 miPicker.init();
587 }( jQuery ) );
588