User:Inductiveload/scripts/draggableSitelinks.js

From Wikidata
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.
/**
 * DraggableSitelink.js
 *
 * Easily add a Wikipedia as an "imported from" (P143) reference to any
 * statement - just drag the sitelink on to the sources for that claim
 *
 * Patches to: https://github.com/inductiveload/wikidata-gadgets
 * Release: 2013-03-11 v0.9
 * Author: User:Inductiveload
 * Licence: MIT/GPL
 */

var DraggableSitelinks = (function ($) {

	var importedFrom = { //hint to show when dragging, defaults to 'en'
		'de' : 'Datenvorlage',
		'en' : 'Imported from',
		'fr' : 'Importé de',
		'it' : 'Importato da',
		'nl' : 'Geimporteerd uit',
		'ru' : 'взято из',
		'sv' : 'Importerad från',
		'zh' : '导入自',
	},
	wikiProperties = { //list of Wikipedia item IDs
		'arwiki' : 199700,
		'cawiki' : 199693,
		'cebwiki': 837615,
		'dawiki' : 181163,
		'dewiki' : 48183,
		'enwiki' : 328,
		'euwiki' : 207260,
		'fiwiki' : 175482,
		'frwiki' : 8447,
		'elwiki' : 11918,
		'eowiki' : 190551,
		'eswiki' : 8449,
		'glwiki' : 841208,
		'hewiki' : 199913,
		'iawiki' : 3757068,
		'iewiki' : 6167360,
		'iowiki' : 1154766,
		'itwiki' : 11920,
		'jawiki' : 177837,
		'mkwiki' : 842341,
		'nlwiki' : 10000,
		'plwiki' : 1551807,
		'ptwiki' : 11921,
		'ruwiki' : 206855,
		'trwiki' : 58255,
		'svwiki' : 169514,
		'ukwiki' : 199698,
		'viwiki' : 200180,
		'vowiki' : 714826,
		'zhwiki' : 30239
	},

	importedFromProperty = 'p' + 143,
	claimPatt=/(q|Q)[0-9]+\$[\-A-Fa-f0-9]+/,
	myLang = mw.config.get('wgUserLanguage'),

	//Private functions
	init = function () {
		
		//set up styles
		$("<style type='text/css'></style>")
			.append('.x-draggable-sitelink-target{ background-color:#6EDDA6;}')
			.appendTo("head");

		//make the sitelinks draggable
		$('table.wb-sitelinks tbody > tr').draggable({
			cursor: "move",
			cursorAt: { top: 5, left: -5 },
			start: function( event, ui ) {
				$('div.wb-statement-references-container')
					.addClass('x-draggable-sitelink-target')
					
					//make the targets droppable (they can appear after load, 
					//so can't do this at init time
					.droppable({
						drop: function( event, ui ) {
							var lang = $(ui.helper).data('lang');

							addImportedFrom($(event.target), lang);

							return false;
						}
					});
			},
			stop: function( event, ui ) {
				$('div.wb-statement-references-container')
					.removeClass('x-draggable-sitelink-target')
					.droppable('destroy');
			},
			helper: function( event ) {

				var langCode = $(event.target)
					.parent()
					.children('td.wb-sitelinks-siteid')
					.text(),

				draggedPage = $('td.wb-sitelinks-link-' + langCode + ' > a')
					.text(),

				prefixText = importedFrom[myLang];

				if (prefixText === undefined){
					prefixText = importedFrom['en'];
				}

				return $("<div>")
					.attr({"class": "ui-widget-header x-draggable-sitelink-helper"})
					.text(prefixText + ': ' + langCode + ' (' + draggedPage + ')')
					.data('lang', langCode);
			}
		});
	},

	addImportedFrom = function(target, lang) {
		//isolate the
		var targetClaim = target.prev()
			.children('.wb-claim')
			.attr('class');

		targetClaim = claimPatt.exec(targetClaim);

		var sourceItem = wikiProperties[lang];

		if (sourceItem === undefined){ //we don't know this wiki, have to bail
			console.log("This Wiki does not have a known ID - add it!");
			return;
		}

		// construct the Snak
		var snaks = {};
		snaks[ importedFromProperty ] = [{
			"snaktype":"value",
			"property":importedFromProperty,
			"datavalue":{"type":"wikibase-entityid",
				"value":{"entity-type":"item","numeric-id":sourceItem}
				}
		}];

		//construct POST data
		var params = { 'entity' : mw.config.get('wgPageName'),
			'statement': ''+targetClaim,
			'snaks': JSON.stringify(snaks),
			'token':wbRepoEditToken,
			'action':'wbsetreference'
		};

		//post the reference and reload
		var api = new mw.Api();

		api.post(params)
			.done( function ( data ) {
				document.location.reload(true);
			});
	}

	mw.loader.using( ['jquery.ui'], function () {
		$(document).ready(function() {
			init();
		});
	});
}(jQuery));