MediaWiki:Common.js: Difference between revisions

From MB Wiki
Jump to navigation Jump to search
No edit summary
mNo edit summary
 
(13 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
Line 37: Line 66:
// Run through sidebar to make sure classes align with collapse status
// Run through sidebar to make sure classes align with collapse status
console.log($('#mw-navigation > .collapsible-nav > nav'));
window.dev.waitFor('#mw-navigation > .collapsible-nav > nav', function() {
$('#mw-navigation > .collapsible-nav > nav').each(function(_, nav) {
$('#mw-navigation > .collapsible-nav > nav').each(function(_, nav) {
if (getComputedStyle(nav).display!=='none') {
if (getComputedStyle(nav).display!=='none') {
if (
if (
nav.classList.contains('collapsed') &&
nav.classList.contains('collapsed') &&
getComputedStyle(nav.querySelector('.vector-menu-content')).display!=='none'
getComputedStyle(nav.querySelector('.vector-menu-content')).display!=='none'
) {
) {
nav.classList.remove('collapsed');
nav.classList.remove('collapsed');
nav.classList.add('expanded');
nav.classList.add('expanded');
} else if (
} else if (
nav.classList.contains('expanded') &&
nav.classList.contains('expanded') &&
getComputedStyle(nav.querySelector('.vector-menu-content')).display=='none'
getComputedStyle(nav.querySelector('.vector-menu-content')).display=='none'
) {
) {
nav.classList.add('collapsed');
nav.classList.add('collapsed');
nav.classList.remove('expanded');
nav.classList.remove('expanded');
}
}
}
}
});
});
});
});
});
Line 61: 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'
            });
        }
    });
}