191 lines
4.6 KiB
JavaScript
191 lines
4.6 KiB
JavaScript
/* global menuIcons:false */
|
|
|
|
require( './media' );
|
|
|
|
( function( $ ) {
|
|
var miPicker;
|
|
|
|
if ( ! menuIcons.activeTypes || _.isEmpty( menuIcons.activeTypes ) ) {
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @namespace
|
|
* @property {object} templates - Cached templates for the item previews on the fields
|
|
* @property {string} wrapClass - Field wrapper's class
|
|
* @property {object} frame - Menu Icons' media frame instance
|
|
* @property {object} target - Frame's target model
|
|
*/
|
|
miPicker = {
|
|
templates: {},
|
|
wrapClass: 'div.menu-icons-wrap',
|
|
frame: null,
|
|
target: new wp.media.model.IconPickerTarget(),
|
|
|
|
/**
|
|
* Callback function to filter active icon types
|
|
*
|
|
* TODO: Maybe move to frame view?
|
|
*
|
|
* @param {string} type - Icon type.
|
|
*/
|
|
typesFilter: function( type ) {
|
|
return ( $.inArray( type.id, menuIcons.activeTypes ) >= 0 );
|
|
},
|
|
|
|
/**
|
|
* Create Menu Icons' media frame
|
|
*/
|
|
createFrame: function() {
|
|
miPicker.frame = new wp.media.view.MediaFrame.MenuIcons({
|
|
target: miPicker.target,
|
|
ipTypes: _.filter( iconPicker.types, miPicker.typesFilter ),
|
|
SidebarView: wp.media.view.MenuIconsSidebar
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Pick icon for a menu item and open the frame
|
|
*
|
|
* @param {object} model - Menu item model.
|
|
*/
|
|
pickIcon: function( model ) {
|
|
miPicker.frame.target.set( model, { silent: true });
|
|
miPicker.frame.open();
|
|
},
|
|
|
|
/**
|
|
* Set or unset icon
|
|
*
|
|
* @param {object} e - jQuery click event.
|
|
*/
|
|
setUnset: function( e ) {
|
|
var $el = $( e.currentTarget ),
|
|
$clicked = $( e.target );
|
|
|
|
e.preventDefault();
|
|
|
|
if ( $clicked.hasClass( '_select' ) || $clicked.hasClass( '_icon' ) ) {
|
|
miPicker.setIcon( $el );
|
|
} else if ( $clicked.hasClass( '_remove' ) ) {
|
|
miPicker.unsetIcon( $el );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Set Icon
|
|
*
|
|
* @param {object} $el - jQuery object.
|
|
*/
|
|
setIcon: function( $el ) {
|
|
var id = $el.data( 'id' ),
|
|
frame = miPicker.frame,
|
|
items = frame.menuItems,
|
|
model = items.get( id );
|
|
|
|
if ( model ) {
|
|
miPicker.pickIcon( model.toJSON() );
|
|
return;
|
|
}
|
|
|
|
model = {
|
|
id: id,
|
|
$el: $el,
|
|
$title: $( '#edit-menu-item-title-' + id ),
|
|
$inputs: {}
|
|
};
|
|
|
|
// Collect menu item's settings fields and use them
|
|
// as the model's attributes.
|
|
$el.find( 'div._settings input' ).each( function() {
|
|
var $input = $( this ),
|
|
key = $input.attr( 'class' ).replace( '_mi-', '' ),
|
|
value = $input.val();
|
|
|
|
if ( ! value ) {
|
|
if ( _.has( menuIcons.menuSettings, key ) ) {
|
|
value = menuIcons.menuSettings[ key ];
|
|
} else if ( _.has( menuIcons.settingsFields, key ) ) {
|
|
value = menuIcons.settingsFields[ key ]['default'];
|
|
}
|
|
}
|
|
|
|
model[ key ] = value;
|
|
model.$inputs[ key ] = $input;
|
|
});
|
|
|
|
items.add( model );
|
|
miPicker.pickIcon( model );
|
|
},
|
|
|
|
/**
|
|
* Unset icon
|
|
*
|
|
* @param {object} $el - jQuery object.
|
|
*/
|
|
unsetIcon: function( $el ) {
|
|
var id = $el.data( 'id' );
|
|
|
|
$el.find( 'div._settings input' ).val( '' );
|
|
$el.trigger( 'mi:update' );
|
|
miPicker.frame.menuItems.remove( id );
|
|
},
|
|
|
|
/**
|
|
* Update valeus of menu item's setting fields
|
|
*
|
|
* When the type and icon is set, this will (re)generate the icon
|
|
* preview on the menu item field.
|
|
*
|
|
* @param {object} e - jQuery event.
|
|
*/
|
|
updateField: function( e ) {
|
|
var $el = $( e.currentTarget ),
|
|
$set = $el.find( 'a._select' ),
|
|
$unset = $el.find( 'a._remove' ),
|
|
type = $el.find( 'input._mi-type' ).val(),
|
|
icon = $el.find( 'input._mi-icon' ).val(),
|
|
url = $el.find( 'input._mi-url' ).val(),
|
|
template;
|
|
|
|
if ( type === '' || icon === '' || _.indexOf( menuIcons.activeTypes, type ) < 0 ) {
|
|
$set.text( menuIcons.text.select ).attr( 'title', '' );
|
|
$unset.addClass( 'hidden' );
|
|
|
|
return;
|
|
}
|
|
|
|
if ( miPicker.templates[ type ]) {
|
|
template = miPicker.templates[ type ];
|
|
} else {
|
|
template = miPicker.templates[ type ] = wp.template( 'menu-icons-item-field-preview-' + iconPicker.types[ type ].templateId );
|
|
}
|
|
|
|
$unset.removeClass( 'hidden' );
|
|
$set.attr( 'title', menuIcons.text.change );
|
|
$set.html( template({
|
|
type: type,
|
|
icon: icon,
|
|
url: url
|
|
}) );
|
|
},
|
|
|
|
/**
|
|
* Initialize picker functionality
|
|
*
|
|
* #fires mi:update
|
|
*/
|
|
init: function() {
|
|
miPicker.createFrame();
|
|
$( document )
|
|
.on( 'click', miPicker.wrapClass, miPicker.setUnset )
|
|
.on( 'mi:update', miPicker.wrapClass, miPicker.updateField );
|
|
|
|
// Trigger 'mi:update' event to generate the icons on the item fields.
|
|
$( miPicker.wrapClass ).trigger( 'mi:update' );
|
|
}
|
|
};
|
|
|
|
miPicker.init();
|
|
}( jQuery ) );
|