/*globals wp */ /** * wp.media.view.MediaFrame.ImageDetails * * A media frame for manipulating an image that's already been inserted * into a post. * * @class * @augments wp.media.view.MediaFrame.Select * @augments wp.media.view.MediaFrame * @augments wp.media.view.Frame * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View * @mixes wp.media.controller.StateMachine */ var Select = require( './select.js' ), Toolbar = require( '../toolbar.js' ), PostImage = require( '../../models/post-image.js' ), Selection = require( '../../models/selection.js' ), ImageDetailsController = require( '../../controllers/image-details.js' ), ReplaceImageController = require( '../../controllers/replace-image.js' ), EditImageController = require( '../../controllers/edit-image.js' ), ImageDetailsView = require( '../image-details.js' ), EditImageView = require( '../edit-image.js' ), l10n = wp.media.view.l10n, ImageDetails; ImageDetails = Select.extend({ defaults: { id: 'image', url: '', menu: 'image-details', content: 'image-details', toolbar: 'image-details', type: 'link', title: l10n.imageDetailsTitle, priority: 120 }, initialize: function( options ) { this.image = new PostImage( options.metadata ); this.options.selection = new Selection( this.image.attachment, { multiple: false } ); Select.prototype.initialize.apply( this, arguments ); }, bindHandlers: function() { Select.prototype.bindHandlers.apply( this, arguments ); this.on( 'menu:create:image-details', this.createMenu, this ); this.on( 'content:create:image-details', this.imageDetailsContent, this ); this.on( 'content:render:edit-image', this.editImageContent, this ); this.on( 'toolbar:render:image-details', this.renderImageDetailsToolbar, this ); // override the select toolbar this.on( 'toolbar:render:replace', this.renderReplaceImageToolbar, this ); }, createStates: function() { this.states.add([ new ImageDetailsController({ image: this.image, editable: false }), new ReplaceImageController({ id: 'replace-image', library: wp.media.query( { type: 'image' } ), image: this.image, multiple: false, title: l10n.imageReplaceTitle, toolbar: 'replace', priority: 80, displaySettings: true }), new EditImageController( { image: this.image, selection: this.options.selection } ) ]); }, imageDetailsContent: function( options ) { options.view = new ImageDetailsView({ controller: this, model: this.state().image, attachment: this.state().image.attachment }); }, editImageContent: function() { var state = this.state(), model = state.get('image'), view; if ( ! model ) { return; } view = new EditImageView( { model: model, controller: this } ).render(); this.content.set( view ); // after bringing in the frame, load the actual editor via an ajax call view.loadEditor(); }, renderImageDetailsToolbar: function() { this.toolbar.set( new Toolbar({ controller: this, items: { select: { style: 'primary', text: l10n.update, priority: 80, click: function() { var controller = this.controller, state = controller.state(); controller.close(); // not sure if we want to use wp.media.string.image which will create a shortcode or // perhaps wp.html.string to at least to build the state.trigger( 'update', controller.image.toJSON() ); // Restore and reset the default state. controller.setState( controller.options.state ); controller.reset(); } } } }) ); }, renderReplaceImageToolbar: function() { var frame = this, lastState = frame.lastState(), previous = lastState && lastState.id; this.toolbar.set( new Toolbar({ controller: this, items: { back: { text: l10n.back, priority: 20, click: function() { if ( previous ) { frame.setState( previous ); } else { frame.close(); } } }, replace: { style: 'primary', text: l10n.replace, priority: 80, click: function() { var controller = this.controller, state = controller.state(), selection = state.get( 'selection' ), attachment = selection.single(); controller.close(); controller.image.changeAttachment( attachment, state.display( attachment ) ); // not sure if we want to use wp.media.string.image which will create a shortcode or // perhaps wp.html.string to at least to build the state.trigger( 'replace', controller.image.toJSON() ); // Restore and reset the default state. controller.setState( controller.options.state ); controller.reset(); } } } }) ); } }); module.exports = ImageDetails;