Make WordPress Core

Changeset 23639


Ignore:
Timestamp:
03/07/2013 03:32:26 PM (12 years ago)
Author:
westi
Message:

Revisions: Updates to the new Revisions UI.

Various Updates including:

  • i18n fixes
  • Added tracking of what revision ID was restored
  • async fetching of diffs so that slider works sooner even with many revisions

See #23497 props adamsilverstein, ethitter

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/css/wp-admin.css

    r23638 r23639  
    37233723.rightmodelloading #modelsloading,
    37243724.leftmodelloading #modelsloading .spinner,
    3725 .rightmodelloading #modelsloading .spinner {
     3725.rightmodelloading #modelsloading .spinner,
     3726{
    37263727    display: inline;
     3728}
     3729
     3730.diff-loading {
     3731    margin-top: 50px;
     3732    width: 100%;
     3733    height: 200px;
     3734}
     3735.diff-loading .spinner
     3736{
     3737    clear: both;
     3738    margin-left: auto;
     3739    margin-right: auto;
     3740    display: block;
     3741    float: none;
    37273742}
    37283743
  • trunk/wp-admin/includes/ajax-actions.php

    r23576 r23639  
    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'] ) : '';
    2138 
    2139     $comparetwomode = ( '' == $postid ) ? false : true;
     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;
     2141
     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;
    2148 
    2149     if ( ! current_user_can( 'read_post', $postid ) )
     2149    if ( '' == $post_id )
     2150        $post_id = $compare_to;
     2151
     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');
     2160
     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 );
     2165
     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 ) );
     2170
     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        }
     2180
     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        }
     2189
     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' );
     2197
     2198            add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' );
     2199
     2200            $args = array();
     2201
     2202            if ( ! empty( $show_split_view ) )
     2203                 $args = array( 'show_split_view' => true );
     2204
     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();
     2213    }
    21552214
    21562215    //if we are comparing two revisions, the first 'revision' represented by the leftmost
    21572216    //slider position is the current revision, prepend a comparison to this revision
    2158     if ( $comparetwomode )
    2159         array_unshift( $revisions, get_post( $postid ) );
    2160 
    2161     $count = 1;
     2217    if ( $compare_two_mode )
     2218        array_unshift( $revisions, get_post( $post_id ) );
     2219       
     2220    $count = -1;
     2221
    21622222    foreach ( $revisions as $revision ) :
    2163     if ( 'true' != $showautosaves && wp_is_post_autosave( $revision ) )
     2223        if ( ! empty( $show_autosaves ) && wp_is_post_autosave( $revision ) )
     2224                continue;
     2225
     2226        $revision_from_date_author = '';
     2227        $count++;
     2228        // return blank data for diffs to the left of the left handle (for right handel model)
     2229        // or to the right of the right handle (for left handel model)
     2230        if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) ||
     2231             ( 0 != $right_handle_at && $count > $right_handle_at )) {
     2232            $alltherevisions[] = array (
     2233                'ID' => $revision->ID,
     2234            );
     2235           
    21642236            continue;
    2165 
    2166     $revision_from_date_author = '';
    2167 
    2168 
    2169     $left_revision = get_post( $compareto );
    2170     $right_revision = get_post( $revision );
    2171 
    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');
    2175 
    2176     $gravatar = get_avatar( $revision->post_author, 18 );
    2177 
    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     );
    2187 
    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(
     2237        }
     2238
     2239        $gravatar = get_avatar( $revision->post_author, 18 );
     2240        $author = get_the_author_meta( 'display_name', $revision->post_author );
     2241        $date = date_i18n( $datef, strtotime( $revision->post_modified ) );
     2242        $revision_date_author = sprintf(
    21942243            '%s %s, %s %s (%s)',
    2195             $compareto_gravatar,
    2196             $compareto_author,
    2197             human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ),
     2244            $gravatar,
     2245            $author,
     2246            human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ),
    21982247            __( ' ago ' ),
    2199             $compareto_date
     2248            $date
    22002249        );
    2201     }
    2202 
    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     );
    2211 
    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     }
    2220 
    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' );
    2228 
    2229         add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' );
    2230 
    2231         $args = array();
    2232 
    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 )
     2250
     2251        $restoreaction = wp_nonce_url(
     2252            add_query_arg(
     2253                array( 'revision' => $revision->ID,
     2254                    'action' => 'restore' ),
     2255                    admin_url( 'revision.php' )
     2256            ),
     2257            "restore-post_{$compare_to}|{$revision->ID}"
     2258        );
     2259
    22432260        $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' => ''
    2249         );
    2250 
    2251     //add to the return data only if there is a difference
    2252     if ( '' != $content )
    2253         $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         );
     2261                'ID' => $revision->ID,
     2262                'revision_date_author' => $revision_date_author,
     2263                'revision_from_date_author' => $revision_from_date_author,
     2264                'restoreaction' => urldecode( $restoreaction ),
     2265                'revision_toload' => true
     2266            );
    22602267
    22612268    endforeach;
  • trunk/wp-admin/js/revisions.js

    r23509 r23639  
    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
     
    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
     
    4550            },
    4651
     52            reload_toload_revisions : function( model_collection, reverse_direction ) {
     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() {
     60                            the_model.fetch( {
     61                                update : true,
     62                                add : false,
     63                                remove : false,
     64                                //async : false,
     65                                success : function( model ) {
     66                                    //console.log(model.get( 'ID' ) +'-'+self._revisions.at( self._right_diff ).get( 'ID' ));
     67                                    if ( model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { //reload if current model refreshed
     68                                        //console.log('render');
     69                                        self._revisionView.render();
     70                                    }
     71                                }
     72                        } );
     73                        }, delay ) ;
     74                        delay = delay + 200; //stagger model loads by 200 ms to avoid hammering server with requests
     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
    6799            reloadmodel : function() {
    68                 if ( 2 == this._compareoneortwo ) {
     100                if ( 2 === this._compareoneortwo ) {
    69101                    this.reloadleftright();
    70102                } else {
     
    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();
     
    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 () {
    96128                        self.stop_right_model_loading();
    97                         window.console && console.log( 'Error loading revision data' );
     129                        //console.log( 'Error loading revision data' );
    98130                    }
    99131
     
    101133            },
    102134
    103             reloadleftright : function() {
     135            reloadleft : function() {
    104136                var self = this;
    105137                self.start_left_model_loading();
     138                self._left_handle_revisions = new wp.revisions.Collection();
     139                self._left_handle_revisions.url =
     140                    ajaxurl +
     141                    '?action=revisions-data&compare_to=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) +
     142                    '&post_id=' + wpRevisionsSettings.post_id +
     143                    '&show_autosaves=' + self._autosaves +
     144                    '&show_split_view=' +  self._show_split_view +
     145                    '&nonce=' + wpRevisionsSettings.nonce +
     146                    '&right_handle_at='  + ( self._right_diff );
     147
     148                self._left_handle_revisions.fetch({
     149
     150                    success : function(){
     151                        self.stop_left_model_loading();
     152                        self.reload_toload_revisions( self._left_handle_revisions );
     153                    },
     154
     155                    error : function () {
     156                        //console.log( 'Error loading revision data' );
     157                        self.stop_left_model_loading();
     158                    }
     159                });
     160            },
     161
     162            reloadright : function() {
     163                var self = this;
    106164                self.start_right_model_loading();
    107 
    108                 self._left_handle_revisions = new wp.revisions.Collection();
    109165                self._right_handle_revisions = new wp.revisions.Collection();
    110 
    111                 if ( 0 == self._left_diff ) {
     166                if ( 0 === self._left_diff ) {
    112167                    self._right_handle_revisions.url =
    113168                        ajaxurl +
    114                         '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id +
     169                        '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
    115170                        '&post_id=' + wpRevisionsSettings.post_id +
    116                         '&showautosaves=' + self._autosaves +
    117                         '&showsplitview=' +  self._showsplitview +
     171                        '&show_autosaves=' + self._autosaves +
     172                        '&show_split_view=' +  self._show_split_view +
    118173                        '&nonce=' + wpRevisionsSettings.nonce;
    119174                } else {
    120175                    self._right_handle_revisions.url =
    121176                        ajaxurl +
    122                         '?action=revisions-data&compareto=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) +
     177                        '?action=revisions-data&compare_to=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) +
    123178                        '&post_id=' + wpRevisionsSettings.post_id +
    124                         '&showautosaves=' + self._autosaves +
    125                         '&showsplitview=' +  self._showsplitview +
    126                         '&nonce=' + wpRevisionsSettings.nonce;
    127                 }
    128 
    129                 self._left_handle_revisions.url =
    130                     ajaxurl +
    131                     '?action=revisions-data&compareto=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) +
    132                     '&post_id=' + wpRevisionsSettings.post_id +
    133                     '&showautosaves=' + self._autosaves +
    134                     '&showsplitview=' +  self._showsplitview +
    135                     '&nonce=' + wpRevisionsSettings.nonce;
    136 
    137                 self._left_handle_revisions.fetch({
    138 
    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 
    153                     success : function(){
    154                         self.stop_left_model_loading();
    155                     },
    156 
    157                     error : function () {
    158                         window.console && console.log( 'Error loading revision data' );
    159                         self.stop_left_model_loading();
    160                     }
    161                 });
     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                }
    162184
    163185                self._right_handle_revisions.fetch({
    164                    
     186
    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                        //console.log( 'Error loading revision data - ' + response.toSource() );
    171194                        self.stop_right_model_loading();
    172195                    }
    173196                });
     197
     198            },
     199
     200            reloadleftright : function() {
     201                this.reloadleft();
     202                this.reloadright();
    174203            },
    175204
     
    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
     
    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            }
     
    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
    221     });
     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    } );
    222260
    223261    _.extend(wp.revisions.views, {
     
    243281                var addhtml = '';
    244282                //compare two revisions mode?
    245                 if ( 2 == REVAPP._compareoneortwo ) {
     283                if ( 2 === REVAPP._compareoneortwo ) {
    246284                    this.comparetwochecked = 'checked';
    247285                    if ( this.draggingleft ) {
     
    261299                        }
    262300                    }
    263                 } else { //end compare two revisions mode, eg only one slider handel
     301                } else { //end compare two revisions mode, eg only one slider handle
    264302                    this.comparetwochecked = '';
    265303                    if ( this.model.at( REVAPP._right_diff - 1 ) ) {
    266304                        addhtml = this.template( _.extend(
    267                             this.model.at( REVAPP._right_diff-1 ).toJSON(),
    268                             { comparetwochecked : this.comparetwochecked } //keep the checkmark checked
     305                            this.model.at( REVAPP._right_diff - 1 ).toJSON(),
     306                            { comparetwochecked : this.comparetwochecked } //keep the checkmark unchecked
    269307                        ) );
    270308                    }
    271309                }
    272310                this.$el.html( addhtml );
     311                if ( this.model.length < 3 ) {
     312                    $( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions
     313
     314                }
     315                //console.log ( (this.model.at( REVAPP._right_diff - 1 )).url());
    273316                return this;
    274317            },
     
    323366
    324367            //
    325             //toggle include autosaves 
     368            //toggle include autosaves
    326369            //
    327370            toggleshowautosaves : function() {
     
    332375                    REVAPP._autosaves = false ;
    333376                }
     377
    334378                //refresh the model data
    335 
    336379                REVAPP.reloadmodel();
    337                 //TODO check for two handle mode
    338                
    339380            },
    340381
     
    346387
    347388                if ( $( 'input#showsplitview' ).is( ':checked' ) ) {
    348                     REVAPP._showsplitview = 'true';
     389                    REVAPP._show_split_view = 'true';
    349390                    $('.revisiondiffcontainer').addClass('diffsplit');
    350391                } else {
    351                     REVAPP._showsplitview = '';
     392                    REVAPP._show_split_view = '';
    352393                    $('.revisiondiffcontainer').removeClass('diffsplit');
    353394                }
     
    365406            className : 'revisionvinteract-container',
    366407            template : wp.template('revisionvinteract'),
     408            _restoreword : '',
    367409
    368410            initialize : function() {
     411                this._restoreword = $( 'input#restore' ).attr( 'value' );
     412            },
     413
     414            reset_restore_button : function() {
     415                $( 'input#restore' ).attr( 'value', this._restoreword + ' ' + REVAPP._revisions.at( REVAPP._right_diff - 1 ).get( 'ID' ) );
    369416            },
    370417
     
    376423                $( '#diff_max, #diff_maxof' ).html( this.model.length );
    377424                $( '#diff_count' ).html( REVAPP._right_diff );
    378                 $( '#diff_left_count_inner' ).html( 0 == REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff );
     425                $( '#diff_left_count_inner' ).html( 0 === REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff );
     426                self.reset_restore_button();
    379427
    380428                var modelcount = REVAPP._revisions.length;
    381429
    382                 slider = $("#slider");
    383                 if ( 1 == REVAPP._compareoneortwo ) {
     430                slider = $( "#slider" );
     431                if ( 1 === REVAPP._compareoneortwo ) {
    384432                    //set up the slider with a single handle
    385433                    slider.slider({
     
    391439                        //slide interactions for one handles slider
    392440                        slide : function( event, ui ) {
    393                             if ( REVAPP.right_model_loading ) //left model stoll loading, prevent sliding left handle
     441                            if ( REVAPP._right_model_loading ) //left model stoll loading, prevent sliding left handle
    394442                                        return false;
    395443
     
    397445                            $( '#diff_count' ).html( REVAPP._right_diff );
    398446                            REVAPP._revisionView.render();
     447                            self.reset_restore_button();
    399448                        }
    400449                    });
     
    415464                            switch ( index ) {
    416465                                case 1: //left handle drag
    417                                     if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle
     466                                    if ( REVAPP._left_model_loading ) //left model stoll loading, prevent sliding left handle
    418467                                        return false;
    419468
    420469                                    if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions &&
    421                                             null != REVAPP._left_handle_revisions )
     470                                            null !== REVAPP._left_handle_revisions )
    422471                                        REVAPP._revisionView.model = REVAPP._left_handle_revisions;
    423472
    424473                                    REVAPP._revisionView.draggingleft = true;
     474                                    REVAPP._left_diff_start = ui.values[ 0 ];
    425475                                    break;
    426476
    427477                                case 2: //right
    428                                     if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle
     478                                    if ( REVAPP._right_model_loading ) //right model stoll loading, prevent sliding right handle
    429479                                        return false;
    430480
    431481                                    //one extra spot at left end when comparing two
    432482                                    if ( REVAPP._revisionView.model !== REVAPP._right_handle_revisions &&
    433                                             null != REVAPP._right_handle_revisions )
     483                                            null !== REVAPP._right_handle_revisions )
    434484                                        REVAPP._revisionView.model = REVAPP._right_handle_revisions;
    435485
    436486                                    REVAPP._revisionView.draggingleft = false;
    437                                     REVAPP._right_diff = ui.values[1] - 1 ;
     487                                    REVAPP._right_diff_start = ui.values[ 1 ];
    438488                                    break;
    439489                            }
     
    442492                        //when sliding in two handled mode change appropriate value
    443493                        slide : function( event, ui ) {
    444                             if ( ui.values[0] == ui.values[1] ) //prevent compare to self
     494                            if ( ui.values[ 0 ] === ui.values[ 1 ] ) //prevent compare to self
    445495                                return false;
    446496
     
    449499                            switch ( index ) {
    450500                                case 1: //left
    451                                     if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle
     501                                    if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle
    452502                                        return false;
    453503
    454                                     REVAPP._left_diff = ui.values[0] - 1; //one extra spot at left end when comparing two
     504                                    REVAPP._left_diff = ui.values[ 0 ] - 1; //one extra spot at left end when comparing two
    455505                                    break;
    456506
    457507                                case 2: //right
    458                                     if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle
     508                                    if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle
    459509                                        return false;
    460510
    461                                     REVAPP._right_diff = ui.values[1] - 1 ;
     511                                    REVAPP._right_diff = ui.values[ 1 ] - 1 ;
    462512                                    break;
    463513                            }
     
    465515                            $( '#diff_count' ).html( REVAPP._right_diff );
    466516
    467                             if ( 0 == REVAPP._left_diff ) {
     517                            if ( 0 === REVAPP._left_diff ) {
    468518                                $( '.revisiondiffcontainer' ).addClass( 'currentversion' );
    469519
     
    474524
    475525                            REVAPP._revisionView.render(); //render the diff view
     526                            self.reset_restore_button();
    476527                        },
    477528
    478529                        //when the user stops sliding  in 2 handle mode, recalculate diffs
    479530                        stop : function( event, ui ) {
    480                             if ( 2 == REVAPP._compareoneortwo ) {
     531                            if ( 2 === REVAPP._compareoneortwo ) {
    481532                                //calculate and generate a diff for comparing to the left handle
    482533                                //and the right handle, swap out when dragging
    483                                 if ( ! (REVAPP.left_model_loading && REVAPP.right_model.loading ) ) {
    484                                     REVAPP.reloadleftright();
     534
     535                                var index = $( ui.handle ).index(); //0 (left) or 1 (right)
     536
     537                                switch ( index ) {
     538                                    case 1: //left
     539                                        //left handle dragged & changed, reload right handle model
     540                                        if ( ! ( REVAPP._left_diff_start === ui.values[ 0 ] || REVAPP._left_model_loading ) )
     541                                            REVAPP.reloadright();
     542
     543                                        break;
     544
     545                                    case 2: //right
     546                                        //right handle dragged & changed, reload left handle model if changed
     547                                        if ( ! ( REVAPP._right_diff_start === ui.values[ 1 ] || REVAPP._right_model_loading ) ) {
     548                                            REVAPP.reloadleft();
     549                                        }
     550                                        break;
    485551                                }
    486552                            }
     
    508574                $( '#diff_count' ).html( REVAPP._right_diff );
    509575                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
     576                this.reset_restore_button();
    510577            },
    511578
     
    519586                $( '#diff_count' ).html( REVAPP._right_diff );
    520587                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
     588                this.reset_restore_button();
    521589            }
    522590        })
     
    526594    REVAPP = new wp.revisions.App();
    527595    //TODO consider enable back button to step back thru states?
    528     Backbone.history.start();
     596    //Backbone.history.start({pushState: true});
    529597
    530598}(jQuery));
  • trunk/wp-admin/revision.php

    r23581 r23639  
    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}" );
     31
     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    update_post_meta( $post->ID, '_post_restored_from', $restore_details );
    3139
    3240    wp_restore_post_revision( $revision->ID );
     
    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
     
    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;
     
    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
     
    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>
     
    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>
     
    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>
     
    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">
  • trunk/wp-includes/pluggable.php

    r23593 r23639  
    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 {
  • trunk/wp-includes/post-template.php

    r23594 r23639  
    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
Note: See TracChangeset for help on using the changeset viewer.