MediaWiki:Common.js: Difference between revisions

From The Reed and Rite
mNo edit summary
mNo edit summary
Line 37: Line 37:
});
});


mw.loader.using('mediawiki.user', function () {
mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () {
   if (mw.user.isAnon()) {
   if (mw.user.isAnon()) {
     $('.user-only-dismiss').hide();
     $('.user-only-dismiss').hide();
Line 43: Line 43:
   }
   }


  // Track how many of each hash have been seen
   const pageTitle = mw.config.get('wgPageName');
   const hashCounts = {};


   $('.maybe-dismissible').each(function (index) {
   $('.maybe-dismissible').each(function (i) {
     const notice = $(this);
     const notice = $(this);
    const content = notice.text().trim();


     // Use trimmed text content as base hash
     // Construct unique key per notice per page, using index + content hash
     const text = notice.text().trim();
     const hash = generateHash(content);
     const hash = generateHash(text);
     const key = `dismissed-notice-${pageTitle}-${hash}-${i}`;


    // Count instances of the same hash
     if (localStorage.getItem(key) === 'true') {
    if (!hashCounts[hash]) {
      hashCounts[hash] = 0;
    } else {
      hashCounts[hash]++;
    }
 
    // Create a unique key per page load (same content, multiple instances)
    const instanceKey = `${hash}-${hashCounts[hash]}`;
    const storageKey = 'dismissed-notice-' + instanceKey;
 
     if (localStorage.getItem(storageKey) === 'true') {
       notice.hide();
       notice.hide();
     }
     }
Line 70: Line 59:
     notice.find('.dismiss-button').on('click', function () {
     notice.find('.dismiss-button').on('click', function () {
       notice.hide();
       notice.hide();
       localStorage.setItem(storageKey, 'true');
       localStorage.setItem(key, 'true');
     });
     });
   });
   });


  // Simple string hash function
   function generateHash(str) {
   function generateHash(str) {
     let hash = 0;
     let hash = 0;
     for (let i = 0; i < str.length; i++) {
     for (let i = 0; i < str.length; i++) {
       hash = ((hash << 5) - hash) + str.charCodeAt(i);
       hash = ((hash << 5) - hash) + str.charCodeAt(i);
       hash |= 0; // 32-bit int
       hash |= 0;
     }
     }
     return hash;
     return hash;
   }
   }
});
});

Revision as of 22:43, 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">&#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 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');
    });
  });

  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;
  }
});