Re-committing r42528:
authorAlex Z <mrzman@users.mediawiki.org>
Sat, 25 Oct 2008 19:05:05 +0000 (19:05 +0000)
committerAlex Z <mrzman@users.mediawiki.org>
Sat, 25 Oct 2008 19:05:05 +0000 (19:05 +0000)
*Add "return false" to the onclick handler, which fixes the reason it was reverted (link causes Firefox to scroll to the top of the page) for JS-enabled browsers
*Hide both arrows for JS-disabled so the link (which does nothing without JS) isn't there to mess up scrolling or break horribly with paranoid browser extensions
*Tested for compatibility in Firefox 3.0.3, IE7, Safari 3.1.2, and Opera 9.52.

RELEASE-NOTES
includes/ChangesList.php
languages/messages/MessagesEn.php
maintenance/language/messages.inc
skins/common/enhancedchanges.js [new file with mode: 0644]
skins/common/wikibits.js

index d5c2dcb..476643d 100644 (file)
@@ -283,6 +283,8 @@ The following extensions are migrated into MediaWiki 1.14:
 * (bug 14609) User's namespaces to be searched default not updated after adding new namespace
 * Purge form uses valid XHTML and (bug 8992) uses $wgRequest instead of $_SERVER
 * (bug 12764) Special:LonelyPages shows transcluded pages
+* (bug 16073) Enhanced RecentChanges uses onclick handler with better fallback if
+  JavaScript is disabled.
 
 === API changes in 1.14 ===
 
index 41d2039..ddf9b0f 100644 (file)
@@ -388,6 +388,23 @@ class OldChangesList extends ChangesList {
  * Generate a list of changes using an Enhanced system (use javascript).
  */
 class EnhancedChangesList extends ChangesList {
+
+       /**
+       *  Add the JavaScript file for enhanced changeslist
+       *  @ return string
+       */
+       public function beginRecentChangesList() {
+               global $wgStylePath, $wgStyleVersion;
+               $this->rc_cache = array();
+               $this->rcMoveIndex = 0;
+               $this->rcCacheIndex = 0;
+               $this->lastdate = '';
+               $this->rclistOpen = false;
+               $script = Xml::tags( 'script', array(
+                       'type' => 'text/javascript',
+                       'src' => $wgStylePath . "/common/enhancedchanges.js?$wgStyleVersion" ), '' );
+               return $script;
+       }
        /**
         * Format a line for enhanced recentchange (aka with javascript and block of lines).
         */
@@ -596,13 +613,16 @@ class EnhancedChangesList extends ChangesList {
 
                $users = ' <span class="changedby">[' . implode( $this->message['semicolon-separator'], $users ) . ']</span>';
 
-               # Arrow
-               $rci = 'RCI'.$this->rcCacheIndex;
-               $rcl = 'RCL'.$this->rcCacheIndex;
-               $rcm = 'RCM'.$this->rcCacheIndex;
-               $toggleLink = "javascript:toggleVisibility('$rci','$rcm','$rcl')";
-               $tl  = '<span id="'.$rcm.'"><a href="'.$toggleLink.'">' . $this->sideArrow() . '</a></span>';
-               $tl .= '<span id="'.$rcl.'" style="display:none"><a href="'.$toggleLink.'">' . $this->downArrow() . '</a></span>';
+               # ID for JS visibility toggle
+               $jsid = $this->rcCacheIndex;
+               # onclick handler to toggle hidden/expanded
+               $toggleLink = "onclick='toggleVisibility($jsid); return false'";
+               # Title for <a> tags
+               $expandTitle = wfMsg('rc-enhanced-expand');
+               $closeTitle = wfMsg('rc-enhanced-hide');
+
+               $tl  = "<span id='mw-rc-openarrow-$jsid' class='mw-changeslist-expanded' style='display:none'><a href='#' $toggleLink title='$expandTitle'>" . $this->sideArrow() . "</a></span>";
+               $tl .= "<span id='mw-rc-closearrow-$jsid' class='mw-changeslist-hidden' style='display:none'><a href='#' $toggleLink title='$closeTitle'>" . $this->downArrow() . "</a></span>";
                $r .= '<td valign="top" style="white-space: nowrap"><tt>'.$tl.'&nbsp;';
 
                # Main line
@@ -680,7 +700,7 @@ class EnhancedChangesList extends ChangesList {
                $r .= "</td></tr></table>\n";
 
                # Sub-entries
-               $r .= '<div id="'.$rci.'" style="display:none;"><table cellpadding="0" cellspacing="0"  border="0" style="background: none">';
+               $r .= '<div id="mw-rc-subentries-'.$jsid.'" class="mw-changeslist-hidden"><table cellpadding="0" cellspacing="0"  border="0" style="background: none">';
                foreach( $block as $rcObj ) {
                        # Get rc_xxxx variables
                        // FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
@@ -759,11 +779,10 @@ class EnhancedChangesList extends ChangesList {
         * @param string $alt text
         * @return string HTML <img> tag
         */
-       protected function arrow( $dir, $alt='' ) {
+       protected function arrow( $dir ) {
                global $wgStylePath;
                $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
-               $encAlt = htmlspecialchars( $alt );
-               return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" />";
+               return "<img src=\"$encUrl\" width=\"12\" height=\"12\" />";
        }
 
        /**
@@ -774,7 +793,7 @@ class EnhancedChangesList extends ChangesList {
        protected function sideArrow() {
                global $wgContLang;
                $dir = $wgContLang->isRTL() ? 'l' : 'r';
-               return $this->arrow( $dir, '+' );
+               return $this->arrow( $dir );
        }
 
        /**
@@ -783,7 +802,7 @@ class EnhancedChangesList extends ChangesList {
         * @return string HTML <img> tag
         */
        protected function downArrow() {
-               return $this->arrow( 'd', '-' );
+               return $this->arrow( 'd' );
        }
 
        /**
@@ -791,7 +810,7 @@ class EnhancedChangesList extends ChangesList {
         * @return string HTML <img> tag
         */
        protected function spacerArrow() {
-               return $this->arrow( '', ' ' );
+               return $this->arrow( '' );
        }
 
        /**
index cdce327..c77514c 100644 (file)
@@ -1714,6 +1714,8 @@ please see math/README to configure.',
 'rc_categories_any'                 => 'Any',
 'rc-change-size'                    => '$1', # only translate this message to other languages if you have to change it
 'newsectionsummary'                 => '/* $1 */ new section',
+'rc-enhanced-expand'                => 'Show details (requires JavaScript)',
+'rc-enhanced-hide'                  => 'Hide details',
 
 # Recent changes linked
 'recentchangeslinked'          => 'Related changes',
index a320cb2..69cbdcb 100644 (file)
@@ -1035,6 +1035,8 @@ $wgMessageStructure = array(
                'rc_categories_any',
                'rc-change-size',
                'newsectionsummary',
+               'rc-enhanced-expand',
+               'rc-enhanced-hide',
        ),
        'recentchangeslinked' => array(
                'recentchangeslinked',
diff --git a/skins/common/enhancedchanges.js b/skins/common/enhancedchanges.js
new file mode 100644 (file)
index 0000000..ebbcf5b
--- /dev/null
@@ -0,0 +1,39 @@
+/* 
+  JavaScript file for enhanced recentchanges
+ */
+/*
+  * Add the CSS to hide parts that should be collapsed
+  *
+  * We do this with JS so everything will be expanded by default
+  * if JS is disabled
+ */
+appendCSS('.mw-changeslist-hidden {'+
+       '       display:none;'+
+       '}'+
+       'div.mw-changeslist-expanded {'+
+       '       display:block;'+
+       '}'+
+       'span.mw-changeslist-expanded {'+
+       '       display:inline !important;'+
+       '}'
+);
+
+/*
+ * Switch an RC line between hidden/shown
+ * @param int idNumber : the id number of the RC group
+*/ 
+function toggleVisibility(idNumber) {
+       var openarrow = document.getElementById("mw-rc-openarrow-"+idNumber);
+       var closearrow = document.getElementById("mw-rc-closearrow-"+idNumber);
+       var subentries = document.getElementById("mw-rc-subentries-"+idNumber);
+       if (openarrow.className == 'mw-changeslist-expanded') {
+               openarrow.className = 'mw-changeslist-hidden';
+               closearrow.className = 'mw-changeslist-expanded';
+               subentries.className = 'mw-changeslist-expanded';
+       } else {
+               openarrow.className = 'mw-changeslist-expanded';
+               closearrow.className = 'mw-changeslist-hidden';
+               subentries.className = 'mw-changeslist-hidden';
+       }
+}
index 514714d..62ef574 100644 (file)
@@ -104,22 +104,6 @@ if (wgBreakFrames) {
        }
 }
 
-// for enhanced RecentChanges
-function toggleVisibility(_levelId, _otherId, _linkId) {
-       var thisLevel = document.getElementById(_levelId);
-       var otherLevel = document.getElementById(_otherId);
-       var linkLevel = document.getElementById(_linkId);
-       if (thisLevel.style.display == 'none') {
-               thisLevel.style.display = 'block';
-               otherLevel.style.display = 'none';
-               linkLevel.style.display = 'inline';
-       } else {
-               thisLevel.style.display = 'none';
-               otherLevel.style.display = 'inline';
-               linkLevel.style.display = 'none';
-       }
-}
-
 function showTocToggle() {
        if (document.createTextNode) {
                // Uses DOM calls to avoid document.write + XHTML issues