mirror of
https://github.com/WordPress/WordPress.git
synced 2024-11-01 00:10:36 +01:00
185 lines
4.8 KiB
JavaScript
185 lines
4.8 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' ),
|
||
|
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 <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;
|