Update the "Uploaded to this post" filter view when uploading new files.

* Add an Attachments collection filter for uploadedTo (post_parent).
* Correct an erroneous map from the non-existent parent prop to post_parent.
* Define default menuOrder and uploadedTo props for uploading attachments.
* Unify filterable props into a single method (improving validation performance for calls to set with multiple properties).

Props koopersmith
fixes #22654


git-svn-id: http://core.svn.wordpress.org/trunk@22951 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Ryan Boren 2012-11-30 15:11:44 +00:00
parent ea3e47bc08
commit b73c43e0e2
4 changed files with 61 additions and 34 deletions

View File

@ -205,7 +205,7 @@
args.post__not_in = attrs.exclude.split(',');
if ( ! args.post__in )
args.parent = attrs.id;
args.uploadedTo = attrs.id;
// Collect the attributes that were not included in `args`.
others = _.omit( attrs, 'id', 'ids', 'include', 'exclude', 'orderby', 'order' );
@ -228,9 +228,9 @@
// the collection will already reflect those properties.
attrs.ids = attachments.pluck('id');
// Copy the `parent` post ID.
if ( props.parent )
attrs.id = props.parent;
// Copy the `uploadedTo` post ID.
if ( props.uploadedTo )
attrs.id = props.uploadedTo;
// If the `ids` attribute is set and `orderby` attribute
// is the default value, clear it for cleaner output.

View File

@ -316,11 +316,11 @@ window.wp = window.wp || {};
this.filters = options.filters || {};
// Bind default `change` events to the `props` model.
this.props.on( 'change', this._changeFilteredProps, this );
this.props.on( 'change:order', this._changeOrder, this );
this.props.on( 'change:orderby', this._changeOrderby, this );
this.props.on( 'change:query', this._changeQuery, this );
this.props.on( 'change:search', this._changeSearch, this );
this.props.on( 'change:type', this._changeType, this );
// Set the `props` model and fill the default property values.
this.props.set( _.defaults( options.props || {} ) );
@ -359,16 +359,32 @@ window.wp = window.wp || {};
}
},
_changeFilteredProp: function( prop, model, term ) {
_changeFilteredProps: function( model, options ) {
// If this is a query, updating the collection will be handled by
// `this._requery()`.
if ( this.props.get('query') )
return;
if ( term && ! this.filters[ prop ] )
this.filters[ prop ] = Attachments.filters[ prop ];
else if ( ! term && this.filters[ prop ] === Attachments.filters[ prop ] )
delete this.filters[ prop ];
var changed = _.chain( options.changes ).map( function( t, prop ) {
var filter = Attachments.filters[ prop ],
term = model.get( prop );
if ( ! filter )
return;
if ( term && ! this.filters[ prop ] )
this.filters[ prop ] = filter;
else if ( ! term && this.filters[ prop ] === filter )
delete this.filters[ prop ];
else
return;
// Record the change.
return true;
}, this ).any().value();
if ( ! changed )
return;
// If no `Attachments` model is provided to source the searches
// from, then automatically generate a source from the existing
@ -379,14 +395,6 @@ window.wp = window.wp || {};
this.reset( this._source.filter( this.validator, this ) );
},
_changeSearch: function( model, term ) {
return this._changeFilteredProp( 'search', model, term );
},
_changeType: function( model, term ) {
return this._changeFilteredProp( 'type', model, term );
},
validator: function( attachment ) {
return _.all( this.filters, function( filter, key ) {
return !! filter.call( this, attachment );
@ -499,7 +507,7 @@ window.wp = window.wp || {};
this.mirror( Query.get( this.props.toJSON() ) );
}
}, {
comparator: function( a, b ) {
comparator: function( a, b, options ) {
var key = this.props.get('orderby'),
order = this.props.get('order') || 'DESC',
ac = a.cid,
@ -513,6 +521,10 @@ window.wp = window.wp || {};
b = b || new Date();
}
// If `options.ties` is set, don't enforce the `cid` tiebreaker.
if ( options && options.ties )
ac = bc = null;
return ( 'DESC' === order ) ? compare( a, b, ac, bc ) : compare( b, a, bc, ac );
},
@ -531,10 +543,15 @@ window.wp = window.wp || {};
type: function( attachment ) {
var type = this.props.get('type');
if ( ! type )
return ! type || -1 !== type.indexOf( attachment.get('type') );
},
uploadedTo: function( attachment ) {
var uploadedTo = this.props.get('uploadedTo');
if ( _.isUndefined( uploadedTo ) )
return true;
return -1 !== type.indexOf( attachment.get('type') );
return uploadedTo === attachment.get('uploadedTo');
}
}
});
@ -571,6 +588,9 @@ window.wp = window.wp || {};
this.created = new Date();
this.filters.order = function( attachment ) {
var orderby = this.props.get('orderby'),
order = this.props.get('order');
if ( ! this.comparator )
return true;
@ -578,13 +598,18 @@ window.wp = window.wp || {};
// item in the set. If we add any items after the last
// item, then we can't guarantee the set is complete.
if ( this.length ) {
return 1 !== this.comparator( attachment, this.last() );
return 1 !== this.comparator( attachment, this.last(), { ties: true });
// Handle the case where there are no items yet and
// we're sorting for recent items. In that case, we want
// changes that occurred after we created the query.
} else if ( 'DESC' === this.args.order && ( 'date' === this.args.orderby || 'modified' === this.args.orderby ) ) {
return attachment.get( this.args.orderby ) >= this.created;
} else if ( 'DESC' === order && ( 'date' === orderby || 'modified' === orderby ) ) {
return attachment.get( orderby ) >= this.created;
// If we're sorting by menu order and we have no items,
// accept any items that have the default menu order (0).
} else if ( 'ASC' === order && 'menuOrder' === orderby ) {
return attachment.get( orderby ) === 0;
}
// Otherwise, we don't want any items yet.
@ -597,7 +622,7 @@ window.wp = window.wp || {};
// Only observe when a limited number of query args are set. There
// are no filters for other properties, so observing will result in
// false positives in those queries.
allowed = [ 's', 'order', 'orderby', 'posts_per_page', 'post_mime_type' ];
allowed = [ 's', 'order', 'orderby', 'posts_per_page', 'post_mime_type', 'post_parent' ];
if ( wp.Uploader && _( this.args ).chain().keys().difference( allowed ).isEmpty().value() )
this.observe( wp.Uploader.queue );
},
@ -670,9 +695,9 @@ window.wp = window.wp || {};
propmap: {
'search': 's',
'type': 'post_mime_type',
'parent': 'post_parent',
'perPage': 'posts_per_page',
'menuOrder': 'menu_order'
'menuOrder': 'menu_order',
'uploadedTo': 'post_parent'
},
// Caches query objects so queries can be easily reused.

View File

@ -2920,7 +2920,7 @@
all: {
text: l10n.allMediaItems,
props: {
parent: null,
uploadedTo: null,
orderby: 'date',
order: 'DESC'
},
@ -2930,7 +2930,7 @@
uploaded: {
text: l10n.uploadedToThisPost,
props: {
parent: media.view.settings.postId,
uploadedTo: media.view.settings.postId,
orderby: 'menuOrder',
order: 'ASC'
},
@ -2948,7 +2948,7 @@
text: text,
props: {
type: key,
parent: null,
uploadedTo: null,
orderby: 'date',
order: 'DESC'
}
@ -2959,7 +2959,7 @@
text: l10n.allMediaItems,
props: {
type: null,
parent: null,
uploadedTo: null,
orderby: 'date',
order: 'DESC'
},
@ -2970,7 +2970,7 @@
text: l10n.uploadedToThisPost,
props: {
type: null,
parent: media.view.settings.postId,
uploadedTo: media.view.settings.postId,
orderby: 'menuOrder',
order: 'ASC'
},

View File

@ -155,7 +155,9 @@ window.wp = window.wp || {};
file: file,
uploading: true,
date: new Date(),
filename: file.name
filename: file.name,
menuOrder: 0,
uploadedTo: media.model.settings.postId
}, _.pick( file, 'loaded', 'size', 'percent' ) );
// Handle early mime type scanning for images.