MediaWiki:Gadget-watchlist-notice-core.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/**
 * Add dismiss buttons to watchlist-message, then unhide it
 * Allows multiple dismiss buttons on [[MediaWiki:Watchlist-messages]] with bumpable cookie IDs (now used for LS).
 * Note: HTML is backwards compatible with old version, new version ignores old syntax, except for dismissed IDs.
 * @author: [[:en:User:Ruud Koot]]
 * @author: [[:en:User:MZMcBride]]
 */
/*jslint white: true, regexp: true */
/*global jQuery, mediaWiki */
( function ( mw, $ ) {
'use strict';

var storageKey = 'hidewatchlistmessages';

function getDismissedNotices () {
	var hiddenNotices = mw.storage.get( storageKey )
		|| mw.storage.session.get( storageKey );

	try {
		return JSON.parse( hiddenNotices ) || []; 
	} catch (e) {
		return [];
	}
}

function saveDismissedNotices ( notices ) {
	notices = JSON.stringify( notices );
	mw.storage.set( storageKey, notices )
		|| mw.storage.session.set( storageKey, notices );
}

// Remove ids which are no longer defined
function expungeOldNotices ( currentList ) {
	var dismissedNotices = getDismissedNotices(),
		originalLength = dismissedNotices.length;
	for ( var i = dismissedNotices.length - 1; i >= 0; i--) {
		if( currentList.indexOf( dismissedNotices[i] ) === -1 ) {
			dismissedNotices.splice( i, 1 );
		}
	}
	if( originalLength !== dismissedNotices.length ) {
		saveDismissedNotices( dismissedNotices );
	}
}

function dismissWatchlistMessage( event ) {
	var $message = $( this ).closest( '.watchlist-message' );
	var cid = $( this ).data( 'watchlistMessage' ).cid;
	var notices = getDismissedNotices();
	
	$message.hide();
	
	notices.push( cid );
	saveDismissedNotices( notices );
	
	event.preventDefault();
}

function addDismissButton() {
	var watchItems = $( 'div.watchlist-message' );
	var watchItemIds = [];
	var dismissedNotices = getDismissedNotices();
	var dismissedNoticesLength = dismissedNotices.length;
	
	if ( watchItems.length === 0) {
		watchItems = $( 'li.watchlist-message' );
	}
	if ( watchItems.length === 0) {
		return;
	}
	for ( var i = 0; i < watchItems.length; i++ ) {
		var watchlistCookieID = parseInt( watchItems[i].className.replace( /.*cookie\-ID\_(\d*).*/ig, '$1' ) );
		if ( isNaN( watchlistCookieID ) ) {
			continue;
		}
		watchItemIds.push( watchlistCookieID );
		if ( dismissedNotices.indexOf( watchlistCookieID ) !== -1 ) {
			watchItems[i].style.display = 'none';
			continue;
		}
		var Button     = document.createElement( 'span' );
		var ButtonLink = document.createElement( 'a' );
		var ButtonText = document.createTextNode( 'dismiss' );
		
		ButtonLink.className = 'dismissButton';
		ButtonLink.setAttribute( 'href', '#' );
		ButtonLink.setAttribute( 'title', 'Hide this message' );
		ButtonLink.appendChild( ButtonText );
		$( ButtonLink ).data( 'watchlistMessage', {
			index: i,
			cid: watchlistCookieID
		} );
		$( ButtonLink ).click( dismissWatchlistMessage );
		
		Button.appendChild( document.createTextNode(' [' ) );
		Button.appendChild( ButtonLink );
		Button.appendChild( document.createTextNode( ']' ) );
		watchItems[i].appendChild( Button );
	}
	expungeOldNotices( watchItemIds );
	
	$( '#watchlist-message' ).show();
}

$( addDismissButton );

}( mediaWiki, jQuery ) );