Make WordPress Core

Ticket #50105: 50105.13.diff

File 50105.13.diff, 5.1 KB (added by joedolson, 4 years ago)

Handles returned data that isn't an XHR object & creates load more view when switching tabs in modal

  • src/js/_enqueues/wp/util.js

     
    115115                                        }
    116116
    117117                                        if ( _.isObject( response ) && ! _.isUndefined( response.success ) ) {
    118                                                 deferred[ response.success ? 'resolveWith' : 'rejectWith' ]( this, [response.data] );
     118                                                deferred[ response.success ? 'resolveWith' : 'rejectWith' ]( deferred.jqXHR, [response.data] );
    119119                                        } else {
    120120                                                deferred.rejectWith( this, [response] );
    121121                                        }
  • src/js/media/models/attachments.js

     
    375375         * passing through the JSON response. We override this to add attributes to
    376376         * the collection items.
    377377         *
    378          * @since 5.8.0 The response returns the attachments under `response.attachments` and
    379          *              `response.totalAttachments` holds the total number of attachments found.
    380          *
    381378         * @param {Object|Array} response The raw response Object/Array.
    382379         * @param {Object} xhr
    383380         * @return {Array} The array of model attributes to be added to the collection
    384381         */
    385382        parse: function( response, xhr ) {
    386                 if ( ! _.isArray( response.attachments ) ) {
    387                         response = [ response.attachments ];
     383                if ( ! _.isArray( response ) ) {
     384                          response = [response];
    388385                }
    389 
    390                 this.totalAttachments = parseInt( response.totalAttachments, 10 );
    391 
    392                 return _.map( response.attachments, function( attrs ) {
     386                return _.map( response, function( attrs ) {
    393387                        var id, attachment, newAttributes;
    394388
    395389                        if ( attrs instanceof Backbone.Model ) {
     
    409403                        return attachment;
    410404                });
    411405        },
     406
     407        // Customize fetch so we can extract the total post count from the response headers.
     408        fetch: function(options) {
     409                var collection = this;
     410                var fetched = Backbone.Collection.prototype.fetch.call(this, options)
     411                        .done( function() {
     412                                if ( this.hasOwnProperty( 'getResponseHeader' ) ) {
     413                                        collection.totalAttachments = parseInt( this.getResponseHeader( 'X-WP-Total' ), 10 );
     414                                } else {
     415                                        collection.totalAttachments = 0;
     416                                }
     417                        } );
     418                return fetched;
     419        },
     420
    412421        /**
    413422         * If the collection is a query, create and mirror an Attachments Query collection.
    414          * 
     423         *
    415424         * @access private
    416425         * @param {Boolean} refresh Deprecated, refresh parameter no longer used.
    417426         */
  • src/js/media/models/query.js

     
    113113                options.remove = false;
    114114
    115115                return this._more = this.fetch( options ).done( function( response ) {
    116                         var attachments = response.attachments;
    117 
    118                         if ( _.isEmpty( attachments ) || -1 === this.args.posts_per_page || attachments.length < this.args.posts_per_page ) {
     116                        if ( _.isEmpty( response ) || -1 === query.args.posts_per_page || response.length < query.args.posts_per_page ) {
    119117                                query._hasMore = false;
    120118                        }
    121119                });
  • src/js/media/views/attachments/browser.js

     
    8888                }
    8989
    9090                this.updateContent();
     91                this.updateLoadMoreView();
    9192
    9293                if ( ! this.options.sidebar || 'errors' === this.options.sidebar ) {
    9394                        this.$el.addClass( 'hide-sidebar' );
     
    635636                });
    636637
    637638                view.loadMoreSpinner.show();
    638 
    639                 this.collection.more().done( function() {
    640                         // Within done(), `this` is the returned collection.
     639                this.collection.once( 'attachments:received', function() {
    641640                        view.loadMoreSpinner.hide();
    642641                } );
     642                this.collection.more();
    643643        },
    644644
    645645        /**
  • src/wp-admin/includes/ajax-actions.php

     
    29902990         * @param array $query An array of query variables.
    29912991         */
    29922992        $query = apply_filters( 'ajax_query_attachments_args', $query );
    2993         $query = new WP_Query( $query );
     2993        $attachments_query = new WP_Query( $query );
    29942994
    2995         $posts = array_map( 'wp_prepare_attachment_for_js', $query->posts );
     2995        $posts = array_map( 'wp_prepare_attachment_for_js', $attachments_query->posts );
    29962996        $posts = array_filter( $posts );
     2997        $total_posts = $attachments_query->found_posts;
    29972998
    2998         $result = array(
    2999                 'attachments'      => $posts,
    3000                 'totalAttachments' => $query->found_posts,
    3001         );
     2999        if ( $total_posts < 1 ) {
     3000                // Out-of-bounds, run the query again without LIMIT for total count.
     3001                unset( $query['paged'] );
    30023002
    3003         wp_send_json_success( $result );
     3003                $count_query = new WP_Query();
     3004                $count_query->query( $query_args );
     3005                $total_posts = $count_query->found_posts;
     3006        }
     3007
     3008        $max_pages = ceil( $total_posts / (int) $attachments_query->query['posts_per_page'] );
     3009
     3010        header( 'X-WP-Total: ' . (int) $total_posts );
     3011        header( 'X-WP-TotalPages: ' . (int) $max_pages );
     3012
     3013        wp_send_json_success( $posts );
    30043014}
    30053015
    30063016/**