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'>&hellip;" ;
      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 += "&hellip;</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'>&#10003;</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
  }

}