184 lines
4.7 KiB
JavaScript
184 lines
4.7 KiB
JavaScript
/*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' ),
|
|
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 wp.media.model.PostImage( options.metadata );
|
|
this.options.selection = new wp.media.model.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 <img />
|
|
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 <img />
|
|
state.trigger( 'replace', controller.image.toJSON() );
|
|
|
|
// Restore and reset the default state.
|
|
controller.setState( controller.options.state );
|
|
controller.reset();
|
|
}
|
|
}
|
|
}
|
|
}) );
|
|
}
|
|
|
|
});
|
|
|
|
module.exports = ImageDetails;
|