Arbitrary diff selection without javascript
authorGabriel Wicke <gwicke@users.mediawiki.org>
Tue, 18 May 2004 12:36:13 +0000 (12:36 +0000)
committerGabriel Wicke <gwicke@users.mediawiki.org>
Tue, 18 May 2004 12:36:13 +0000 (12:36 +0000)
The checkboxes are replaced by two columns of radio boxes. If js is available it does some styling tasks/makes sure sensible version combinations are selected.

includes/PageHistory.php
languages/Language.php
stylesheets/common.css
stylesheets/wikibits.js

index 323bf4f..c96ab31 100644 (file)
@@ -109,38 +109,10 @@ class PageHistory {
        {
                global $wgTitle;
                $this->lastdate = $this->lastline = "";
-               $url = $wgTitle->getFullURL("-");
-               $s = "\n<script type='text/javascript'>
-                       /*<![CDATA[*/
-                       var sel = -1;
-                       function anysel(oid){ 
-                               row = document.getElementById(\"ver\" + oid);
-                               if( row.selected ){
-                                       row.style.backgroundColor=row.oldbg; 
-                                       row.selected = 0;
-                                       sel = -1;
-                               } else {
-                                       row.oldbg = row.style.backgroundColor;
-                                       row.style.backgroundColor=\"lightgrey\"; 
-                                       row.selected = 1;
-                                       if( sel == -1){
-                                               sel = oid;
-                                       } else {
-                                               dodiff(sel, oid);
-                                       }
-                               }
-                               return false; 
-                       } 
-                       function dodiff(oldid, diff){
-                               if( (diff < oldid && diff != 0) || oldid == 0 ){ 
-                                       tmp = oldid; oldid = diff; diff = tmp; 
-                               }
-                               u = \"{$url}diff=\" + diff + \"&oldid=\" + oldid;
-                               location.href=u;
-                       }
-                       /*]]>*/
-               </script>";
-               $s .= "\n<p>" . wfMsg( "histlegend" ) . "</p>\n<ul class='special'>";
+               $s = "\n<p>" . wfMsg( "histlegend" ).'</p>'; 
+               $s .="\n<form id=\"pagehistory\" name=\"pagehistory\" action=\"" . $wgTitle->getFullURL("-") . "\" method=\"get\">";
+               $s .= "<input type=\"hidden\" name=\"title\" value=\"".urlencode($wgTitle->getPrefixedDbKey())."\"/>\n";
+               $s .= "" . "\n<ul>";
                return $s;
        }
 
@@ -150,6 +122,10 @@ class PageHistory {
 
                $s = $skip ? "" : preg_replace( "/!OLDID![0-9]+!/", $last, $this->lastline );
                $s .= "</ul>\n";
+               if( $this->linesonpage > 1) {
+                       $s .= '<button type="submit">'.wfMsg('compareselectedversions')."</button><br/><br/>\n";
+               }
+               $s .= "</form>\n";
                return $s;
        }
 
@@ -193,14 +169,24 @@ class PageHistory {
                        $curlink = $cur;
                }
                $arbitrary = "";
-               if( $this->linesonpage > 1)
-                       $arbitrary = "<input type='checkbox' onclick='anysel($oid)' title='Select any two versions to diff them' />";
-               $s .= "({$curlink}) (!OLDID!{$oid}!) $arbitrary . .";
+               if( $this->linesonpage > 1) {
+                       # XXX: move title texts to javascript
+                       $checkmark = "";
+                       if ( !$oid ) {
+                               $arbitrary = '<input type="radio" style="visibility:hidden" name="oldid" value="'.$oid.'" title="'.wfMsg('selectolderversionfordiff').'" />';
+                               $checkmark = ' checked="checked"';
+                       } else {
+                               if( $counter == 2 ) $checkmark = ' checked="checked"';
+                               $arbitrary = '<input type="radio" name="oldid" value="'.$oid.'" title="'.wfMsg('selectolderversionfordiff').'"'.$checkmark.' />';
+                               $checkmark = '';
+                       }
+                       $arbitrary .= '<input type="radio" name="diff" value="'.$oid.'" title="'.wfMsg('selectnewerversionfordiff').'"'.$checkmark.' />';
+               }
                $M = wfMsg( "minoreditletter" );
                if ( $isminor ) {
-                       $s .= " <strong>{$M}</strong>";
+                       $s .= "<span class='hflag'>{$M}</span>";
                }
-               $s .= " <span id='ver$oid'>{$link} . . {$ul}</span>";
+               $s .= "({$curlink}) (!OLDID!{$oid}!) $arbitrary {$link} <span class='hlinedesc'>{$ul}</span>";
 
                if ( "" != $c && "*" != $c ) {
 
index 99dd798..2cbef2b 100644 (file)
@@ -781,7 +781,7 @@ Please check the URL you used to access this page.\n",
 "last"                 => "last",
 "orig"                 => "orig",
 "histlegend"   => "Legend: (cur) = difference with current version,
-(last) = difference with preceding version, M = minor edit",
+(last) = difference with preceding version, M = minor edit.<br/>Select any two versions and hit enter or the button at the bottom.",
 
 # Diffs
 #
@@ -789,6 +789,9 @@ Please check the URL you used to access this page.\n",
 "loadingrev"   => "loading revision for diff",
 "lineno"               => "Line $1:",
 "editcurrent"  => "Edit the current version of this page",
+'selectnewerversionfordiff' => 'Select a newer version for comparison',
+'selectolderversionfordiff' => 'Select an older version for comparison',
+'compareselectedversions' => 'Compare selected versions',
 
 # Search results
 #
index 657b332..91596be 100644 (file)
@@ -64,6 +64,23 @@ div.tleft {
     margin-right:0.5em;
 }
 
+/* Page history styling */
+/* automatically generated edit summaries */
+.autocomment { color: gray; }
+#pagehistory span.hlinedesc { margin-left: 1.4em }
+#pagehistory span.hflag { 
+    margin-left: -1em;
+    font-weight: bold;
+}
+#pagehistory li { 
+    border: 1px solid White;
+    padding-left: 1em;
+}
+#pagehistory li.selected { 
+    background-color:#f9f9f9;
+    border:1px dashed #aaaaaa;
+}
+
 table.diff {
         background:white;
 }
@@ -86,8 +103,6 @@ td.diff-context {
 img { border: none; }
 img.tex { vertical-align: middle; }
 
-/* automatically generated edit summaries */
-.autocomment { color: gray; }
 
 #toc {
         border: 1px solid #8888aa;
index 5d510d1..1d3a682 100644 (file)
@@ -14,6 +14,16 @@ if (clientPC.indexOf('opera')!=-1) {
     var is_opera_seven = (window.opera && document.childNodes);
 }
 
+// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
+function onloadhook () {
+    // don't run anything below this for non-dom browsers
+    if(!(document.getElementById && document.getElementsByTagName)) return;
+    histrowinit();
+}
+if (window.addEventListener) window.addEventListener("load",onloadhook,false);
+else if (window.attachEvent) window.attachEvent("onload",onloadhook);
+
+
 // document.write special stylesheet links
 function addcss ( stylepath ) {
     if (is_opera_preseven) {
@@ -45,6 +55,57 @@ function toggleVisibility( _levelId, _otherId, _linkId) {
                }
 }
 
+// page history stuff
+// attach event handlers to the input elements on history page
+function histrowinit () {
+    hf = document.getElementById('pagehistory');
+    if(!hf) return;
+    lis = hf.getElementsByTagName('li');
+    for (i=0;i<lis.length;i++) {
+        inputs=lis[i].getElementsByTagName('INPUT');
+        if(inputs[0] && inputs[1]) {
+                inputs[0].onclick = diffcheck;
+                inputs[1].onclick = diffcheck;
+        }
+    }
+    diffcheck();
+}
+// check selection and tweak visibility/class onclick
+function diffcheck() { 
+    var dli = false; // the li where the diff radio is checked
+    var oli = false; // the li where the oldid radio is checked
+    hf = document.getElementById('pagehistory');
+    if(!hf) return;
+    lis = hf.getElementsByTagName('li');
+    for (i=0;i<lis.length;i++) {
+        inputs=lis[i].getElementsByTagName('INPUT');
+        if(inputs[1] && inputs[0]) {
+            if(inputs[1].checked || inputs[0].checked) { // this row has a checked radio button
+                if(inputs[1].checked && inputs[0].checked && inputs[0].value == inputs[1].value) return false;
+                if(oli) { // it's the second checked radio
+                    if(inputs[1].checked) {
+                    oli.className = "selected";
+                    return false 
+                    }
+                } else if (inputs[0].checked) {
+                    return false;
+                }
+                if(inputs[0].checked) dli = lis[i];
+                if(!oli) inputs[0].style.visibility = 'hidden';
+                if(dli) inputs[1].style.visibility = 'hidden';
+                lis[i].className = "selected";
+                oli = lis[i];
+            }  else { // no radio is checked in this row
+                if(!oli) inputs[0].style.visibility = 'hidden';
+                else inputs[0].style.visibility = 'visible';
+                if(dli) inputs[1].style.visibility = 'hidden';
+                else inputs[1].style.visibility = 'visible';
+                lis[i].className = "";
+            }
+        }
+    }
+}
+
 // Timezone stuff
 // tz in format [+-]HHMM
 function checkTimezone( tz, msg ) {
@@ -87,6 +148,7 @@ function showTocToggle(show,hide) {
        }
 }
 
+
 function toggleToc() {
        var toc = document.getElementById('tocinside');
        var showlink=document.getElementById('showlink');