wp/wp-admin/js/widgets/media-audio-widget.js
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 /* eslint consistent-this: [ "error", "control" ] */
       
     2 (function( component ) {
       
     3 	'use strict';
       
     4 
       
     5 	var AudioWidgetModel, AudioWidgetControl, AudioDetailsMediaFrame;
       
     6 
       
     7 	/**
       
     8 	 * Custom audio details frame that removes the replace-audio state.
       
     9 	 *
       
    10 	 * @class AudioDetailsMediaFrame
       
    11 	 * @constructor
       
    12 	 */
       
    13 	AudioDetailsMediaFrame = wp.media.view.MediaFrame.AudioDetails.extend({
       
    14 
       
    15 		/**
       
    16 		 * Create the default states.
       
    17 		 *
       
    18 		 * @returns {void}
       
    19 		 */
       
    20 		createStates: function createStates() {
       
    21 			this.states.add([
       
    22 				new wp.media.controller.AudioDetails({
       
    23 					media: this.media
       
    24 				}),
       
    25 
       
    26 				new wp.media.controller.MediaLibrary({
       
    27 					type: 'audio',
       
    28 					id: 'add-audio-source',
       
    29 					title: wp.media.view.l10n.audioAddSourceTitle,
       
    30 					toolbar: 'add-audio-source',
       
    31 					media: this.media,
       
    32 					menu: false
       
    33 				})
       
    34 			]);
       
    35 		}
       
    36 	});
       
    37 
       
    38 	/**
       
    39 	 * Audio widget model.
       
    40 	 *
       
    41 	 * See WP_Widget_Audio::enqueue_admin_scripts() for amending prototype from PHP exports.
       
    42 	 *
       
    43 	 * @class AudioWidgetModel
       
    44 	 * @constructor
       
    45 	 */
       
    46 	AudioWidgetModel = component.MediaWidgetModel.extend({});
       
    47 
       
    48 	/**
       
    49 	 * Audio widget control.
       
    50 	 *
       
    51 	 * See WP_Widget_Audio::enqueue_admin_scripts() for amending prototype from PHP exports.
       
    52 	 *
       
    53 	 * @class AudioWidgetModel
       
    54 	 * @constructor
       
    55 	 */
       
    56 	AudioWidgetControl = component.MediaWidgetControl.extend({
       
    57 
       
    58 		/**
       
    59 		 * Show display settings.
       
    60 		 *
       
    61 		 * @type {boolean}
       
    62 		 */
       
    63 		showDisplaySettings: false,
       
    64 
       
    65 		/**
       
    66 		 * Map model props to media frame props.
       
    67 		 *
       
    68 		 * @param {Object} modelProps - Model props.
       
    69 		 * @returns {Object} Media frame props.
       
    70 		 */
       
    71 		mapModelToMediaFrameProps: function mapModelToMediaFrameProps( modelProps ) {
       
    72 			var control = this, mediaFrameProps;
       
    73 			mediaFrameProps = component.MediaWidgetControl.prototype.mapModelToMediaFrameProps.call( control, modelProps );
       
    74 			mediaFrameProps.link = 'embed';
       
    75 			return mediaFrameProps;
       
    76 		},
       
    77 
       
    78 		/**
       
    79 		 * Render preview.
       
    80 		 *
       
    81 		 * @returns {void}
       
    82 		 */
       
    83 		renderPreview: function renderPreview() {
       
    84 			var control = this, previewContainer, previewTemplate, attachmentId, attachmentUrl;
       
    85 			attachmentId = control.model.get( 'attachment_id' );
       
    86 			attachmentUrl = control.model.get( 'url' );
       
    87 
       
    88 			if ( ! attachmentId && ! attachmentUrl ) {
       
    89 				return;
       
    90 			}
       
    91 
       
    92 			previewContainer = control.$el.find( '.media-widget-preview' );
       
    93 			previewTemplate = wp.template( 'wp-media-widget-audio-preview' );
       
    94 
       
    95 			previewContainer.html( previewTemplate({
       
    96 				model: {
       
    97 					attachment_id: control.model.get( 'attachment_id' ),
       
    98 					src: attachmentUrl
       
    99 				},
       
   100 				error: control.model.get( 'error' )
       
   101 			}));
       
   102 			wp.mediaelement.initialize();
       
   103 		},
       
   104 
       
   105 		/**
       
   106 		 * Open the media audio-edit frame to modify the selected item.
       
   107 		 *
       
   108 		 * @returns {void}
       
   109 		 */
       
   110 		editMedia: function editMedia() {
       
   111 			var control = this, mediaFrame, metadata, updateCallback;
       
   112 
       
   113 			metadata = control.mapModelToMediaFrameProps( control.model.toJSON() );
       
   114 
       
   115 			// Set up the media frame.
       
   116 			mediaFrame = new AudioDetailsMediaFrame({
       
   117 				frame: 'audio',
       
   118 				state: 'audio-details',
       
   119 				metadata: metadata
       
   120 			});
       
   121 			wp.media.frame = mediaFrame;
       
   122 			mediaFrame.$el.addClass( 'media-widget' );
       
   123 
       
   124 			updateCallback = function( mediaFrameProps ) {
       
   125 
       
   126 				// Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
       
   127 				control.selectedAttachment.set( mediaFrameProps );
       
   128 
       
   129 				control.model.set( _.extend(
       
   130 					control.model.defaults(),
       
   131 					control.mapMediaToModelProps( mediaFrameProps ),
       
   132 					{ error: false }
       
   133 				) );
       
   134 			};
       
   135 
       
   136 			mediaFrame.state( 'audio-details' ).on( 'update', updateCallback );
       
   137 			mediaFrame.state( 'replace-audio' ).on( 'replace', updateCallback );
       
   138 			mediaFrame.on( 'close', function() {
       
   139 				mediaFrame.detach();
       
   140 			});
       
   141 
       
   142 			mediaFrame.open();
       
   143 		}
       
   144 	});
       
   145 
       
   146 	// Exports.
       
   147 	component.controlConstructors.media_audio = AudioWidgetControl;
       
   148 	component.modelConstructors.media_audio = AudioWidgetModel;
       
   149 
       
   150 })( wp.mediaWidgets );