User:MusikAnimal/Gadget-MOAAC.js

From Meta, a Wikimedia project coordination wiki

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.
// 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 ) );