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 .dismiss-button').click(function () {
   $('.dismissible-notice').each(function (i) {
    $(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">&#9679;</span>', '&#9702;'];
  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 notice = $(this);
     const content = notice.text().trim();
     const content = notice.text().trim();


     // Generate a content-based hash
     // 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">&#9679;</span>', '&#9702;'];
  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());
    });
  });
});
});