MediaWiki:Common.js: Difference between revisions
No edit summary |
No edit summary |
||
| Line 987: | Line 987: | ||
try{var saved=localStorage.getItem('grantha_home_tab');if(saved==='author')showView('author');else showView('grantha');}catch(e){showView('grantha');} | try{var saved=localStorage.getItem('grantha_home_tab');if(saved==='author')showView('author');else showView('grantha');}catch(e){showView('grantha');} | ||
} ); | } ); | ||
}() ); | |||
// ── Replace MediaWiki user links with a single username dropdown (Profile + Logout) ── | |||
( function () { | |||
function wikiHref( title ) { | |||
if ( window.mw && mw.util && mw.util.getUrl ) return mw.util.getUrl( title ); | |||
var ap = ( window.mw && mw.config && mw.config.get( 'wgArticlePath' ) ) || '/wiki/$1'; | |||
return ap.replace( '$1', title ); | |||
} | |||
function buildLogoutForm( token ) { | |||
// POST logout = no confirmation interstitial. returnto sends them home. | |||
var form = document.createElement( 'form' ); | |||
form.method = 'post'; | |||
form.action = ( window.mw ? mw.util.wikiScript() : '/index.php' ) + '?title=Special:UserLogout'; | |||
form.style.display = 'none'; | |||
form.innerHTML = | |||
'<input type="hidden" name="wpEditToken" value="' + token.replace(/"/g,'"') + '">' + | |||
'<input type="hidden" name="title" value="Special:UserLogout">' + | |||
'<input type="hidden" name="returnto" value="Main Page">'; | |||
document.body.appendChild( form ); | |||
return form; | |||
} | |||
function injectUserDropdown() { | |||
if ( document.getElementById( 'gr-user-dropdown' ) ) return; | |||
var userName = window.mw ? mw.config.get( 'wgUserName' ) : null; | |||
if ( !userName ) return; // anonymous — nothing to show | |||
var container = document.querySelector( '.vector-user-links-main' ) | |||
|| document.querySelector( '.vector-user-links' ); | |||
if ( !container ) return; | |||
// Logout token (csrf token works for logout in modern MW) | |||
var token = ( window.mw && mw.user && mw.user.tokens ) | |||
? mw.user.tokens.get( 'csrfToken' ) : '+\\'; | |||
var wrap = document.createElement( 'div' ); | |||
wrap.id = 'gr-user-dropdown'; | |||
wrap.innerHTML = | |||
'<button id="gr-user-trigger" type="button" aria-haspopup="true" aria-expanded="false">' + | |||
'<span>' + (userName.replace(/</g,'<')) + '</span>' + | |||
'<span class="gr-caret">▾</span>' + | |||
'</button>' + | |||
'<div id="gr-user-menu" role="menu">' + | |||
'<a href="' + wikiHref( 'Special:Profile' ) + '" role="menuitem">Profile</a>' + | |||
'<a href="#" id="gr-logout-link" role="menuitem">Log out</a>' + | |||
'</div>'; | |||
container.appendChild( wrap ); | |||
var trigger = document.getElementById( 'gr-user-trigger' ); | |||
var menu = document.getElementById( 'gr-user-menu' ); | |||
trigger.addEventListener( 'click', function ( e ) { | |||
e.stopPropagation(); | |||
var open = menu.classList.toggle( 'gr-open' ); | |||
trigger.setAttribute( 'aria-expanded', open ? 'true' : 'false' ); | |||
} ); | |||
document.addEventListener( 'click', function ( e ) { | |||
if ( !wrap.contains( e.target ) ) { | |||
menu.classList.remove( 'gr-open' ); | |||
trigger.setAttribute( 'aria-expanded', 'false' ); | |||
} | |||
} ); | |||
document.getElementById( 'gr-logout-link' ).addEventListener( 'click', function ( e ) { | |||
e.preventDefault(); | |||
buildLogoutForm( token ).submit(); | |||
} ); | |||
} | |||
if ( document.readyState === 'loading' ) { | |||
document.addEventListener( 'DOMContentLoaded', injectUserDropdown ); | |||
} else { | |||
injectUserDropdown(); | |||
} | |||
}() ); | }() ); | ||