User:Technical 13/SandBox/Gadget-BugStatusUpdate.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.
/*
* Bug Status Update Gadget
* Author: Donald Fortier (User:Technical_13)
* *  Based on original code:
* ** Author: Rob Moen (robm)
* ** Source: [[mw:User:Robmoen/bugStatusUpdate.js]]
* Description:
* Finds and updates bug status templates on a page.
* Makes 1 JSONP request to Bugzilla JSON RPC api.
*/
 
(function($){
	var ids = [], target = 'https://bugzilla.wikimedia.org/jsonrpc.cgi';
 
//	// Ugly way to compose the request parameters. Though, bugzilla is happy with it.
	var getParams = function ( ids ) {
		return 'method=Bug.get&id=158&params=[{ "ids": [' + ids.join(',') + '],"include_fields":["last_change_time","status", "id", "summary"]}]';
	};
 
//	// Get the bug id numbers on the page
	$( '.mw-trackedTemplate' ).each( function() {
		var title = $( this ).find( 'a[title^="bugzilla:"]' ).attr( 'title' );
		ids.push( title.split( ':' )[1] );
	});
//	// Do not query if no ids were found
	if  ( !ids.length ) {
			return;
	}
	// Make jsonp request
	$.ajax({
		url: target,
		dataType: 'jsonp',
		data: getParams( ids ),
		success: function ( data ) {
			 var color = {
						"RESOLVED": "green",
						"CRITICAL": "red"
					},
					statusProps = {
						'font-weight': 'bold',
						'font-size': '1.5em',
						'text-transform': 'uppercase'
					};
			 if ( data.result.bugs ) {
				for( var b in data.result.bugs ) {
//					//find the right bug to update
					var $item = $( '.mw-trackedTemplate' ).find( 'a[title^="bugzilla:' + data.result.bugs[b].id + '"]' );
					var title = $( '.trakbug-' + data.result.bugs[b].id );
					if( title ) {
						title.text( data.result.bugs[b].summary );
					}
					if( $item ) {
//						// Find child, if it exists.
						$status = $item
							.parent()
							.next( 'p' )
							.children( 'span' );
//						//create the status element if it does not exist
						if( $status.length === 0 ){
							$item
								.parent()
								.parent()
								.append(
									$( '<p />' ).append(
										$( '<span />' ).css( statusProps )
											.text( 'Status' )
									)
								);
						}
//						// Udpate the status element.
						$item
							.parent()
							.next( 'p' )
							.children( 'span' )
							.css( 'color', color[data.result.bugs[b].status] || '#333333' )
							.text( data.result.bugs[b].status );	
						$status = null;
					 }
				}
			}
		}// End of success:
	});
 })(jQuery);