MediaWiki:Gadget-togglePatrollerRequests.js

/** * A toggle script for hiding "patrol-requests". * This is basically just a function for hiding/redisplaying a heading with its underlying conversation. * * Created by User:Jack McKalling */ $(document).ready(function {	var objStatusClasses = {		"new": "patrol-request-status-new",		"wip":  "patrol-request-status-wip",		"done": "patrol-request-status-done"	};	/**	 * Check whether the current user wants to show (true) or hide (false) the specified patroller request status.	 * If the current user did not set these settings before, this method returns false by default.	 * This information is stored in the browser's localStorage (assuming there is one)	 * @return boolean	 */	function hasUserSetting(strName) {		var strRaw = localStorage.getItem("mw-patrol-requests-settings");		// localStorage variable should be formatted as "status1 status2 statusX", e.g. "new wip"		// each value specifies a status of requests that should be shown		if (strRaw === null) return false;		if ((" " + strRaw + " ").indexOf(" " + strName + " ") < 0)  return false;		return true;	}	/**	 * Sets the user preference for the specified patroller request status. * If the current user wants the specified status to show, it will be appended to a space-separated multi value. * This information is acquired from the browser's localStorage (assuming there is one) * @param strStatusKey string The status key to set the value for * @param booShow boolean The value whether to show (true) or hide (false) */	function setUserSetting(strStatusKey, booShow) { var strSettings = localStorage.getItem("mw-patrol-requests-settings"); if (!objStatusClasses.hasOwnProperty(strStatusKey)) return; // cancel if status doesn't exist if (strSettings === null || strSettings === "") strSettings = ""; // new usersettings else if (strSettings == strSettings) strSettings = ""; // unset specified status else strSettings = (" " + strSettings + " ").replace(" " + strStatusKey + " ", " ").trim; // strip away specified status if (booShow) { strSettings += (strSettings !== "" ? " " : "") + strStatusKey; // add specified status }		localStorage.setItem("mw-patrol-requests-settings", strSettings); }	/**	 * Create a handler for toggling the display of "empty" headings along with their content * TODO: differentiate the toggling by status rather than just "all" * @param booShow boolean whether to display or hide the "empty" headings */	function toggleEmptyHeadings(booShow) { $("h2").nextAll("h3").each(function {   		var headingContent = $(this).nextUntil("h3"), funcIsRelevantHeading = function {            	// ignore irrelevant headers that don't contain requests at all            	if (!$(this).is(".patrol-request")) return false;        		// (merged if with for-loop to only iterate over the above user defined properties)        		for (var strStatusKey in objStatusClasses) if (objStatusClasses.hasOwnProperty(strStatusKey)) {        			// detect anything with an unknown status as not hideable        			if (!$(this).is("[class*='patrol-request-status-']")) return false;        			// detect anything else than the hideable status as not hideable        			if (strStatusKey != "done" && $(this).is("." + objStatusClasses[strStatusKey])) return false;        		}        		return true; // only hideable statusses at this point            };        	// check if heading has content at all and meets all criteria of a hideable conversation if (headingContent.length > 0 && headingContent.is(funcIsRelevantHeading)) { if (booShow) $(this).show; else $(this).hide; }   	});	}	/**	 * Create a handler for displaying hideable patrol requests	 */    $(".patrol-request-toggle-show").on("click", function { $(".patrol-request-status-done").next("dl").show; $(".patrol-request-status-done").show; toggleEmptyHeadings(true); });   /**     * Create a handler for hiding hideable patrol requests     */    $(".patrol-request-toggle-hide").on("click", function { $(".patrol-request-status-done").next("dl").hide; $(".patrol-request-status-done").hide; toggleEmptyHeadings(false); }); });