Improve UI for Special:Recentchanges and Special:Recentchangeslinked.
authorDaniel Friesen <dantman@users.mediawiki.org>
Sat, 17 May 2008 16:08:34 +0000 (16:08 +0000)
committerDaniel Friesen <dantman@users.mediawiki.org>
Sat, 17 May 2008 16:08:34 +0000 (16:08 +0000)
* Allow configuration of the default limit and days links with the variables $wgRCLinkLimits and $wgRCLinkDays.
* When selecting a limit and a days on the special pages, if you use a number not within the default list it will be added to the display.
** The selected limit and days is bolded. (This can be considered the first step for bug 3327)
* Optional other configuration option $wgRCFilterByAge, when enabled the list of days will be filtered so that only links within what $wgRCMaxAge says will be stored in the database will be displayed. Note that this is disabled by default because MediaWiki doesn't quite seam to trim out old entries as quickly as $wgRCMaxAge says it should be and some people appear to use the extra 30days links to display older entries even though $wgRCMaxAge is set to 7days on said wiki.

This should also solve bug 9257.

includes/DefaultSettings.php
includes/Setup.php
includes/SpecialRecentchanges.php

index 1fa3104..08c0c02 100644 (file)
@@ -1933,6 +1933,18 @@ $wgPutIPinRC = true;
  */
 $wgRCMaxAge = 7 * 24 * 3600;
 
+/**
+ * Filter $wgRCLinkDays by $wgRCMaxAge to avoid showing links for numbers higher than what will be stored.
+ * Note that this is disabled by default because we sometimes do have RC data which is beyond the limit
+ * for some reason, and some users may use the high numbers to display that data which is still there.
+ */
+$wgRCFilterByAge = false;
+
+/**
+ * List of Days and Limits options to list in the Special:Recentchanges and Special:Recentchangeslinked pages.
+ */
+$wgRCLinkLimits = array( 50, 100, 250, 500 );
+$wgRCLinkDays   = array( 1, 3, 7, 14, 30 );
 
 # Send RC updates via UDP
 $wgRC2UDPAddress = false;
index 92e310b..2ed4a41 100644 (file)
@@ -159,6 +159,19 @@ if ( $wgCommandLineMode ) {
        wfDebug( $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . "\n" );
 }
 
+if( $wgRCFilterByAge ) {
+       ## Trim down $wgRCLinkDays so that it only lists links which are valid
+       ## as determined by $wgRCMaxAge.
+       ## Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
+       sort($wgRCLinkDays);
+       for( $i = 0; $i < count($wgRCLinkDays); $i++ ) {
+               if( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
+                       $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i+1, false );
+                       break;
+               }
+       }
+}
+
 if ( $wgSkipSkin ) {
        $wgSkipSkins[] = $wgSkipSkin;
 }
index 0d8502d..12f5aeb 100644 (file)
@@ -477,24 +477,26 @@ function rcDoOutputFeed( $rows, &$feed ) {
 /**
  *
  */
-function rcCountLink( $lim, $d, $page='Recentchanges', $more='' ) {
+function rcCountLink( $lim, $d, $page='Recentchanges', $more='', $active = false ) {
        global $wgUser, $wgLang, $wgContLang;
        $sk = $wgUser->getSkin();
        $s = $sk->makeKnownLink( $wgContLang->specialPage( $page ),
          ($lim ? $wgLang->formatNum( "{$lim}" ) : wfMsg( 'recentchangesall' ) ), "{$more}" .
-         ($d ? "days={$d}&" : '') . 'limit='.$lim );
+         ($d ? "days={$d}&" : '') . 'limit='.$lim, '', '',
+         $active ? 'style="font-weight: bold;"' : '' );
        return $s;
 }
 
 /**
  *
  */
-function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) {
+function rcDaysLink( $lim, $d, $page='Recentchanges', $more='', $active = false ) {
        global $wgUser, $wgLang, $wgContLang;
        $sk = $wgUser->getSkin();
        $s = $sk->makeKnownLink( $wgContLang->specialPage( $page ),
          ($d ? $wgLang->formatNum( "{$d}" ) : wfMsg( 'recentchangesall' ) ), $more.'days='.$d .
-         ($lim ? '&limit='.$lim : '') );
+         ($lim ? '&limit='.$lim : ''), '', '',
+         $active ? 'style="font-weight: bold;"' : '' );
        return $s;
 }
 
@@ -503,19 +505,31 @@ function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) {
  */
 function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall = false, $minorLink = '',
        $botLink = '', $liuLink = '', $patrLink = '', $myselfLink = '' ) {
+       global $wgRCLinkLimits, $wgRCLinkDays;
        if ($more != '') $more .= '&';
-       $cl = rcCountLink( 50, $days, $page, $more ) . ' | ' .
-         rcCountLink( 100, $days, $page, $more  ) . ' | ' .
-         rcCountLink( 250, $days, $page, $more  ) . ' | ' .
-         rcCountLink( 500, $days, $page, $more  ) .
-         ( $doall ? ( ' | ' . rcCountLink( 0, $days, $page, $more ) ) : '' );
-       $dl = rcDaysLink( $limit, 1, $page, $more  ) . ' | ' .
-         rcDaysLink( $limit, 3, $page, $more  ) . ' | ' .
-         rcDaysLink( $limit, 7, $page, $more  ) . ' | ' .
-         rcDaysLink( $limit, 14, $page, $more  ) . ' | ' .
-         rcDaysLink( $limit, 30, $page, $more  ) .
-         ( $doall ? ( ' | ' . rcDaysLink( $limit, 0, $page, $more ) ) : '' );
-
+       
+       # Sort data for display and make sure it's unique after we've added user data.
+       $wgRCLinkLimits[] = $limit;
+       $wgRCLinkDays[] = $days;
+       sort(&$wgRCLinkLimits);
+       sort(&$wgRCLinkDays);
+       $wgRCLinkLimits = array_unique($wgRCLinkLimits);
+       $wgRCLinkDays = array_unique($wgRCLinkDays);
+       
+       $cl = array();
+       foreach( $wgRCLinkLimits as $countLink ) {
+               $cl[] = rcCountLink( $countLink, $days, $page, $more, $countLink == $limit );
+       }
+       if( $doall ) $cl[] = rcCountLink( 0, $days, $page, $more );
+       $cl = implode( ' | ', $cl);
+       
+       $dl = array();
+       foreach( $wgRCLinkDays as $daysLink ) {
+               $dl[] = rcDaysLink( $limit, $daysLink, $page, $more, $daysLink == $days );
+       }
+       if( $doall ) $dl[] = rcDaysLink( $limit, 0, $page, $more );
+       $dl = implode( ' | ', $dl);
+       
        $linkParts = array( 'minorLink' => 'minor', 'botLink' => 'bots', 'liuLink' => 'liu', 'patrLink' => 'patr', 'myselfLink' => 'mine' );
        foreach( $linkParts as $linkVar => $linkMsg ) {
                if( $$linkVar != '' )
@@ -534,11 +548,12 @@ function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall
  * @param $override
  * @param $options
  */
-function makeOptionsLink( $title, $override, $options ) {
+function makeOptionsLink( $title, $override, $options, $active = false ) {
        global $wgUser, $wgContLang;
        $sk = $wgUser->getSkin();
        return $sk->makeKnownLink( $wgContLang->specialPage( 'Recentchanges' ),
-               htmlspecialchars( $title ), wfArrayToCGI( $override, $options ) );
+               htmlspecialchars( $title ), wfArrayToCGI( $override, $options ), '', '',
+               $active ? 'style="font-weight: bold;"' : '' );
 }
 
 /**
@@ -547,7 +562,7 @@ function makeOptionsLink( $title, $override, $options ) {
  * @param $nondefaults
  */
 function rcOptionsPanel( $defaults, $nondefaults ) {
-       global $wgLang, $wgUser;
+       global $wgLang, $wgUser, $wgRCLinkLimits, $wgRCLinkDays;
 
        $options = $nondefaults + $defaults;
 
@@ -561,19 +576,25 @@ function rcOptionsPanel( $defaults, $nondefaults ) {
                        $wgLang->formatNum( $options['days'] ),
                        $wgLang->timeAndDate( wfTimestampNow(), true ) );
 
+       # Sort data for display and make sure it's unique after we've added user data.
+       $wgRCLinkLimits[] = $options['limit'];
+       $wgRCLinkDays[] = $options['days'];
+       sort(&$wgRCLinkLimits);
+       sort(&$wgRCLinkDays);
+       $wgRCLinkLimits = array_unique($wgRCLinkLimits);
+       $wgRCLinkDays = array_unique($wgRCLinkDays);
+       
        // limit links
-       $options_limit = array(50, 100, 250, 500);
-       foreach( $options_limit as $value ) {
+       foreach( $wgRCLinkLimits as $value ) {
                $cl[] = makeOptionsLink( $wgLang->formatNum( $value ),
-                       array( 'limit' => $value ), $nondefaults) ;
+                       array( 'limit' => $value ), $nondefaults, $value == $options['limit'] ) ;
        }
        $cl = implode( ' | ', $cl);
 
        // day links, reset 'from' to none
-       $options_days = array(1, 3, 7, 14, 30);
-       foreach( $options_days as $value ) {
+       foreach( $wgRCLinkDays as $value ) {
                $dl[] = makeOptionsLink( $wgLang->formatNum( $value ),
-                       array( 'days' => $value, 'from' => ''  ), $nondefaults) ;
+                       array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] ) ;
        }
        $dl = implode( ' | ', $dl);