MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
(make available at any point) |
mNo edit summary |
||
| (11 intermediate revisions by 2 users not shown) | |||
| Line 30: | Line 30: | ||
// Load site JS | // Load site JS | ||
[ | [ | ||
'ThemeToggle.js', // Add link button on sidebar for mass renaming files and pages | |||
'MassRename.js', // Add link button on sidebar for mass renaming files and pages | |||
'BetterUpload.js', // Improvements to Special:Upload | 'BetterUpload.js', // Improvements to Special:Upload | ||
'BetterDiff.js' // Aids with patrolling and with diff viewing on RC, page history and user contribs | 'BetterDiff.js' // Aids with patrolling and with diff viewing on RC, page history and user contribs | ||
| Line 89: | Line 91: | ||
importScript('User:'+config.wgUserName+'/common.js'); | importScript('User:'+config.wgUserName+'/common.js'); | ||
importStylesheet('User:'+config.wgUserName+'/common.css'); | importStylesheet('User:'+config.wgUserName+'/common.css'); | ||
} | |||
// === EMERGENCY TITLE OVERRIDE === | |||
(function() { | |||
// Only on main page | |||
if (mw.config.get('wgPageName') !== 'Main_Page' && | |||
!window.location.href.includes('Main_Page')) return; | |||
console.log('=== APPLYING EMERGENCY TITLE FIX ==='); | |||
// 1. IMMEDIATELY set the title | |||
document.title = 'MB Wiki - The Official Wiki'; | |||
// 2. Override the heading | |||
function fixHeading() { | |||
var heading = document.querySelector('#firstHeading, h1.firstHeading, .mw-page-title-main'); | |||
if (heading) { | |||
heading.textContent = 'MB Wiki - The Official Wiki'; | |||
heading.style.display = 'none'; | |||
heading.style.visibility = 'hidden'; | |||
} else { | |||
// Create heading if it doesn't exist | |||
var newHeading = document.createElement('h1'); | |||
newHeading.id = 'firstHeading'; | |||
newHeading.className = 'firstHeading'; | |||
newHeading.textContent = 'MB Wiki - The Official Wiki'; | |||
var content = document.querySelector('#content, .mw-body'); | |||
if (content) content.prepend(newHeading); | |||
} | |||
} | |||
// 3. Run now and keep running | |||
fixHeading(); | |||
setTimeout(fixHeading, 100); | |||
setTimeout(fixHeading, 500); | |||
setTimeout(fixHeading, 1000); | |||
setTimeout(fixHeading, 2000); | |||
// 4. Monitor and fix any time title changes | |||
var lastTitle = document.title; | |||
setInterval(function() { | |||
if (document.title !== lastTitle && | |||
document.title.includes('Coral Island')) { | |||
console.log('Title changed to wrong value, fixing...'); | |||
document.title = 'MB Wiki - The Official Wiki'; | |||
lastTitle = document.title; | |||
fixHeading(); | |||
} | |||
}, 500); | |||
// 5. Also fix meta tags | |||
function fixMetaTags() { | |||
var metaTags = document.querySelectorAll('meta[property="og:title"], meta[name="twitter:title"]'); | |||
metaTags.forEach(function(tag) { | |||
tag.setAttribute('content', 'MB Wiki - The Official Wiki'); | |||
}); | |||
} | |||
fixMetaTags(); | |||
console.log('Emergency title fix applied'); | |||
})(); | |||
/* Navigation Fix */ | |||
// Fix navigation to match bottom code structure | |||
$(document).ready(function() { | |||
// Wait a bit to ensure DOM is fully loaded | |||
setTimeout(function() { | |||
// 1. Remove webfonts-changed class from dropdown checkboxes | |||
$('#p-cactions-checkbox.webfonts-changed').removeClass('webfonts-changed'); | |||
$('#p-variants-checkbox.webfonts-changed').removeClass('webfonts-changed'); | |||
// 2. Add vectorTabs class to navigation menus (like bottom code) | |||
$('#p-namespaces, #p-views').addClass('vectorTabs'); | |||
// 3. Add 'menu' class to content lists (like bottom code) | |||
$('#p-namespaces .vector-menu-content-list, #p-views .vector-menu-content-list') | |||
.addClass('menu'); | |||
// 4. Fix dropdown functionality if needed | |||
fixDropdownFunctionality(); | |||
// 5. Optional: Hide personal tools if you want to match bottom structure | |||
// $('#p-personal').hide(); | |||
console.log('Navigation structure fixed to match target design'); | |||
}, 100); | |||
}); | |||
function fixDropdownFunctionality() { | |||
// Make sure dropdowns work with checkbox system | |||
$('.vector-menu-dropdown .vector-menu-heading').each(function() { | |||
var $heading = $(this); | |||
var $checkbox = $heading.prev('.vector-menu-checkbox'); | |||
var $content = $heading.next('.vector-menu-content'); | |||
if ($checkbox.length && $content.length) { | |||
// Toggle dropdown on click | |||
$heading.on('click', function(e) { | |||
e.preventDefault(); | |||
e.stopPropagation(); | |||
var isChecked = $checkbox.prop('checked'); | |||
$checkbox.prop('checked', !isChecked); | |||
// Close other open dropdowns | |||
$('.vector-menu-checkbox').not($checkbox).prop('checked', false); | |||
updateDropdowns(); | |||
}); | |||
} | |||
}); | |||
// Close dropdowns when clicking outside | |||
$(document).on('click', function(e) { | |||
if (!$(e.target).closest('.vector-menu-dropdown').length) { | |||
$('.vector-menu-checkbox').prop('checked', false); | |||
updateDropdowns(); | |||
} | |||
}); | |||
} | |||
function updateDropdowns() { | |||
$('.vector-menu-checkbox').each(function() { | |||
var $checkbox = $(this); | |||
var $content = $checkbox.nextAll('.vector-menu-content').first(); | |||
if ($checkbox.prop('checked')) { | |||
$content.css({ | |||
'display': 'block', | |||
'opacity': '1', | |||
'visibility': 'visible' | |||
}); | |||
} else { | |||
$content.css({ | |||
'display': 'none', | |||
'opacity': '0', | |||
'visibility': 'hidden' | |||
}); | |||
} | |||
}); | |||
} | } | ||
Latest revision as of 02:27, 16 December 2025
var config = mw.config.values;
window.dev = window.dev || {};
window.dev.waitFor = function(query, callback, extraDelay) {
if ('function' == typeof callback && 'string' == typeof query) {
extraDelay = extraDelay || 0;
if (document.querySelector(query)) {
setTimeout(callback, extraDelay);
} else {
// set up the mutation observer
var observer = new MutationObserver(function (mutations, me) {
// mutations is an array of mutations that occurred
// me is the MutationObserver instance
var targetNode = document.querySelector(query);
if (targetNode) {
setTimeout(callback, extraDelay);
me.disconnect(); // stop observing
return;
}
});
// start observing
observer.observe(document, {
childList: true,
subtree: true
});
}
}
};
// Load site JS
[
'ThemeToggle.js', // Add link button on sidebar for mass renaming files and pages
'MassRename.js', // Add link button on sidebar for mass renaming files and pages
'BetterUpload.js', // Improvements to Special:Upload
'BetterDiff.js' // Aids with patrolling and with diff viewing on RC, page history and user contribs
]
.forEach(function(src){
importScript('MediaWiki:'+src);
});
// Run when page content is added and loaded
mw.hook('wikipage.content').add(function(){
// Add navigational keybinds
if (config.wgAction=='view') {
var actions = {
e: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=edit'; },
h: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=history'; },
m: function(page){ return config.wgServer+mw.util.getUrl('Special:MovePage/'+page); },
d: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=delete'; },
};
var url = new URL(document.location.href);
var title =
url.searchParams.get('title') || // for `/w/index.php?title=XYZ` links
url.pathname.replace(/^.*?wi?k?i?\//, ''); // for `/wiki/XYZ` links
$(document).on('keydown', function(e) {
var key = e.key.toLocaleLowerCase();
if (
actions[key] &&
!(e.target && ['INPUT', 'TEXTAREA'].includes(e.target.nodeName)) &&
config.wgCanonicalSpecialPageName===false
) {
document.location.href= actions[key](title);
}
});
}
// Run through sidebar to make sure classes align with collapse status
window.dev.waitFor('#mw-navigation > .collapsible-nav > nav', function() {
$('#mw-navigation > .collapsible-nav > nav').each(function(_, nav) {
if (getComputedStyle(nav).display!=='none') {
if (
nav.classList.contains('collapsed') &&
getComputedStyle(nav.querySelector('.vector-menu-content')).display!=='none'
) {
nav.classList.remove('collapsed');
nav.classList.add('expanded');
} else if (
nav.classList.contains('expanded') &&
getComputedStyle(nav.querySelector('.vector-menu-content')).display=='none'
) {
nav.classList.add('collapsed');
nav.classList.remove('expanded');
}
}
});
});
});
// Load personal JS & CSS if logged in user
if (config.wgUserName && config.wgUserName.length>0) {
importScript('User:'+config.wgUserName+'/common.js');
importStylesheet('User:'+config.wgUserName+'/common.css');
}
// === EMERGENCY TITLE OVERRIDE ===
(function() {
// Only on main page
if (mw.config.get('wgPageName') !== 'Main_Page' &&
!window.location.href.includes('Main_Page')) return;
console.log('=== APPLYING EMERGENCY TITLE FIX ===');
// 1. IMMEDIATELY set the title
document.title = 'MB Wiki - The Official Wiki';
// 2. Override the heading
function fixHeading() {
var heading = document.querySelector('#firstHeading, h1.firstHeading, .mw-page-title-main');
if (heading) {
heading.textContent = 'MB Wiki - The Official Wiki';
heading.style.display = 'none';
heading.style.visibility = 'hidden';
} else {
// Create heading if it doesn't exist
var newHeading = document.createElement('h1');
newHeading.id = 'firstHeading';
newHeading.className = 'firstHeading';
newHeading.textContent = 'MB Wiki - The Official Wiki';
var content = document.querySelector('#content, .mw-body');
if (content) content.prepend(newHeading);
}
}
// 3. Run now and keep running
fixHeading();
setTimeout(fixHeading, 100);
setTimeout(fixHeading, 500);
setTimeout(fixHeading, 1000);
setTimeout(fixHeading, 2000);
// 4. Monitor and fix any time title changes
var lastTitle = document.title;
setInterval(function() {
if (document.title !== lastTitle &&
document.title.includes('Coral Island')) {
console.log('Title changed to wrong value, fixing...');
document.title = 'MB Wiki - The Official Wiki';
lastTitle = document.title;
fixHeading();
}
}, 500);
// 5. Also fix meta tags
function fixMetaTags() {
var metaTags = document.querySelectorAll('meta[property="og:title"], meta[name="twitter:title"]');
metaTags.forEach(function(tag) {
tag.setAttribute('content', 'MB Wiki - The Official Wiki');
});
}
fixMetaTags();
console.log('Emergency title fix applied');
})();
/* Navigation Fix */
// Fix navigation to match bottom code structure
$(document).ready(function() {
// Wait a bit to ensure DOM is fully loaded
setTimeout(function() {
// 1. Remove webfonts-changed class from dropdown checkboxes
$('#p-cactions-checkbox.webfonts-changed').removeClass('webfonts-changed');
$('#p-variants-checkbox.webfonts-changed').removeClass('webfonts-changed');
// 2. Add vectorTabs class to navigation menus (like bottom code)
$('#p-namespaces, #p-views').addClass('vectorTabs');
// 3. Add 'menu' class to content lists (like bottom code)
$('#p-namespaces .vector-menu-content-list, #p-views .vector-menu-content-list')
.addClass('menu');
// 4. Fix dropdown functionality if needed
fixDropdownFunctionality();
// 5. Optional: Hide personal tools if you want to match bottom structure
// $('#p-personal').hide();
console.log('Navigation structure fixed to match target design');
}, 100);
});
function fixDropdownFunctionality() {
// Make sure dropdowns work with checkbox system
$('.vector-menu-dropdown .vector-menu-heading').each(function() {
var $heading = $(this);
var $checkbox = $heading.prev('.vector-menu-checkbox');
var $content = $heading.next('.vector-menu-content');
if ($checkbox.length && $content.length) {
// Toggle dropdown on click
$heading.on('click', function(e) {
e.preventDefault();
e.stopPropagation();
var isChecked = $checkbox.prop('checked');
$checkbox.prop('checked', !isChecked);
// Close other open dropdowns
$('.vector-menu-checkbox').not($checkbox).prop('checked', false);
updateDropdowns();
});
}
});
// Close dropdowns when clicking outside
$(document).on('click', function(e) {
if (!$(e.target).closest('.vector-menu-dropdown').length) {
$('.vector-menu-checkbox').prop('checked', false);
updateDropdowns();
}
});
}
function updateDropdowns() {
$('.vector-menu-checkbox').each(function() {
var $checkbox = $(this);
var $content = $checkbox.nextAll('.vector-menu-content').first();
if ($checkbox.prop('checked')) {
$content.css({
'display': 'block',
'opacity': '1',
'visibility': 'visible'
});
} else {
$content.css({
'display': 'none',
'opacity': '0',
'visibility': 'hidden'
});
}
});
}