Jump to content

User:Awesome Aasim/editrequestor.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
if (!EditRequestor) {
	var EditRequestor = {}
	mw.loader.using("jquery.ui", function() {
		$(document).ready(function() {
			EditRequestor.url = new URL(location);
			let url = EditRequestor.url;
			if (mw.config.get('wgAction') == 'edit' && url.searchParams.get('section') == 'new' && url.searchParams.get('preload') == 'Template:Submit an edit request/preload') {
				EditRequestor.requestPage = '';
				EditRequestor.requestType = '';
				var preloadArray = EditRequestor.url.searchParams.getAll('preloadparams[]');
				EditRequestor.requestType = preloadArray[0];
				EditRequestor.requestPage = preloadArray[1];
				$('<form id="editrequestor-form"></form>').append('<p>Please make the change that you unambiguously would like to implement.</p><textarea id="editrequestor-area" disabled></textarea><textarea name="reason" id="editrequestor-reason" disabled placeholder="Explanation for change, or explanation of change if unsure what needs changing."></textarea><div id="editrequestor-reason-preview"></div>').dialog({
					'buttons': [{
						"text": "Submit",
						"click": async function() {
							// fetch diff
							let wikitext = $("#editrequestor-area").val();
							let reason =  $("#editrequestor-reason").val();
							let compareRes = await $.get(mw.config.get('wgScriptPath') + '/api.php', {
								'action': 'compare',
								'format': 'json',
								'fromtitle': EditRequestor.requestPage,
								'toslots': 'main',
								'totext-main': wikitext
							});
							if (compareRes.error) {
								alert(compareRes.error.info);
								return;
							}
							let diffHTML = compareRes.compare['*'];
							diffHTML = diffHTML.replaceAll(/'/g, "&#39;");
							if (diffHTML == '' && reason == '') {
								alert("Cannot complete the edit request. Change and reason is missing!");
								return;
							} else if (diffHTML == '') {
								if (!confirm("Change is missing. Make sure that the change is explained well in the reason field, or your edit request will be declined as unclear!")) {
									return;
								}
							} else if (reason == '') {
								if (!confirm("Reason is missing. Your edit request may be declined if the reason for the uncontroversial change is not obvious!")) {
									return;
								}
							}
							// place in edit request
							let editRequestWikitext = `
== ${url.searchParams.get("preloadtitle")} ==
{{${EditRequestor.requestType}|1=${EditRequestor.requestPage}|answered=no}}
${diffHTML ? `
Please change the following (click show to expand diff):

<table class="diff diff-type-table diff-contentalign-left diff-editfont-monospace mw-collapsible mw-collapsed">${diffHTML}</table>${reason ? `

Reason: ${reason}` : ``}

~~~~
` : reason + " ~~~~"}
`;
							// save
							let saveResult = await (new mw.Api()).postWithEditToken( {
								"action": "edit",
								"title": mw.config.get("wgPageName"),
								"appendtext": editRequestWikitext,
								"summary": "Creating new edit request ([[User:Awesome Aasim/editrequestor|EditRequestor]])"
							})
							console.log(saveResult);
							if (saveResult.error) {
								alert(saveResult.error.info);
							} else {
								let nexturl = new URL(location.href);
								nexturl.searchParams.delete("action");
								location.href = nexturl;
							}
						}
					},
					{
						"text": "Preview",
						"click": async function() {
							// preview change
							let wikitext = $("#editrequestor-area").val();
							let parsedText = await (new mw.Api()).parse(wikitext, {"title": EditRequestor.requestPage})
							$(`<div id="editrequestor-preview"></div>`).html(parsedText).dialog({modal: true, width: (0.75 * window.innerWidth > 300) ? 0.75 * window.innerWidth : 300});
						}
					},
					{
						"text": "Show change",
						"click": async function() {
							// show diff of change
							let wikitext = $("#editrequestor-area").val();
							let compareRes = await $.get(mw.config.get('wgScriptPath') + '/api.php', {
								'action': 'compare',
								'format': 'json',
								'fromtitle': EditRequestor.requestPage,
								'toslots': 'main',
								'totext-main': wikitext
							});
							console.log(compareRes);
							$(`<div id="editrequestor-change"></div>`).html(`
<table class="diff diff-type-table diff-contentalign-left diff-editfont-monospace">
<colgroup><col class="diff-marker">
<col class="diff-content">
<col class="diff-marker">
<col class="diff-content">
</colgroup>
${compareRes.compare['*']}</table>`).dialog({modal: true, width: (0.75 * window.innerWidth > 300) ? 0.75 * window.innerWidth : 300});
						}
					}
					],
					width: (0.50 * window.innerWidth > 300) ? 0.50 * window.innerWidth : 300,
					modal: true
				});
				$("#editrequestor-area").text("Loading...");
				EditRequestor.timeout = null;
				$("#editrequestor-reason").keydown(function() {
					if (EditRequestor.timeout) return;
					let that = this;
					EditRequestor.timeout = window.setTimeout(async function() {
						let previewResult = await (new mw.Api()).parse($(that).val(), {"title": mw.config.get('wgPageName')});
						$("#editrequestor-reason-preview").html(previewResult);
						EditRequestor.timeout = null;
					}, 500);
				});
				$.get(mw.config.get('wgScriptPath') + '/api.php', {
					'action': 'parse',
					'format': 'json',
					'prop': 'wikitext',
					'page': EditRequestor.requestPage
				}).done(function(result) {
					if (result.error) {
						$("#editrequestor-area").text('Error: ' + result.error.info);
					} else {
						$("#editrequestor-area").text(result.parse.wikitext['*']);
						$("#editrequestor-area").prop("disabled", false);
						$("#editrequestor-reason").prop("disabled", false);
					}
				});
			}
		});
	});
}
// </nowiki>