WordPress.org

Make WordPress Core

Ticket #24056: 24056-combined.patch

File 24056-combined.patch, 16.8 KB (added by a.hoereth, 2 years ago)
  • wp-admin/css/wp-admin.css

     
    36413641        display: block; 
    36423642} 
    36433643 
     3644#diff-paginate { 
     3645        text-align: center; 
     3646        margin: 10px 0 0 0; 
     3647} 
     3648 
     3649#diff-paginate input { 
     3650        margin: 0 2px; 
     3651} 
     3652 
    36443653#diff-title-to strong { 
    36453654        display: none; 
    36463655} 
     
    36933702 
    36943703.comparing-two-revisions #diff-previous-revision, 
    36953704.comparing-two-revisions #diff-next-revision, 
     3705.comparing-two-revisions .button.paginate, 
    36963706#diff-header-from { 
    36973707        display: none; 
    36983708} 
  • wp-admin/includes/ajax-actions.php

     
    21122112        $right_handle_at = ! empty( $_GET['right_handle_at'] ) ? (int) $_GET['right_handle_at'] : 0; 
    21132113        $left_handle_at = ! empty( $_GET['left_handle_at'] ) ? (int) $_GET['left_handle_at'] : 0; 
    21142114        $single_revision_id = ! empty( $_GET['single_revision_id'] ) ? absint( $_GET['single_revision_id'] ) : 0; 
     2115        $page_size          = ! empty( $_GET['page_size'] ) ? absint( $_GET['page_size'] ) : -1; 
     2116        $pages              = ! empty( $_GET['pages']     ) ? absint( $_GET['pages'] ) : 1; 
     2117        $page               = ! empty( $_GET['page']      ) ? absint( $_GET['page'] ) : 1; 
    21152118        $compare_two_mode = (bool) $post_id; 
    21162119 
    21172120        $all_the_revisions = array(); 
    2118         if ( ! $post_id ) 
    2119                 $post_id = $compare_to; 
    21202121 
    21212122        if ( ! current_user_can( 'read_post', $post_id ) ) 
    21222123                continue; 
    21232124 
    2124         if ( ! $revisions = wp_get_post_revisions( $post_id ) ) 
     2125        if ( ! $revisions = wp_get_post_revisions( $post_id, array( 'posts_per_page' => $page_size, 'paged' => $page ) ) ) 
    21252126                return; 
    21262127 
    21272128        $left_revision = get_post( $compare_to ); 
     
    21862187        // reverse the list to start with oldest revision 
    21872188        $revisions = array_reverse( $revisions ); 
    21882189 
    2189         $previous_revision_id = 0; 
     2190        if ( $page < $pages ) { // not on last page 
     2191                $previous =     array_pop( wp_get_post_revisions( $post_id, array( 'posts_per_page' => $page_size, 'paged' => $page, 'order' => 'ASC', 'numberposts' => 1 ) ) ); 
     2192                $previous_revision_id = $previous->ID; 
     2193        } else { 
     2194                $previous_revision_id = 0; 
     2195        } 
    21902196 
    21912197        /* translators: revision date format, see http://php.net/date */ 
    21922198        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
     
    22092215                                 ( 0 != $right_handle_at && $count > ( $right_handle_at - 2 ) ) ) ) { 
    22102216                                $all_the_revisions[] = array ( 
    22112217                                        'ID' => $revision->ID, 
     2218                                        'timestamp' => strtotime($revision->post_modified), 
    22122219                                ); 
    22132220                                continue; 
    22142221                        } 
     
    22172224                                 ( 0 != $left_handle_at && $count < $right_handle_at ) ) ) { 
    22182225                                $all_the_revisions[] = array ( 
    22192226                                        'ID' => $revision->ID, 
     2227                                        'timestamp' => strtotime($revision->post_modified), 
    22202228                                ); 
    22212229                                continue; 
    22222230                        } 
     
    23052313                                'restoreLink'  => urldecode( $restore_link ), 
    23062314                                'previousID'   => $previous_revision_id, 
    23072315                                'isCurrent'    => $is_current_revision, 
     2316                                'timestamp'    => strtotime($revision->post_modified), 
    23082317                        ); 
    23092318                } 
    23102319                $previous_revision_id = $revision->ID; 
  • wp-admin/js/revisions.js

     
    4141 
    4242                constructor: function() { 
    4343                        var self    = this; 
     44                        this.page   = parseInt( revisions.model.settings.page ); 
    4445                        this.slider = new revisions.view.Slider(); 
    4546 
    4647                        if ( null === this.revisions ) { 
     
    6263                                delay = 0, 
    6364                                totalChanges; 
    6465 
    65                         // match slider to passed revision_id 
    66                         _.each( revisionsToLoad, function( revision ) { 
    67                                 if ( revision.get( 'ID' ) == revisions.model.settings.revision_id ) 
    68                                         self.rightDiff = self.revisions.indexOf( revision ) + 1; 
     66                        // match slider to passed revision_id when on initial page 
     67                        if ( self.revisionsInteractions == null ) { 
     68                                _.each( revisionsToLoad, function( revision ) { 
     69                                        if ( revision.get( 'ID' ) == revisions.model.settings.revision_id ) 
     70                                                self.rightDiff = self.revisions.indexOf( revision ) + 1; 
     71                                }); 
     72                        } 
     73 
     74                        // order revisions in their chronological closeness to the handle(s) 
     75                        var left  = self.singleRevision ? 0 : self.revisions.at( self.leftDiff - 1 ).get( 'timestamp' ), 
     76                            right = self.revisions.at( self.rightDiff - 1 ).get( 'timestamp' ); 
     77                        revisionsToLoad = _.sortBy( revisionsToLoad, function( model ) { 
     78                                var t = model.get( 'timestamp' ), 
     79                                    y = Math.abs( t - right ), 
     80                                    x = Math.abs( t - left  ); 
     81                                return _.min( [x, y] ); 
    6982                        }); 
    7083 
    7184                        _.each( revisionsToLoad, function( revision ) { 
     
    142155                }, 
    143156 
    144157                // load the models for the single handle mode 
    145                 reloadModelSingle: function() { 
     158                reloadModelSingle: function( pageChange ) { 
    146159                        var self = this; 
    147160 
    148161                        self.startRightModelLoading(); 
     162                        self.revisionsInteractions.buttonsDisable(); 
     163                        self.slider.disable(); 
    149164 
    150165                        self.revisions.reload({ 
    151166                                options: { 
    152                                 'showAutosaves': self.autosaves, 
    153                                 'showSplitView': self.showSplitView 
     167                                        'showAutosaves': self.autosaves, 
     168                                        'showSplitView': self.showSplitView 
    154169                                }, 
    155170 
    156171                                success: function() { 
    157                                         var revisionCount = self.revisions.length; 
     172                                        var revisionCount = self.revisions.length, 
     173                                            pos = self.rightDiff; 
     174 
     175                                        if ( pageChange !== 'undefined' ) 
     176                                                pos = ( pageChange == 'left' ) ? revisionCount : 1; 
     177                                        self.rightDiff = pos; 
     178 
     179                                        self.slider.refresh({ 
     180                                                'max': revisionCount - 1, // slider starts at 0 in single handle mode 
     181                                                'value': pos - 1 // slider starts at 0 in single handle mode 
     182                                        }, true); 
    158183                                        self.revisionView.model = self.revisions; 
    159184                                        self.revisionView.render(); 
    160185                                        self.loadDiffs( self.revisions ); 
    161186                                        self.tickmarkView.model = self.revisions; 
    162187                                        self.tickmarkView.render(); 
    163                                         self.slider.refresh({ 
    164                                                 'max': revisionCount - 1, // slider starts at 0 in single handle mode 
    165                                                 'value': self.rightDiff - 1 // slider starts at 0 in single handle mode 
    166                                         }, true); 
     188 
     189                                        self.revisionsInteractions.buttonsEnable(); 
     190                                        self.slider.enable(); 
    167191                                }, 
    168192 
    169193                                error: function() { 
    170194                                        self.stopRightModelLoading(); 
     195                                        self.revisionsInteractions.buttonsEnable(); 
     196                                        self.slider.enable(); 
    171197                                } 
    172198                        }); 
    173199                }, 
     
    234260                 * reloadLeftRight reload models for both the left and right handles 
    235261                 */ 
    236262                reloadLeftRight: function() { 
    237                         this.startRightModelLoading(); 
    238                         this.startLeftModelLoading(); 
    239263                        this.reloadLeft(); 
    240264                        this.reloadRight(); 
    241265                }, 
     
    245269                                next = ! isRtl ? $( '#next' ) : $( '#previous' ), 
    246270                                prev = ! isRtl ? $( '#previous' ) : $( '#next' ); 
    247271 
    248                         // Disable "Next" button if you're on the last node 
    249                         if ( maxVal === val ) 
     272                        // Disable "Next" button if you're on the last node and first page 
     273                        if ( maxVal === val && Diff.page == 1 ) 
    250274                                next.prop( 'disabled', true ); 
    251275                        else 
    252276                                next.prop( 'disabled', false ); 
    253277 
    254                         // Disable "Previous" button if you're on the 0 node 
    255                         if ( 0 === val ) 
     278                        // Disable "Previous" button if you're on the 0 node and last page 
     279                        if ( 0 === val && Diff.page == revisions.model.settings.pages ) 
    256280                                prev.prop( 'disabled', true ); 
    257281                        else 
    258282                                prev.prop( 'disabled', false ); 
     
    430454                        return $( '#diff-slider' ).slider( 'option', key ); 
    431455                }, 
    432456 
     457                disable: function() { 
     458                        $( '#diff-slider' ).slider( "disable" ); 
     459                }, 
     460 
     461                enable: function() { 
     462                        $( '#diff-slider' ).slider( "enable" ); 
     463                }, 
     464 
    433465                render: function() { 
    434466                        var self = this; 
    435467                        // this.$el doesn't work, why? 
     
    453485                el: $('#diff-slider-ticks'), 
    454486                template: wp.template('revision-ticks'), 
    455487                model: Revision, 
     488                initWidth: null, 
    456489 
     490                initialize: function() { 
     491        $(window).on('resize', this, this.resize); 
     492                }, 
     493 
    457494                resetTicks: function() { 
     495                        if ( this.initWidth == null ) 
     496                                this.initWidth = Diff.slider.width(); 
     497 
    458498                        var sliderMax, sliderWidth, adjustMax, tickWidth, tickCount = 0, aTickWidth, tickMargin, self = this, firstTick, lastTick; 
    459499                        sliderMax   = Diff.slider.option( 'max' ); 
    460                         sliderWidth = Diff.slider.width(); 
     500                        sliderWidth = this.initWidth; 
    461501                        adjustMax   = Diff.singleRevision ? 0 : 1; 
    462502                        tickWidth   = Math.floor( sliderWidth / ( sliderMax - adjustMax ) ); 
    463503                        tickWidth   = ( tickWidth > 50 ) ? 50 : tickWidth; // set minimum and maximum widths for tick marks 
     
    490530                        /** 
    491531                         * go through all ticks, add hover and click interactions 
    492532                         */ 
     533 
    493534                        $( '.revision-tick' ).each( function() { 
    494535                                Diff.slider.addTooltip ( $( this ), Diff.revisions.at( tickCount++ ).get( 'titleTooltip' ) ); 
    495536                                $( this ).hover( 
     
    539580                        } ); 
    540581                }, 
    541582 
     583                /** 
     584                 * Readjusts the slider width depending on the containers width. 
     585                 */ 
     586                resize: function( e ) { 
     587                        e.data.initWidth = $('#revision-diff-container').width() - 200; 
     588                        e.data.render(); 
     589                }, 
     590 
    542591                // render the tick mark view 
    543592                render: function() { 
    544593                        var self = this, addHtml; 
     
    553602                        } 
    554603                        self.resetTicks(); 
    555604                        return self; 
    556                 } 
    557         } ); 
     605                }, 
    558606 
     607                /** 
     608                 * Overwrite backbone's default behavior to also remove the window resize event 
     609                 */ 
     610                remove: function() { 
     611                        $(window).off('resize', this.resize); 
     612      this.$el.remove(); 
     613      this.stopListening(); 
     614      return this; 
     615    } 
     616        }); 
     617 
    559618        /** 
    560619         * wp.revisions.view.Interact 
    561620         * 
    562          * Next/Prev buttons and the slider 
     621         * Next/Prev/pagination buttons and the slider 
    563622         */ 
    564623        revisions.view.Interact = Backbone.View.extend({ 
    565624                el: $( '#revision-interact' ), 
     
    568627                // next and previous buttons, only available in compare one mode 
    569628                events: { 
    570629                        'click #next':     ! isRtl ? 'nextRevision' : 'previousRevision', 
    571                         'click #previous': ! isRtl ? 'previousRevision' : 'nextRevision' 
     630                        'click #previous': ! isRtl ? 'previousRevision' : 'nextRevision', 
     631                        'click .paginate': 'changePage' 
    572632                }, 
    573633 
    574634                render: function() { 
     
    608668                        return this; 
    609669                }, 
    610670 
     671                buttonsEnable: function() { 
     672                        $( "#previous, #next, .paginate:not(.disabled)" ).prop('disabled', false); 
     673                }, 
     674 
     675                buttonsDisable: function() { 
     676                        $( "#previous, #next, .paginate" ).prop('disabled', true); 
     677                }, 
     678 
    611679                // go to the next revision 
    612680                nextRevision: function() { 
    613                         if ( Diff.rightDiff < this.model.length ) // unless at right boundry 
    614                                 Diff.rightDiff = Diff.rightDiff + 1 ; 
     681                        if ( Diff.rightDiff < this.model.length ) { // unless at right boundary 
     682                                Diff.rightDiff = Diff.rightDiff + 1; 
    615683 
    616                         Diff.revisionView.render(); 
     684                                Diff.revisionView.render(); 
    617685 
    618                         Diff.slider.refresh({ 
    619                                 value: Diff.rightDiff - 1 
    620                         }, true ); 
     686                                Diff.slider.refresh({ 
     687                                        value: Diff.rightDiff - 1 
     688                                }, true ); 
     689                        }       else if ( Diff.page > 1 ) { // move to previous page 
     690                                this.changePage( +Diff.page - 1 ); 
     691                        } 
    621692                }, 
    622693 
    623694                // go to the previous revision 
    624695                previousRevision: function() { 
    625                         if ( Diff.rightDiff > 1 ) // unless at left boundry 
    626                                 Diff.rightDiff = Diff.rightDiff - 1 ; 
     696                        if ( Diff.rightDiff > 1 ) { // unless at left boundary 
     697                                Diff.rightDiff = Diff.rightDiff - 1; 
    627698 
    628                         Diff.revisionView.render(); 
     699                                Diff.revisionView.render(); 
    629700 
    630                         Diff.slider.refresh({ 
    631                                 value: Diff.rightDiff - 1 
    632                         }, true ); 
    633                 } 
     701                                Diff.slider.refresh({ 
     702                                        value: Diff.rightDiff - 1 
     703                                }, true ); 
     704                        } else if ( Diff.page < revisions.model.settings.pages ) { // move to next page 
     705                                this.changePage( +Diff.page + 1 ); 
     706                        } 
     707                }, 
     708 
     709                changePage: function(arg) { 
     710                        if ( ! Diff.slider.singleRevision ) // only in single handle mode 
     711                                return; 
     712 
     713                        var self = this; 
     714 
     715                        // get page button depending on how function is called (direct or onclick) 
     716                        var newPage = $.isNumeric(arg) ? arg : $( arg.currentTarget ).data( 'id' ), 
     717                            oldPage = Diff.page; 
     718 
     719                        Diff.page = newPage; 
     720 
     721                        $( ".paginate[data-id=" + newPage + "]" ).addClass(   'disabled' ); 
     722                        $( ".paginate[data-id=" + oldPage + "]" ).removeClass('disabled' ); 
     723 
     724                        var direction =  newPage > oldPage ? 'left' : 'right'; 
     725                        Diff.reloadModelSingle( direction ); 
     726                } 
    634727        }); 
    635728 
    636729        /** 
     
    699792                        if ( $( '#compare-two-revisions' ).is( ':checked' ) ) { // compare 2 mode 
    700793                                Diff.singleRevision = false ; 
    701794 
    702                                 // in RTL mode handles are swapped, so boundary checks are different; 
    703                                 if ( isRtl ){ 
    704                                         Diff.leftDiff = Diff.revisions.length; // put the left handle at the rightmost position, representing current revision 
     795                                // ensure that we are on page one 
     796                                Diff.page = 1; 
    705797 
    706                                         if ( Diff.revisions.length === Diff.rightDiff ) // make sure 'left' handle not in rightmost slot 
    707                                                 Diff.rightDiff = Diff.rightDiff - 1; 
    708                                 } else { 
    709                                         if ( 1 === Diff.rightDiff ) // make sure right handle not in leftmost slot 
    710                                                 Diff.rightDiff = 2; 
    711                                 } 
     798                                // fix tickmarks 
     799                                Diff.tickmarkView.resetTicks(); 
     800                                Diff.revisions.reload({ 
     801                                        success: function() { 
     802                                                // in RTL mode handles are swapped, so boundary checks are different; 
     803                                                if ( isRtl ){ 
     804                                                        Diff.leftDiff = Diff.revisions.length; // put the left handle at the rightmost position, representing current revision 
    712805 
    713                                 Diff.revisionView.draggingLeft = false; 
     806                                                        if ( Diff.revisions.length === Diff.rightDiff ) // make sure 'left' handle not in rightmost slot 
     807                                                                Diff.rightDiff = Diff.rightDiff - 1; 
     808                                                } else { 
     809                                                        if ( 1 === Diff.rightDiff ) // make sure right handle not in leftmost slot 
     810                                                                Diff.rightDiff = 2; 
     811                                                } 
    714812 
    715                                 revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision 
    716                                 Diff.reloadLeftRight(); // load diffs for left and right handles 
    717                                 Diff.revisionView.model = Diff.rightHandleRevisions; 
     813                                                Diff.revisionView.draggingLeft = false; 
    718814 
     815                                                revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision 
     816                                                Diff.reloadLeftRight(); // load diffs for left and right handles 
     817                                                Diff.revisionView.model = Diff.rightHandleRevisions; 
     818                                        } 
     819                                }); 
     820 
     821 
    719822                        } else { // compare one mode 
    720823                                Diff.singleRevision = true; 
    721824                                Diff.revisionView.draggingLeft = false; 
    722                                 Diff.reloadModelSingle(); 
     825                                Diff.page = null; 
     826                                Diff.revisionsInteractions.changePage( 1 ); 
    723827                        } 
    724828                        Diff.revisionsInteractions.render(); 
    725829                        Diff.tickmarkView.render(); 
     
    781885        Revisions = revisions.Revisions = Backbone.Collection.extend({ 
    782886                model: Revision, 
    783887 
     888                // sorts the revisions ASC by 'last modified' timestamp 
     889                comparator: function(item) { 
     890                        return item.get('timestamp'); 
     891                }, 
     892 
    784893                initialize: function( models, options ) { 
    785894                        this.options = _.defaults( options || {}, { 
    786895                                'compareTo': revisions.model.settings.post_id, 
     
    789898                                'showSplitView': true, 
    790899                                'rightHandleAt': 0, 
    791900                                'leftHandleAt': 0, 
     901                                'page_size' : revisions.model.settings.page_size, 
     902                                'pages' : revisions.model.settings.pages, 
    792903                                'nonce': revisions.model.settings.nonce 
    793904                        }); 
    794905                }, 
    795906 
    796907                url: function() { 
     908                        if( _.isUndefined( Diff.page ) ) 
     909                                Diff.page = revisions.model.settings.page; 
     910 
    797911                        return ajaxurl + 
    798912                                '?action=revisions-data' + 
    799913                                '&compare_to=' + this.options.compareTo + // revision are we comparing to 
     
    802916                                '&show_split_view=' + this.options.showSplitView + // show in split view or single column view 
    803917                                '&right_handle_at=' + this.options.rightHandleAt + // mark point for comparison list 
    804918                                '&left_handle_at=' + this.options.leftHandleAt + // mark point for comparison list 
     919                                '&page_size=' + this.options.page_size + 
     920                                '&pages=' + this.options.pages + 
     921                                '&page=' + Diff.page + 
    805922                                '&nonce=' + this.options.nonce; 
    806923                }, 
    807924 
  • wp-admin/revision.php

     
    7878 
    7979wp_enqueue_script( 'revisions' ); 
    8080 
     81$page_size = 50; 
     82$revisions_idx = array_flip( array_keys( wp_get_post_revisions( $post->ID ) ) ); 
    8183 
    8284$settings = array( 
    8385        'post_id'     => $post->ID, 
    8486        'nonce'       => wp_create_nonce( 'revisions-ajax-nonce' ), 
    85         'revision_id' => $revision_id 
     87        'revision_id' => $revision_id, 
     88        'page'        => floor( ( ( $revisions_idx[$revision_id] ) / $page_size) ) + 1, 
     89        'pages'       => floor( count( $revisions_idx ) / $page_size ) + 1, 
     90        'page_size'   => $page_size, 
    8691); 
    8792 
    8893wp_localize_script( 'revisions', 'wpRevisionsSettings', $settings ); 
     
    172177        </div> 
    173178 
    174179        <div id="diff-slider" class="wp-slider"></div> 
     180 
     181        <?php if ( $settings['pages'] > 1 ) : ?> 
     182        <div id="diff-paginate"> 
     183                <?php 
     184                // display pages from high to low 
     185                for( $i = $settings['pages']; $i >= 1; $i-- ) { 
     186                        $value = ( ( $i == $settings['pages'] ) ? count( $revisions_idx ) : $i * $page_size ); 
     187                        $value .= '-' . (($i-1) * $page_size + 1); 
     188                        echo "<input class='button paginate' value='$value' data-id='$i' type='button'".disabled( $i, $settings['page'], false)." />\n"; 
     189                } 
     190                ?> 
     191        </div> 
     192        <?php endif; ?> 
    175193</script> 
    176194 
    177195<script id="tmpl-revision-ticks" type="text/html">