MediaWiki:Common.js: Difference between revisions

From The Reed and Rite
mNo edit summary
Tag: Reverted
mNo edit summary
 
(53 intermediate revisions by the same user not shown)
Line 2: Line 2:
mw.loader.load( 'ext.cite.styles' );
mw.loader.load( 'ext.cite.styles' );


$(document).ready(function() {
/* Allows Template:Notice to be dismissable. */
   $('.dismissible-notice .dismiss-button').click(function() {
mw.loader.using(['mediawiki.user', 'mediawiki.util'], function () {
     $(this).closest('.dismissible-notice').hide();
  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">&#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());
    });
  });
});


/* EDITORIAL NOTATION TOOPTIP INCREASED SPEED */
$(function() {
$(function() {
   if (mw.config.get('wgCanonicalSpecialPageName') === 'Editcount') {
   $('.editorial-notation-tooltip').on('mouseover', function(e) {
     $('form').each(function() {
    var $this = $(this);
       var $form = $(this);
    var $innerSpan = $this.find('span');
       var usernameInput = $form.find('input[name="wpUsername"]'); // Adjust if the input name is different
     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');


       if (usernameInput.length > 0) {
       $innerSpan.data('original-title', titleText).removeAttr('title'); // Store and remove title
        $form.on('submit', function(e) {
    }
          e.preventDefault();
  }).on('mouseout', function() {
          var username = usernameInput.val();
    var $this = $(this);
          if (username) {
    var $innerSpan = $this.find('span');
            var newAction = mw.config.get('wgScriptPath') + '/index.php?title=Special:EditCount/' + encodeURIComponent(username);
    var tooltipText = $('.editorial-notation-tooltip-box').text();
            $form.attr('action', newAction);
 
            // Optionally, you can submit the form programmatically:
    $('.editorial-notation-tooltip-box').fadeOut('normal', function() {
            $form.off('submit').submit();
      $(this).remove();
          }
      $innerSpan.attr('title', $innerSpan.data('original-title')); // Restore the original title
        });
    });
        return false; // Stop iterating through other forms (if any)
  }).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">&#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());
    });
  });
});

/* 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'); })
}