User:Magnus Manske/referee.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.
/* ADD THESE TWO LINES TO YOUR common.js USER SUBPAGE
referee_mode = 'manual' ;
importScript( 'User:Magnus_Manske/referee.js' );
*/
mw.loader.using(
[
/* 'wikibase.ui.entityViewInit',
'jquery.ui',*/
'oojs',
'oojs-ui-core',
'oojs-ui-widgets'
],
function onReady() {
if ( mw.config.get('wgNamespaceNumber') == 0 ) $(document).ready(refereeInit);
},
function onError(error) {
console.error(error);
},
);
if ( typeof referee_mode == 'undefined' ) referee_mode = 'auto' ; // 'auto' or 'manual'
function refereeInit () {
var is_data_loaded = false ;
var referee_api_url = 'https://referee.toolforge.org/api.php' ;
var api = new mw.Api();
var texts = (function texts() {
var translations = {
en: {
saveFail: 'Unfortunately, saving failed',
potentialReference: 'Potential reference from',
},
},
chain = mw.language.getFallbackLanguageChain(),
len = chain.length,
ret = {},
i = len - 1;
while (i >= 0) {
if (translations.hasOwnProperty(chain[i])) {
$.extend(ret, translations[chain[i]]);
}
i -= 1;
}
return ret;
}());
// MAIN
$('#p-tb').find('ul').append ( "<li id='t-referee'><a href='#'>Referee</a></li>" ) ;
$('#t-referee').find('a').click ( function () {
if ( is_data_loaded ) {
$('div.referee-container').toggle() ;
} else {
run(true) ;
}
return false ;
} ) ;
if ( referee_mode == 'auto' ) {
run(false) ;
}
function genericAPIaction(json, callback) {
json.summary = '#referee';
api
.postWithEditToken(json)
.done(callback)
.fail(function err() {
OO.ui.alert(texts.saveFail);
});
}
function createReferenceCandidate ( statement , url ) {
let sn = $('[id="'+statement.statement_id+'"]') ; // Statement node
if ( $('.wikibase-edittoolbar-container').length == 0 ) {
setTimeout ( function () { createReferenceCandidate ( statement , url ) } , 100 ) ;
return ;
}
let json = JSON.parse ( statement.json ) ;
let new_id = statement.statement_id + '-urlid' + url.id ;
let h = "<div class='wikibase-statementview-references referee-container' id='"+new_id+"'>" ;
h += "<div style='border-left:15px solid #6094DB;padding-left:3px;border-top:1px dotted #DDD;'>" ;
h += "<div style='display:flex;flex-direction:row;'>"
h += "<div style='display:flex;flex-direction:column;flex-grow:1;'>"
h += "<div style='font-weight:bold;'>" + texts.potentialReference + " <a target='_blank' href='"+url.url+"'>"+url.server+"</a>:</div>" ;
$.each ( json , function ( dummy , j ) {
h += "<div style='flex-grow:1'>…" ;
h += "<span>" + $('<span>').html(j.before).text() + "</span>" ;
h += "<span style='margin-left:3px; margin-right:3px;'><b>" + $('<span>').html(j.match).text() + "</b></span>" ;
h += "<span>" + $('<span>').html(j.before).text() + "</span>" ;
h += "…</div>" ;
} ) ;
h += "</div>" ;
h += "<div style='white-space:nowrap;margin-left:15px;margin-right:5px;' class='referee_actions_container'>" ;
h += "<div><a href='#' class='referee_add_reference'>add reference</a></div>" ;
h += "<div><a href='#' class='referee_remove_candidate'>remove candidate</a></div>" ;
h += "</div>" ;
h += "</div>" ;
h += "</div>" ;
h += "</div>" ;
sn.append ( h ) ;
$('[id="'+new_id+'"]').find('.referee_add_reference').click ( function () {
console.log ( new_id ) ;
$('[id="'+new_id+'"]').find('.referee_actions_container').html ( "<span style='color:green;font-size:14pt'>✓</span>" ) ;
let date = new Date() ;
let this_time = '+' + date.toISOString().substr(0,10) + 'T00:00:00Z' ;
let snaks = {
P854:[{snaktype:'value',property:'P854',datavalue:{type:'string',value:url.url}}],
P813:[{snaktype:'value',property:'P813',datavalue:{type:'time',value:{time:this_time,timezone:0,before:0,after:0,precision:11,calendarmodel:'http://www.wikidata.org/entity/Q1985727'}}}]
} ;
// Set reference in Wikidata
genericAPIaction ( {
action:'wbsetreference',
statement:statement.statement_id,
snaks:JSON.stringify(snaks),
format:'json'
} , function ( d ) {
if ( d.success == 1 ) return ;
console.log ( d ) ;
OO.ui.alert(texts.saveFail);
} ) ;
$.getJSON ( referee_api_url+'?callback=?' , {
action : 'set_candidate_status' ,
statement_id : statement.id ,
status : 'DONE' ,
user : mw.user.getName()
} , function ( d ) {
if ( d.status == 'OK' ) return ;
console.log(d) ;
} ) ;
return false ;
} ) ;
// Remove candidate reference in referee
$('[id="'+new_id+'"]').find('.referee_remove_candidate').click ( function () {
$('[id="'+new_id+'"]').remove() ;
$.getJSON ( referee_api_url+'?callback=?' , {
action : 'set_candidate_status' ,
statement_id : statement.id ,
status : 'REJECTED' ,
user : mw.user.getName()
} , function ( d ) {
if ( d.status == 'OK' ) return ;
console.log(d) ;
} ) ;
return false ;
} ) ;
}
function run (autorun) {
$('#t-referee').css({'background-color':'#6094DB'});
$.getJSON ( referee_api_url+'?callback=?' , {
action:'get_statements_for_entity',
entity:mw.config.get('wbEntityId'),
autorun:autorun?1:0
} , function ( d ) {
$('#t-referee').css({'background-color':''});
if ( d.status != 'OK' ) {
OO.ui.alert(d.status);
return ;
}
is_data_loaded = true ;
$.each ( d.statements , function ( dummy , statement ) {
let url = d.urls[statement.url_id] ;
if ( typeof url == 'undefined' ) return ;
createReferenceCandidate ( statement , url ) ;
} ) ;
} ) ; // TODO error handling
}
}