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,'&quot;') + '">' +
      '<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,'&lt;')) + '</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();
  }
}() );
}() );