MediaWiki:Common.js: Difference between revisions
mNo edit summary Tag: Reverted |
mNo edit summary |
||
| (51 intermediate revisions by the same user not shown) | |||
| Line 2: | Line 2: | ||
mw.loader.load( 'ext.cite.styles' ); | mw.loader.load( 'ext.cite.styles' ); | ||
$( | /* Allows Template:Notice to be dismissable. */ | ||
$('.dismissible-notice .dismiss-button').click(function() { | mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () { | ||
$( | if (mw.user.isAnon()) { | ||
// Hide the dismiss button for anonymous users | |||
$('.user-only-dismiss').hide(); | |||
return; | |||
} | |||
const pageTitle = mw.config.get('wgPageName'); | |||
// Enable dismissal for logged-in users if allowed | |||
$('.maybe-dismissible').addClass('dismissible-notice'); | |||
$('.dismissible-notice').each(function (i) { | |||
const notice = $(this); | |||
const content = notice.text().trim(); | |||
// Generate a unique key for each notice (based on content + index) | |||
const hash = generateHash(content); | |||
const key = `dismissed-notice-${pageTitle}-${hash}-${i}`; | |||
// Hide the notice if it has already been dismissed | |||
if (localStorage.getItem(key) === 'true') { | |||
notice.hide(); | |||
} | |||
// Enable dismissal | |||
notice.find('.dismiss-button').on('click', function () { | |||
notice.hide(); | |||
localStorage.setItem(key, 'true'); | |||
}); | |||
// Track if the content has changed to clear the dismissal | |||
const originalContent = notice.html(); | |||
const mutationObserver = new MutationObserver(function () { | |||
const currentContent = notice.html(); | |||
if (originalContent !== currentContent) { | |||
localStorage.removeItem(key); // Clear the dismissal if content changes | |||
} | |||
}); | |||
mutationObserver.observe(notice[0], { childList: true, subtree: true }); | |||
}); | |||
// Add Reset Notices tab to action menu | |||
mw.util.addPortletLink( | |||
'p-cactions', // Add to the "Actions" menu | |||
'#', | |||
'Reset Notices', | |||
'ca-reset-notices', | |||
'Reset all dismissed notices on this page', | |||
null, | |||
'#ca-history' | |||
); | |||
// Reset logic | |||
$('#ca-reset-notices a').on('click', function (e) { | |||
e.preventDefault(); | |||
const prefix = `dismissed-notice-${pageTitle}-`; | |||
const keysToRemove = []; | |||
// Collect all localStorage keys that are related to dismissed notices | |||
for (let i = 0; i < localStorage.length; i++) { | |||
const key = localStorage.key(i); | |||
if (key && key.startsWith(prefix)) { | |||
keysToRemove.push(key); | |||
} | |||
} | |||
// Remove all matching keys | |||
keysToRemove.forEach(key => localStorage.removeItem(key)); | |||
// Reload to re-show all notices | |||
location.reload(); | |||
}); | }); | ||
// Basic hash function | |||
function generateHash(str) { | |||
let hash = 0; | |||
for (let i = 0; i < str.length; i++) { | |||
hash = ((hash << 5) - hash) + str.charCodeAt(i); | |||
hash |= 0; // Convert to 32bit integer | |||
} | |||
return hash; | |||
} | |||
}); | }); | ||
/* Allows bullet points in to-do list in Template:User to toggle on and off. */ | |||
$(function() { | |||
const bullets = document.querySelectorAll('.toggle-bullet'); | |||
const bulletChars = ['<span style="color: green">●</span>', '◦']; | |||
const localStorageKey = 'userInfoboxBulletState'; | |||
bullets.forEach((bullet, index) => { | |||
let currentIndex = localStorage.getItem(localStorageKey + index) === '0' ? 0 : 1; // Default to black if no stored state | |||
bullet.innerHTML = bulletChars[currentIndex]; | |||
bullet.addEventListener('click', function() { | |||
currentIndex = (currentIndex + 1) % bulletChars.length; | |||
this.innerHTML = bulletChars[currentIndex]; | |||
localStorage.setItem(localStorageKey + index, currentIndex.toString()); | |||
}); | |||
}); | |||
}); | |||
/* EDITORIAL NOTATION TOOPTIP INCREASED SPEED */ | |||
$(function() { | $(function() { | ||
$('.editorial-notation-tooltip').on('mouseover', function(e) { | |||
var | var $this = $(this); | ||
var $innerSpan = $this.find('span'); | |||
var titleText = $innerSpan.attr('title'); | |||
if ($ | if (titleText) { | ||
$ | var $tooltip = $('<div class="editorial-notation-tooltip-box"></div>').text(titleText); | ||
$('body').append($tooltip); | |||
$tooltip.css({ | |||
top: e.pageY + 10, | |||
left: e.pageX + 10, | |||
position: 'absolute' | |||
}).fadeIn('normal'); | |||
$innerSpan.data('original-title', titleText).removeAttr('title'); // Store and remove title | |||
} | |||
}).on('mouseout', function() { | |||
var $this = $(this); | |||
var $innerSpan = $this.find('span'); | |||
var tooltipText = $('.editorial-notation-tooltip-box').text(); | |||
$('.editorial-notation-tooltip-box').fadeOut('normal', function() { | |||
$(this).remove(); | |||
$innerSpan.attr('title', $innerSpan.data('original-title')); // Restore the original title | |||
}); | |||
}).on('mousemove', function(e) { | |||
$('.editorial-notation-tooltip-box').css({ | |||
top: e.pageY + 10, | |||
left: e.pageX + 10 | |||
}); | |||
}); | |||
}); | |||
$(function() { | |||
// Remove default link tooltip for citation needed links | |||
$('.editorial-notation-tooltip a').removeAttr('title'); | |||
}); | |||
/* MAKES "CONTENT PAGES" THE DEFUALT TAB WHEN SEARCHING (INSTALLING SMW MADE THE DEFAULT "ADVANCED") */ | |||
$(function () { | |||
if (mw.config.get('wgCanonicalSpecialPageName') === 'Search') { | |||
const urlParams = new URLSearchParams(window.location.search); | |||
if (!urlParams.has('profile')) { | |||
urlParams.set('profile', 'default'); // Use Content pages | |||
window.location.search = urlParams.toString(); | |||
} | } | ||
} | } | ||
}); | |||
/* Initial Spoiler Pop-up */ | |||
function showDialog (name, text) { | |||
var container = document.createElement('div'); | |||
container.style.display = 'flex'; | |||
container.style.alignItems = 'center'; | |||
container.style.justifyContent = 'center'; | |||
container.style.position = 'fixed'; | |||
container.style.left = '0'; | |||
container.style.right = '0'; | |||
container.style.top = '0'; | |||
container.style.bottom = '0'; | |||
container.style.zIndex = '10000'; | |||
container.style.background = 'rgba(0, 0, 0, 0.5)'; | |||
container.style.filter = 'initial'; | |||
var window = document.createElement('div'); | |||
window.className = 'thereadandrite-spoiler-warning'; | |||
window.style.boxShadow = '0 4px 30px 0 rgba(0, 0, 0, 0.2)'; | |||
window.style.width = '90%'; | |||
window.style.maxWidth = '600px'; | |||
window.style.borderRadius = '3px'; | |||
window.style.background = 'white'; | |||
window.style.display = 'flex'; | |||
window.style.flexDirection = 'column'; | |||
window.style.boxSizing = 'border-box'; | |||
window.style.padding = '16px'; | |||
window.style.fontSize = '1.5em'; | |||
window.style.maxHeight = '90%'; | |||
container.appendChild(window); | |||
window.innerHTML = '<h2>⚠️ Spoiler Warning</h2>'; | |||
window.innerHTML += text; | |||
var button = document.createElement('button'); | |||
button.className = 'mw-ui-button mw-ui-destructive'; | |||
button.style.alignSelf = 'center'; | |||
button.style.fontSize = '1em'; | |||
button.innerHTML = 'Proceed'; | |||
button.onclick = function () { | |||
localStorage.setItem(name, 'seen'); | |||
document.body.removeChild(container); | |||
$(document.body).removeClass('spoiler-warning-blur'); | |||
} | } | ||
}); | window.appendChild(button); | ||
var style = document.createElement('style'); | |||
style.type = 'text/css'; | |||
style.innerHTML = '.spoiler-warning-blur > * { filter: blur(50px); }'; | |||
document.getElementsByTagName('head')[0].appendChild(style); | |||
$(document.body).addClass('spoiler-warning-blur'); | |||
document.body.appendChild(container); | |||
$('#spoiler-warning__time-machine-link').click(function () { localStorage.setItem(name, 'seen'); }) | |||
$('#spoiler-warning__spoiler-policy-link').click(function () { localStorage.setItem(name, 'seen'); }) | |||
} | |||
Latest revision as of 03:49, 17 May 2025
/* Any JavaScript here will be loaded for all users on every page load. */
mw.loader.load( 'ext.cite.styles' );
/* Allows Template:Notice to be dismissable. */
mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () {
if (mw.user.isAnon()) {
// Hide the dismiss button for anonymous users
$('.user-only-dismiss').hide();
return;
}
const pageTitle = mw.config.get('wgPageName');
// Enable dismissal for logged-in users if allowed
$('.maybe-dismissible').addClass('dismissible-notice');
$('.dismissible-notice').each(function (i) {
const notice = $(this);
const content = notice.text().trim();
// Generate a unique key for each notice (based on content + index)
const hash = generateHash(content);
const key = `dismissed-notice-${pageTitle}-${hash}-${i}`;
// Hide the notice if it has already been dismissed
if (localStorage.getItem(key) === 'true') {
notice.hide();
}
// Enable dismissal
notice.find('.dismiss-button').on('click', function () {
notice.hide();
localStorage.setItem(key, 'true');
});
// Track if the content has changed to clear the dismissal
const originalContent = notice.html();
const mutationObserver = new MutationObserver(function () {
const currentContent = notice.html();
if (originalContent !== currentContent) {
localStorage.removeItem(key); // Clear the dismissal if content changes
}
});
mutationObserver.observe(notice[0], { childList: true, subtree: true });
});
// Add Reset Notices tab to action menu
mw.util.addPortletLink(
'p-cactions', // Add to the "Actions" menu
'#',
'Reset Notices',
'ca-reset-notices',
'Reset all dismissed notices on this page',
null,
'#ca-history'
);
// Reset logic
$('#ca-reset-notices a').on('click', function (e) {
e.preventDefault();
const prefix = `dismissed-notice-${pageTitle}-`;
const keysToRemove = [];
// Collect all localStorage keys that are related to dismissed notices
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key && key.startsWith(prefix)) {
keysToRemove.push(key);
}
}
// Remove all matching keys
keysToRemove.forEach(key => localStorage.removeItem(key));
// Reload to re-show all notices
location.reload();
});
// Basic hash function
function generateHash(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = ((hash << 5) - hash) + str.charCodeAt(i);
hash |= 0; // Convert to 32bit integer
}
return hash;
}
});
/* Allows bullet points in to-do list in Template:User to toggle on and off. */
$(function() {
const bullets = document.querySelectorAll('.toggle-bullet');
const bulletChars = ['<span style="color: green">●</span>', '◦'];
const localStorageKey = 'userInfoboxBulletState';
bullets.forEach((bullet, index) => {
let currentIndex = localStorage.getItem(localStorageKey + index) === '0' ? 0 : 1; // Default to black if no stored state
bullet.innerHTML = bulletChars[currentIndex];
bullet.addEventListener('click', function() {
currentIndex = (currentIndex + 1) % bulletChars.length;
this.innerHTML = bulletChars[currentIndex];
localStorage.setItem(localStorageKey + index, currentIndex.toString());
});
});
});
/* EDITORIAL NOTATION TOOPTIP INCREASED SPEED */
$(function() {
$('.editorial-notation-tooltip').on('mouseover', function(e) {
var $this = $(this);
var $innerSpan = $this.find('span');
var titleText = $innerSpan.attr('title');
if (titleText) {
var $tooltip = $('<div class="editorial-notation-tooltip-box"></div>').text(titleText);
$('body').append($tooltip);
$tooltip.css({
top: e.pageY + 10,
left: e.pageX + 10,
position: 'absolute'
}).fadeIn('normal');
$innerSpan.data('original-title', titleText).removeAttr('title'); // Store and remove title
}
}).on('mouseout', function() {
var $this = $(this);
var $innerSpan = $this.find('span');
var tooltipText = $('.editorial-notation-tooltip-box').text();
$('.editorial-notation-tooltip-box').fadeOut('normal', function() {
$(this).remove();
$innerSpan.attr('title', $innerSpan.data('original-title')); // Restore the original title
});
}).on('mousemove', function(e) {
$('.editorial-notation-tooltip-box').css({
top: e.pageY + 10,
left: e.pageX + 10
});
});
});
$(function() {
// Remove default link tooltip for citation needed links
$('.editorial-notation-tooltip a').removeAttr('title');
});
/* MAKES "CONTENT PAGES" THE DEFUALT TAB WHEN SEARCHING (INSTALLING SMW MADE THE DEFAULT "ADVANCED") */
$(function () {
if (mw.config.get('wgCanonicalSpecialPageName') === 'Search') {
const urlParams = new URLSearchParams(window.location.search);
if (!urlParams.has('profile')) {
urlParams.set('profile', 'default'); // Use Content pages
window.location.search = urlParams.toString();
}
}
});
/* Initial Spoiler Pop-up */
function showDialog (name, text) {
var container = document.createElement('div');
container.style.display = 'flex';
container.style.alignItems = 'center';
container.style.justifyContent = 'center';
container.style.position = 'fixed';
container.style.left = '0';
container.style.right = '0';
container.style.top = '0';
container.style.bottom = '0';
container.style.zIndex = '10000';
container.style.background = 'rgba(0, 0, 0, 0.5)';
container.style.filter = 'initial';
var window = document.createElement('div');
window.className = 'thereadandrite-spoiler-warning';
window.style.boxShadow = '0 4px 30px 0 rgba(0, 0, 0, 0.2)';
window.style.width = '90%';
window.style.maxWidth = '600px';
window.style.borderRadius = '3px';
window.style.background = 'white';
window.style.display = 'flex';
window.style.flexDirection = 'column';
window.style.boxSizing = 'border-box';
window.style.padding = '16px';
window.style.fontSize = '1.5em';
window.style.maxHeight = '90%';
container.appendChild(window);
window.innerHTML = '<h2>⚠️ Spoiler Warning</h2>';
window.innerHTML += text;
var button = document.createElement('button');
button.className = 'mw-ui-button mw-ui-destructive';
button.style.alignSelf = 'center';
button.style.fontSize = '1em';
button.innerHTML = 'Proceed';
button.onclick = function () {
localStorage.setItem(name, 'seen');
document.body.removeChild(container);
$(document.body).removeClass('spoiler-warning-blur');
}
window.appendChild(button);
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = '.spoiler-warning-blur > * { filter: blur(50px); }';
document.getElementsByTagName('head')[0].appendChild(style);
$(document.body).addClass('spoiler-warning-blur');
document.body.appendChild(container);
$('#spoiler-warning__time-machine-link').click(function () { localStorage.setItem(name, 'seen'); })
$('#spoiler-warning__spoiler-policy-link').click(function () { localStorage.setItem(name, 'seen'); })
}