MediaWiki:Common.js: Difference between revisions

From MB Wiki
Jump to navigation Jump to search
(the format varies per action so just make it easier to customize)
mNo edit summary
 
(17 intermediate revisions by 2 users not shown)
Line 1: Line 1:
var config = mw.config.values;
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
// 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
]
]
.forEach(function(scr){
.forEach(function(src){
importScript('MediaWiki:'+scr);
importScript('MediaWiki:'+src);
});
});


// Add navigational keybinds
// Run when page content is added and loaded
mw.hook('wikipage.content').add(function(){
mw.hook('wikipage.content').add(function(){
var actions = {
// Add navigational keybinds
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'; },
};
if (config.wgAction=='view') {
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 url = new URL(document.location.href);
var title =  
var title =  
Line 34: Line 64:
});
});
}
}
// 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');
}
}
});
});
});
});


Line 40: 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'
            });
        }
    });
}