MediaWiki r44112 - Code Review

Jump to: navigation, search
Repository:MediaWiki
Revision:r44111‎ | r44112 (on ViewVC)‎ | r44113 >
Date:14:10, 1 December 2008
Author:werdna
Status:ok
Tags:
Comment:
Visually indicate settings which have been changed from the default, and provide mechanisms for showing how the current settings (or indeed any settings) are different from the default, as well as
displaying the default settings themselves.

Also, fix a JS bug.
Modified paths:

Diff [purge]

Index: trunk/extensions/Configure/Configure.obj.php
===================================================================
--- trunk/extensions/Configure/Configure.obj.php	(revision 44111)
+++ trunk/extensions/Configure/Configure.obj.php	(revision 44112)
@@ -147,6 +147,8 @@
 	 * @return array
 	 */
 	public function getOldSettings( $ts ) {
+		if ($ts == 'default')
+			return array( 'default' => $this->getDefaults() );
 		return $this->mHandler->getOldSettings( $ts );
 	}
 
@@ -159,6 +161,15 @@
 	public function getWikisInVersion( $ts ) {
 		return $this->mHandler->getWikisInVersion( $ts );
 	}
+	
+	/** Recursive doohicky for normalising variables so we can compare them. */
+	public static function filterVar( $var ) {
+		if (is_array($var)) {
+			return array_filter( array_map( array( __CLASS__, 'filterVar' ), $var ) );
+		}
+		
+		return $var;
+	}
 
 	/**
 	 * Returns a pager for this handler
Index: trunk/extensions/Configure/Configure.page.php
===================================================================
--- trunk/extensions/Configure/Configure.page.php	(revision 44111)
+++ trunk/extensions/Configure/Configure.page.php	(revision 44112)
@@ -306,12 +306,16 @@
 
 		if ( $version = $wgRequest->getVal( 'version' ) ) {
 			$versions = $wgConf->listArchiveVersions();
-			if ( in_array( $version, $versions ) ) {
+			if ( in_array( $version, $versions ) || $version == 'default' ) {
 				$conf = $wgConf->getOldSettings( $version );
+				
+				if ($version == 'default') { ## Hacky special case.
+					$conf[$this->mWiki] = $conf['default'];
+				}
+				
 				$this->conf = $conf[$this->mWiki];
 				if ( !isset( $conf[$this->mWiki] ) ) {
-					$wgOut->addWikiText( '<div class="errorbox">$1</div>',
-						array( 'configure-old-not-available', $version ) );
+					$wgOut->addHtml( Xml::tags( 'div', array( 'class' => 'errorbox' ), wfMsgExt( 'configure-old-not-available', 'parseinline', $version ) ) );
 					return false;
 				}
 				$current = null;
@@ -397,7 +401,8 @@
 			$text .= "</li>\n</ul>\n";
 		}
 		$link = SpecialPage::getTitleFor( 'ViewConfig' );
-		$text .= $skin->makeKnownLinkObj( $link, wfMsgHtml( 'configure-view-all-versions' ) );
+		$text .= Xml::tags( 'p', null, $skin->makeKnownLinkObj( $link, wfMsgHtml( 'configure-view-all-versions' ) ) );
+		$text .= Xml::tags( 'p', null, $skin->link( SpecialPage::getTitleFor( 'ViewConfig' ), wfMsgHtml( 'configure-view-default' ), array(), array( 'version' => 'default' ) ) );
 
 		$text .= '</fieldset>';
 		return $text;
@@ -611,15 +616,6 @@
 		else
 			return $val;
 	}
-	
-	/** Recursive doohicky for normalising variables so we can compare them. */
-	protected static function filterVar( $var ) {
-		if (is_array($var)) {
-			return array_filter( array_map( array( __CLASS__, 'filterVar' ), $var ) );
-		}
-		
-		return $var;
-	}
 
 	/**
 	 * Removes the defaults values from settings
@@ -633,12 +629,12 @@
 		foreach ( $defaultValues as $name => $default ) {
 			## Normalise the two, to avoid false "changes"
 			if (is_array($default))
-				$default = self::filterVar( $default );
+				$default = WebConfiguration::filterVar( $default );
 				
 			if ( isset( $settings[$name] ) ) {
 				$settingCompare = $settings[$name];
 				if (is_array($settingCompare))
-					$settingCompare = self::filterVar($settingCompare);
+					$settingCompare = WebConfiguration::filterVar($settingCompare);
 			
 				if ( $settingCompare == $default ) {
 					unset( $settings[$name] );
@@ -1113,10 +1109,16 @@
 	 */
 	protected function buildTableRow( $conf, $params ) {
 		global $wgContLang;
+		
+		$rowClasses = array();
+		
+		if ($params['customised'])
+			$rowClasses[] = 'configure-customised';
 
 		$msg = isset( $params['msg'] ) ? $params['msg'] : 'configure-setting-' . $conf;
 		$showLink = isset( $params['link'] ) ? $params['link'] : true;
 
+		## First TD
 		$attribs = array();
 		$attribs['align'] = $wgContLang->isRtl() ? 'right' : 'left';
 		$attribs['valign'] = 'top';
@@ -1132,16 +1134,20 @@
 			$msgVal = $link;
 		else
 			$msgVal = "$msgVal ($link)";
+			
+		if ($params['customised'])
+			$msgVal = Xml::tags( 'p', null, $msgVal ).wfMsgExt( 'configure-customised', 'parse' );
 		$attribs['class'] = 'configure-left-column';
-		$td1 = Xml::openElement( 'td', $attribs ) . $msgVal . '</td>';
+		$td1 = Xml::tags( 'td', $attribs, $msgVal );
+		
+		## Only the class is customised per-cell, so we'll just redefine that.
 		$attribs['class'] = 'configure-right-column';
 		if ( $this->isSettingAvailable( $conf ) )
-			$td2 = Xml::openElement( 'td', $attribs ) . $this->buildInput( $conf, $params ) . '</td>';
+			$td2 = Xml::tags( 'td', $attribs, $this->buildInput( $conf, $params ) );
 		else
-			$td2 = Xml::openElement( 'td', $attribs ) .
-				wfMsgExt( 'configure-setting-not-available', array( 'parseinline' ) ) . '</td>';
+			$td2 = Xml::tags( 'td', $attribs, wfMsgExt( 'configure-setting-not-available', array( 'parseinline' ) ) );
 
-		return '<tr>' . $td1 . $td2 . "</tr>\n";
+		return Xml::tags( 'tr', array( 'class' => implode( ' ', $rowClasses ) ), $td1 . $td2 ) . "\n";
 	}
 
 	/**
@@ -1153,6 +1159,9 @@
 	 */
 	protected function buildSettings( $settings, $param = array() ) {
 		wfLoadExtensionMessages( 'ConfigureSettings' );
+		
+		global $wgConf;
+		$defaults = $wgConf->getDefaults();
 
 		$ret = '';
 		$perms = array();
@@ -1209,6 +1218,9 @@
 							'value' => $this->getSettingValue( $setting ),
 							'link' => $showlink,
 						);
+						
+						$params['customised'] = ( WebConfiguration::filterVar($defaults[$setting]) != WebConfiguration::filterVar($params['value']) );
+						
 						$show = $this->mCanEdit ?
 							( isset( $params['edit'] ) ? $params['edit'] : $this->userCanEdit( $setting ) ) :
 							( isset( $params['read'] ) ? $params['read'] : $this->userCanRead( $setting ) );
Index: trunk/extensions/Configure/SpecialViewConfig.php
===================================================================
--- trunk/extensions/Configure/SpecialViewConfig.php	(revision 44111)
+++ trunk/extensions/Configure/SpecialViewConfig.php	(revision 44112)
@@ -30,8 +30,13 @@
 
 		if ( $this->isWebConfig && $version = $wgRequest->getVal( 'version' ) ) {
 			$versions = $wgConf->listArchiveVersions();
-			if ( in_array( $version, $versions ) ) {
+			if ( in_array( $version, $versions ) || $version == 'default' ) {
 				$conf = $wgConf->getOldSettings( $version );
+				
+				if ($version == 'default') { ## Yucky special case.
+					$conf[$this->mWiki] = $conf['default'];
+				}
+				
 				if ( $this->isUserAllowedAll() ) {
 					$wiki = $wgRequest->getVal( 'wiki', $wgConf->getWiki() );
 				} else {
@@ -42,7 +47,7 @@
 				$this->wiki = $wiki;
 
 				if ( $diff = $wgRequest->getVal( 'diff' ) ) {
-					if ( !in_array( $diff, $versions ) ) {
+					if ( !in_array( $diff, $versions ) && $diff != 'default' ) {
 						$msg = wfMsgNoTrans( 'configure-old-not-available', $diff );
 						$wgOut->addWikiText( "<div class='errorbox'>$msg</div>" );
 						return;
@@ -240,7 +245,8 @@
 				Xml::element( 'input', array_merge(
 					array( 'type' => 'radio', 'name' => 'version', 'value' => $ts ),
 					$versionCheck ) );
-
+			
+			$actions[] = $skin->link( $this->getTitle(), wfMsgHtml( 'configure-viewconfig-default-diff' ), array(), array( 'version' => $ts, 'diff' => 'default' ) );
 		} else {
 			$buttons = '';
 		}
Index: trunk/extensions/Configure/Configure.diff.php
===================================================================
--- trunk/extensions/Configure/Configure.diff.php	(revision 44111)
+++ trunk/extensions/Configure/Configure.diff.php	(revision 44112)
@@ -198,8 +198,8 @@
 		else
 			$msgVal = "$msgVal ($rawVal)";
 
-		$oldSet = $this->getSettingAsArray( $old, $name, $type );
-		$newSet = $this->getSettingAsArray( $new, $name, $type );
+		$oldSet = WebConfiguration::filterVar( $this->getSettingAsArray( $old, $name, $type ) );
+		$newSet = WebConfiguration::filterVar( $this->getSettingAsArray( $new, $name, $type ) );
 		$diffs = new Diff( $oldSet, $newSet );
 		$formatter = new TableDiffFormatter();
 
@@ -327,12 +327,33 @@
 
 	protected function getOldVersion() {
 		global $wgConf;
-		return $wgConf->getOldSettings( $this->diff );
+		
+		$settings = $wgConf->getOldSettings( $this->diff );
+	
+		if ($this->diff == 'default') { ## Special case: Replicate settings across all wikis for a fair comparison.
+			$new = $this->getNewVersion();
+			
+			$defaultSettings = array();
+			
+			## This is kinda annoying. We can't copy ALL settings over, because not all settings are stored.
+			foreach( $new as $wiki => $newSettings ) {
+				$defaultSettings[$wiki] = array();
+				
+				foreach( $newSettings as $key => $value ) {
+					$defaultSettings[$wiki][$key] = $settings['default'][$key];
+				}
+			}
+			
+			$settings = $defaultSettings;
+		}
+		
+		return $settings;
 	}
 
 	protected function getNewVersion() {
 		global $wgConf;
-		return $wgConf->getOldSettings( $this->version );
+		$settings = $wgConf->getOldSettings( $this->version );
+		return $settings;
 	}
 
 	protected function getSettings() {
Index: trunk/extensions/Configure/Configure.i18n.php
===================================================================
--- trunk/extensions/Configure/Configure.i18n.php	(revision 44111)
+++ trunk/extensions/Configure/Configure.i18n.php	(revision 44112)
@@ -18,6 +18,7 @@
 
 	'configure-edit-core'                 => 'MediaWiki',
 	'configure-edit-ext'                  => 'Extensions',
+	'configure-viewconfig-default-diff'   => 'Changes from default settings',
 
 	'configure-ext-doc'                   => 'See online documentation',
 	'configure-ext-schemachange'          => "'''Warning:''' this extension requires a database update to work correctly!",
@@ -25,6 +26,7 @@
 	'configure-ext-use-extension'         => 'Use this extension',
 	'configure-ext-use'                   => 'Use',
 	'configure-form-reason'		      => 'Reason for change:',
+	'configure-customised'		      => "''This setting has been customised''",
 
 	'configure-arrayinput-oneperline'     => "''(one per line)''",
 	'configure-summary'                   => 'This special page allows you to configure this wiki, see [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings] for more information.',
@@ -134,6 +136,7 @@
 	'configure-transwiki-not-in-range'    => 'The requested wiki, $1, is not in allowed values ($2).',
 	'configure-view'                      => 'View',
 	'configure-view-all-versions'         => 'Full list of versions',
+	'configure-view-default'              => 'Default settings',
 	'configure-view-not-allowed'          => 'You are not allowed to see this setting',
 	'configure-viewconfig-line'	      => '$1 $2 by $3 $5: $4',
 	'extensions'                          => 'Configure the extensions',
Index: trunk/extensions/Configure/Configure.js
===================================================================
--- trunk/extensions/Configure/Configure.js	(revision 44111)
+++ trunk/extensions/Configure/Configure.js	(revision 44112)
@@ -170,7 +170,8 @@
 		button.onclick = createImageUrlCallback( textbox, img );
 
 		textbox.parentNode.insertBefore( button, img );
-		textbox.parentNode.appendChild( document.createTextNode( '\u00A0' ), textbox ); // nbsp
+		textbox.parentNode.insertBefore( document.createTextNode( '\u00A0' ), button ); // nbsp
+		img.parentNode.insertBefore( document.createTextNode( '\u00A0' ), img ); // nbsp
 	}
 
 	// $wgGroupPermissions stuff, only if ajax is enabled
Index: trunk/extensions/Configure/Configure.css
===================================================================
--- trunk/extensions/Configure/Configure.css	(revision 44111)
+++ trunk/extensions/Configure/Configure.css	(revision 44112)
@@ -142,6 +142,10 @@
 	color: #0318d8;
 }
 
+.configure-customised {
+	background-color: #eef;
+}
+
 /**
  * disabled settings
  */

Status & tagging log

Personal tools
Namespaces
Variants
Views
Actions
Site
Support
Download
Development
Communication
Toolbox