User:Robmoen/bugStatusUpdate.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* 
 * Bug Status Update Gadget
 * Author: Rob Moen (robm)
 * 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"]}]';
	};
	
	//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]);
	});
    
    if( ids.length === 0 ) return ;

	//make jsonp
	$.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
					$item = $('.mw-trackedTemplate')
						.find('a[title^="bugzilla:'+data.result.bugs[b].id+'"]');

					if($item) {
						//find child, if 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;

					}
				}
			}
		}
	});

})(jQuery);