MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More languages
More actions
Content deleted Content added
Restore the working version switcher to the core site module (Gadgets ext is not installed on this wiki) (via update-page on MediaWiki MCP Server) |
Guard against double-injection once the Gadgets extension ships (via update-page on MediaWiki MCP Server) |
||
| Line 1: | Line 1: | ||
/** |
/** |
||
* OHC Network Wiki — shared site |
* OHC Network Wiki — shared site JS. |
||
| ⚫ | |||
* |
|||
* Guarded so it never double-injects when the ohc-version-switcher gadget is |
|||
| ⚫ | |||
* enabled (see MediaWiki:Gadgets-definition). |
|||
* |
|||
* Behaviour: |
|||
* 1. On any page with the .docs-meta class (i.e. pages using {{Doc header}}), |
|||
* injects a version dropdown into the metadata strip. |
|||
* 2. Selecting an older version checks (via MW API) whether a frozen fork |
|||
* subpage exists (e.g. Concepts/Patient/3.0). If yes → navigate there. |
|||
* If no → stay on the canonical page (it spans that version implicitly). |
|||
* 3. Persists the chosen version in localStorage. On page load, if you have |
|||
* a non-latest version stored and a fork exists, auto-redirects. |
|||
* 4. On frozen forks, the dropdown shows the fork's version as selected and |
|||
* switching to "latest" returns you to the canonical page. |
|||
*/ |
*/ |
||
mw.loader.using( [ 'mediawiki.util', 'mediawiki.notification' ] ).then( function () { |
mw.loader.using( [ 'mediawiki.util', 'mediawiki.notification' ] ).then( function () { |
||
'use strict'; |
'use strict'; |
||
// Only activate on doc pages |
|||
var metaStrip = document.querySelector( '.docs-meta' ); |
var metaStrip = document.querySelector( '.docs-meta' ); |
||
if ( !metaStrip ) { |
if ( !metaStrip || metaStrip.querySelector( '.docs-version-switcher' ) ) { |
||
return; |
return; |
||
} |
} |
||
// --- Configuration (update KNOWN_VERSIONS on each CARE release) --- |
|||
var KNOWN_VERSIONS = [ '3.1', '3.0' ]; |
var KNOWN_VERSIONS = [ '3.1', '3.0' ]; |
||
var LATEST = KNOWN_VERSIONS[ 0 ]; |
var LATEST = KNOWN_VERSIONS[ 0 ]; |
||
var LS_KEY = 'ohcwiki-care-version'; |
var LS_KEY = 'ohcwiki-care-version'; |
||
// --- Detect context --- |
|||
var currentPage = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ); |
var currentPage = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ); |
||
var storedVersion = null; |
var storedVersion = null; |
||
| Line 35: | Line 22: | ||
if ( !storedVersion ) { storedVersion = LATEST; } |
if ( !storedVersion ) { storedVersion = LATEST; } |
||
// Are we on a frozen fork? (subpage like "Concepts/Patient/3.0") |
|||
var forkMatch = currentPage.match( /^(.+)\/(\d+\.\d+)$/ ); |
var forkMatch = currentPage.match( /^(.+)\/(\d+\.\d+)$/ ); |
||
var isOnFork = !!forkMatch; |
var isOnFork = !!forkMatch; |
||
| Line 41: | Line 27: | ||
var viewingVersion = isOnFork ? forkMatch[ 2 ] : LATEST; |
var viewingVersion = isOnFork ? forkMatch[ 2 ] : LATEST; |
||
// --- Build the dropdown --- |
|||
var container = document.createElement( 'span' ); |
var container = document.createElement( 'span' ); |
||
container.className = 'docs-meta__badge docs-version-switcher'; |
container.className = 'docs-meta__badge docs-version-switcher'; |
||
| Line 67: | Line 52: | ||
metaStrip.insertBefore( container, metaStrip.firstChild ); |
metaStrip.insertBefore( container, metaStrip.firstChild ); |
||
// --- Navigation --- |
|||
function navigateToVersion( version ) { |
function navigateToVersion( version ) { |
||
if ( version === LATEST ) { |
if ( version === LATEST ) { |
||
| Line 80: | Line 64: | ||
window.location.href = mw.util.getUrl( forkTitle ); |
window.location.href = mw.util.getUrl( forkTitle ); |
||
} else if ( isOnFork ) { |
} else if ( isOnFork ) { |
||
// No fork for chosen version but we're on a fork — go canonical |
|||
window.location.href = mw.util.getUrl( canonicalPage ); |
window.location.href = mw.util.getUrl( canonicalPage ); |
||
} else { |
} else { |
||
| Line 98: | Line 81: | ||
} |
} |
||
// --- Auto-redirect on load (respects stored version preference) --- |
|||
if ( storedVersion !== LATEST && !isOnFork && !window.location.search.includes( 'action=' ) ) { |
if ( storedVersion !== LATEST && !isOnFork && !window.location.search.includes( 'action=' ) ) { |
||
var forkTitle = canonicalPage + '/' + storedVersion; |
var forkTitle = canonicalPage + '/' + storedVersion; |
||
Revision as of 14:43, 11 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';
select.style.cssText = 'border:none;background:transparent;font-size:1em;font-weight:700;cursor:pointer;color:#0f8b6c;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 ) );
}
} );
}
} );