MediaWiki:Gadget-WatchlistNoticeCore.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/**
 * Display the watchlist messages (by unhiding them), and add dismiss buttons to them.
 * The messages are defined in [[MediaWiki:Watchlist-messages]], with bumpable message ids.
 * @author: [[:en:User:Ruud Koot]]
 * @author: [[:en:User:MZMcBride]]
 */

/* globals WeakMap, mw, $ */

( function () {
'use strict';

var linkIds = new WeakMap();
var storageKey = 'hidewatchlistmessages';

var i18n = ( function () {
	var translations = {
		fr: {
			'Masquer ce message': 'Masquer ce message',
			'masquer': 'masquer',
		},
		en: {
			'Masquer ce message': 'Hide this message',
			'masquer': 'hide',
		},
	};
	var userlanguage = mw.config.get( 'wgUserLanguage' );
	var defaultLanguage = 'fr';

	return function ( key ) {
		if ( translations[ userlanguage ] && translations[ userlanguage ][ key ] !== undefined ) {
			return translations[ userlanguage ][ key ];
		}
		if ( translations[ defaultLanguage ][ key ] !== undefined ) {
			return translations[ defaultLanguage ][ key ];
		}
		return '';
	};
} )();

function getDismissedNotices() {
	var hiddenNotices = mw.storage.getObject( storageKey );

	return Array.isArray( hiddenNotices ) ? hiddenNotices : [];
}

function saveDismissedNotices( notices ) {
	mw.storage.setObject( storageKey, notices );
}

// Remove ids that are no longer defined
function expungeOldNotices( currentList, dismissedNotices ) {
	var newDismissed = dismissedNotices.filter( function ( notice ) {
		return currentList.includes( notice );
	} );
	if ( dismissedNotices.length !== newDismissed.length ) {
		saveDismissedNotices( newDismissed );
	}
}

function dismissWatchlistMessage( event ) {
	event.preventDefault();

	var ButtonLink = event.currentTarget;

	var $message = $( ButtonLink ).closest( '.watchlist-message' );
	$message.hide();

	var notices = getDismissedNotices();
	var messageId = linkIds.get( ButtonLink );

	// The conditional prevents multiple insertions of the same id,
	// in case the user closed the same message in several browser tabs
	if ( !notices.includes( messageId ) ) {
		notices.push( messageId );
		saveDismissedNotices( notices );
	}
}

function addDismissButton() {
	var $watchItems = $( '.watchlist-message' );
	var watchItemIds = [];
	var dismissedNotices = getDismissedNotices();
	var hasMessagesToShow = false;

	for ( var i = 0; i < $watchItems.length; i++ ) {
		var messageId = parseInt( $watchItems[ i ].dataset.messageId );
		if ( isNaN( messageId ) ) {
			continue;
		}

		watchItemIds.push( messageId );

		if ( dismissedNotices.includes( messageId ) ) {
			$watchItems[ i ].style.display = 'none';

		} else {
			hasMessagesToShow = true;

			var Button     = document.createElement( 'span' );
			var ButtonLink = document.createElement( 'a' );

			linkIds.set( ButtonLink, messageId );

			ButtonLink.href = '#';
			ButtonLink.title = i18n( 'Masquer ce message' );
			ButtonLink.textContent = i18n( 'masquer' );
			ButtonLink.addEventListener( 'click', dismissWatchlistMessage );

			Button.appendChild( document.createTextNode( ' [' ) );
			Button.appendChild( ButtonLink );
			Button.appendChild( document.createTextNode( ']' ) );

			$watchItems[ i ].appendChild( Button );
		}
	}

	expungeOldNotices( watchItemIds, dismissedNotices );

	if ( hasMessagesToShow ) {
		$( '#watchlist-messages' ).show();
	}
}

$( addDismissButton );

}() );