MediaWiki:Gadget-BugStatusUpdate.js

/*

* Bug Status Update Gadget

*

* Authors:

* Written by Rob Moen (robm).

* Ported to Phabricator by Matthew Flaschen (Mattflaschen (WMF))

*

* Description:

* Finds and updates bug status templates on a page.

* Makes 1 JSONP request to phabricator-bug-status API (maintained by Matthew Flaschen)

* (which passes the request to Phabricator's Conduit API)

* Source: mw:User:Robmoen/bugStatusUpdate.js

*/

( function( $ ){

var ids = [],

target = 'https://tools.wmflabs.org/phabricator-bug-status/queryTasks';

var getParams = function( ids ) {

return $.param( { ids: JSON.stringify( ids ) } );

};

// Get the Phabricator task id numbers on the page

// The template should provide a data attribute, for simplicity and probably better performance. There

// should also be a class, so it could quickly be found. E.g.

// data-phabricator-task="123" class="trakfab ..." ...

// This could then be selected easily, and the number could be accessed with .data( 'phabricatorTask' )

$( '.mw-trackedTemplate' ).find( 'a[title^="phabricator:T"]' ).each( function() {

var titleMatch = $( this ).attr( 'title' ).match( /phabricator:T(\d*)/ );

if ( titleMatch !== null ) {

ids.push( parseInt( titleMatch[1], 10 ) );

}

});

// Do not query if no ids were found

if ( !ids.length ) {

return;

}

// Make jsonp

$.ajax( {

url: target,

dataType: 'jsonp',

timeout: 5000, // Give up if Tool Labs is being slow today

statusCode: { 500: function () { /* Tool Labs has failed, nothing to do here */ } },

data: getParams( ids ),

success: function ( data ) {

var color = {

"resolved": "green"

},

phid, taskInfo, taskNumber, selector,

trackedTemplate, $taskLink, $title, $item,

$status;

for( phid in data ) {

taskInfo = data[phid];

taskNumber = taskInfo.id;

// Find the right task to update

selector = '.mw-trackedTemplate a[title^="phabricator:T' + taskNumber + '"]';

$taskLink = $( selector );

$title = $taskLink.find( '.trakfab-T' + taskNumber );

if ( $title ) {

$title.text( taskInfo.title );

}

$item = $taskLink.closest( '.mw-trackedTemplate' );

if( $item ) {

// Find child, if exists

// This is very fragile; this needs a class.

$status = $( '.tracked-closure' );

// Create the status element if it does not exist

if( $status.length === 0 ) {

$status = $( '' )

.addClass('tracked-closure');

$item.append( '
', $status );

}

// Update the status element

// This matches Template:Tracked itself, where only resolved has a color

// defined for Phabricator (everything else is black).

$status

.text( taskInfo.statusName )

.css( 'color', color[taskInfo.status] || 'black' );

}

}

}

} );

})( jQuery );