MediaWiki:Gadget-duplicate.js

From Wikifunctions

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.
(function () {
	'use strict';
	
	var wikiLambda = mw.config.get('wgWikiLambda');
	if (wikiLambda === null || !wikiLambda.viewmode) return;
	
	var api = new mw.Api();

	var messages = (function () {
		var userLanguage = mw.config.get('wgUserLanguage');
		var translations = {
			en: {
				duplicate: 'Duplicate',
				duplicateReason: 'Why you want to duplicate this item?',
				duplicateReasonPlaceHolder: 'Reason',
			}
		};
		return translations[userLanguage]
			? translations[userLanguage]
			: translations.en;
	}());

	function showDialog(callback) {
		mw.loader.using('oojs-ui').then(function () {
			OO.ui.prompt(
				messages.duplicateReason,
				{ textInput: { placeholder: messages.duplicateReasonPlaceHolder } }
			).then(function (result) {
			    if (result === null) return;
			    callback(result);
			});
		});
	}

	function wikiLambdaFetch(zId) {
		return api.get({ 'action': 'wikilambda_fetch', zids: zId }).then(function (result) {
			return JSON.parse(result[Object.keys(result)[0]].wikilambda_fetch);
		});
	}
	
	function createLambda(summary, zobject) {
		return api.postWithEditToken({
			action: 'wikilambda_edit',
			summary: summary,
			zobject: zobject
		});
	}
	
	function getLatestRevisionId(page) {
		return api.get({
			action: 'query',
			prop: 'revisions',
			titles: page,
			rvlimit: 1,
			rvprop: 'ids'
		}).then(function (result) {
			var pages = result.query.pages;
			return pages[Object.keys(pages)[0]].revisions[0].revid;
		});
	}
	
	$(mw.util.addPortletLink(
		'p-cactions',
		'#',
		messages.duplicate,
		'ca-duplicate',
		messages.duplicate,
		'd'
	)).click(function (event) {
		event.preventDefault();
		showDialog(function (summary) {
			getLatestRevisionId(wikiLambda.zId).then(function (oldid) {
				wikiLambdaFetch(wikiLambda.zId).then(function (zobject) {
					zobject.Z2K1 = 'Z0';
					zobject.Z2K3.Z12K1 = ['Z11'];
					createLambda(
						'[[MediaWiki:Gadget-duplicate.js|Duplicate]] from [' + 
						new mw.Uri('/').extend({ oldid: oldid }).toString() +
						' ' + wikiLambda.zId + ']: ' + summary,
						JSON.stringify(zobject)
					).then(function (result) {
						location.href = mw.util.getUrl(result.wikilambda_edit.page);
					});
				});
			});
		});
	});
}());