From a37272d4e5c33dbc7ee8f91829c2cc900097997e Mon Sep 17 00:00:00 2001 From: Eston Bond Date: Wed, 10 Nov 2010 15:00:08 -0800 Subject: [PATCH] Select revision ranges instead of individual revisions --- .../frontend/public/javascript/gollum.js | 91 +++++++++++++++++-- 1 file changed, 84 insertions(+), 7 deletions(-) diff --git a/lib/gollum/frontend/public/javascript/gollum.js b/lib/gollum/frontend/public/javascript/gollum.js index e4321ce4..20f6ad06 100644 --- a/lib/gollum/frontend/public/javascript/gollum.js +++ b/lib/gollum/frontend/public/javascript/gollum.js @@ -25,7 +25,6 @@ $(document).ready(function() { } if ($('#wiki-wrapper').hasClass('history')) { - $('#wiki-history td.checkbox input').each(highlightChecked); $('#wiki-history td.checkbox input').click(highlightChecked); $('#wiki-history td.revert-action a').mouseenter(highlightOn); @@ -34,6 +33,88 @@ $(document).ready(function() { }); +var nodeSelector = { + + node1: null, + node2: null, + + selectNodeRange: function( n1, n2 ) { + if ( nodeSelector.node1 && nodeSelector.node2 ) { + $('#wiki-history td.selected').removeClass('selected'); + nodeSelector.node1.addClass('selected'); + nodeSelector.node2.addClass('selected'); + + // swap the nodes around if they went in reverse + if ( nodeSelector.nodeComesAfter( nodeSelector.node1, + nodeSelector.node2 ) ) { + var n = nodeSelector.node1; + nodeSelector.node1 = nodeSelector.node2; + nodeSelector.node2 = n; + } + + var s = true; + var $nextNode = nodeSelector.node1.next(); + while ( $nextNode ) { + $nextNode.addClass('selected'); + if ( $nextNode[0] == nodeSelector.node2[0] ) { + break; + } + $nextNode = $nextNode.next(); + } + } + }, + + nodeComesAfter: function ( n1, n2 ) { + var s = false; + $(n1).prevAll().each(function() { + if ( $(this)[0] == $(n2)[0] ) { + s = true; + } + }); + return s; + }, + + checkNode: function( nodeCheckbox ) { + var $nodeCheckbox = nodeCheckbox; + var $node = $(nodeCheckbox).parent().parent(); + // if we're unchecking + if ( !$nodeCheckbox.is(':checked') ) { + + // remove the range, since we're breaking it + $('#wiki-history tr.selected').each(function() { + if ( $(this).find('td.checkbox input').is(':checked') ) { + return; + } + $(this).removeClass('selected'); + }); + + // no longer track this + if ( $node[0] == nodeSelector.node1[0] ) { + nodeSelector.node1 = null; + if ( nodeSelector.node2 ) { + nodeSelector.node1 = nodeSelector.node2; + nodeSelector.node2 = null; + } + } else if ( $node[0] == nodeSelector.node2[0] ) { + nodeSelector.node2 = null; + } + + } else { + // not checked, get a range set up + $node.addClass('selected'); + if ( !nodeSelector.node1 ) { + nodeSelector.node1 = $node; + } else if ( !nodeSelector.node2 ) { + // okay, we don't have a node 2 but have a node1 + nodeSelector.node2 = $node; + nodeSelector.selectNodeRange( nodeSelector.node1, + nodeSelector.node2 ); + } + } + } + +}; + function highlightOn() { $(this).parent().parent().animate({ backgroundColor: '#ffffea', @@ -53,9 +134,5 @@ function highlightOff() { } function highlightChecked() { - if ($(this).is(':checked')) { - $(this).parent().parent().addClass('selected'); - } else { - $(this).parent().parent().removeClass('selected'); - } -} \ No newline at end of file + nodeSelector.checkNode($(this)); +}