/* 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( '', { 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 );