User:MusikAnimal/Gadget-MOAAC.js
Jump to navigation
Jump to search
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)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
// adapted from [[d:User:TheDJ/Gadget-EAHCCT2.js]]
( function ( $, mw ) {
var translationData, dropdownData, api, layout, button, dropdown, textfieldNew, buttonNew;
var processData = function processData( entitiesResp, sitematrixResp ) {
if( entitiesResp[0].error || sitematrixResp[0].error ) {
alert( 'An API error occured' );
return;
} else if ( entitiesResp[0].entities[translationData.entity].missing !== undefined ) {
alert( 'Entity ID could not be found' );
return;
}
var dropdownOptions = [];
dropdownData = {};
var sitelinks = entitiesResp[0].entities[translationData.entity].sitelinks;
var labels = entitiesResp[0].entities[translationData.entity].labels;
// the sitematrix api is totally BONKERS
$.each( sitematrixResp[0].sitematrix, function( key, languageData ) {
// Skip "count"
if( isNaN( parseInt( key ) ) ) {
return;
}
$.each( languageData.site, function (index, siteData) {
if( siteData.code !== 'wiki' || siteData.closed !== undefined ) {
return;
}
if ( translationData.destLang === languageData.code ) {
translationData.url = siteData.url;
translationData.destLangName = languageData.name;
}
if ( sitelinks[siteData.dbname] !== undefined ) {
dropdownData[siteData.dbname] = {
sourceLang: languageData.code,
sourceTitle: sitelinks[siteData.dbname].title
};
dropdownOptions.push( {
data: siteData.dbname,
label: languageData.name + ' [' + languageData.code + ']: ' + sitelinks[siteData.dbname].title
} );
}
} );
} );
if ( translationData.url === undefined ) {
alert( 'Unable to verify destination language parameter' );
return;
}
if( labels[translationData.destLang] ) {
translationData.destTitle = labels[translationData.destLang].value;
}
$.when( UIPromise ).done( function () {
/* OOjs UI seems to listen for clicks on labels... */
layout.$label.off( 'click' );
if ( dropdownOptions.length === 0 ) {
$( '#gadget-layout-ct').remove();
buttonNew.setFlags( [ 'primary', 'progressive'] );
return;
}
if( translationData.destTitle ) {
textfieldNew.setValue( translationData.destTitle );
}
layout.setLabel( new OO.ui.HtmlSnippet( 'Translate an article on <a href="https://www.wikidata.org/wiki/'
+ translationData.entity
+ '">this subject</a> from another language to '
+ translationData.destLangName
+ '.' ) );
dropdown.setOptions( dropdownOptions );
dropdown.setDisabled( false );
button.setDisabled( false );
} );
};
var loadInfo = function loadInfo() {
translationData = {
entity: mw.util.getParamValue( 'itemid' ),
destLang: mw.util.getParamValue( 'destlang' )
};
if( !translationData.entity || !translationData.entity.match( /^Q\d*$/ ) ) {
alert( 'No valid entity ID provided' );
return;
}
// init api
api = new mw.Api( {
ajax: {
headers: { 'Api-User-Agent': 'MOAAC/1.0' }
}
} );
var entitiesRequest = $.ajax({
url: 'https://www.wikidata.org/w/api.php',
data: {
format: 'json',
action: 'wbgetentities',
ids: translationData.entity,
props: 'labels|sitelinks/urls',
formatversion: 2
},
jsonp: 'callback',
dataType: 'jsonp'
});
var sitematrixRequest = api.get( {
action: 'sitematrix'
} );
$.when( entitiesRequest, sitematrixRequest ).done( processData )
.fail( function() {
alert( 'An API error occured' );
});
};
var buildUI = function buildUI() {
dropdown = new OO.ui.DropdownInputWidget({
disabled: true
});
button = new OO.ui.ButtonWidget( {
disabled: true,
label: 'Start translation',
flags: [ 'primary', 'progressive']
} );
button.on( 'click', function () {
var selected = dropdownData[dropdown.getValue()];
var destinationURI = new mw.Uri( translationData.url + '/w/index.php?title=Special:ContentTranslation' );
destinationURI.extend( {
campaign: 'specialcx',
page: selected.sourceTitle,
from: selected.sourceLang,
to: translationData.destLang
} );
window.location.href = destinationURI.toString();
} );
layout = new OO.ui.ActionFieldLayout(
dropdown,
button,
{
label: 'Translate an article on this subject from another language',
align: 'top'
}
);
layout.$element.attr( 'id', 'gadget-layout-ct');
/* Spacer */
/* Create article */
textfieldNew = new OO.ui.TextInputWidget({
placeholder: 'Provide a name for the article'
});
buttonNew = new OO.ui.ButtonWidget( {
label: 'Start writing',
flags: [ 'progressive']
} );
buttonNew.on( 'click', function () {
var destTitle = textfieldNew.getValue();
var destinationURI = new mw.Uri( translationData.url + '/w/index.php' );
destinationURI.extend( {
title: destTitle,
action: 'edit',
redlink: 1,
summary: 'New article of [[:d:' + translationData.entity + '|'
+ translationData.entity
+ ']] for the [[:meta:Met Open Access Artworks Challenge]] #280'
} );
window.location.href = destinationURI.toString();
} );
/* Add all of them */
$( '#no-gadget-active' ).replaceWith( layout.$element );
};
var UIPromise = $.when( $.ready, mw.loader.using( ['oojs-ui', 'mediawiki.Uri'] ) ).done( buildUI );
mw.loader.using( ['mediawiki.util', 'mediawiki.api'] ).done( loadInfo );
}( jQuery, mediaWiki ) );