Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js

MediaWiki interface page
Revision as of 13:00, 12 August 2026 by Robo (talk | contribs) (Bot: careui — version-switcher select no longer hardcodes the old teal; it is styled from the token layer in Common.css - Claude)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
 * OHC Network Wiki — shared site JS.
 * CARE version switcher (Docusaurus-style dropdown on doc pages, {{Doc header}}).
 * Guarded so it never double-injects when the ohc-version-switcher gadget is
 * enabled (see MediaWiki:Gadgets-definition).
 */
mw.loader.using( [ 'mediawiki.util', 'mediawiki.notification' ] ).then( function () {
	'use strict';

	var metaStrip = document.querySelector( '.docs-meta' );
	if ( !metaStrip || metaStrip.querySelector( '.docs-version-switcher' ) ) {
		return;
	}

	var KNOWN_VERSIONS = [ '3.1', '3.0' ];
	var LATEST = KNOWN_VERSIONS[ 0 ];
	var LS_KEY = 'ohcwiki-care-version';

	var currentPage = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
	var storedVersion = null;
	try { storedVersion = localStorage.getItem( LS_KEY ); } catch ( e ) {}
	if ( !storedVersion ) { storedVersion = LATEST; }

	var forkMatch = currentPage.match( /^(.+)\/(\d+\.\d+)$/ );
	var isOnFork = !!forkMatch;
	var canonicalPage = isOnFork ? forkMatch[ 1 ] : currentPage;
	var viewingVersion = isOnFork ? forkMatch[ 2 ] : LATEST;

	var container = document.createElement( 'span' );
	container.className = 'docs-meta__badge docs-version-switcher';
	container.style.cssText = 'display:inline-flex;align-items:center;gap:0.3em;padding:0.15em 0.5em;';

	var select = document.createElement( 'select' );
	select.title = 'Switch documentation version';
	// Colour comes from the token layer, not a literal -- MediaWiki:Common.css
	// already styles `.docs-version-switcher select`, so only layout is set here.
	select.style.cssText = 'font-size:1em;font-weight:700;font-family:inherit;';

	KNOWN_VERSIONS.forEach( function ( v ) {
		var opt = document.createElement( 'option' );
		opt.value = v;
		opt.textContent = v + ( v === LATEST ? ' (latest)' : '' );
		if ( v === viewingVersion ) { opt.selected = true; }
		select.appendChild( opt );
	} );

	select.addEventListener( 'change', function () {
		var chosen = select.value;
		try { localStorage.setItem( LS_KEY, chosen ); } catch ( e ) {}
		navigateToVersion( chosen );
	} );

	container.appendChild( select );
	metaStrip.insertBefore( container, metaStrip.firstChild );

	function navigateToVersion( version ) {
		if ( version === LATEST ) {
			if ( isOnFork ) {
				window.location.href = mw.util.getUrl( canonicalPage );
			}
			return;
		}
		var forkTitle = canonicalPage + '/' + version;
		checkPageExists( forkTitle ).then( function ( exists ) {
			if ( exists ) {
				window.location.href = mw.util.getUrl( forkTitle );
			} else if ( isOnFork ) {
				window.location.href = mw.util.getUrl( canonicalPage );
			} else {
				mw.notify(
					'This page is unchanged in CARE ' + version + ' — you\'re already seeing the right content.',
					{ type: 'info', autoHide: true, autoHideSeconds: 4 }
				);
			}
		} );
	}

	function checkPageExists( title ) {
		return new mw.Api().get( { action: 'query', titles: title } ).then( function ( data ) {
			var pages = data.query && data.query.pages;
			return pages && !pages[ '-1' ];
		} ).catch( function () { return false; } );
	}

	if ( storedVersion !== LATEST && !isOnFork && !window.location.search.includes( 'action=' ) ) {
		var forkTitle = canonicalPage + '/' + storedVersion;
		checkPageExists( forkTitle ).then( function ( exists ) {
			if ( exists ) {
				window.location.replace( mw.util.getUrl( forkTitle ) );
			}
		} );
	}
} );