[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/js/widgets/ -> media-image-widget.js (source)

   1  /**
   2   * @output wp-admin/js/widgets/media-image-widget.js
   3   */
   4  
   5  /* eslint consistent-this: [ "error", "control" ] */
   6  (function( component, $ ) {
   7      'use strict';
   8  
   9      var ImageWidgetModel, ImageWidgetControl;
  10  
  11      /**
  12       * Image widget model.
  13       *
  14       * See WP_Widget_Media_Image::enqueue_admin_scripts() for amending prototype from PHP exports.
  15       *
  16       * @class    wp.mediaWidgets.modelConstructors.media_image
  17       * @augments wp.mediaWidgets.MediaWidgetModel
  18       */
  19      ImageWidgetModel = component.MediaWidgetModel.extend({});
  20  
  21      /**
  22       * Image widget control.
  23       *
  24       * See WP_Widget_Media_Image::enqueue_admin_scripts() for amending prototype from PHP exports.
  25       *
  26       * @class    wp.mediaWidgets.controlConstructors.media_audio
  27       * @augments wp.mediaWidgets.MediaWidgetControl
  28       */
  29      ImageWidgetControl = component.MediaWidgetControl.extend(/** @lends wp.mediaWidgets.controlConstructors.media_image.prototype */{
  30  
  31          /**
  32           * View events.
  33           *
  34           * @type {object}
  35           */
  36          events: _.extend( {}, component.MediaWidgetControl.prototype.events, {
  37              'click .media-widget-preview.populated': 'editMedia'
  38          } ),
  39  
  40          /**
  41           * Render preview.
  42           *
  43           * @return {void}
  44           */
  45          renderPreview: function renderPreview() {
  46              var control = this, previewContainer, previewTemplate, fieldsContainer, fieldsTemplate, linkInput;
  47              if ( ! control.model.get( 'attachment_id' ) && ! control.model.get( 'url' ) ) {
  48                  return;
  49              }
  50  
  51              previewContainer = control.$el.find( '.media-widget-preview' );
  52              previewTemplate = wp.template( 'wp-media-widget-image-preview' );
  53              previewContainer.html( previewTemplate( control.previewTemplateProps.toJSON() ) );
  54              previewContainer.addClass( 'populated' );
  55  
  56              linkInput = control.$el.find( '.link' );
  57              if ( ! linkInput.is( document.activeElement ) ) {
  58                  fieldsContainer = control.$el.find( '.media-widget-fields' );
  59                  fieldsTemplate = wp.template( 'wp-media-widget-image-fields' );
  60                  fieldsContainer.html( fieldsTemplate( control.previewTemplateProps.toJSON() ) );
  61              }
  62          },
  63  
  64          /**
  65           * Open the media image-edit frame to modify the selected item.
  66           *
  67           * @return {void}
  68           */
  69          editMedia: function editMedia() {
  70              var control = this, mediaFrame, updateCallback, defaultSync, metadata;
  71  
  72              metadata = control.mapModelToMediaFrameProps( control.model.toJSON() );
  73  
  74              // Needed or else none will not be selected if linkUrl is not also empty.
  75              if ( 'none' === metadata.link ) {
  76                  metadata.linkUrl = '';
  77              }
  78  
  79              // Set up the media frame.
  80              mediaFrame = wp.media({
  81                  frame: 'image',
  82                  state: 'image-details',
  83                  metadata: metadata
  84              });
  85              mediaFrame.$el.addClass( 'media-widget' );
  86  
  87              updateCallback = function() {
  88                  var mediaProps, linkType;
  89  
  90                  // Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
  91                  mediaProps = mediaFrame.state().attributes.image.toJSON();
  92                  linkType = mediaProps.link;
  93                  mediaProps.link = mediaProps.linkUrl;
  94                  control.selectedAttachment.set( mediaProps );
  95                  control.displaySettings.set( 'link', linkType );
  96  
  97                  control.model.set( _.extend(
  98                      control.mapMediaToModelProps( mediaProps ),
  99                      { error: false }
 100                  ) );
 101              };
 102  
 103              mediaFrame.state( 'image-details' ).on( 'update', updateCallback );
 104              mediaFrame.state( 'replace-image' ).on( 'replace', updateCallback );
 105  
 106              // Disable syncing of attachment changes back to server. See <https://core.trac.wordpress.org/ticket/40403>.
 107              defaultSync = wp.media.model.Attachment.prototype.sync;
 108              wp.media.model.Attachment.prototype.sync = function rejectedSync() {
 109                  return $.Deferred().rejectWith( this ).promise();
 110              };
 111              mediaFrame.on( 'close', function onClose() {
 112                  mediaFrame.detach();
 113                  wp.media.model.Attachment.prototype.sync = defaultSync;
 114              });
 115  
 116              mediaFrame.open();
 117          },
 118  
 119          /**
 120           * Get props which are merged on top of the model when an embed is chosen (as opposed to an attachment).
 121           *
 122           * @return {Object} Reset/override props.
 123           */
 124          getEmbedResetProps: function getEmbedResetProps() {
 125              return _.extend(
 126                  component.MediaWidgetControl.prototype.getEmbedResetProps.call( this ),
 127                  {
 128                      size: 'full',
 129                      width: 0,
 130                      height: 0
 131                  }
 132              );
 133          },
 134  
 135          /**
 136           * Get the instance props from the media selection frame.
 137           *
 138           * Prevent the image_title attribute from being initially set when adding an image from the media library.
 139           *
 140           * @param {wp.media.view.MediaFrame.Select} mediaFrame - Select frame.
 141           * @return {Object} Props.
 142           */
 143          getModelPropsFromMediaFrame: function getModelPropsFromMediaFrame( mediaFrame ) {
 144              var control = this;
 145              return _.omit(
 146                  component.MediaWidgetControl.prototype.getModelPropsFromMediaFrame.call( control, mediaFrame ),
 147                  'image_title'
 148              );
 149          },
 150  
 151          /**
 152           * Map model props to preview template props.
 153           *
 154           * @return {Object} Preview template props.
 155           */
 156          mapModelToPreviewTemplateProps: function mapModelToPreviewTemplateProps() {
 157              var control = this, previewTemplateProps, url;
 158              url = control.model.get( 'url' );
 159              previewTemplateProps = component.MediaWidgetControl.prototype.mapModelToPreviewTemplateProps.call( control );
 160              previewTemplateProps.currentFilename = url ? url.replace( /\?.*$/, '' ).replace( /^.+\//, '' ) : '';
 161              previewTemplateProps.link_url = control.model.get( 'link_url' );
 162              return previewTemplateProps;
 163          }
 164      });
 165  
 166      // Exports.
 167      component.controlConstructors.media_image = ImageWidgetControl;
 168      component.modelConstructors.media_image = ImageWidgetModel;
 169  
 170  })( wp.mediaWidgets, jQuery );


Generated: Thu Nov 21 01:00:03 2024 Cross-referenced by PHPXref 0.7.1