MediaWiki:Common.js: Difference between revisions
mNo edit summary |
mNo edit summary |
||
| Line 3: | Line 3: | ||
/* Allows Template:Notice to be dismissable. */ | /* Allows Template:Notice to be dismissable. */ | ||
mw.loader.using('mediawiki.user', function () { | mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () { | ||
if (mw.user.isAnon()) { | if (mw.user.isAnon()) { | ||
// Hide the dismiss button for anonymous users | // Hide the dismiss button for anonymous users | ||
| Line 9: | Line 9: | ||
return; | return; | ||
} | } | ||
const pageTitle = mw.config.get('wgPageName'); | |||
// Enable dismissal for logged-in users if allowed | // Enable dismissal for logged-in users if allowed | ||
$('.maybe-dismissible').addClass('dismissible-notice'); | $('.maybe-dismissible').addClass('dismissible-notice'); | ||
$('.dismissible-notice | $('.dismissible-notice').each(function (i) { | ||
const notice = $(this); | const notice = $(this); | ||
const content = notice.text().trim(); | const content = notice.text().trim(); | ||
// Generate a content | // Generate a unique key for each notice (based on content + index) | ||
const hash = generateHash(content); | const hash = generateHash(content); | ||
const key = `dismissed-notice-${pageTitle}-${hash}-${i}`; | const key = `dismissed-notice-${pageTitle}-${hash}-${i}`; | ||
// Hide the notice if it has already been dismissed | |||
if (localStorage.getItem(key) === 'true') { | if (localStorage.getItem(key) === 'true') { | ||
notice.hide(); | notice.hide(); | ||
} | } | ||
// Enable dismissal | |||
notice.find('.dismiss-button').on('click', function () { | notice.find('.dismiss-button').on('click', function () { | ||
notice.hide(); | notice.hide(); | ||
localStorage.setItem(key, 'true'); | 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 }); | |||
}); | }); | ||
| Line 81: | Line 64: | ||
const keysToRemove = []; | const keysToRemove = []; | ||
// Collect all localStorage keys that are related to dismissed notices | |||
for (let i = 0; i < localStorage.length; i++) { | for (let i = 0; i < localStorage.length; i++) { | ||
const key = localStorage.key(i); | const key = localStorage.key(i); | ||
| Line 104: | Line 88: | ||
return hash; | 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()); | |||
}); | |||
}); | |||
}); | }); | ||
Revision as of 23:08, 14 April 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());
});
});
});