226 lines
6.3 KiB
JavaScript
226 lines
6.3 KiB
JavaScript
|
/* jshint onevar: false, multistr: true */
|
||
|
/* global _wpMediaViewsL10n, _wpGalleryWidgetAdminSettings */
|
||
|
|
||
|
(function($){
|
||
|
var $ids;
|
||
|
var $thumbs;
|
||
|
|
||
|
$(function(){
|
||
|
$( document.body ) .on( 'click', '.gallery-widget-choose-images', function( event ) {
|
||
|
event.preventDefault();
|
||
|
|
||
|
var widget_form = $( this ).closest( 'form, .form' );
|
||
|
|
||
|
$ids = widget_form.find( '.gallery-widget-ids' );
|
||
|
$thumbs = widget_form.find( '.gallery-widget-thumbs' );
|
||
|
|
||
|
var idsString = $ids.val();
|
||
|
|
||
|
var attachments = getAttachments( idsString );
|
||
|
|
||
|
var selection = null;
|
||
|
var editing = false;
|
||
|
|
||
|
if ( attachments ) {
|
||
|
selection = getSelection( attachments );
|
||
|
|
||
|
editing = true;
|
||
|
}
|
||
|
|
||
|
var options = {
|
||
|
state: 'gallery-edit',
|
||
|
title: wp.media.view.l10n.addMedia,
|
||
|
multiple: true,
|
||
|
editing: editing,
|
||
|
selection: selection
|
||
|
};
|
||
|
|
||
|
var workflow = getWorkflow( options );
|
||
|
|
||
|
workflow.open();
|
||
|
});
|
||
|
|
||
|
// Setup an onchange handler to toggle various options when changing style. The different style options
|
||
|
// require different form inputs to be presented in the widget; this event will keep the UI in sync
|
||
|
// with the selected style
|
||
|
$( '.widget-inside' ).on( 'change', '.gallery-widget-style', setupStyleOptions);
|
||
|
|
||
|
// Setup the Link To options for all forms currently on the page. Does the same as the onChange handler, but
|
||
|
// is called once to display the correct form inputs for each widget on the page
|
||
|
setupStyleOptions();
|
||
|
});
|
||
|
|
||
|
var media = wp.media,
|
||
|
l10n;
|
||
|
|
||
|
// Link any localized strings.
|
||
|
l10n = media.view.l10n = typeof _wpMediaViewsL10n === 'undefined' ? {} : _wpMediaViewsL10n;
|
||
|
|
||
|
/**
|
||
|
* wp.media.view.MediaFrame.GalleryWidget
|
||
|
*
|
||
|
* This behavior can be very nearly had by setting the workflow's state to 'gallery-edit', but
|
||
|
* we cannot use the custom WidgetGalleryEdit controller with it (must overide createStates(),
|
||
|
* which is necessary to disable the sidebar gallery settings in the media browser)
|
||
|
*/
|
||
|
media.view.MediaFrame.GalleryWidget = media.view.MediaFrame.Post.extend({
|
||
|
createStates: function() {
|
||
|
var options = this.options;
|
||
|
|
||
|
// `CollectionEdit` and `CollectionAdd` were only introduced in r27214-core,
|
||
|
// so they may not be available yet.
|
||
|
if ( 'CollectionEdit' in media.controller ) {
|
||
|
this.states.add([
|
||
|
new media.controller.CollectionEdit({
|
||
|
type: 'image',
|
||
|
collectionType: 'gallery',
|
||
|
title: l10n.editGalleryTitle,
|
||
|
SettingsView: media.view.Settings.Gallery,
|
||
|
library: options.selection,
|
||
|
editing: options.editing,
|
||
|
menu: 'gallery'
|
||
|
}),
|
||
|
new media.controller.CollectionAdd({
|
||
|
type: 'image',
|
||
|
collectionType: 'gallery',
|
||
|
title: l10n.addToGalleryTitle
|
||
|
})
|
||
|
]);
|
||
|
} else {
|
||
|
// If `CollectionEdit` is not available, then use the old approach.
|
||
|
|
||
|
if ( ! ( 'WidgetGalleryEdit' in media.controller ) ) {
|
||
|
// Remove the gallery settings sidebar when editing widgets.
|
||
|
media.controller.WidgetGalleryEdit = media.controller.GalleryEdit.extend({
|
||
|
gallerySettings: function( /*browser*/ ) {
|
||
|
return;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
this.states.add([
|
||
|
new media.controller.WidgetGalleryEdit({
|
||
|
library: options.selection,
|
||
|
editing: options.editing,
|
||
|
menu: 'gallery'
|
||
|
}),
|
||
|
new media.controller.GalleryAdd({ })
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function setupStyleOptions(){
|
||
|
$( '.widget-inside .gallery-widget-style' ).each( function( /*i*/ ){
|
||
|
var style = $( this ).val();
|
||
|
|
||
|
var form = $( this ).parents( 'form' );
|
||
|
|
||
|
switch ( style ) {
|
||
|
case 'slideshow':
|
||
|
form.find( '.gallery-widget-link-wrapper' ).hide();
|
||
|
form.find( '.gallery-widget-columns-wrapper' ).hide();
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
form.find( '.gallery-widget-link-wrapper' ).show();
|
||
|
form.find( '.gallery-widget-columns-wrapper' ).show();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Take a given Selection of attachments and a thumbs wrapper div (jQuery object)
|
||
|
* and fill it with thumbnails
|
||
|
*/
|
||
|
function setupThumbs( selection, wrapper ){
|
||
|
wrapper.empty();
|
||
|
|
||
|
var imageSize = _wpGalleryWidgetAdminSettings.thumbSize;
|
||
|
|
||
|
selection.each( function( model ){
|
||
|
var sizedUrl = model.get('url') + '?w=' + imageSize + '&h=' + imageSize + '&crop=true';
|
||
|
|
||
|
var thumb = jQuery('<img>', { 'src' : sizedUrl, 'alt': model.get('title'), 'title': model.get('title'), 'width': imageSize, 'height': imageSize, 'class': 'thumb' });
|
||
|
|
||
|
wrapper.append( thumb );
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Take a csv string of ids (as stored in db) and fetch a full Attachments collection
|
||
|
*/
|
||
|
function getAttachments( idsString ) {
|
||
|
if ( ! idsString ) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// Found in /wp-includes/js/media-editor.js
|
||
|
var shortcode = wp.shortcode.next( 'gallery', '[gallery ids="' + idsString + '"]' );
|
||
|
|
||
|
// Ignore the rest of the match object, to give attachments() below what it expects
|
||
|
shortcode = shortcode.shortcode;
|
||
|
|
||
|
var attachments = wp.media.gallery.attachments( shortcode );
|
||
|
|
||
|
return attachments;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Take an Attachments collection and return a corresponding Selection model that can be
|
||
|
* passed to a MediaFrame to prepopulate the gallery picker
|
||
|
*/
|
||
|
function getSelection( attachments ) {
|
||
|
var selection = new wp.media.model.Selection( attachments.models, {
|
||
|
props: attachments.props.toJSON(),
|
||
|
multiple: true
|
||
|
});
|
||
|
|
||
|
selection.gallery = attachments.gallery;
|
||
|
|
||
|
// Fetch the query's attachments, and then break ties from the
|
||
|
// query to allow for sorting.
|
||
|
selection.more().done( function() {
|
||
|
// Break ties with the query.
|
||
|
selection.props.set( { query: false } );
|
||
|
selection.unmirror();
|
||
|
selection.props.unset( 'orderby' );
|
||
|
});
|
||
|
|
||
|
return selection;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a media 'workflow' (MediaFrame). This is the main entry point for the media picker
|
||
|
*/
|
||
|
function getWorkflow( options ) {
|
||
|
var workflow = new wp.media.view.MediaFrame.GalleryWidget( options );
|
||
|
|
||
|
workflow.on( 'update', function( selection ) {
|
||
|
var state = workflow.state();
|
||
|
|
||
|
selection = selection || state.get( 'selection' );
|
||
|
|
||
|
if ( ! selection ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Map the Models down into a simple array of ids that can be easily imploded to a csv string
|
||
|
var ids = selection.map( function( model ){
|
||
|
return model.get( 'id' );
|
||
|
} );
|
||
|
|
||
|
var id_string = ids.join( ',' );
|
||
|
|
||
|
$ids.val( id_string ).trigger( 'change' );
|
||
|
|
||
|
setupThumbs( selection, $thumbs );
|
||
|
}, this );
|
||
|
|
||
|
workflow.setState( workflow.options.state );
|
||
|
|
||
|
return workflow;
|
||
|
}
|
||
|
})(jQuery);
|