MediaWiki r39651 - Code Review

Jump to: navigation, search
Repository:MediaWiki
Revision:r39650‎ | r39651 (on ViewVC)‎ | r39652 >
Date:18:21, 19 August 2008
Author:ialex
Status:old
Tags:
Comment:
Added the possibility to change status with ajax in OnlineStatus extension, it will add a new tab in the personal tools with a dropdown menu.
Note: this requires a SkinTemplate-based skin to work as the PersonalUrls hook is used.
Modified paths:

Diff [purge]

Index: trunk/extensions/OnlineStatus/OnlineStatus.css
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.css	(revision 0)
+++ trunk/extensions/OnlineStatus/OnlineStatus.css	(revision 39651)
@@ -0,0 +1,17 @@
+/**
+ * CSS stylesheet for OnlineStatus extension
+ */
+
+.online-status-js {
+	overflow: auto; 
+	overflow-x: hidden; 
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	background-color: white; 
+	border-style: solid;
+	border-color: #AAAAAA;
+	border-width: 1px;
+	z-index: 99;
+	font-size: 120%;
+}

Property changes on: trunk/extensions/OnlineStatus/OnlineStatus.css
___________________________________________________________________
Name: svn:eol-style
   + native

Index: trunk/extensions/OnlineStatus/OnlineStatus.js
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.js	(revision 0)
+++ trunk/extensions/OnlineStatus/OnlineStatus.js	(revision 39651)
@@ -0,0 +1,83 @@
+var OnlineStatusCreated = false;
+
+function OnlineStatus(){
+	var status = document.getElementById( 'pt-status' );
+	if( typeof status == 'object' ){
+		var link = status.firstChild;
+		link.onmousedown = status.onkeypress = ShowOnlineToggle;
+	}
+}
+
+function ShowOnlineToggle(){
+	if( !OnlineStatusCreated ){
+		var div = document.createElement( 'div' );
+		div.id = 'online-status-js';
+		div.className = 'online-status-js';
+
+		// Taken from skins/mwsuggest.js of core
+		// Credit: Robert Stojnić
+		var left = 0;
+		var top = this.offsetHeight;
+		var elem = this;
+		while( elem ){
+			left += elem.offsetLeft;
+			top += elem.offsetTop;
+			elem = elem.offsetParent;
+		}
+		if( navigator.userAgent.indexOf( 'Mac' ) != -1 && typeof document.body.leftMargin != 'undefined' ){
+			left += document.body.leftMargin;
+			top += document.body.topMargin;
+		}
+
+		div.style.left = left + "px";
+		div.style.top = top + "px";
+		var table = document.createElement( 'table' );
+		sajax_do_call( 'efOnlineStatusAjax', ['get'], function( x ){
+			if( x.status == 200 ){
+				var resp = x.responseText;
+				// A bit unsafe, but...
+				var json = eval( resp );
+				for( i = 0; i < json.length; i++ ){
+					var status = json[i];
+					var tr = document.createElement( 'tr' );
+					var td = document.createElement( 'td' );
+					if( status[2] ){
+						td.appendChild( document.createTextNode( status[1] ) );
+					} else {
+						var a = document.createElement( 'a' );
+						a.status = status[0];
+						a.onmousedown = a.onkeypress = ChangeOnlineStatus;
+						a.appendChild( document.createTextNode( status[1] ) );
+						td.appendChild( a );
+					}
+					tr.appendChild( td );
+					table.appendChild( tr );
+				}
+			}
+		} );
+		div.appendChild( table );
+		div.visible = true;
+		document.body.appendChild( div );
+		OnlineStatusCreated = true;
+	} else {
+		var div = document.getElementById( 'online-status-js' );
+		div.parentNode.removeChild( div );
+		OnlineStatusCreated = false;
+	}
+}
+
+function ChangeOnlineStatus(){
+	var status = this.status;
+	sajax_do_call( 'efOnlineStatusAjax', ['set', status], function( x ){
+		if( x.status == 200 ){
+			var resp = x.responseText;
+			jsMsg( resp, 'watch' );
+			// Force update
+			var div = document.getElementById( 'online-status-js' );
+			div.parentNode.removeChild( div );
+			OnlineStatusCreated = false;
+		}
+	} );
+}
+
+hookEvent( 'load', OnlineStatus );
\ No newline at end of file

Property changes on: trunk/extensions/OnlineStatus/OnlineStatus.js
___________________________________________________________________
Name: svn:eol-style
   + native

Index: trunk/extensions/OnlineStatus/OnlineStatus.i18n.php
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.i18n.php	(revision 39650)
+++ trunk/extensions/OnlineStatus/OnlineStatus.i18n.php	(revision 39651)
@@ -9,10 +9,14 @@
 
 $messages['en'] = array(
 	'onlinestatus-desc'             => 'Add a preference to show if the user is currently present or not on the wiki',
+	'onlinestatus-js-anon'          => 'Error: you must be logged in to use this feature',
+	'onlinestatus-js-changed'       => 'Your status has been changed to "$1"',
+	'onlinestatus-js-error'         => 'Impossible to change status, value "$1" is invalid',
 	'onlinestatus-levels'           => '* online
 * offline', // Do not translate this message
 	'onlinestatus-subtitle-offline' => 'This user is currently offline',
 	'onlinestatus-subtitle-online'  => 'This user is currently online',
+	'onlinestatus-tab'              => 'Status',
 	'onlinestatus-toggles-desc'     => 'Your status:',
 	'onlinestatus-toggles-explain'  => 'This allows you to show to other users if you are actually online or not by viewing your user page.',
 	'onlinestatus-toggles-show'     => 'Show online status on my user page',
@@ -156,8 +160,12 @@
  */
 $messages['fr'] = array(
 	'onlinestatus-desc' => "Ajoute une préférence pour montrer si l'utilisateur est présent ou non",
+	'onlinestatus-js-anon' => 'Erreur : vous devez être connecté pour utiliser cette fonctionnalité',
+	'onlinestatus-js-changed' => 'Votre status a été changé à « $1 »',
+	'onlinestatus-js-error' => 'Impossible de changer le statut, la valeur « $1 » est invalide',
 	'onlinestatus-subtitle-offline' => 'Cet utilisateur est actuellement hors ligne',
 	'onlinestatus-subtitle-online' => 'Cet utilisateur est actuellement en ligne',
+	'onlinestatus-tab' => 'Statut',
 	'onlinestatus-toggles-desc' => 'Votre statut&nbsp;:',
 	'onlinestatus-toggles-explain' => 'Ceci permet aux autres utilisateur de savoir si vous êtes actuellement présent en regardant votre page utilisateur.',
 	'onlinestatus-toggles-show' => 'Montrer mon statut sur ma page utilisateur',
Index: trunk/extensions/OnlineStatus/OnlineStatus.php
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.php	(revision 39650)
+++ trunk/extensions/OnlineStatus/OnlineStatus.php	(revision 39651)
@@ -13,8 +13,8 @@
 
 // Add credit :)
 $wgExtensionCredits['other'][] = array(
-	'svn-date' => '$LastChangedDate$',
-	'svn-revision' => '$LastChangedRevision$',
+	'svn-date'       => '$LastChangedDate$',
+	'svn-revision'   => '$LastChangedRevision$',
 	'name'           => 'OnlineStatus',
 	'author'         => 'Alexandre Emsenhuber',
 	'url'            => 'http://www.mediawiki.org/wiki/Extension:OnlineStatus',
@@ -29,10 +29,55 @@
  */
 $wgAllowAnyUserOnlineStatusFunction = true;
 
+function efOnlineStatusAjax( $action, $stat = false ){
+	global $wgUser;
+	wfLoadExtensionMessages( 'OnlineStatus' );
+
+	if( $wgUser->isAnon() )
+		return wfMsgHtml( 'onlinestatus-js-anon' );
+
+	switch( $action ){
+	case 'get':
+		$def = $wgUser->getOption( 'online' );
+		$msg = wfMsgForContentNoTrans( 'onlinestatus-levels' );
+		$lines = explode( "\n", $msg );
+		$radios = array();
+		foreach( $lines as $line ){
+			if( substr( $line, 0, 1 ) != '*' )
+				continue;
+			$lev = trim( $line, '* ' );
+			$radios[] = array(
+				$lev,
+				wfMsg( 'onlinestatus-toggle-' . $lev ),
+				$lev == $def
+			);
+		}
+		return json_encode( $radios );
+	case 'set':
+		if( $stat ){
+			$dbw = wfGetDB(DB_MASTER);
+			$dbw->begin();
+			$actual = $wgUser->getOption( 'online' );
+			$wgUser->setOption( 'online', $stat );
+			if( $actual != $stat ){
+				$wgUser->getUserPage()->invalidateCache();
+				$wgUser->getTalkPage()->invalidateCache();
+			}
+			$wgUser->saveSettings();
+			$wgUser->invalidateCache();
+			$dbw->commit();
+			return wfMsgHtml( 'onlinestatus-js-changed', wfMsgHtml( 'onlinestatus-toggle-'.$stat ) );
+		} else {
+			return wfMsgHtml( 'onlinestatus-js-error', $stat );
+		}
+	}
+}
+
 class OnlineStatus {
 
 	static function init(){
-		global $wgExtensionMessagesFiles, $wgExtensionFunctions, $wgHooks, $wgAllowAnyUserOnlineStatusFunction;
+		global $wgExtensionMessagesFiles, $wgExtensionFunctions, $wgHooks, $wgAjaxExportList;
+		global $wgAllowAnyUserOnlineStatusFunction;
 		// Add messages file
 		$wgExtensionMessagesFiles['OnlineStatus'] = dirname( __FILE__ ) . '/OnlineStatus.i18n.php';
 
@@ -60,6 +105,10 @@
 
 		// User page
 		$wgHooks['BeforePageDisplay'][] = 'OnlineStatus::BeforePageDisplay';
+		$wgHooks['PersonalUrls'][] = 'OnlineStatus::PersonalUrls';
+		
+		// Ajax stuff
+		$wgAjaxExportList[] = 'efOnlineStatusAjax';
 	}
 
 	/**
@@ -241,7 +290,19 @@
 	 * Hook function for BeforePageDisplay
 	 */
 	static function BeforePageDisplay( &$out ){
-		global $wgTitle, $wgRequest;
+		global $wgTitle, $wgRequest, $wgUser;
+		global $wgUseAjax;
+
+		if( $wgUser->isLoggedIn() && $wgUseAjax ){
+			global $wgScriptPath, $wgJsMimeType;
+			$out->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgScriptPath}/extensions/OnlineStatus/OnlineStatus.js\"></script>" );
+			$out->addLink( array(
+				'rel' => 'stylesheet',
+				'type' => 'text/css',
+				'href' => "{$wgScriptPath}/extensions/OnlineStatus/OnlineStatus.css"
+			) );
+		}
+		
 		if( !in_array( $wgRequest->getVal( 'action', 'view' ), array( 'view', 'purge' ) ) )
 			return true;
 		$status = self::GetUserStatus( $wgTitle, true );
@@ -249,8 +310,32 @@
 			return true;
 		wfLoadExtensionMessages( 'OnlineStatus' );
 		$out->setSubtitle( wfMsgExt( 'onlinestatus-subtitle-' . $status, array( 'parse' ) ) );
+		
 		return true;
 	}
+
+	/**
+	 * Hook for PersonalUrls
+	 */
+	static function PersonalUrls( &$urls, &$title ){
+		global $wgUser, $wgUseAjax;
+		# Require ajax
+		if( !$wgUser->isLoggedIn() || !$wgUseAjax )
+			return true;
+		$arr = array();
+		foreach( $urls as $key => $val ){
+			if( $key == 'logout' ){
+				wfLoadExtensionMessages( 'OnlineStatus' );
+				$arr['status'] = array(
+					'text' => wfMsgHtml( 'onlinestatus-tab' ),
+					'href' => 'javascript:;',
+				);	
+			}
+			$arr[$key] = $val;
+		}
+		$urls = $arr;
+		return true;
+	}
 }
 
 OnlineStatus::init();
\ No newline at end of file

Status & tagging log

  • 15:30, 12 September 2011 Meno25 (Talk | contribs) changed the status of r39651 [removed: ok added: old]
Personal tools
Namespaces
Variants
Views
Actions
Site
Support
Download
Development
Communication
Toolbox