MediaWiki:Gadget-watchlist-notice-core.js: Difference between revisions

From Seeds of the Word, the encyclopedia of the influence of the Gospel on culture
Content deleted Content added
rm cookie logic, no longer needed
(No difference)

Revision as of 19:47, July 30, 2018

/**
 * 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( !( dismissedNotices[i] in currentList ) ) {
			dismissedNotices.splice( i, 0 );
		}
	}
	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 ) );