WordPress.org

Make WordPress Core

Ticket #24056: 24056-combined.patch

File 24056-combined.patch, 16.8 KB (added by a.hoereth, 5 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">