MediaWiki:Gadget-BugStatusUpdate.js
Apparence
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) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./*
* 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]]
*/
jQuery( function ( $ ) {
var $trackedTemplates = $( '#mw-content-text' ).find( '.phab-trackedTemplate' ),
$allTaskLinks = $(),
ids = [],
target = 'https://tools.wmflabs.org/phabricator-bug-status/queryTasks';
// Pick only the first matching link in each template
$trackedTemplates.each( function ( _, trackedTemplate ) {
var $taskLink = $( trackedTemplate ).find( 'a[title^="phabricator:T"], a[title^="phab:T"]' ).first();
if ( $taskLink.length ) {
$allTaskLinks.add( $taskLink );
}
} );
// 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' )
$allTaskLinks.each( function ( _, taskLink ) {
var titleMatch = taskLink.title.match( /^phab(?:ricator):T(\d+)$/ );
if ( titleMatch ) {
ids.push( parseInt( titleMatch[1] ) );
}
} );
// Do not query if no ids were found
if ( !ids.length ) {
return;
}
// Remove duplicates
ids = ids.filter( function ( value, index, self ) {
return self.indexOf( value ) === index;
} );
// Make jsonp
$.ajax( {
url: target,
dataType: 'jsonp',
data: { ids: JSON.stringify( ids ) },
timeout: 5000, // Give up if Tool Labs is being slow today
success: function ( data ) {
var color = {
"resolved": "green"
},
statusProps = {
'font-weight': 'bold',
'text-transform': 'uppercase'
},
phid, taskInfo, taskNumber,
$taskLinks;
for ( phid in data ) {
taskInfo = data[phid];
taskNumber = taskInfo.id;
// Find the right tasks to update
$taskLinks = $allTaskLinks.filter( 'a[title^="phabricator:T' + taskNumber + '"], a[title^="phab:T' + taskNumber + '"]' );
$taskLinks.each( function ( _, taskLink ) {
var $taskLink = $( taskLink ),
$title, $template, $status;
$title = $taskLink.find( '.trakfab-T' + taskNumber );
if ( $title.length ) {
$title.text( taskInfo.title );
}
$template = $taskLink.closest( '.phab-trackedTemplate' );
// Find child, if exists
$status = $template.find( '.phab-status' );
// Create the status element if it does not exist
if ( !$status.length ) {
$status = $( '<span></span>' )
.addClass( 'phab-status' )
.css( statusProps );
$template.append( '<br>', $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' );
} );
}
}
} );
} );