MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More languages
More actions
Content deleted Content added
Version switcher moved to ohc-version-switcher gadget; keep Common.js as a shared anchor (via update-page on MediaWiki MCP Server) Tag: Replaced |
Bot: careui — version-switcher select no longer hardcodes the old teal; it is styled from the token layer in Common.css - Claude |
||
| (2 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
/** |
/** |
||
* OHC Network Wiki — shared site |
* 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 |
|||
* Previously hosted the CARE version switcher; that logic now lives in the |
|||
* |
* enabled (see MediaWiki:Gadgets-definition). |
||
* be toggled per-user. Keep generic, site-wide behavior here instead. |
|||
*/ |
*/ |
||
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 ) ); |
|||
} |
|||
} ); |
|||
} |
|||
} ); |
|||
Latest revision as of 13:00, 12 August 2026
/**
* 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 ) );
}
} );
}
} );