Ticket #23901: 23901.patch
File 23901.patch, 49.6 KB (added by , 12 years ago) |
---|
-
wp-admin/includes/ajax-actions.php
2130 2130 if ( 0 != $single_revision_id ) { 2131 2131 $right_revision = get_post( $single_revision_id ); 2132 2132 2133 if ( 0 == $compare_to )2133 if ( 0 == $compare_to ) 2134 2134 $left_revision = get_post( $post_id ); 2135 2135 2136 // make sure the right revision is the most recent2137 if ( $compare_two_mode && $right_revision->ID < $left_revision->ID ) {2138 $temp = $left_revision;2139 $left_revision = $right_revision;2140 $right_revision = $temp;2141 }2136 // make sure the right revision is the most recent 2137 if ( $compare_two_mode && $right_revision->ID < $left_revision->ID ) { 2138 $temp = $left_revision; 2139 $left_revision = $right_revision; 2140 $right_revision = $temp; 2141 } 2142 2142 2143 2143 $linesadded=0; 2144 2144 $linesdeleted=0; … … 2191 2191 $previous_revision_id = 0; 2192 2192 2193 2193 foreach ( $revisions as $revision ) : 2194 //error_log( ( $show_autosaves ));2195 2194 if ( empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 2196 2195 continue; 2197 2196 -
wp-admin/js/revisions.js
1 1 window.wp = window.wp || {}; 2 2 3 3 (function($) { 4 wp.revisions = {4 var Revision, Revisions, Diff, l10n, revisions; 5 5 6 views: {}, 6 revisions = wp.revisions = function() { 7 Diff = revisions.Diff = new Diff(); 8 }; 7 9 8 Model: Backbone.Model.extend({ 9 idAttribute: 'ID', 10 urlRoot: ajaxurl + '?action=revisions-data' + 11 '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 12 defaults: { 13 ID: 0, 14 revision_date_author: '', 15 revision_date_author_short: '', 16 revisiondiff: '<div class="diff-loading"><div class="spinner"></div></div>', 17 restoreaction: '', 18 revision_from_date_author: '', 19 revision_toload: false, 20 lines_added: 0, 21 lines_deleted: 0, 22 scope_of_changes: 'none', 23 previous_revision_id: 0 24 }, 10 _.extend( revisions, { model: {}, view: {}, controller: {} } ); 25 11 26 url: function() { 27 if ( 1 === REVAPP._compareOneOrTwo ) { 28 return this.urlRoot + 29 '&single_revision_id=' + this.id + 30 '&compare_to=' + this.get( 'previous_revision_id' ) + 31 '&post_id=' + wpRevisionsSettings.post_id; 32 } else { 33 return this.urlRoot + 34 '&single_revision_id=' + this.id; 35 } 12 // Link any localized strings. 13 l10n = revisions.model.l10n = typeof wpRevisionsL10n === 'undefined' ? {} : wpRevisionsL10n; 36 14 37 } 15 // Link any settings. 16 revisions.model.settings = l10n.settings || {}; 17 delete l10n.settings; 38 18 39 }),40 19 41 app: _.extend({}, Backbone.Events), 20 /** 21 * ======================================================================== 22 * CONTROLLERS 23 * ======================================================================== 24 */ 42 25 43 App: Backbone.Router.extend({ 44 _revisions: null, 45 _leftHandleRevisions: null, 46 _rightHandleRevisions: null, 47 _revisionsInteractions: null, 48 _revisionsOptions: null, 49 _leftDiff: 1, 50 _rightDiff: 1, 51 _autosaves: true, 52 _showSplitView: true, 53 _compareOneOrTwo: 1, 54 _leftModelLoading: false, // keep track of model loads 55 _rightModelLoading: false, // disallow slider interaction, also repeat loads, while loading 56 _tickmarkView: null, // the slider tickmarks 26 /** 27 * wp.revisions.controller.Diff 28 * 29 * Controlls the diff 30 */ 31 Diff = revisions.controller.Diff = Backbone.Model.extend( { 32 rightDiff: 1, 33 leftDiff: 1, 34 revisions: null, 35 leftHandleRevisions: null, 36 rightHandleRevisions: null, 37 revisionsInteractions: null, 38 revisionsOptions: null, 39 autosaves: true, 40 showSplitView: true, 41 singleRevision: true, 42 leftModelLoading: false, // keep track of model loads 43 rightModelLoading: false, // disallow slider interaction, also repeat loads, while loading 44 tickmarkView: null, // the slider tickmarks 45 slider: null, // the slider instance 57 46 58 routes: { 59 }, 47 constructor: function() { 48 this.slider = new revisions.view.Slider(); 49 if ( null === this.revisions ) { 50 this.revisions = new Revisions(); // set up collection 51 this.startRightModelLoading(); 60 52 61 reloadToLoadRevisions: function( model_collection, reverse_direction ) { 62 var self = this, 63 revisionsToLoad = model_collection.where( { revision_toload: true } ), 64 delay = 0; 65 // match slider to passed revision_id 66 _.each( revisionsToLoad, function( theModel ) { 67 if ( theModel.get( 'ID' ) == wpRevisionsSettings.revision_id ) { 68 self._rightDiff = self._revisions.indexOf( theModel ) + 1; 53 var self = this; 54 this.revisions.fetch({ // load revision data 55 success: function() { 56 self.stopRightModelLoading(); 57 self.completeApplicationSetup(); 69 58 } 70 71 59 }); 72 _.each( revisionsToLoad, function( theModel ) { 73 theModel.urlRoot = model_collection.url; 74 _.delay( function() { 75 theModel.fetch( { 76 update: true, 77 add: false, 78 remove: false, 79 success: function( model ) { 80 model.set( 'revision_toload', 'false' ); 60 } 61 }, 81 62 82 // stop spinner when all models are loaded 83 if ( 0 === model_collection.where( { revision_toload: true } ).length ) 84 self.stopModelLoadingSpinner(); 63 reloadToLoadRevisions: function( models, reverse_direction ) { 64 var self = this, 65 revisionsToLoad = models.where( { revision_toload: true } ), 66 delay = 0; 85 67 86 self._tickmarkView.render(); 68 // match slider to passed revision_id 69 _.each( revisionsToLoad, function( theModel ) { 70 if ( theModel.get( 'ID' ) == revisions.model.settings.revision_id ) 71 self.rightDiff = self.revisions.indexOf( theModel ) + 1; 72 }); 87 73 88 var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'), 89 scope_of_changes = 'vsmall'; 74 _.each( revisionsToLoad, function( theModel ) { 75 theModel.urlRoot = models.url(); 76 _.delay( function() { 77 theModel.fetch( { 78 update: true, 79 add: false, 80 remove: false, 81 success: function( model ) { 82 model.set( 'revision_toload', 'false' ); 90 83 91 // Note: hard coded scope of changes 92 // TODO change to dynamic based on range of values 93 if ( total_changes > 1 && total_changes <= 3 ) { 94 scope_of_changes = 'small'; 95 } else if(total_changes > 3 && total_changes <= 5 ) { 96 scope_of_changes = 'med'; 97 } else if(total_changes > 5 && total_changes <= 10 ) { 98 scope_of_changes = 'large'; 99 } else if(total_changes > 10 ) { 100 scope_of_changes = 'vlarge'; 101 } 102 model.set( 'scope_of_changes', scope_of_changes ); 103 if ( 0 !== self._rightDiff && 104 model.get( 'ID' ) === self._revisions.at( self._rightDiff - 1 ).get( 'ID' ) ) { 105 // reload if current model refreshed 106 self._revisionView.render(); 107 } 84 // stop spinner when all models are loaded 85 if ( 0 === models.where( { revision_toload: true } ).length ) 86 self.stopModelLoadingSpinner(); 108 87 88 self.tickmarkView.render(); 89 90 var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'), 91 scope_of_changes = 'vsmall'; 92 93 // Note: hard coded scope of changes 94 // TODO change to dynamic based on range of values 95 if ( total_changes > 1 && total_changes <= 3 ) { 96 scope_of_changes = 'small'; 97 } else if( total_changes > 3 && total_changes <= 5 ) { 98 scope_of_changes = 'med'; 99 } else if( total_changes > 5 && total_changes <= 10 ) { 100 scope_of_changes = 'large'; 101 } else if( total_changes > 10 ) { 102 scope_of_changes = 'vlarge'; 109 103 } 110 });111 }, delay ) ;112 delay = delay + 150; // stagger model loads to avoid hammering server with requests113 }114 );115 },104 model.set( 'scope_of_changes', scope_of_changes ); 105 if ( 0 !== self.rightDiff && 106 model.get( 'ID' ) === self.revisions.at( self.rightDiff - 1 ).get( 'ID' ) ) { 107 // reload if current model refreshed 108 self.revisionView.render(); 109 } 116 110 117 startLeftModelLoading: function() { 118 this._leftModelLoading = true; 119 $('.revisiondiffcontainer').addClass('leftmodelloading'); 120 }, 111 } 112 } ); 113 }, delay ) ; 114 delay = delay + 150; // stagger model loads to avoid hammering server with requests 115 } 116 ); 117 }, 121 118 122 stopLeftModelLoading: function() { 123 this._leftModelLoading = false; 124 }, 119 startLeftModelLoading: function() { 120 this.leftModelLoading = true; 121 $('.revisiondiffcontainer').addClass('leftmodelloading'); 122 }, 125 123 126 startRightModelLoading: function() { 127 this._rightModelLoading = true; 128 $('.revisiondiffcontainer').addClass('rightmodelloading'); 129 }, 124 stopLeftModelLoading: function() { 125 this.leftModelLoading = false; 126 }, 130 127 131 stopRightModelLoading: function() { 132 this._rightModelLoading = false; 133 }, 128 startRightModelLoading: function() { 129 this.rightModelLoading = true; 130 $('.revisiondiffcontainer').addClass('rightmodelloading'); 131 }, 134 132 135 stopModelLoadingSpinner: function() { 136 $('.revisiondiffcontainer').removeClass('rightmodelloading'); 137 $('.revisiondiffcontainer').removeClass('leftmodelloading'); 138 }, 133 stopRightModelLoading: function() { 134 this.rightModelLoading = false; 135 }, 139 136 140 reloadModel: function() { 141 if ( 2 === this._compareOneOrTwo ) { 142 this.reloadLeftRight(); 143 } else { 144 this.reloadModelSingle(); 145 } 146 }, 137 stopModelLoadingSpinner: function() { 138 $('.revisiondiffcontainer').removeClass('rightmodelloading'); 139 $('.revisiondiffcontainer').removeClass('leftmodelloading'); 140 }, 147 141 148 // load the models for the single handle mode 149 reloadModelSingle: function() { 150 var self = this; 151 self._revisions.url = ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 152 '&show_autosaves=' + self._autosaves + 153 '&show_split_view=' + self._showSplitView + 154 '&nonce=' + wpRevisionsSettings.nonce; 155 self.startRightModelLoading(); 156 self._revisions.fetch({ // reload revision data 157 success: function() { 158 console.log('loaded'); 159 // self.stopRightModelLoading(); 160 // REVAPP._rightDiff -= 1; 161 var revisionCount = self._revisions.length; 162 self._revisionView.model = self._revisions; 163 self._revisionView.render(); 164 self.reloadToLoadRevisions( self._revisions ); 165 self._tickmarkView.model = self._revisions; 166 self._tickmarkView.render(); 167 $( '#slider' ).slider( 'option', 'max', revisionCount - 1 ); // TODO: test this, if autosave option changed 168 $( '#slider' ).slider( 'value', self._rightDiff - 1 ).trigger( 'slide' ); 142 reloadModel: function() { 143 if ( this.singleRevision ) { 144 this.reloadModelSingle(); 145 } else { 146 this.reloadLeftRight(); 147 } 148 }, 169 149 170 }, 150 // load the models for the single handle mode 151 reloadModelSingle: function() { 152 var self = this; 171 153 172 error: function() { 173 self.stopRightModelLoading(); 174 } 154 // TODO: Only updates the query args yet 155 self.revisions.reload({ 156 'showAutosaves': self.autosaves, 157 'showSplitView': self.showSplitView 158 }); 175 159 176 }); 177 }, 160 self.startRightModelLoading(); 161 self.revisions.fetch({ // reload revision data 162 success: function() { 163 var revisionCount = self.revisions.length; 164 self.revisionView.model = self.revisions; 165 self.revisionView.render(); 166 self.reloadToLoadRevisions( self.revisions ); 167 self.tickmarkView.model = self.revisions; 168 self.tickmarkView.render(); 169 self.slider.refresh({ 170 'max': revisionCount - 1, 171 'value': self.rightDiff - 1 172 }, true); 173 }, 178 174 179 // load the models for the left handle 180 reloadLeft: function() { 181 var self = this; 182 self.startLeftModelLoading(); 183 self._leftHandleRevisions = new wp.revisions.Collection(); 175 error: function() { 176 self.stopRightModelLoading(); 177 } 184 178 185 self._leftHandleRevisions.url = 186 ajaxurl + 187 '?action=revisions-data&compare_to=' + self._revisions.at( self._rightDiff - 1 ).get( 'ID' ) + 188 '&post_id=' + wpRevisionsSettings.post_id + 189 '&show_autosaves=' + REVAPP._autosaves + 190 '&show_split_view=' + REVAPP._showSplitView + 191 '&nonce=' + wpRevisionsSettings.nonce + 192 '&right_handle_at=' + ( self._rightDiff ); 179 }); 180 }, 193 181 194 self._leftHandleRevisions.fetch({ 182 // load the models for the left handle 183 reloadLeft: function() { 184 var self = this; 185 self.startLeftModelLoading(); 186 self.leftHandleRevisions = new Revisions({ 187 'compareTo': self.revisions.at( self.leftDiff ).get( 'ID' ), 188 'showAutosaves': self.autosaves, 189 'showSplitView': self.showSplitView, 190 'rightHandleAt': self.rightDiff 191 }); 195 192 196 success: function(){ 197 self.stopLeftModelLoading(); 198 self.reloadToLoadRevisions( self._leftHandleRevisions ); 199 self._tickmarkView.model = self._leftHandleRevisions; 200 $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 201 // ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off 202 // the number of models in the collection might get shorter, this ensures right handle is not beyond last model 203 if ( self._rightDiff > self._revisions.length ) 204 self._rightDiff = self._revisions.length; 205 }, 193 self.leftHandleRevisions.fetch({ 194 success: function(){ 195 self.stopLeftModelLoading(); 196 self.reloadToLoadRevisions( self.leftHandleRevisions ); 197 self.tickmarkView.model = self.leftHandleRevisions; 198 self.slider.refresh({ 199 'max': self.revisions.length 200 }); 201 // ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off 202 // the number of models in the collection might get shorter, this ensures right handle is not beyond last model 203 if ( self.rightDiff > self.revisions.length ) 204 self.rightDiff = self.revisions.length; 205 }, 206 206 207 208 209 210 211 207 error: function() { 208 self.stopLeftModelLoading(); 209 } 210 }); 211 }, 212 212 213 // load the models for the right handle 214 reloadRight: function() { 215 var self = this; 216 self.startRightModelLoading(); 217 self._rightHandleRevisions = new wp.revisions.Collection(); 213 // load the models for the right handle 214 reloadRight: function() { 215 var self = this; 216 self.startRightModelLoading(); 217 self.rightHandleRevisions = new Revisions({ 218 'compareTo': self.revisions.at( self.leftDiff ).get( 'ID' ) - 1, 219 'showAutosaves': self.autosaves, 220 'showSplitView': self.showSplitView 221 }); 218 222 219 self._rightHandleRevisions.url = 220 ajaxurl + 221 '?action=revisions-data&compare_to=' + ( self._revisions.at( self._leftDiff ).get( 'ID' ) - 1 )+ 222 '&post_id=' + wpRevisionsSettings.post_id + 223 '&show_autosaves=' + REVAPP._autosaves + 224 '&show_split_view=' + REVAPP._showSplitView + 225 '&nonce=' + wpRevisionsSettings.nonce; 223 self.rightHandleRevisions.fetch({ 224 success: function(){ 225 self.stopRightModelLoading(); 226 self.reloadToLoadRevisions( self.rightHandleRevisions ); 227 self.tickmarkView.model = self.rightHandleRevisions; 228 self.slider.refresh({ 229 'max': self.revisions.length, 230 'values': [ self.leftDiff, self.rightDiff] 231 }, true); 232 }, 226 233 227 self._rightHandleRevisions.fetch({ 234 error: function( response ) { 235 self.stopRightModelLoading(); 236 } 237 }); 228 238 229 success: function(){ 230 self.stopRightModelLoading(); 231 self.reloadToLoadRevisions( self._rightHandleRevisions ); 232 self._tickmarkView.model = self._rightHandleRevisions; 233 $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 234 $( '#slider' ).slider( 'values', [ REVAPP._leftDiff, REVAPP._rightDiff] ).trigger( 'slide' ); 239 }, 235 240 236 // REVAPP._revisionView.render(); 241 reloadLeftRight: function() { 242 this.startRightModelLoading(); 243 this.startLeftModelLoading(); 244 this.reloadLeft(); 245 this.reloadRight(); 246 }, 237 247 238 }, 248 // TODO: New view 249 addTooltip: function( handle, message ) { 239 250 240 error: function( response ) { 241 self.stopRightModelLoading(); 251 handle.attr( 'title', '' ).tooltip({ 252 track: false, 253 254 position: { 255 my: "left-30 top-66", 256 at: "top left", 257 using: function( position, feedback ) { 258 $( this ).css( position ); 259 $( "<div>" ) 260 .addClass( "arrow" ) 261 .addClass( feedback.vertical ) 262 .addClass( feedback.horizontal ) 263 .appendTo( $( this ) ); 242 264 } 243 }); 265 }, 266 show: false, 267 hide: false, 268 content: function() { 269 return message; 270 } 244 271 245 }, 272 } ); 273 }, 246 274 247 reloadLeftRight: function() { 248 this.startRightModelLoading(); 249 this.startLeftModelLoading(); 250 this.reloadLeft(); 251 this.reloadRight(); 252 }, 275 completeApplicationSetup: function() { 276 this.revisionView = new revisions.view.Diff({ 277 model: this.revisions 278 }); 279 this.revisionView.render(); 253 280 254 /* 255 * initialize the revision application 256 */ 257 initialize: function( options ) { 258 var self = this; // store the application instance 259 if (this._revisions === null) { 260 self._revisions = new wp.revisions.Collection(); // set up collection 261 self.startRightModelLoading(); 262 self._revisions.fetch({ // load revision data 281 this.reloadToLoadRevisions( this.revisions ); 263 282 264 success: function() { 265 self.stopRightModelLoading(); 266 // self._rightHandleRevisions = self._revisions; 267 self.completeApplicationSetup(); 268 } 269 }); 270 } 271 return this; 272 }, 283 this.revisionsInteractions = new revisions.view.Interact({ 284 model: this.revisions 285 }); 286 this.revisionsInteractions.render(); 273 287 274 addTooltip: function( handle, message ) { 288 this.tickmarkView = new revisions.view.Tickmarks({ 289 model: this.revisions 290 }); 291 this.tickmarkView.render(); 292 this.tickmarkView.resetTicks(); 275 293 276 handle.attr( 'title', '' ).tooltip({277 track: false,294 } 295 }); 278 296 279 position: {280 my: "left-30 top-66",281 at: "top left",282 using: function( position, feedback ) {283 $( this ).css( position );284 $( "<div>" )285 .addClass( "arrow" )286 .addClass( feedback.vertical )287 .addClass( feedback.horizontal )288 .appendTo( $( this ) );289 }290 },291 show: false,292 hide: false,293 content: function() {294 return message;295 }296 297 297 } ); 298 }, 299 /**/ 298 /** 299 * ======================================================================== 300 * VIEWS 301 * ======================================================================== 302 */ 300 303 301 completeApplicationSetup: function() { 302 this._revisionView = new wp.revisions.views.View({ 303 model: this._revisions 304 }); 305 this._revisionView.render(); 306 $( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 ); 304 /** 305 * wp.revisions.view.Slider 306 * 307 * The slider 308 */ 309 revisions.view.Slider = Backbone.View.extend({ 310 el: $( '#slider' ), 311 singleRevision: true, 307 312 308 this.reloadToLoadRevisions( this._revisions ); 313 initialize: function( options ) { 314 this.options = _.defaults( options || {}, { 315 value: 0, 316 min: 0, 317 max: 1, 318 step: 1 319 }); 320 }, 309 321 310 this._revisionsInteractions = new wp.revisions.views.Interact({ 311 model: this._revisions 312 }); 313 this._revisionsInteractions.render(); 322 slide: function( event, ui ) { 323 if ( this.singleRevision ) { 324 Diff.rightDiff = ( ui.value + 1 ); 325 Diff.revisionView.render(); 326 } else { 327 if ( ui.values[0] === ui.values[1] ) // prevent compare to self 328 return false; 314 329 315 this._tickmarkView = new wp.revisions.views.Tickmarks({316 model: this._revisions317 });318 this._tickmarkView.render();319 this._tickmarkView.resetTicks();330 var index = $( ui.handle ).index(); // 0 (left) or 2 (right) 331 switch ( index ) { 332 case 0: // left 333 if ( Diff.leftModelLoading ) // left model still loading, prevent sliding left handle 334 return false; 320 335 336 Diff.leftDiff = ui.values[0]; 337 break; 321 338 322 /* 323 .on( 'mouseup', function( event ) { 324 REVAPP._keep_tooltip_open = false; 325 $( this ).find('.ui-slider-tooltip').hide(); 326 } ).on( 'mousedown', function( event ) { 327 REVAPP._keep_tooltip_open = true; 328 } ).on( 'mouseout', function( event ) { 329 if ( REVAPP._keep_tooltip_open) 330 event.stopImmediatePropagation(); 331 }); 332 */ 333 /* 334 // Options hidden for now, moving to screen options 335 this._revisionsOptions = new wp.revisions.views.Options({ 336 model: this._revisions 337 }); 338 this._revisionsOptions.render(); 339 */ 339 case 2: // right 340 if ( Diff.rightModelLoading ) // right model still loading, prevent sliding right handle 341 return false; 340 342 341 }342 })343 };343 Diff.rightDiff = ui.values[1]; 344 break; 345 } 344 346 345 wp.revisions.Collection = Backbone.Collection.extend({ 346 model: wp.revisions.Model, 347 url: ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 348 '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 347 if ( 0 === Diff.leftDiff ) { 348 $( '.revisiondiffcontainer' ).addClass( 'currentversion' ); 349 } else { 350 $( '.revisiondiffcontainer' ).removeClass( 'currentversion' ); 351 } 349 352 350 initialize: function() {353 Diff.revisionView.render(); 351 354 } 352 } );355 }, 353 356 354 _.extend(wp.revisions.views, { 357 start: function( event, ui ) { 358 // Not needed in one mode 359 if ( this.singleRevision ) 360 return; 355 361 356 // Ticks inside slider view 357 Tickmarks: Backbone.View.extend({ 358 el: $('#diff-slider-ticks')[0], 359 tagName: 'diff-slider-ticks-view', 360 className: 'diff-slider-ticks-container', 361 template: wp.template('revision-ticks'), 362 model: wp.revisions.Model, 362 var index = $( ui.handle ).index(); // 0 (left) or 2 (right) 363 switch ( index ) { 364 case 0: // left handle drag 365 if ( Diff.leftModelLoading ) // left model still loading, prevent sliding left handle 366 return false; 363 367 364 resetTicks: function() { 365 var sliderMax = $( '#slider' ).slider( 'option', 'max'); 366 var sliderWidth = $( '#slider' ).width(); 367 var adjustMax = ( 2 === REVAPP._compareOneOrTwo ) ? 1 : 0; 368 var tickWidth = Math.floor( sliderWidth / ( sliderMax - adjustMax ) ); 368 Diff.revisionView.draggingLeft = true; 369 369 370 // TODO: adjust right margins for wider ticks so they stay centered on handle stop point 370 if ( Diff.revisionView.model !== Diff.leftHandleRevisions && 371 null !== Diff.leftHandleRevisions ) { 372 Diff.revisionView.model = Diff.leftHandleRevisions; 373 Diff.tickmarkView.model = Diff.leftHandleRevisions; 374 Diff.tickmarkView.render(); 375 } 371 376 372 // set minimum and maximum widths for tick marks 373 tickWidth = (tickWidth > 50 ) ? 50 : tickWidth; 374 tickWidth = (tickWidth < 10 ) ? 10 : tickWidth; 377 Diff.leftDiffStart = ui.values[ 0 ]; 378 break; 375 379 376 sliderWidth = tickWidth * (sliderMax - adjustMax ) + 1; 380 case 2: // right 381 if ( Diff.rightModelLoading || 0 === Diff.rightHandleRevisions.length) // right model still loading, prevent sliding right handle 382 return false; 377 383 378 $( '#slider' ).width( sliderWidth ); 379 $( '.diff-slider-ticks-wrapper' ).width( sliderWidth ); 380 $( '#diffslider' ).width( sliderWidth ); 381 $( '#diff-slider-ticks' ).width( sliderWidth ); 384 if ( Diff.revisionView.model !== Diff.rightHandleRevisions && 385 null !== Diff.rightHandleRevisions ) { 386 Diff.revisionView.model = Diff.rightHandleRevisions; 387 Diff.tickmarkView.model = Diff.rightHandleRevisions; 388 Diff.tickmarkView.render(); 389 } 382 390 383 var aTickWidth = $( '.revision-tick' ).width(); 391 Diff.revisionView.draggingLeft = false; 392 Diff.rightDiffStart = ui.values[1]; 393 break; 394 } 395 }, 384 396 385 if ( tickWidth !== aTickWidth ) { // is the width already set correctly?386 $( '.revision-tick' ).each( function( ) {387 $(this).css( 'margin-right', tickWidth - 1 + 'px'); // space the ticks out using right margin388 });397 stop: function( event, ui ) { 398 // Not needed in one mode 399 if ( this.singleRevision ) 400 return; 389 401 390 if( 2 === REVAPP._compareOneOrTwo ) { 391 $( '.revision-tick' ).first().remove(); // TODO - remove the check 392 } 393 $( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin 394 } 402 // calculate and generate a diff for comparing to the left handle 403 // and the right handle, swap out when dragging 404 var index = $( ui.handle ).index(); // 0 (left) or 1 (right) 395 405 396 }, 406 switch ( index ) { 407 case 1: // left 408 // left handle dragged & changed, reload right handle model 409 if ( Diff.leftDiffStart !== ui.values[0] ) 410 Diff.reloadRight(); 397 411 398 // render the tickmark view 399 render: function() { 400 var self = this; 412 break; 401 413 402 if ( null !== self.model ) { 403 var addHtml = ""; 404 _.each ( self.model.models, function( theModel ) { 405 addHtml = addHtml + self.template ( theModel.toJSON() ); 406 }); 407 self.$el.html( addHtml ); 414 case 2: // right 415 // right handle dragged & changed, reload left handle model if changed 416 if ( Diff.rightDiffStart !== ui.values[1] ) 417 Diff.reloadLeft(); 408 418 409 } 410 self.resetTicks(); 411 return self; 419 break; 412 420 } 413 } ),421 }, 414 422 415 // primary revision diff view 416 View: Backbone.View.extend({ 417 el: $('#backbonerevisionsdiff')[0], 418 tagName: 'revisionvview', 419 className: 'revisionview-container', 420 template: wp.template('revision'), 421 comparetwochecked: '', 422 draggingLeft: false, 423 addTooltip: function() { 424 // Own view? 425 }, 423 426 424 // render the revisions 425 render: function() { 426 var addHtml = ''; 427 var thediff; 428 // compare two revisions mode? 427 width: function() { 428 return $( '#slider' ).width(); 429 }, 429 430 430 if ( 2 === REVAPP._compareOneOrTwo ) { 431 setWidth: function( width ) { 432 return $( '#slider' ).width( width ); 433 }, 431 434 432 this.comparetwochecked = 'checked'; 433 if ( this.draggingLeft ) { 434 thediff = REVAPP._leftDiff -1; 435 if ( this.model.at( thediff ) ) { 436 addHtml = this.template( _.extend( 437 this.model.at( thediff ).toJSON(), 438 { comparetwochecked: this.comparetwochecked } // keep the checkmark checked 439 ) ); 440 } 441 } else { // dragging right handle 442 thediff = REVAPP._rightDiff -1; 443 if ( this.model.at( thediff ) ) { 444 addHtml = this.template( _.extend( 445 this.model.at( thediff ).toJSON(), 446 { comparetwochecked: this.comparetwochecked } // keep the checkmark checked 447 ) ); 448 } 449 } 450 } else { // end compare two revisions mode, eg only one slider handle 451 this.comparetwochecked = ''; 452 if ( this.model.at( REVAPP._rightDiff - 1 ) ) { 453 addHtml = this.template( _.extend( 454 this.model.at( REVAPP._rightDiff - 1 ).toJSON(), 455 { comparetwochecked: this.comparetwochecked } // keep the checkmark unchecked 456 ) ); 457 } 458 } 459 this.$el.html( addHtml ); 460 if ( this.model.length < 3 ) { 461 $( 'div#comparetworevisions' ).hide(); // don't allow compare two if fewer than three revisions 462 } 463 if ( this.model.length < 2 ) { 464 $( 'div#diffslider' ).hide(); // don't allow compare two if fewer than three revisions 465 $( 'div.diff-slider-ticks-wrapper' ).hide(); 466 } 435 refresh: function( options, slide ) { 436 $( '#slider' ).slider( 'option', options ); 467 437 468 // add tooltips to the handles 469 if ( 2 === REVAPP._compareOneOrTwo ) { 470 REVAPP.addTooltip ( $( 'a.ui-slider-handle.left-handle' ), 471 ( REVAPP._leftDiff < 0 ) ? '' : REVAPP._revisions.at( REVAPP._leftDiff - 1 ).get( 'revision_date_author_short' ) ); 472 REVAPP.addTooltip ( $( 'a.ui-slider-handle.right-handle' ), 473 ( REVAPP._rightDiff > REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._rightDiff - 1 ).get( 'revision_date_author_short' ) ); 474 } else { 475 REVAPP.addTooltip ( $( 'a.ui-slider-handle' ), 476 ( REVAPP._rightDiff > REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._rightDiff - 1 ).get( 'revision_date_author_short' ) ); 477 } 438 // Triggers the slide event 439 if ( slide ) 440 $( '#slider' ).trigger( 'slide' ); 441 }, 478 442 479 // hide the restore button when on the last sport/current post data 480 if ( REVAPP._rightDiff === REVAPP._revisions.length ){ 481 $( '.restore-button' ).hide(); 482 } else { 483 $( '.restore-button' ).show(); 484 } 443 option: function( key ) { 444 return $( '#slider' ).slider( 'option', key ); 445 }, 485 446 486 return this; 487 }, 447 render: function() { 448 var self = this; 449 // this.$el doesn't work, why? 450 $( '#slider' ).slider( { 451 slide: $.proxy( self.slide, self ), 452 start: $.proxy( self.start, self ), 453 stop: $.proxy( self.stop, self ) 454 } ); 488 455 489 // the compare two button is in this view, add the interaction here490 events: {491 'click #comparetwo': 'clickcomparetwo'492 },456 // Set options 457 this.refresh( this.options ); 458 } 459 }); 493 460 494 // turn on/off the compare two mmode 495 clickcomparetwo: function(){ 496 self = this; 461 /** 462 * wp.revisions.view.Tickmarks 463 * 464 * The slider tickmarks. 465 */ 466 revisions.view.Tickmarks = Backbone.View.extend({ 467 el: $('#diff-slider-ticks'), 468 template: wp.template('revision-ticks'), 469 model: Revision, 497 470 498 if ( $( 'input#comparetwo' ).is( ':checked' ) ) { // compare 2 mode 499 REVAPP._compareOneOrTwo = 2 ; 471 resetTicks: function() { 472 var sliderMax = Diff.slider.option( 'max' ); 473 var sliderWidth = Diff.slider.width(); 474 var adjustMax = Diff.singleRevision ? 0 : 1; 475 var tickWidth = Math.floor( sliderWidth / ( sliderMax - adjustMax ) ); 500 476 501 if ( 1 === REVAPP._rightDiff ) 502 REVAPP._rightDiff = 2; 503 REVAPP._revisionView.draggingLeft = false; 477 // TODO: adjust right margins for wider ticks so they stay centered on handle stop point 504 478 505 wpRevisionsSettings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision506 REVAPP.reloadLeftRight();507 REVAPP._revisionView.model = REVAPP._rightHandleRevisions;479 // set minimum and maximum widths for tick marks 480 tickWidth = (tickWidth > 50 ) ? 50 : tickWidth; 481 tickWidth = (tickWidth < 10 ) ? 10 : tickWidth; 508 482 509 } else { // compare one mode 510 REVAPP._compareOneOrTwo = 1 ; 511 REVAPP._revisionView.draggingLeft = false; 512 // REVAPP._leftDiff = 0; 513 // REVAPP._rightDiff = (REVAPP._revisions.length <= REVAPP._rightDiff ) ? REVAPP._rightDiff + 1 : REVAPP._rightDiff + 1; 514 REVAPP.reloadModelSingle(); 515 } 516 // REVAPP._revisionView.render(); 517 REVAPP._revisionsInteractions.render(); 518 REVAPP._tickmarkView.render(); 483 sliderWidth = tickWidth * (sliderMax - adjustMax ) + 1; 519 484 520 } 521 }), 485 //$( '#slider' ).width( sliderWidth ); 486 Diff.slider.setWidth( sliderWidth ); 487 $( '.diff-slider-ticks-wrapper' ).width( sliderWidth ); 488 $( '#diffslider' ).width( sliderWidth ); 489 $( '#diff-slider-ticks' ).width( sliderWidth ); 522 490 523 // options view for show autosaves and show split view options 524 /* DISABLED for now 525 Options: Backbone.View.extend({ 526 el: $('#backbonerevisionsoptions')[0], 527 tagName: 'revisionoptionsview', 528 className: 'revisionoptions-container', 529 template: wp.template('revisionoptions'), 491 var aTickWidth = $( '.revision-tick' ).width(); 530 492 531 // render the options view 532 render: function() { 533 var addHtml = this.template; 534 this.$el.html( addHtml ); 535 return this; 536 }, 493 if ( tickWidth !== aTickWidth ) { // is the width already set correctly? 494 $( '.revision-tick' ).each( function( ) { 495 $(this).css( 'margin-right', tickWidth - 1 + 'px'); // space the ticks out using right margin 496 }); 537 497 538 // add options interactions 539 events: { 540 'click #toggleshowautosaves': 'toggleshowautosaves', 541 'click #showsplitview': 'showsplitview' 542 }, 543 544 // toggle include autosaves 545 toggleshowautosaves: function() { 546 var self = this; 547 if ( $( '#toggleshowautosaves' ).is( ':checked' ) ) { 548 REVAPP._autosaves = true ; 549 } else { 550 REVAPP._autosaves = false ; 498 if( ! Diff.singleRevision ) { 499 $( '.revision-tick' ).first().remove(); // TODO - remove the check 551 500 } 501 $( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin 502 } 552 503 553 // refresh the model data 554 REVAPP.reloadModel(); 555 }, 504 }, 556 505 557 // toggle showing the split diffview558 showsplitview:function() {559 506 // render the tickmark view 507 render: function() { 508 var self = this; 560 509 561 if ( $( 'input#showsplitview' ).is( ':checked' ) ) { 562 REVAPP._showSplitView = 'true'; 563 $('.revisiondiffcontainer').addClass('diffsplit'); 564 } else { 565 REVAPP._showSplitView = ''; 566 $('.revisiondiffcontainer').removeClass('diffsplit'); 567 } 510 if ( null !== self.model ) { 511 var addHtml = ""; 512 _.each ( self.model.models, function( theModel ) { 513 addHtml = addHtml + self.template ( theModel.toJSON() ); 514 }); 515 self.$el.html( addHtml ); 568 516 569 REVAPP.reloadModel();570 517 } 571 }), 572 */ 573 // main interactions view 574 Interact: Backbone.View.extend({ 575 el: $('#backbonerevisionsinteract')[0], 576 tagName: 'revisionvinteract', 577 className: 'revisionvinteract-container', 578 template: wp.template('revisionvinteract'), 518 self.resetTicks(); 519 return self; 520 } 521 }); 579 522 580 initialize: function() { 581 }, 523 /** 524 * wp.revisions.view.Interact 525 * 526 * Next/Prev buttons and the slider 527 */ 528 // TODO: Change Interact to something else. 529 revisions.view.Interact = Backbone.View.extend({ 530 el: $('#backbonerevisionsinteract'), 531 template: wp.template('revision-interact'), 582 532 583 render: function() { 584 var self = this; 533 // next and previous buttons, only available in compare one mode 534 events: { 535 'click #next': 'nextRevision', 536 'click #previous': 'previousRevision' 537 }, 585 538 586 var addHtml = this.template;587 this.$el.html( addHtml );539 render: function() { 540 var self = this; 588 541 589 var modelcount = REVAPP._revisions.length; 542 var addHtml = this.template; 543 this.$el.html( addHtml ); 590 544 591 slider = $( "#slider" ); 592 if ( 1 === REVAPP._compareOneOrTwo ) { 593 // set up the slider with a single handle 594 slider.slider({ 595 value: REVAPP._rightDiff - 1, 596 min: 0, 597 max: modelcount - 1, 598 step: 1, 545 var modelcount = Diff.revisions.length; 599 546 547 Diff.slider.singleRevision = Diff.singleRevision; 548 Diff.slider.render(); 600 549 601 // slide interactions for one handles slider 602 slide: function( event, ui ) { 550 if ( Diff.singleRevision ) { 551 Diff.slider.refresh({ 552 value: Diff.rightDiff - 1, 553 min: 0, 554 max: modelcount - 1 555 }); 603 556 604 REVAPP._rightDiff = ( ui.value + 1 ); 605 REVAPP._revisionView.render(); 606 /* 607 $( 'a.ui-slider-handle' ).tooltip( { 608 content: REVAPP._revisions.at( ui.value ).get( 'revision_date_author_short' ), 609 position: { 610 my: "top-65", 611 using: function( position, feedback ) { 612 $( this ).css( position ); 613 $( "<div>" ) 614 .addClass( "arrow" ) 615 .addClass( feedback.vertical ) 616 .addClass( feedback.horizontal ) 617 .appendTo( this ); 618 } 619 } 620 });// .trigger( 'close' ).trigger( 'open' ); 621 */ 622 } 623 }); 624 $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' ); 557 $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' ); 625 558 626 } else { // comparing more than one, eg 2 627 // set up the slider with two handles 628 slider.slider({ 629 values: [ REVAPP._leftDiff, REVAPP._rightDiff + 1 ], 630 min: 1, 631 max: modelcount + 1, 632 step: 1, 633 range: true, 559 } else { 560 Diff.slider.refresh({ 561 values: [ Diff.leftDiff, Diff.rightDiff + 1 ], 562 min: 1, 563 max: modelcount + 1, 564 range: true 565 }); 634 566 635 // in two handled mode when user starts dragging, swap in precalculated diff for handle 636 start: function(event, ui ) { 637 var index = $( ui.handle ).index(); // 0 (left) or 1 (right) 638 switch ( index ) { 639 case 1: // left handle drag 640 if ( REVAPP._leftModelLoading ) // left model still loading, prevent sliding left handle 641 return false; 567 $( '.revisiondiffcontainer' ).addClass( 'comparetwo' ); 568 $( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' ); 642 569 643 REVAPP._revisionView.draggingLeft = true;570 } 644 571 645 if ( REVAPP._revisionView.model !== REVAPP._leftHandleRevisions && 646 null !== REVAPP._leftHandleRevisions ) { 647 REVAPP._revisionView.model = REVAPP._leftHandleRevisions; 648 REVAPP._tickmarkView.model = REVAPP._leftHandleRevisions; 649 REVAPP._tickmarkView.render(); 650 } 572 return this; 573 }, 651 574 652 REVAPP._leftDiffStart = ui.values[ 0 ]; 653 break; 575 // go to the next revision 576 nextRevision: function() { 577 if ( Diff.rightDiff < this.model.length ) // unless at right boundry 578 Diff.rightDiff = Diff.rightDiff + 1 ; 654 579 655 case 2: // right 656 if ( REVAPP._rightModelLoading || 0 === REVAPP._rightHandleRevisions.length) // right model still loading, prevent sliding right handle 657 return false; 580 Diff.revisionView.render(); 658 581 659 if ( REVAPP._revisionView.model !== REVAPP._rightHandleRevisions && 660 null !== REVAPP._rightHandleRevisions ) { 661 REVAPP._revisionView.model = REVAPP._rightHandleRevisions; 662 REVAPP._tickmarkView.model = REVAPP._rightHandleRevisions; 663 REVAPP._tickmarkView.render(); 664 } 582 Diff.slider.refresh({ 583 value: Diff.rightDiff - 1 584 }, true ); 585 }, 665 586 666 REVAPP._revisionView.draggingLeft = false; 667 REVAPP._rightDiffStart = ui.values[1]; 668 break; 669 } 670 }, 587 // go the the previous revision 588 previousRevision: function() { 589 if ( Diff.rightDiff > 1 ) // unless at left boundry 590 Diff.rightDiff = Diff.rightDiff - 1 ; 671 591 672 // when sliding in two handled mode change appropriate value 673 slide: function( event, ui ) { 674 if ( ui.values[0] === ui.values[1] ) // prevent compare to self 675 return false; 592 Diff.revisionView.render(); 676 593 677 var index = $( ui.handle ).index(); // 0 (left) or 1 (right) 594 Diff.slider.refresh({ 595 value: Diff.rightDiff - 1 596 }, true ); 597 } 598 }); 678 599 679 switch ( index ) { 680 case 1: // left 681 if ( REVAPP._leftModelLoading ) // left model still loading, prevent sliding left handle 682 return false; 600 /** 601 * wp.revisions.view.Diff 602 * 603 * Next/Prev buttons and the slider 604 */ 605 revisions.view.Diff = Backbone.View.extend({ 606 el: $('#backbonerevisionsdiff'), 607 template: wp.template('revision'), 608 comparetwochecked: '', 609 draggingLeft: false, 683 610 684 REVAPP._leftDiff = ui.values[0]; 685 break; 611 // the compare two button is in this view, add the interaction here 612 events: { 613 'click #comparetwo': 'compareTwo', 614 'click #restore': 'restore' 615 }, 686 616 687 case 2: // right 688 if ( REVAPP._rightModelLoading ) // right model still loading, prevent sliding right handle 689 return false; 617 // render the revisions 618 render: function() { 619 var addHtml = ''; 620 var thediff; 690 621 691 REVAPP._rightDiff = ui.values[1]; 692 break; 693 } 622 // compare two revisions mode? 623 if ( ! Diff.singleRevision ) { 624 this.comparetwochecked = 'checked'; 625 if ( this.draggingLeft ) { 626 thediff = Diff.leftDiff - 1; 627 if ( this.model.at( thediff ) ) { 628 addHtml = this.template( _.extend( 629 this.model.at( thediff ).toJSON(), 630 { comparetwochecked: this.comparetwochecked } // keep the checkmark checked 631 ) ); 632 } 633 } else { // dragging right handle 634 thediff = Diff.rightDiff -1; 635 if ( this.model.at( thediff ) ) { 636 addHtml = this.template( _.extend( 637 this.model.at( thediff ).toJSON(), 638 { comparetwochecked: this.comparetwochecked } // keep the checkmark checked 639 ) ); 640 } 641 } 642 } else { // end compare two revisions mode, eg only one slider handle 643 this.comparetwochecked = ''; 644 if ( this.model.at( Diff.rightDiff - 1 ) ) { 645 addHtml = this.template( _.extend( 646 this.model.at( Diff.rightDiff - 1 ).toJSON(), 647 { comparetwochecked: this.comparetwochecked } // keep the checkmark unchecked 648 ) ); 649 } 650 } 651 this.$el.html( addHtml ); 652 if ( this.model.length < 3 ) { 653 $( 'div#comparetworevisions' ).hide(); // don't allow compare two if fewer than three revisions 654 } 655 if ( this.model.length < 2 ) { 656 $( 'div#diffslider' ).hide(); // don't allow compare two if fewer than three revisions 657 $( 'div.diff-slider-ticks-wrapper' ).hide(); 658 } 694 659 695 if ( 0 === REVAPP._leftDiff ) { 696 $( '.revisiondiffcontainer' ).addClass( 'currentversion' ); 660 // add tooltips to the handles 661 if ( ! Diff.singleRevision ) { 662 Diff.addTooltip ( $( 'a.ui-slider-handle.left-handle' ), 663 ( Diff.leftDiff < 0 ) ? '' : Diff.revisions.at( Diff.leftDiff - 1 ).get( 'revision_date_author_short' ) ); 664 Diff.addTooltip ( $( 'a.ui-slider-handle.right-handle' ), 665 ( Diff.rightDiff > Diff.revisions.length ) ? '' : Diff.revisions.at( Diff.rightDiff - 1 ).get( 'revision_date_author_short' ) ); 666 } else { 667 Diff.addTooltip ( $( 'a.ui-slider-handle' ), 668 ( Diff.rightDiff > Diff.revisions.length ) ? '' : Diff.revisions.at( Diff.rightDiff - 1 ).get( 'revision_date_author_short' ) ); 669 } 697 670 698 } else { 699 $( '.revisiondiffcontainer' ).removeClass( 'currentversion' ); 700 } 671 // hide the restore button when on the last sport/current post data 672 if ( Diff.rightDiff === Diff.revisions.length ){ 673 $( '.restore-button' ).hide(); 674 } else { 675 $( '.restore-button' ).show(); 676 } 701 677 702 REVAPP._revisionView.render(); 678 return this; 679 }, 703 680 704 }, 681 // turn on/off the compare two mmode 682 compareTwo: function() { 683 self = this; 705 684 706 // when the user stops sliding in 2 handle mode, recalculate diffs 707 stop: function( event, ui ) { 708 if ( 2 === REVAPP._compareOneOrTwo ) { 709 // calculate and generate a diff for comparing to the left handle 710 // and the right handle, swap out when dragging 685 if ( $( 'input#comparetwo' ).is( ':checked' ) ) { // compare 2 mode 686 Diff.singleRevision = false ; 711 687 712 var index = $( ui.handle ).index(); // 0 (left) or 1 (right) 688 if ( 1 === Diff.rightDiff ) 689 Diff.rightDiff = 2; 713 690 714 switch ( index ) { 715 case 1: // left 691 Diff.revisionView.draggingLeft = false; 716 692 717 // left handle dragged & changed, reload right handle model718 if ( REVAPP._leftDiffStart !== ui.values[0] )719 REVAPP.reloadRight();693 revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision 694 Diff.reloadLeftRight(); 695 Diff.revisionView.model = Diff.rightHandleRevisions; 720 696 721 break; 697 } else { // compare one mode 698 Diff.singleRevision = true; 699 Diff.revisionView.draggingLeft = false; 700 Diff.reloadModelSingle(); 701 } 702 Diff.revisionsInteractions.render(); 703 Diff.tickmarkView.render(); 704 }, 722 705 723 case 2: // right 724 // REVAPP._rightDiff = ( 1 >= REVAPP._rightDiff ) ? 1 : REVAPP._rightDiff - 1; 725 // right handle dragged & changed, reload left handle model if changed 726 if ( REVAPP._rightDiffStart !== ui.values[1] ) 727 REVAPP.reloadLeft(); 706 restore: function() { 707 document.location = $( '#restore' ).data( 'link' ); 708 } 709 }); 728 710 729 break;730 }731 }732 }733 });734 $( '.revisiondiffcontainer' ).addClass( 'comparetwo' );735 $( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' );736 }737 711 738 return this; 739 }, 712 /** 713 * ======================================================================== 714 * MODELS 715 * ======================================================================== 716 */ 740 717 741 // next and previous buttons, only available in compare one mode 742 events: { 743 'click #next': 'nextRevision', 744 'click #previous': 'previousRevision' 745 }, 718 /** 719 * wp.revisions.Revision 720 */ 721 Revision = revisions.model.Revision = Backbone.Model.extend({ 722 idAttribute: 'ID', 723 urlRoot: ajaxurl + '?action=revisions-data' + 724 '&show_autosaves=true&show_split_view=true&nonce=' + revisions.model.settings.nonce, 725 defaults: { 726 ID: 0, 727 revision_date_author: '', 728 revision_date_author_short: '', 729 revisiondiff: '<div class="diff-loading"><div class="spinner"></div></div>', 730 restoreaction: '', 731 revision_from_date_author: '', 732 revision_toload: false, 733 lines_added: 0, 734 lines_deleted: 0, 735 scope_of_changes: 'none', 736 previous_revision_id: 0 737 }, 746 738 747 // go to the next revision 748 nextRevision: function() { 749 if ( REVAPP._rightDiff < this.model.length ) // unless at right boundry 750 REVAPP._rightDiff = REVAPP._rightDiff + 1 ; 739 url: function() { 740 if ( Diff.singleRevision ) { 741 return this.urlRoot + 742 '&single_revision_id=' + this.id + 743 '&compare_to=' + this.get( 'previous_revision_id' ) + 744 '&post_id=' + revisions.model.settings.post_id; 745 } else { 746 return this.urlRoot + '&single_revision_id=' + this.id; 747 } 751 748 752 REVAPP._revisionView.render(); 749 } 750 }); 753 751 754 $( '#slider' ).slider( 'value', REVAPP._rightDiff - 1 ).trigger( 'slide' ); 755 }, 752 /** 753 * wp.revisions.Revisions 754 */ 755 Revisions = revisions.Revisions = Backbone.Collection.extend({ 756 model: Revision, 757 urlRoot: ajaxurl + '?action=revisions-data', 756 758 757 // go the the previous revision 758 previousRevision: function() { 759 if ( REVAPP._rightDiff > 1 ) // unless at left boundry 760 REVAPP._rightDiff = REVAPP._rightDiff - 1 ; 759 initialize: function( models, options ) { 760 this.options = _.defaults( options || {}, { 761 'compareTo': revisions.model.settings.post_id, 762 'showAutosaves': true, 763 'showSplitView': true, 764 'rightHandleAt': 0, 765 'nonce': revisions.model.settings.nonce 766 }); 767 }, 761 768 762 REVAPP._revisionView.render(); 769 url: function() { 770 return this.urlRoot + 771 '&compare_to=' + this.options.compareTo + 772 '&show_autosaves=' + this.options.showAutosaves + 773 '&show_split_view=' + this.options.showSplitView + 774 '&right_handle_at=' + this.options.rightHandleAt + 775 '&nonce=' + this.options.nonce; 776 }, 763 777 764 $( '#slider' ).slider( 'value', REVAPP._rightDiff - 1 ).trigger( 'slide' ); 765 } 766 }) 767 }); 778 reload: function( options ) { 779 this.options = _.defaults( options || {}, this.options ); 768 780 769 // instantiate Revision Application 770 REVAPP = new wp.revisions.App(); 781 // TODO 782 //this.fetch(); 783 } 771 784 785 } ); 786 787 $( wp.revisions ); 788 772 789 }(jQuery)); -
wp-admin/revision.php
79 79 80 80 require_once( './admin-header.php' ); 81 81 82 //TODO - Some of the translations below split things into multiple strings that are contextually related and this makes it pretty impossible for RTL translation. 83 //TODO can we pass the context in a better way 84 $wpRevisionsSettings = array( 'post_id' => $post->ID, 85 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), 86 'revision_id' => $revision_id ); 87 wp_localize_script( 'revisions', 'wpRevisionsSettings', $wpRevisionsSettings ); 82 $strings = array( 83 'diffFromTitle' => _x( 'From: %s', 'revision from title' ), 84 'diffToTitle' => _x( 'To: %s', 'revision to title' ) 85 ); 88 86 87 $settings = array( 88 'post_id' => $post->ID, 89 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), 90 'revision_id' => $revision_id 91 ); 92 93 $strings['settings'] = $settings; 94 95 wp_localize_script( 'revisions', 'wpRevisionsL10n', $strings ); 96 89 97 $comparetworevisionslink = get_edit_post_link( $revision->ID ); 90 98 ?> 91 99 … … 126 134 <div class="diff-to-title"><?php _e( 'To:' ); ?></div>{{{ data.revision_date_author }}} 127 135 </div> 128 136 <div id="diffrestore"> 129 <input class="button button-primary restore-button" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" />137 <input id="restore" class="button button-primary" data-link="{{{ data.restoreaction }}}" type="button" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" /> 130 138 </div> 131 139 <div id="comparetworevisions"> 132 140 <input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> … … 141 149 <div>{{{ data.revisiondiff }}}</div> 142 150 </script> 143 151 144 <script id="tmpl-revision vinteract" type="text/html">152 <script id="tmpl-revision-interact" type="text/html"> 145 153 <div id="diffheader"> 146 154 <div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /> 147 155 </div> … … 153 161 </div> 154 162 </div> 155 163 </script> 164 156 165 <script id="tmpl-revision-ticks" type="text/html"> 157 166 <div class="revision-tick revision-toload{{{ data.revision_toload }}} revision-scopeofchanges-{{{ data.scope_of_changes }}}"> 158 167 </div> 159 168 </script> 160 169 <?php 161 /* 162 TODO Convert these into screen options 163 <script id="tmpl-revisionoptions" type="text/html"> 164 <div id="revisionoptions"> 165 <div id="showsplitviewoption"> 166 <input type='checkbox' id="show_split_view" checked="checked" value="1" /> <?php _e( 'Show split diff view' ); ?> 167 </div> 168 <div id="toggleshowautosavesoption"> 169 <input type='checkbox' id="toggleshowautosaves" value="1" /> <?php _e( 'Show autosaves' ); ?> 170 </div> 171 </div> 172 </script> 173 */ 174 require_once( './admin-footer.php' ); 175 No newline at end of file 170 require_once( './admin-footer.php' );