WordPress.org

Make WordPress Core

Ticket #23497: 23497.17.diff

File 23497.17.diff, 34.6 KB (added by adamsilverstein, 5 years ago)

asynchronous fetching, code patch rollup

  • wp-includes/post-template.php

     
    14681468        else :
    14691469                echo "<ul class='post-revisions'>\n";
    14701470                echo $rows;
     1471
     1472                //
     1473                // if the post was previously restored from a revision
     1474                // show the restore event details
     1475                //
     1476                if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) {
     1477                        $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] );
     1478                        /* translators: revision date format, see http://php.net/date */
     1479                        $datef = _x( 'j F, Y @ G:i:s', 'revision date format');
     1480                        $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) );
     1481                        $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) ) . __( ' ago ' );
     1482                        ?>
     1483                        <hr />
     1484                        <div id="revisions-meta-restored">
     1485                                <?php
     1486                                printf( 'Previously restored from Revision ID %d, %s by %s (%s)',
     1487                                $restored_from_meta[ 'restored_revision_id'],
     1488                                $timesince,
     1489                                $author,
     1490                                $date );
     1491                                ?>
     1492                        </div>
     1493                        <?php
    14711494                echo "</ul>";
     1495                }
     1496
    14721497        endif;
    14731498
    14741499}
  • wp-includes/pluggable.php

     
    17191719
    17201720        $r  = "<table class='diff'>\n";
    17211721
    1722         if ( isset( $args[ 'showsplitview' ] ) && 'true' == $args[ 'showsplitview' ] ) {
     1722        if ( ! empty( $args[ 'show_split_view' ] ) ) {
    17231723                $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />";
    17241724        } else {
    17251725                $r .= "<col class='content' />";
  • wp-admin/includes/ajax-actions.php

     
    21312131function wp_ajax_revisions_data() {
    21322132        check_ajax_referer( 'revisions-ajax-nonce', 'nonce' );
    21332133
    2134         $compareto = isset( $_GET['compareto'] ) ? absint( $_GET['compareto'] ) : 0;
    2135         $showautosaves = isset( $_GET['showautosaves'] ) ? $_GET['showautosaves'] : '';
    2136         $showsplitview = isset( $_GET['showsplitview'] ) ? $_GET['showsplitview'] : '';
    2137         $postid = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : '';
     2134        $compare_to = isset( $_GET['compare_to'] ) ? absint( $_GET['compare_to'] ) : 0;
     2135        $show_autosaves = isset( $_GET['show_autosaves'] ) ? $_GET['show_autosaves'] : '';
     2136        $show_split_view = isset( $_GET['show_split_view'] ) ? $_GET['show_split_view'] : '';
     2137        $post_id = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : '';
     2138        $right_handle_at = isset( $_GET['right_handle_at'] ) ? $_GET['right_handle_at'] : 0;
     2139        $left_handle_at = isset( $_GET['left_handle_at'] ) ? $_GET['left_handle_at'] : 0;
     2140        $single_revision_id = isset( $_GET['single_revision_id'] ) ? $_GET['single_revision_id'] : 0;
    21382141
    2139         $comparetwomode = ( '' == $postid ) ? false : true;
     2142        $compare_two_mode = ( '' == $post_id ) ? false : true;
    21402143        //
    2141         //TODO: currently code returns all possible comparisons for the indicated 'compareto' revision
     2144        //TODO: currently code returns all possible comparisons for the indicated 'compare_to' revision
    21422145        //however, the front end prevents users from pulling the right handle past the left or the left pass the right,
    21432146        //so only the possible diffs need be generated
    21442147        //
    21452148        $alltherevisions = array();
    2146         if ( '' == $postid )
    2147                 $postid = $compareto;
     2149        if ( '' == $post_id )
     2150                $post_id = $compare_to;
    21482151
    2149         if ( ! current_user_can( 'read_post', $postid ) )
     2152        if ( ! current_user_can( 'read_post', $post_id ) )
    21502153                continue;
    21512154
    2152         if ( ! $revisions = wp_get_post_revisions( $postid ) )
     2155        if ( ! $revisions = wp_get_post_revisions( $post_id ) )
    21532156                return;
    21542157
     2158        /* translators: revision date format, see http://php.net/date */
     2159        $datef = _x( 'j F, Y @ G:i:s', 'revision date format');
    21552160
    2156         //if we are comparing two revisions, the first 'revision' represented by the leftmost
    2157         //slider position is the current revision, prepend a comparison to this revision
    2158         if ( $comparetwomode )
    2159                 array_unshift( $revisions, get_post( $postid ) );
     2161        //single model fetch mode
     2162        if ( 0 != $single_revision_id ) {
     2163                $left_revision = get_post( $compare_to );
     2164                $right_revision = get_post( $single_revision_id );
    21602165
    2161         $count = 1;
    2162         foreach ( $revisions as $revision ) :
    2163         if ( 'true' != $showautosaves && wp_is_post_autosave( $revision ) )
    2164                         continue;
     2166                if ( $compare_two_mode ) {
     2167                        $compare_to_gravatar = get_avatar( $left_revision->post_author, 18 );
     2168                        $compare_to_author = get_the_author_meta( 'display_name', $left_revision->post_author );
     2169                        $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) );
    21652170
    2166         $revision_from_date_author = '';
     2171                        $revision_from_date_author = sprintf(
     2172                                '%s %s, %s %s (%s)',
     2173                                $compare_to_gravatar,
     2174                                $compare_to_author,
     2175                                human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ),
     2176                                __( ' ago ' ),
     2177                                $compare_to_date
     2178                        );
     2179                }
    21672180
     2181                //
     2182                //make sure the left revision is the most recent
     2183                //
     2184                if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) {
     2185                        $temp = $left_revision;
     2186                        $left_revision = $right_revision;
     2187                        $right_revision = $temp;
     2188                }
    21682189
    2169         $left_revision = get_post( $compareto );
    2170         $right_revision = get_post( $revision );
     2190                //
     2191                //compare from left to right, passed from application
     2192                //
     2193                $content='';
     2194                foreach ( array_keys( _wp_post_revision_fields() ) as $field ) {
     2195                        $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' );
     2196                        $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' );
    21712197
    2172         $author = get_the_author_meta( 'display_name', $revision->post_author );
    2173         /* translators: revision date format, see http://php.net/date */
    2174         $datef = _x( 'j F, Y @ G:i:s', 'revision date format');
     2198                        add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' );
    21752199
    2176         $gravatar = get_avatar( $revision->post_author, 18 );
     2200                        $args = array();
    21772201
    2178         $date = date_i18n( $datef, strtotime( $revision->post_modified ) );
    2179         $revision_date_author = sprintf(
    2180                 '%s %s, %s %s (%s)',
    2181                 $gravatar,
    2182                 $author,
    2183                 human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ),
    2184                 __( ' ago ' ),
    2185                 $date
    2186         );
     2202                        if ( ! empty( $show_split_view ) )
     2203                                 $args = array( 'show_split_view' => true );
    21872204
    2188         if ( $comparetwomode ) {
    2189                 $compareto_gravatar = get_avatar( $left_revision->post_author, 18 );
    2190                 $compareto_author = get_the_author_meta( 'display_name', $left_revision->post_author );
    2191                 $compareto_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) );
    2192 
    2193                 $revision_from_date_author = sprintf(
    2194                         '%s %s, %s %s (%s)',
    2195                         $compareto_gravatar,
    2196                         $compareto_author,
    2197                         human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ),
    2198                         __( ' ago ' ),
    2199                         $compareto_date
    2200                 );
     2205                        $content .= wp_text_diff( $left_content, $right_content, $args );
     2206                }
     2207                        $content = '' == $content ? __( 'No difference' ) : $content;
     2208                        $alltherevisions = array (
     2209                                'revisiondiff' => $content
     2210                        );
     2211                echo json_encode( $alltherevisions );
     2212                exit();
    22012213        }
    22022214
    2203         $restoreaction = wp_nonce_url(
    2204                 add_query_arg(
    2205                         array( 'revision' => $revision->ID,
    2206                                 'action' => 'restore' ),
    2207                                 '/wp-admin/revision.php'
    2208                 ),
    2209                 "restore-post_{$compareto}|{$revision->ID}"
    2210         );
     2215        //if we are comparing two revisions, the first 'revision' represented by the leftmost
     2216        //slider position is the current revision, prepend a comparison to this revision
     2217        if ( $compare_two_mode )
     2218                array_unshift( $revisions, get_post( $post_id ) );
     2219               
    22112220
    2212         //
    2213         //make sure the left revision is the most recent
    2214         //
    2215         if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) {
    2216                 $temp = $left_revision;
    2217                 $left_revision = $right_revision;
    2218                 $right_revision = $temp;
    2219         }
     2221        $count = -1;
    22202222
    2221         //
    2222         //compare from left to right, passed from application
    2223         //
    2224         $content='';
    2225         foreach ( array_keys( _wp_post_revision_fields() ) as $field ) {
    2226                 $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' );
    2227                 $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' );
     2223        foreach ( $revisions as $revision ) :
     2224                if ( ! empty( $show_autosaves ) && wp_is_post_autosave( $revision ) )
     2225                                continue;
    22282226
    2229                 add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' );
     2227                $revision_from_date_author = '';
     2228                $count++;
     2229                // return blank data for diffs to the left of the left handle (for right handel model)
     2230                // or to the right of the right handle (for left handel model)
     2231                if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) ||
     2232                         ( 0 != $right_handle_at && $count > $right_handle_at )) {
     2233                        $alltherevisions[] = array (
     2234                                'ID' => $revision->ID,
     2235                        );
     2236                       
     2237                        continue;
     2238                }
    22302239
    2231                 $args = array();
     2240                $gravatar = get_avatar( $revision->post_author, 18 );
     2241                $author = get_the_author_meta( 'display_name', $revision->post_author );
     2242                $date = date_i18n( $datef, strtotime( $revision->post_modified ) );
     2243                $revision_date_author = sprintf(
     2244                        '%s %s, %s %s (%s)',
     2245                        $gravatar,
     2246                        $author,
     2247                        human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ),
     2248                        __( ' ago ' ),
     2249                        $date
     2250                );
    22322251
    2233                 if ( 'true' == $showsplitview )
    2234                          $args = array( 'showsplitview' => 'true' );
    2235 
    2236                 $content .= wp_text_diff( $left_content, $right_content, $args );
    2237         }
    2238 
    2239         //if we are comparing two revisions
    2240         //and we are on the matching revision
    2241         //add an error revision indicating unable to compare to self
    2242         if ( $comparetwomode && $compareto == $revision->ID )
    2243                 $alltherevisions[] = array (
    2244                         'ID' => $revision->ID,
    2245                         'revision_date_author' => $revision_date_author,
    2246                         'revisiondiff' => sprintf('<div id="selfcomparisonerror">%s</div>', __( 'Cannot compare revision to itself' ) ),
    2247                         'restoreaction' => urldecode( $restoreaction ),
    2248                         'revision_from_date_author' => ''
     2252                $restoreaction = wp_nonce_url(
     2253                        add_query_arg(
     2254                                array( 'revision' => $revision->ID,
     2255                                        'action' => 'restore' ),
     2256                                        admin_url( 'revision.php' )
     2257                        ),
     2258                        "restore-post_{$compare_to}|{$revision->ID}"
    22492259                );
    22502260
    2251         //add to the return data only if there is a difference
    2252         if ( '' != $content )
    22532261                $alltherevisions[] = array (
    2254                         'ID' => $revision->ID,
    2255                         'revision_date_author' => $revision_date_author,
    2256                         'revisiondiff' => $content,
    2257                         'restoreaction' => urldecode( $restoreaction ),
    2258                         'revision_from_date_author' => $revision_from_date_author
    2259                 );
     2262                                'ID' => $revision->ID,
     2263                                'revision_date_author' => $revision_date_author,
     2264                                'revision_from_date_author' => $revision_from_date_author,
     2265                                'restoreaction' => urldecode( $restoreaction ),
     2266                                'revision_toload' => true
     2267                        );
    22602268
    22612269        endforeach;
    22622270
  • wp-admin/js/revisions.js

     
    66                views : {},
    77
    88                Model : Backbone.Model.extend({
     9                        idAttribute : 'ID',
     10                        urlRoot : ajaxurl +     '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
     11                                '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
    912                        defaults: {
    1013                                ID : 0,
    1114                                revision_date_author : '',
    12                                 revisiondiff : '',
    13                                 restoreaction: '',
    14                                 diff_max : 0,
    15                                 diff_count : 0,
    16                                 diff_revision_to : 0,
     15                                revisiondiff : '<div class="diff-loading"><div class="spinner"></div></div>',
     16                                restoreaction : '',
    1717                                revision_from_date_author : '',
     18                                revision_toload : false
     19                        },
     20
     21                        url : function() {
     22                                return this.urlRoot + '&single_revision_id=' + this.id;
    1823                        }
     24
    1925                }),
    2026
    2127                app: _.extend({}, Backbone.Events),
     
    3036                        _left_diff : 0,
    3137                        _right_diff : 1,
    3238                        _autosaves : false,
    33                         _showsplitview : true,
     39                        _show_split_view : true,
    3440                        _compareoneortwo : 1,
    35                         left_model_loading : false,             //keep track of model loads
    36                         right_model_loading : false,    //disallow slider interaction, also repeat loads, while loading
     41                        _left_model_loading : false,            //keep track of model loads
     42                        _right_model_loading : false,   //disallow slider interaction, also repeat loads, while loading
    3743
    3844                        //TODO add ability to arrive on specific revision
    3945                        routes : {
    40                                 "viewrevision/:revision": "viewrevision",
    4146                        },
    4247
    4348                        viewrevision : function( revision ) {
    4449                                //coming soon
    4550                        },
    4651
     52                        reload_toload_revisions : function( model_collection ) {
     53                                var self = this;
     54                                var revisions_to_load = model_collection.where( { revision_toload : true } );
     55                                //console.log(revisions_to_load);
     56                                var delay=0;
     57                                _.each(revisions_to_load, function( the_model ) {
     58                                                the_model.urlRoot = model_collection.url;
     59                                                _.delay( function() { (the_model.fetch( { 
     60                                                        update : true,
     61                                                        add : false,
     62                                                        remove : false,
     63                                                        //async : false,
     64                                                        success : function( model ) {
     65                                                                //console.log(model.get( 'ID' ) +'-'+self._revisions.at( self._right_diff ).get( 'ID' ));
     66                                                                if ( model.get( 'ID' ) == self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { //reload if current model refreshed
     67                                                                        //console.log('render');
     68                                                                        self._revisionView.render();   
     69                                                                }
     70                                                        }
     71                                                } ) )}, delay ) ;
     72                                                delay = delay + 200; //stagger model loads by 200 ms to avoid hammering server with requests
     73                                        }
     74                                       
     75                                )
     76
     77                        },     
     78
    4779                        start_left_model_loading : function() {
    48                                 this.left_model_loading = true;
     80                                this._left_model_loading = true;
    4981                                $('.revisiondiffcontainer').addClass('leftmodelloading');
    5082                        },
    5183
    5284                        stop_left_model_loading : function() {
    53                                 this.left_model_loading = false;
     85                                this._left_model_loading = false;
    5486                                $('.revisiondiffcontainer').removeClass('leftmodelloading');
    5587                        },
    5688
    5789                        start_right_model_loading : function() {
    58                                 this.right_model_loading = true;
     90                                this._right_model_loading = true;
    5991                                $('.revisiondiffcontainer').addClass('rightmodelloading');
    6092                        },
    6193
    6294                        stop_right_model_loading : function() {
    63                                 this.right_model_loading = false;
     95                                this._right_model_loading = false;
    6496                                $('.revisiondiffcontainer').removeClass('rightmodelloading');
    6597                        },
    6698
     
    74106
    75107                        reloadmodelsingle : function() {
    76108                                var self = this;
    77                                 self._revisions.url = ajaxurl + '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id +
    78                                                                                         '&showautosaves=' + self.self_autosaves +
    79                                                                                         '&showsplitview=' +  REVAPP._showsplitview +
     109                                self._revisions.url = ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
     110                                                                                        '&show_autosaves=' + self._autosaves +
     111                                                                                        '&show_split_view=' +  REVAPP._show_split_view +
    80112                                                                                        '&nonce=' + wpRevisionsSettings.nonce;
    81113                                self.start_right_model_loading();
    82114                                this._revisions.fetch({ //reload revision data
     
    85117                                                var revisioncount = self._revisions.length;
    86118                                                if ( self._right_diff > revisioncount ) //if right handle past rightmost, move
    87119                                                        self._right_diff = revisioncount;
    88                                                 //TODO add a test for matchind left revision and push left, testing
    89                                                 //also reset the slider values here
    90120
    91121                                                self._revisionView.render();
    92                                                 $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this
     122                                                self.reload_toload_revisions( self._revisions );
     123
     124                                                $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, autsaves changed
    93125                                        },
    94126
    95127                                        error : function () {
     
    100132                                });
    101133                        },
    102134
    103                         reloadleftright : function() {
     135                        reloadleft : function() {
    104136                                var self = this;
    105137                                self.start_left_model_loading();
    106                                 self.start_right_model_loading();
    107 
    108138                                self._left_handle_revisions = new wp.revisions.Collection();
    109                                 self._right_handle_revisions = new wp.revisions.Collection();
    110 
    111                                 if ( 0 == self._left_diff ) {
    112                                         self._right_handle_revisions.url =
    113                                                 ajaxurl +
    114                                                 '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id +
    115                                                 '&post_id=' + wpRevisionsSettings.post_id +
    116                                                 '&showautosaves=' + self._autosaves +
    117                                                 '&showsplitview=' +  self._showsplitview +
    118                                                 '&nonce=' + wpRevisionsSettings.nonce;
    119                                 } else {
    120                                         self._right_handle_revisions.url =
    121                                                 ajaxurl +
    122                                                 '?action=revisions-data&compareto=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) +
    123                                                 '&post_id=' + wpRevisionsSettings.post_id +
    124                                                 '&showautosaves=' + self._autosaves +
    125                                                 '&showsplitview=' +  self._showsplitview +
    126                                                 '&nonce=' + wpRevisionsSettings.nonce;
    127                                 }
    128 
    129139                                self._left_handle_revisions.url =
    130140                                        ajaxurl +
    131                                         '?action=revisions-data&compareto=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) +
     141                                        '?action=revisions-data&compare_to=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) +
    132142                                        '&post_id=' + wpRevisionsSettings.post_id +
    133                                         '&showautosaves=' + self._autosaves +
    134                                         '&showsplitview=' +  self._showsplitview +
    135                                         '&nonce=' + wpRevisionsSettings.nonce;
     143                                        '&show_autosaves=' + self._autosaves +
     144                                        '&show_split_view=' +  self._show_split_view +
     145                                        '&nonce=' + wpRevisionsSettings.nonce +
     146                                        '&right_handle_at='  + ( self._right_diff );
    136147
    137148                                self._left_handle_revisions.fetch({
    138149
    139                                         xhr: function() {
    140                                                 var xhr = $.ajaxSettings.xhr();
    141                                                 xhr.onprogress = self.handleProgress;
    142                                                 return xhr;
    143                                         },
    144 
    145                                         handleProgress: function(evt){
    146                                                 var percentComplete = 0;
    147                                                 if (evt.lengthComputable) {
    148                                                         percentComplete = evt.loaded / evt.total;
    149                                                         window.console && console.log( Math.round( percentComplete * 100) + "%" );
    150                                                 }
    151                                         },
    152 
    153150                                        success : function(){
    154151                                                self.stop_left_model_loading();
     152                                                self.reload_toload_revisions( self._left_handle_revisions );
    155153                                        },
    156154
    157155                                        error : function () {
     
    159157                                                self.stop_left_model_loading();
    160158                                        }
    161159                                });
     160                        },
    162161
     162                        reloadright : function() {
     163                                var self = this;
     164                                self.start_right_model_loading();
     165                                self._right_handle_revisions = new wp.revisions.Collection();
     166                                if ( 0 == self._left_diff ) {
     167                                        self._right_handle_revisions.url =
     168                                                ajaxurl +
     169                                                '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
     170                                                '&post_id=' + wpRevisionsSettings.post_id +
     171                                                '&show_autosaves=' + self._autosaves +
     172                                                '&show_split_view=' +  self._show_split_view +
     173                                                '&nonce=' + wpRevisionsSettings.nonce;
     174                                } else {
     175                                        self._right_handle_revisions.url =
     176                                                ajaxurl +
     177                                                '?action=revisions-data&compare_to=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) +
     178                                                '&post_id=' + wpRevisionsSettings.post_id +
     179                                                '&show_autosaves=' + self._autosaves +
     180                                                '&show_split_view=' +  self._show_split_view +
     181                                                '&nonce=' + wpRevisionsSettings.nonce +
     182                                                '&left_handle_at=' + (self._left_diff ) ;
     183                                }
     184
    163185                                self._right_handle_revisions.fetch({
    164186                                       
    165187                                        success : function(){
    166188                                                self.stop_right_model_loading();
     189                                                self.reload_toload_revisions( self._right_handle_revisions );
    167190                                        },
    168191
    169                                         error : function () {
    170                                                 window.console && console.log( 'Error loading revision data' );
     192                                        error : function ( response ) {
     193                                                window.console && console.log( 'Error loading revision data - ' + response.toSource() );
    171194                                                self.stop_right_model_loading();
    172195                                        }
    173196                                });
     197
    174198                        },
    175199
     200                        reloadleftright : function() {
     201                                this.reloadleft();
     202                                this.reloadright();
     203                        },
     204
    176205                        /*
    177206                         * initialize the revision application
    178207                         */
     
    194223                        },
    195224
    196225                        revisionDiffSetup : function() {
    197                                 var self = this, slider;
    198 
    199226                                this._revisionView = new wp.revisions.views.View({
    200227                                        model : this._revisions
    201228                                });
    202229                                this._revisionView.render();
    203 
     230                                $( '#diff_max, #diff_maxof' ).html( this._revisions.length );
     231                                $( '#diff_count' ).html( REVAPP._right_diff );
     232                                $( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 );
     233                               
     234                                this.reload_toload_revisions( this._revisions );
    204235                                this._revisionsInteractions = new wp.revisions.views.Interact({
    205236                                        model : this._revisions
    206237                                });
    207238                                this._revisionsInteractions.render();
    208239
     240                                /*
     241                                //Options hidden for now, moving to screen options
    209242                                this._revisionsOptions = new wp.revisions.views.Options({
    210243                                        model : this._revisions
    211244                                });
    212245                                this._revisionsOptions.render();
     246                                */
    213247
    214248                        }
    215249                })
     
    217251
    218252        wp.revisions.Collection = Backbone.Collection.extend({
    219253                model : wp.revisions.Model,
    220                 url : ajaxurl + '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id + '&showautosaves=false&showsplitview=true&nonce=' + wpRevisionsSettings.nonce
     254                url : ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
     255                        '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
     256               
     257                initialize : function() {
     258                        },
     259
    221260        });
    222261
    223262        _.extend(wp.revisions.views, {
     
    260299                                                        ) );
    261300                                                }
    262301                                        }
    263                                 } else { //end compare two revisions mode, eg only one slider handel
     302                                } else { //end compare two revisions mode, eg only one slider handle
    264303                                        this.comparetwochecked = '';
    265304                                        if ( this.model.at( REVAPP._right_diff - 1 ) ) {
    266305                                                addhtml = this.template( _.extend(
    267                                                         this.model.at( REVAPP._right_diff-1 ).toJSON(),
    268                                                         { comparetwochecked : this.comparetwochecked } //keep the checkmark checked
     306                                                        this.model.at( REVAPP._right_diff - 1 ).toJSON(),
     307                                                        { comparetwochecked : this.comparetwochecked } //keep the checkmark unchecked
    269308                                                ) );
    270309                                        }
    271310                                }
    272311                                this.$el.html( addhtml );
     312                                if ( this.model.length < 3 ) {
     313                                        $( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions
     314                                       
     315                                }
     316                                //console.log ( (this.model.at( REVAPP._right_diff - 1 )).url());
    273317                                return this;
    274318                        },
    275319
     
    331375                                } else {
    332376                                        REVAPP._autosaves = false ;
    333377                                }
     378
    334379                                //refresh the model data
    335 
    336                                 REVAPP.reloadmodel();
    337                                 //TODO check for two handle mode
    338                                
     380                                REVAPP.reloadmodel();                           
    339381                        },
    340382
    341383                        //
     
    345387                                var self = this;
    346388
    347389                                if ( $( 'input#showsplitview' ).is( ':checked' ) ) {
    348                                         REVAPP._showsplitview = 'true';
     390                                        REVAPP._show_split_view = 'true';
    349391                                        $('.revisiondiffcontainer').addClass('diffsplit');
    350392                                } else {
    351                                         REVAPP._showsplitview = '';
     393                                        REVAPP._show_split_view = '';
    352394                                        $('.revisiondiffcontainer').removeClass('diffsplit');
    353395                                }
    354396
     
    364406                        tagName : 'revisionvinteract',
    365407                        className : 'revisionvinteract-container',
    366408                        template : wp.template('revisionvinteract'),
     409                        _restoreword : '',
    367410
    368411                        initialize : function() {
     412                                this._restoreword = $( 'input#restore' ).attr( 'value' );
    369413                        },
    370414
     415                        reset_restore_button : function() {
     416                                $( 'input#restore' ).attr( 'value', this._restoreword + ' ' + REVAPP._revisions.at( REVAPP._right_diff - 1 ).get( 'ID' ) );
     417                        },
     418
    371419                        render : function() {
    372420                                var self = this;
    373421
     
    376424                                $( '#diff_max, #diff_maxof' ).html( this.model.length );
    377425                                $( '#diff_count' ).html( REVAPP._right_diff );
    378426                                $( '#diff_left_count_inner' ).html( 0 == REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff );
     427                                self.reset_restore_button();
    379428
    380429                                var modelcount = REVAPP._revisions.length;
    381430
    382                                 slider = $("#slider");
     431                                slider = $( "#slider" );
    383432                                if ( 1 == REVAPP._compareoneortwo ) {
    384433                                        //set up the slider with a single handle
    385434                                        slider.slider({
     
    390439
    391440                                                //slide interactions for one handles slider
    392441                                                slide : function( event, ui ) {
    393                                                         if ( REVAPP.right_model_loading ) //left model stoll loading, prevent sliding left handle
     442                                                        if ( REVAPP._right_model_loading ) //left model stoll loading, prevent sliding left handle
    394443                                                                                return false;
    395444
    396445                                                        REVAPP._right_diff =( ui.value+1 );
    397446                                                        $( '#diff_count' ).html( REVAPP._right_diff );
    398447                                                        REVAPP._revisionView.render();
     448                                                        self.reset_restore_button();
    399449                                                }
    400450                                        });
    401451                                        $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' );
     
    414464
    415465                                                        switch ( index ) {
    416466                                                                case 1: //left handle drag
    417                                                                         if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle
     467                                                                        if ( REVAPP._left_model_loading ) //left model stoll loading, prevent sliding left handle
    418468                                                                                return false;
    419469
    420470                                                                        if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions &&
     
    422472                                                                                REVAPP._revisionView.model = REVAPP._left_handle_revisions;
    423473
    424474                                                                        REVAPP._revisionView.draggingleft = true;
     475                                                                        REVAPP._left_diff_start = ui.values[ 0 ];
    425476                                                                        break;
    426477
    427478                                                                case 2: //right
    428                                                                         if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle
     479                                                                        if ( REVAPP._right_model_loading ) //right model stoll loading, prevent sliding right handle
    429480                                                                                return false;
    430481
    431482                                                                        //one extra spot at left end when comparing two
     
    434485                                                                                REVAPP._revisionView.model = REVAPP._right_handle_revisions;
    435486
    436487                                                                        REVAPP._revisionView.draggingleft = false;
    437                                                                         REVAPP._right_diff = ui.values[1] - 1 ;
     488                                                                        REVAPP._right_diff_start = ui.values[ 1 ];
    438489                                                                        break;
    439490                                                        }
    440491                                                },
    441492
    442493                                                //when sliding in two handled mode change appropriate value
    443494                                                slide : function( event, ui ) {
    444                                                         if ( ui.values[0] == ui.values[1] ) //prevent compare to self
     495                                                        if ( ui.values[ 0 ] == ui.values[ 1 ] ) //prevent compare to self
    445496                                                                return false;
    446497
    447498                                                        var index = $( ui.handle ).index(); //0 (left) or 1 (right)
    448499
    449500                                                        switch ( index ) {
    450501                                                                case 1: //left
    451                                                                         if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle
     502                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle
    452503                                                                                return false;
    453504
    454                                                                         REVAPP._left_diff = ui.values[0] - 1; //one extra spot at left end when comparing two
     505                                                                        REVAPP._left_diff = ui.values[ 0 ] - 1; //one extra spot at left end when comparing two
    455506                                                                        break;
    456507
    457508                                                                case 2: //right
    458                                                                         if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle
     509                                                                        if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle
    459510                                                                                return false;
    460511
    461                                                                         REVAPP._right_diff = ui.values[1] - 1 ;
     512                                                                        REVAPP._right_diff = ui.values[ 1 ] - 1 ;
    462513                                                                        break;
    463514                                                        }
    464515
    465516                                                        $( '#diff_count' ).html( REVAPP._right_diff );
    466517
     518
     519
    467520                                                        if ( 0 == REVAPP._left_diff ) {
    468521                                                                $( '.revisiondiffcontainer' ).addClass( 'currentversion' );
    469522
     
    473526                                                        }
    474527
    475528                                                        REVAPP._revisionView.render(); //render the diff view
     529                                                        self.reset_restore_button();
    476530                                                },
    477531
    478532                                                //when the user stops sliding  in 2 handle mode, recalculate diffs
     
    480534                                                        if ( 2 == REVAPP._compareoneortwo ) {
    481535                                                                //calculate and generate a diff for comparing to the left handle
    482536                                                                //and the right handle, swap out when dragging
    483                                                                 if ( ! (REVAPP.left_model_loading && REVAPP.right_model.loading ) ) {
    484                                                                         REVAPP.reloadleftright();
     537
     538                                                                var index = $( ui.handle ).index(); //0 (left) or 1 (right)
     539
     540                                                                switch ( index ) {
     541                                                                        case 1: //left
     542                                                                                //left handle dragged & changed, reload right handle model
     543                                                                                if ( ! ( REVAPP._left_diff_start == ui.values[ 0 ] || REVAPP._left_model_loading ) )
     544                                                                                        REVAPP.reloadright();
     545                                                                               
     546                                                                                break;
     547
     548                                                                        case 2: //right
     549                                                                                //right handle dragged & changed, reload left handle model if changed
     550                                                                                if ( ! ( REVAPP._right_diff_start == ui.values[ 1 ] || REVAPP._right_model_loading ) ) {
     551                                                                                        REVAPP.reloadleft();
     552                                                                                }
     553                                                                                break;
    485554                                                                }
    486555                                                        }
    487556                                                }
     
    507576
    508577                                $( '#diff_count' ).html( REVAPP._right_diff );
    509578                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
     579                                this.reset_restore_button();
    510580                        },
    511581
    512582                        //go the the previous revision
     
    518588
    519589                                $( '#diff_count' ).html( REVAPP._right_diff );
    520590                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
     591                                this.reset_restore_button();
    521592                        }
    522593                })
    523594        });
     
    525596        //instantiate Revision Application
    526597        REVAPP = new wp.revisions.App();
    527598        //TODO consider enable back button to step back thru states?
    528         Backbone.history.start();
     599        //Backbone.history.start({pushState: true});
    529600
    530601}(jQuery));
  • wp-admin/revision.php

     
    1010require_once('./admin.php');
    1111wp_reset_vars( array( 'revision', 'action' ) );
    1212
    13 $revision_id = absint($revision);
     13$revision_id = absint( $revision );
    1414$redirect = 'edit.php';
    1515
    1616switch ( $action ) :
    1717case 'restore' :
    18         if ( !$revision = wp_get_post_revision( $revision_id ) )
     18        if ( ! $revision = wp_get_post_revision( $revision_id ) )
    1919                break;
    20         if ( !current_user_can( 'edit_post', $revision->post_parent ) )
     20        if ( ! current_user_can( 'edit_post', $revision->post_parent ) )
    2121                break;
    22         if ( !$post = get_post( $revision->post_parent ) )
     22        if ( ! $post = get_post( $revision->post_parent ) )
    2323                break;
    2424
    2525        // Revisions disabled and we're not looking at an autosave
    26         if ( ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) && !wp_is_post_autosave( $revision ) ) {
     26        if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) && ! wp_is_post_autosave( $revision ) ) {
    2727                $redirect = 'edit.php?post_type=' . $post->post_type;
    2828                break;
    2929        }
    3030        check_admin_referer( "restore-post_{$post->ID}|{$revision->ID}" );
    3131
     32        //store revision event in post meta
     33        $restore_details = array(
     34                'restored_revision_id' => $revision->ID,
     35                'restored_by_user' => get_current_user_id(),
     36                'restored_time' => time()
     37        );
     38        wp_update_post_meta( $post->ID, '_post_restored_from', $restore_details );
     39
    3240        wp_restore_post_revision( $revision->ID );
    3341        $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) );
    3442        break;
    3543case 'view' :
    3644case 'edit' :
    3745default :
    38         if ( !$revision = wp_get_post_revision( $revision_id ) )
     46        if ( ! $revision = wp_get_post_revision( $revision_id ) )
    3947                break;
    40         if ( !$post = get_post( $revision->post_parent ) )
     48        if ( ! $post = get_post( $revision->post_parent ) )
    4149                break;
    4250
    43         if ( !current_user_can( 'read_post', $revision->ID ) || !current_user_can( 'read_post', $post->ID ) )
     51        if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'read_post', $post->ID ) )
    4452                break;
    4553
    4654        // Revisions disabled and we're not looking at an autosave
     
    5967endswitch;
    6068
    6169// Empty post_type means either malformed object found, or no valid parent was found.
    62 if ( !$redirect && empty($post->post_type) )
     70if ( ! $redirect && empty( $post->post_type ) )
    6371        $redirect = 'edit.php';
    6472
    65 if ( !empty($redirect) ) {
     73if ( ! empty( $redirect ) ) {
    6674        wp_redirect( $redirect );
    6775        exit;
    6876}
    6977
    7078// This is so that the correct "Edit" menu item is selected.
    71 if ( !empty($post->post_type) && 'post' != $post->post_type )
     79if ( ! empty( $post->post_type ) && 'post' != $post->post_type )
    7280        $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type;
    7381else
    7482        $parent_file = $submenu_file = 'edit.php';
     
    8391<script type="text/javascript">
    8492var wpRevisionsSettings = <?php echo json_encode( array( 'post_id' => $post->ID, 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ) ) ); ?>;
    8593</script>
     94<?php
     95        $comparetworevisionslink = get_edit_post_link( $revision->ID );
     96?>
    8697
    8798<div id="backbonerevisionsoptions"></div>
    88 
    89 <br class="clear"/>
    9099<div class="wrap">
    91100        <div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
    92101        <div class="revisiondiffcontainer diffsplit currentversion rightmodelloading">
     
    94103                <h2 class="long-header"><?php echo $h2; ?></h2>
    95104                <div id="backbonerevisionsinteract"></div>
    96105                <div id="backbonerevisionsdiff"></div>
    97 <hr />
    98 <?php
    99         $comparetworevisionslink = get_edit_post_link( $revision->ID );
    100 ?>
     106                <hr />
    101107        </div>
    102108</div>
    103109
     
    107113                <div id="difftitlefrom">{{{ data.revision_from_date_author }}} <?php _e( '- compared to -' ); ?></div>
    108114                <div id="difftitle">{{{ data.revision_date_author }}}</div>
    109115                <div id="diffcancel"><input class="button" onClick="document.location='<?php echo get_edit_post_link( $post->ID ); ?>'" type="submit" id="cancel" value="<?php esc_attr_e( 'Cancel' )?>" /></div>
    110                 <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore' )?>" /></div>
    111                 <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <?php esc_attr_e( 'Compare two revisions' )?></div>
    112         </div>
     116                <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore revision ID' )?>" /></div>
     117                <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></div>    </div>
    113118        <div id="removedandadded">
    114119                <div id="removed"><?php _e( 'Removed -' ); ?></div>
    115120                <div id="added"><?php _e( 'Added +' ); ?></div>
     
    119124
    120125<script id="tmpl-revisionvinteract" type="text/html">
    121126        <div id="diffheader">
    122 <div id="diffprevious"><input class="button" type="submit" id="previous" value="Previous" /></div>
    123                         <div id="diffnext"><input class="button" type="submit" id="next" value="Next" /></div>
     127<div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /></div>
     128                        <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /></div>
    124129                        <div id="diffslider">
    125130        <div id="revisioncount">
    126131                                        <?php _e( 'Comparing' ); ?>
  • wp-admin/css/wp-admin.css

     
    37273727.leftmodelloading #modelsloading,
    37283728.rightmodelloading #modelsloading,
    37293729.leftmodelloading #modelsloading .spinner,
    3730 .rightmodelloading #modelsloading .spinner {
     3730.rightmodelloading #modelsloading .spinner,
     3731{
    37313732        display: inline;
    37323733}
    37333734
     3735.diff-loading {
     3736        margin-top: 50px;
     3737        width: 100%;
     3738        height: 200px;
     3739}
     3740.diff-loading .spinner
     3741{
     3742        clear: both;
     3743        margin-left: auto;
     3744        margin-right: auto;
     3745        display: block;
     3746        float: none;
     3747}
     3748
    37343749#difftitlefrom {
    37353750        float: left;
    37363751        display: none;