MediaWiki:Vector.js: Difference between revisions
Jump to navigation
Jump to search
| Line 134: | Line 134: | ||
}); | }); | ||
}); | }); | ||
/* Page Forms Image Sync Fix. Automatically "clicks" and focuses the image field after an upload to ensure the data is synced and recognized by the form. */ | |||
(function($) { | |||
// 1. Define the observer to watch for value changes | |||
var observer = new MutationObserver(function(mutations) { | |||
mutations.forEach(function(mutation) { | |||
// Check if the 'value' attribute of an input was changed | |||
if (mutation.type === "attributes" && mutation.attributeName === "value") { | |||
var target = mutation.target; | |||
// Only act if the field is an image field and has data | |||
if (target.name.includes('[image]') && target.value !== "") { | |||
// Simulate a hardware-level click | |||
target.dispatchEvent(new MouseEvent('click', { | |||
view: window, | |||
bubbles: true, | |||
cancelable: true | |||
})); | |||
// Force focus and trigger the sync events | |||
$(target).focus().trigger('change').trigger('input').blur(); | |||
console.log("PF Sync: Image field 'woken up' for: " + target.value); | |||
} | |||
} | |||
}); | |||
}); | |||
// 2. Start the observer when the form is ready | |||
$(document).ready(function() { | |||
var $imageFields = $('input[name*="[image]"]'); | |||
$imageFields.each(function() { | |||
observer.observe(this, { attributes: true }); | |||
}); | |||
// Also watch for any new fields added (like in multiple-instance templates) | |||
$('#sfForm').on('DOMNodeInserted', function(e) { | |||
var $newField = $(e.target).find('input[name*="[image]"]'); | |||
if ($newField.length) { | |||
observer.observe($newField[0], { attributes: true }); | |||
} | |||
}); | |||
}); | |||
})(jQuery); | |||
Revision as of 15:01, 25 April 2026
/* All JavaScript here will be loaded for users of the Vector skin */
/* Redirect ALL red links to the "Create Page" page */
$('.new').on('click', function(e) {
e.preventDefault();
window.location.href = mw.util.getUrl('Fork:Create_Page');
});
/* Accelerate native Vector collapsible tabs */
( function () {
var triggerNativeTabs = function () {
if ( mw.config.get( 'skin' ) === 'vector' ) {
// Forces the native script to recalculate and move links into the "More" menu
$( window ).trigger( 'resize' );
}
};
// Run as soon as the basic page structure is ready
$( triggerNativeTabs );
}() );
// Force immediate check for collapsible tabs in Vector Legacy
mw.loader.using( 'mediawiki.util' ).done( function () {
$( function () {
if ( mw.config.get( 'skin' ) === 'vector' ) {
// Trigger the resize event immediately on load
$( window ).trigger( 'resize' );
}
} );
} );
/* Move subcategories to the top on Category:Forklifts and Category:Video_Games */
if ( mw.config.get( 'wgPageName' ) === 'Category:Forklifts' || mw.config.get( 'wgPageName' ) === 'Category:Video_Games' ) {
$( function() {
var subcats = $( '#mw-subcategories' );
var content = $( '.mw-parser-output' );
if ( subcats.length && content.length ) {
subcats.insertBefore( content );
$( 'body' ).addClass( 'move-subcategories-up-active' );
$( '#bodyContent' ).css( { 'display': 'flex', 'flex-direction': 'column' } );
content.css( 'order', '2' );
subcats.css( 'order', '1' );
}
} );
}
/* SHOW ALL BUTTON */
mw.loader.using(['mediawiki.util', 'jquery'], function() {
$(function() {
$('.cargo-show-all-btn').on('click', function() {
var $this = $(this);
var $grid = $this.siblings('.cargo-hidden-grid');
// Toggle visibility
$grid.toggleClass('grid-visible');
// Dynamic text switching
var isVisible = $grid.hasClass('grid-visible');
var originalText = $this.text();
if (isVisible) {
$this.data('original-text', originalText);
$this.text(originalText.replace('Show All', 'Hide')).addClass('btn-active');
} else {
$this.text($this.data('original-text')).removeClass('btn-active');
}
});
});
});
/* NEWS SLIDESHOW */
mw.loader.using('mediawiki.util').then(function () {
mw.hook('wikipage.content').add(function () {
document.querySelectorAll('.news-slideshow-container').forEach(function (container) {
var slides = container.querySelectorAll('.news-slideshow-slide');
if (slides.length <= 1) return;
var current = 0;
var intervalId = null;
var delay = 8000; // 8 seconds
function showSlide(index) {
slides.forEach(function (slide, i) {
slide.classList.toggle('active', i === index);
});
}
function startSlideshow() {
if (intervalId !== null) return;
intervalId = setInterval(function () {
current = (current + 1) % slides.length;
showSlide(current);
}, delay);
}
function stopSlideshow() {
if (intervalId !== null) {
clearInterval(intervalId);
intervalId = null;
}
}
// Initial state
showSlide(current);
startSlideshow();
// Pause on hover
container.addEventListener('mouseenter', stopSlideshow);
container.addEventListener('mouseleave', startSlideshow);
});
});
});
/* FORM TABLE */
document.addEventListener('click', function (e) {
const header = e.target.closest('.pf-collapsible');
if (!header) return;
const targetId = header.dataset.target;
const section = document.getElementById(targetId);
if (!section) return;
const isOpen = section.style.display === 'block';
section.style.display = isOpen ? 'none' : 'block';
});
/* CLICKABLE HOME BUTTON AT THE TOP IN MOBILE VIEW */
$(document).ready(function() {
$('#left-navigation').on('click', function(e) {
if (e.target === this || $(e.target).is('::before')) {
window.location.href = mw.config.get('wgArticlePath').replace('$1', '');
}
});
});
/* Page Forms Image Sync Fix. Automatically "clicks" and focuses the image field after an upload to ensure the data is synced and recognized by the form. */
(function($) {
// 1. Define the observer to watch for value changes
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// Check if the 'value' attribute of an input was changed
if (mutation.type === "attributes" && mutation.attributeName === "value") {
var target = mutation.target;
// Only act if the field is an image field and has data
if (target.name.includes('[image]') && target.value !== "") {
// Simulate a hardware-level click
target.dispatchEvent(new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true
}));
// Force focus and trigger the sync events
$(target).focus().trigger('change').trigger('input').blur();
console.log("PF Sync: Image field 'woken up' for: " + target.value);
}
}
});
});
// 2. Start the observer when the form is ready
$(document).ready(function() {
var $imageFields = $('input[name*="[image]"]');
$imageFields.each(function() {
observer.observe(this, { attributes: true });
});
// Also watch for any new fields added (like in multiple-instance templates)
$('#sfForm').on('DOMNodeInserted', function(e) {
var $newField = $(e.target).find('input[name*="[image]"]');
if ($newField.length) {
observer.observe($newField[0], { attributes: true });
}
});
});
})(jQuery);