MediaWiki:Common.js: Difference between revisions
mNo edit summary |
mNo edit summary |
||
| Line 61: | Line 61: | ||
localStorage.setItem(key, 'true'); | localStorage.setItem(key, 'true'); | ||
}); | }); | ||
}); | |||
// Add Reset Notices tab to action menu | |||
mw.util.addPortletLink( | |||
'p-cactions', // Add to "Actions" menu (use 'p-personal' or 'p-navigation' if preferred) | |||
'#', // Link href (will be intercepted) | |||
'Reset Notices', // Link text | |||
'ca-reset-notices', // ID | |||
'Reset all dismissed notices on this page', // Tooltip | |||
null, | |||
'#ca-history' // Position before the history tab | |||
); | |||
// Handle reset click | |||
$('#ca-reset-notices a').on('click', function (e) { | |||
e.preventDefault(); | |||
// Clear only dismissed notices related to this page | |||
for (let i = 0; i < localStorage.length; i++) { | |||
const key = localStorage.key(i); | |||
if (key && key.startsWith(`dismissed-notice-${pageTitle}-`)) { | |||
localStorage.removeItem(key); | |||
} | |||
} | |||
// Reload the page to re-show notices | |||
location.reload(); | |||
}); | }); | ||
Revision as of 22:44, 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', function () {
if (mw.user.isAnon()) {
// Hide the dismiss button for anonymous users
$('.user-only-dismiss').hide();
return;
}
// Enable dismissal for logged-in users if allowed
$('.maybe-dismissible').addClass('dismissible-notice');
$('.dismissible-notice .dismiss-button').click(function () {
$(this).closest('.dismissible-notice').hide();
});
});
/* 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());
});
});
});
mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () {
if (mw.user.isAnon()) {
$('.user-only-dismiss').hide();
return;
}
const pageTitle = mw.config.get('wgPageName');
$('.maybe-dismissible').each(function (i) {
const notice = $(this);
const content = notice.text().trim();
// Construct unique key per notice per page, using index + content hash
const hash = generateHash(content);
const key = `dismissed-notice-${pageTitle}-${hash}-${i}`;
if (localStorage.getItem(key) === 'true') {
notice.hide();
}
notice.find('.dismiss-button').on('click', function () {
notice.hide();
localStorage.setItem(key, 'true');
});
});
// Add Reset Notices tab to action menu
mw.util.addPortletLink(
'p-cactions', // Add to "Actions" menu (use 'p-personal' or 'p-navigation' if preferred)
'#', // Link href (will be intercepted)
'Reset Notices', // Link text
'ca-reset-notices', // ID
'Reset all dismissed notices on this page', // Tooltip
null,
'#ca-history' // Position before the history tab
);
// Handle reset click
$('#ca-reset-notices a').on('click', function (e) {
e.preventDefault();
// Clear only dismissed notices related to this page
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key && key.startsWith(`dismissed-notice-${pageTitle}-`)) {
localStorage.removeItem(key);
}
}
// Reload the page to re-show notices
location.reload();
});
function generateHash(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = ((hash << 5) - hash) + str.charCodeAt(i);
hash |= 0;
}
return hash;
}
});