summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/widgets/gallery/js/admin.js')
-rw-r--r--plugins/jetpack/modules/widgets/gallery/js/admin.js236
1 files changed, 236 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/widgets/gallery/js/admin.js b/plugins/jetpack/modules/widgets/gallery/js/admin.js
new file mode 100644
index 00000000..71025a9b
--- /dev/null
+++ b/plugins/jetpack/modules/widgets/gallery/js/admin.js
@@ -0,0 +1,236 @@
+/* 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 );