Media JS: Add support for multiple views to the media workflow controller. see #21390.
git-svn-id: http://core.svn.wordpress.org/trunk@21820 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
fffed3c5d2
commit
b514f391cd
|
@ -16,7 +16,7 @@ if ( typeof wp === 'undefined' )
|
||||||
*/
|
*/
|
||||||
media = wp.media = function( attributes ) {
|
media = wp.media = function( attributes ) {
|
||||||
if ( media.controller.Workflow )
|
if ( media.controller.Workflow )
|
||||||
return new media.controller.Workflow( attributes ).render();
|
return new media.controller.Workflow( attributes ).attach().render();
|
||||||
};
|
};
|
||||||
|
|
||||||
_.extend( media, { model: {}, view: {}, controller: {} });
|
_.extend( media, { model: {}, view: {}, controller: {} });
|
||||||
|
|
|
@ -16,15 +16,88 @@
|
||||||
*/
|
*/
|
||||||
media.controller.Workflow = Backbone.Model.extend({
|
media.controller.Workflow = Backbone.Model.extend({
|
||||||
defaults: {
|
defaults: {
|
||||||
multiple: false
|
multiple: false,
|
||||||
|
view: 'library'
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
this.createSelection();
|
this.createSelection();
|
||||||
|
|
||||||
// Initialize views.
|
// Initialize view storage.
|
||||||
|
this._views = {};
|
||||||
|
this._pending = {};
|
||||||
|
|
||||||
|
// Initialize modal container view.
|
||||||
this.modal = new media.view.Modal({ controller: this });
|
this.modal = new media.view.Modal({ controller: this });
|
||||||
this.workspace = new media.view.Workspace({ controller: this });
|
|
||||||
|
// Add default views.
|
||||||
|
this.add( 'library', {
|
||||||
|
view: media.view.Workspace
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// Accepts an `id` and `options` for a view. Options is an object that
|
||||||
|
// contains two keys: the `view` key is a `Backbone.View` constructor,
|
||||||
|
// and the `options` key are the options to be passed when the view is
|
||||||
|
// initialized.
|
||||||
|
//
|
||||||
|
// Triggers the `add` and `add:VIEW_ID` events.
|
||||||
|
add: function( id, options ) {
|
||||||
|
this.remove( id );
|
||||||
|
this._pending[ id ] = options;
|
||||||
|
this.trigger( 'add add:' + id, options );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Returns a registered view instance. If an `id` is not provided,
|
||||||
|
// it will return the active view.
|
||||||
|
//
|
||||||
|
// Lazily instantiates a registered view.
|
||||||
|
//
|
||||||
|
// Triggers the `init` and `init:VIEW_ID` events.
|
||||||
|
view: function( id ) {
|
||||||
|
var pending;
|
||||||
|
|
||||||
|
id = id || this.get('view');
|
||||||
|
pending = this._pending[ id ];
|
||||||
|
|
||||||
|
if ( ! this._views[ id ] && pending ) {
|
||||||
|
this._views[ id ] = new pending.view( _.extend({ controller: this }, pending.options || {} ) );
|
||||||
|
delete this._pending[ id ];
|
||||||
|
this.trigger( 'init init:' + id, this._views[ id ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._views[ id ];
|
||||||
|
},
|
||||||
|
|
||||||
|
// Unregisters a view from the workflow.
|
||||||
|
//
|
||||||
|
// Triggers the `remove` and `remove:VIEW_ID` events.
|
||||||
|
remove: function( id ) {
|
||||||
|
delete this._views[ id ];
|
||||||
|
delete this._pending[ id ];
|
||||||
|
this.trigger( 'remove remove:' + id );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Renders a view and places it within the modal window.
|
||||||
|
// Automatically adds a view if `options` are provided.
|
||||||
|
render: function( id, options ) {
|
||||||
|
var view;
|
||||||
|
id = id || this.get('view');
|
||||||
|
|
||||||
|
if ( options )
|
||||||
|
this.add( id, options );
|
||||||
|
|
||||||
|
view = this.view( id );
|
||||||
|
|
||||||
|
if ( ! view )
|
||||||
|
return;
|
||||||
|
|
||||||
|
view.render();
|
||||||
|
this.modal.content( view );
|
||||||
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
createSelection: function() {
|
createSelection: function() {
|
||||||
|
@ -65,15 +138,17 @@
|
||||||
return !! ( this.getByCid( attachment.cid ) || this.get( attachment.id ) );
|
return !! ( this.getByCid( attachment.cid ) || this.get( attachment.id ) );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
this.workspace.render();
|
|
||||||
this.modal.content( this.workspace ).attach();
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Map modal methods to the workflow.
|
||||||
|
_.each(['attach','detach','open','close'], function( method ) {
|
||||||
|
media.controller.Workflow.prototype[ method ] = function() {
|
||||||
|
this.modal[ method ].apply( this.modal, arguments );
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ========================================================================
|
* ========================================================================
|
||||||
* VIEWS
|
* VIEWS
|
||||||
|
|
Loading…
Reference in New Issue