<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-AjaxEdit.js</id>
	<title>MediaWiki:Gadget-AjaxEdit.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-AjaxEdit.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-AjaxEdit.js&amp;action=history"/>
	<updated>2026-04-11T01:27:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-AjaxEdit.js&amp;diff=475109&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-AjaxEdit.js&amp;diff=475109&amp;oldid=prev"/>
		<updated>2025-11-04T17:54:02Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:54, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-AjaxEdit.js&amp;diff=475108&amp;oldid=prev</id>
		<title>wikt&gt;Ioaxxere: Make sure that there can&#039;t be two ajaxedit boxes open at once - leads to some weird effects; also run format</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-AjaxEdit.js&amp;diff=475108&amp;oldid=prev"/>
		<updated>2025-10-02T21:20:03Z</updated>

		<summary type="html">&lt;p&gt;Make sure that there can&amp;#039;t be two ajaxedit boxes open at once - leads to some weird effects; also run format&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// AjaxEdit&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Description         : With a new button &amp;quot;Ædit&amp;quot; one can edit specific sections without reloading the whole page. &lt;br /&gt;
//                       Supports TabbedLanguages gadget&lt;br /&gt;
// Dependencies: mediawiki.util, mediawiki.Uri, mediawiki.user, mediawiki.api&lt;br /&gt;
/* jshint maxerr:1048576, strict:true, undef:true, latedef:true, sub:true, esversion:5, esnext:false */&lt;br /&gt;
/* global mw, $ */&lt;br /&gt;
&lt;br /&gt;
(function ajaxEditIife() {&lt;br /&gt;
	window.AjaxEdit = {};&lt;br /&gt;
&lt;br /&gt;
	window.AjaxEdit.scriptLink = &amp;quot;&amp;quot;;&lt;br /&gt;
	if (mw.config.get(&amp;quot;wgSiteName&amp;quot;) !== &amp;quot;Wiktionary&amp;quot;)&lt;br /&gt;
		window.AjaxEdit.scriptLink += &amp;quot;wikt:&amp;quot;;&lt;br /&gt;
	if (mw.config.get(&amp;quot;wgContentLanguage&amp;quot;) !== &amp;quot;en&amp;quot;)&lt;br /&gt;
		window.AjaxEdit.scriptLink += &amp;quot;en:&amp;quot;;&lt;br /&gt;
	window.AjaxEdit.scriptLink += &amp;quot;MediaWiki:Gadget-AjaxEdit.js&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var $document = $(document);&lt;br /&gt;
	window.AjaxEdit.FireEvents = function () {&lt;br /&gt;
		// fire page load events like the [quotations ▼] thing&lt;br /&gt;
		// see https://github.com/wikimedia/mediawiki/blob/master/resources/src/mediawiki.action/mediawiki.action.edit.preview.js&lt;br /&gt;
		mw.hook(&amp;quot;wikipage.content&amp;quot;).fire($document);&lt;br /&gt;
		mw.hook(&amp;quot;wikipage.categories&amp;quot;).fire($document);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	window.AjaxEdit.Click = function (ajaxEditAnchor) {&lt;br /&gt;
		if (ajaxEditAnchor.hasEditBox) {&lt;br /&gt;
			mw.notify(&amp;quot;This AjaxEdit edit box is already open.&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (document.getElementById(&amp;quot;ajaxedit-wrapper&amp;quot;)) {&lt;br /&gt;
			mw.notify(&amp;quot;An AjaxEdit edit box is already open on this page.&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			ajaxEditAnchor.hasEditBox = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var elements = {};&lt;br /&gt;
		var _query = new URL($(ajaxEditAnchor)&lt;br /&gt;
			.parent()&lt;br /&gt;
			.find(&amp;quot;a[href*=&amp;#039;action=edit&amp;#039;]&amp;quot;)&lt;br /&gt;
			.attr(&amp;quot;href&amp;quot;), location.href).searchParams,&lt;br /&gt;
			title = _query.get(&amp;quot;title&amp;quot;),&lt;br /&gt;
			section = _query.get(&amp;quot;section&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		section = section.replace(&amp;quot;T-&amp;quot;, &amp;quot;&amp;quot;); //transclusions...&lt;br /&gt;
		var hdr = $(ajaxEditAnchor).parent().parent();&lt;br /&gt;
		var sectionName = hdr.children(&amp;quot;:header&amp;quot;).first().text();&lt;br /&gt;
&lt;br /&gt;
		if (window.tabbedLanguages &amp;amp;&amp;amp; !hdr.is(&amp;quot;:header&amp;quot;)) {&lt;br /&gt;
			sectionName = window.tabbedLanguages[window.currentLanguageTab];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var data = { action: &amp;#039;raw&amp;#039;, title: title, section: section };&lt;br /&gt;
		$.get(mw.util.wikiScript(&amp;#039;index&amp;#039;), data).then(function (wikitext) {&lt;br /&gt;
			var rowHeight = Math.min(15, 1 + wikitext.split(&amp;quot;\n&amp;quot;).length);&lt;br /&gt;
			elements.textarea = $(&amp;quot;&amp;lt;textarea/&amp;gt;&amp;quot;)&lt;br /&gt;
				.attr({ rows: rowHeight })&lt;br /&gt;
				.addClass(&amp;quot;mw-editfont-monospace&amp;quot;)&lt;br /&gt;
				.text(wikitext);&lt;br /&gt;
&lt;br /&gt;
			elements.textareaSummary = $(&amp;quot;&amp;lt;input/&amp;gt;&amp;quot;)&lt;br /&gt;
				.attr({&lt;br /&gt;
					type: &amp;quot;text&amp;quot;,&lt;br /&gt;
					maxlength: 500,&lt;br /&gt;
					spellcheck: true,&lt;br /&gt;
					name: &amp;quot;wpSummary&amp;quot;,&lt;br /&gt;
				})&lt;br /&gt;
				.keydown(event, function () {&lt;br /&gt;
					if (event.keyCode == 13) { // on enter&lt;br /&gt;
						elements.saveButton.click();&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function checkboxAndLabel(id, text) {&lt;br /&gt;
				var checkbox = $(&amp;quot;&amp;lt;input/&amp;gt;&amp;quot;)&lt;br /&gt;
					.attr({&lt;br /&gt;
						&amp;quot;id&amp;quot;: id,&lt;br /&gt;
						&amp;quot;type&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
					});&lt;br /&gt;
				var label = $(&amp;quot;&amp;lt;label/&amp;gt;&amp;quot;)&lt;br /&gt;
					.attr(&amp;quot;for&amp;quot;, id)&lt;br /&gt;
					.text(text);&lt;br /&gt;
				return [checkbox, label];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var minorEdit = checkboxAndLabel(&amp;quot;ajaxedit-minor-edit-checkbox&amp;quot;, &amp;quot;Minor edit&amp;quot;);&lt;br /&gt;
			elements.minorEditCheckbox = minorEdit[0], elements.minorEditLabel = minorEdit[1];&lt;br /&gt;
&lt;br /&gt;
			elements.saveButton = $(&amp;quot;&amp;lt;button/&amp;gt;&amp;quot;)&lt;br /&gt;
				.text(&amp;quot;Save&amp;quot;)&lt;br /&gt;
				.click(function () {&lt;br /&gt;
					elements.textarea.attr(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
					elements.textareaSummary.attr(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
&lt;br /&gt;
					window.AjaxEdit.Save(section, sectionName, elements.textarea.val(), title, elements.textareaSummary.val(), elements.minorEditCheckbox.prop(&amp;quot;checked&amp;quot;))&lt;br /&gt;
						.then(function (apiSaveResponse) {&lt;br /&gt;
							if (apiSaveResponse.error) return; //if abusefilter was triggered&lt;br /&gt;
							new mw.Api().get({ page: mw.config.get(&amp;quot;wgPageName&amp;quot;), action: &amp;quot;parse&amp;quot;, prop: &amp;quot;text|categorieshtml&amp;quot; })&lt;br /&gt;
								.then(function (newHtml) {&lt;br /&gt;
									$(&amp;quot;#ajaxedit-wrapper&amp;quot;).remove();&lt;br /&gt;
									$(&amp;quot;#mw-content-text&amp;quot;).html(newHtml.parse.text[&amp;quot;*&amp;quot;]);&lt;br /&gt;
									$(&amp;quot;#catlinks&amp;quot;).replaceWith(newHtml.parse.categorieshtml[&amp;quot;*&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
									window.AjaxEdit.FireEvents();&lt;br /&gt;
&lt;br /&gt;
									mw.loader.moduleRegistry[&amp;quot;site&amp;quot;].state = &amp;quot;registered&amp;quot;;&lt;br /&gt;
									//mw.loader.moduleRegistry[&amp;quot;site&amp;quot;].version=&amp;quot;generate-unique-guid-here&amp;quot;;&lt;br /&gt;
									mw.loader.moduleRegistry[&amp;quot;site&amp;quot;].script = undefined;&lt;br /&gt;
									mw.loader.using(&amp;quot;site&amp;quot;, function () { });&lt;br /&gt;
&lt;br /&gt;
									window.AjaxEdit.Submain();&lt;br /&gt;
								});&lt;br /&gt;
						});&lt;br /&gt;
				})&lt;br /&gt;
				.css(&amp;quot;margin-left&amp;quot;, &amp;quot;3px&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			elements.cancelButton = $(&amp;#039;&amp;lt;button/&amp;gt;&amp;#039;)&lt;br /&gt;
				.text(&amp;quot;Cancel&amp;quot;)&lt;br /&gt;
				.click(function () {&lt;br /&gt;
					$(&amp;quot;#ajaxedit-wrapper&amp;quot;).remove();&lt;br /&gt;
					ajaxEditAnchor.hasEditBox = false;&lt;br /&gt;
				});&lt;br /&gt;
			elements.previewDiv = $(&amp;quot;&amp;lt;div/&amp;gt;&amp;quot;)&lt;br /&gt;
				.css({&lt;br /&gt;
					&amp;quot;border-style&amp;quot;: &amp;quot;solid&amp;quot;, &amp;quot;border-width&amp;quot;: &amp;quot;1px 1px 1px 4px&amp;quot;,&lt;br /&gt;
					&amp;quot;border-radius&amp;quot;: &amp;quot;0.33em&amp;quot;, &amp;quot;border-color&amp;quot;: &amp;quot;#a3d3ff&amp;quot;,&lt;br /&gt;
				})&lt;br /&gt;
				.hide();&lt;br /&gt;
&lt;br /&gt;
			function timestamp() {&lt;br /&gt;
				return new Date().toISOString();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var previousText;&lt;br /&gt;
			var previousTextTimestamp = timestamp();&lt;br /&gt;
			function loadPreview() {&lt;br /&gt;
				var newText = elements.textarea.val();&lt;br /&gt;
				var textTimestamp = timestamp();&lt;br /&gt;
				if (!previousText || previousText != newText) {&lt;br /&gt;
					new mw.Api()&lt;br /&gt;
						.parse(&lt;br /&gt;
							newText,&lt;br /&gt;
							{ title: mw.config.get(&amp;quot;wgPageName&amp;quot;), pst: &amp;quot;true&amp;quot;, preview: &amp;quot;true&amp;quot;, sectionpreview: &amp;quot;true&amp;quot;, disableeditsection: &amp;quot;true&amp;quot; }&lt;br /&gt;
						)&lt;br /&gt;
						.done(function (html) {&lt;br /&gt;
							if (textTimestamp &amp;gt; previousTextTimestamp) {&lt;br /&gt;
								elements.previewDiv.html(html);&lt;br /&gt;
								window.AjaxEdit.FireEvents();&lt;br /&gt;
								previousTextTimestamp = textTimestamp;&lt;br /&gt;
							}&lt;br /&gt;
						});&lt;br /&gt;
				}&lt;br /&gt;
				previousText = newText;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var livePreview = checkboxAndLabel(&amp;quot;ajaxedit-live-preview-checkbox&amp;quot;, &amp;quot;Live preview&amp;quot;);&lt;br /&gt;
			elements.livePreviewCheckbox = livePreview[0], elements.livePreviewLabel = livePreview[1];&lt;br /&gt;
			elements.livePreviewCheckbox.on(&amp;quot;change&amp;quot;, function () {&lt;br /&gt;
				if ($(this).prop(&amp;quot;checked&amp;quot;)) {&lt;br /&gt;
					elements.previewDiv.show(&amp;quot;slow&amp;quot;);&lt;br /&gt;
					loadPreview();&lt;br /&gt;
					this.previewIntervalId = setInterval(loadPreview, 500);&lt;br /&gt;
				} else {&lt;br /&gt;
					clearInterval(this.previewIntervalId);&lt;br /&gt;
					elements.previewDiv.hide(&amp;quot;fast&amp;quot;);&lt;br /&gt;
					elements.previewDiv.empty();&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			var wrapper = $(&amp;quot;&amp;lt;div/&amp;gt;&amp;quot;)&lt;br /&gt;
				.attr(&amp;quot;id&amp;quot;, &amp;quot;ajaxedit-wrapper&amp;quot;)&lt;br /&gt;
				.css({ width: &amp;quot;auto&amp;quot;, &amp;quot;margin&amp;quot;: 0, &amp;quot;overflow&amp;quot;: &amp;quot;hidden&amp;quot; })&lt;br /&gt;
				.append(elements.textarea)&lt;br /&gt;
				.append(elements.textareaSummary)&lt;br /&gt;
				.append(elements.saveButton)&lt;br /&gt;
				.append(elements.livePreviewCheckbox)&lt;br /&gt;
				.append(elements.livePreviewLabel)&lt;br /&gt;
				.append(elements.minorEditCheckbox)&lt;br /&gt;
				.append(elements.minorEditLabel)&lt;br /&gt;
				.append(elements.cancelButton)&lt;br /&gt;
				.append(elements.previewDiv);&lt;br /&gt;
&lt;br /&gt;
			//tabbed languages support&lt;br /&gt;
			if ($(ajaxEditAnchor).is(&amp;quot;#tabstable .editlangsection a&amp;quot;)) {&lt;br /&gt;
				$(&amp;quot;.languageContainer:not(:hidden)&amp;quot;)&lt;br /&gt;
					.first()&lt;br /&gt;
					.prepend(wrapper);&lt;br /&gt;
			} else {&lt;br /&gt;
				hdr.after(wrapper);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * Define edit summary template with window.AjaxEditSummary. For instance:&lt;br /&gt;
	 window.AjaxEditSummary = &amp;quot;Æ $sectionlink $summary&amp;quot;;&lt;br /&gt;
	 */&lt;br /&gt;
	window.AjaxEdit.Save = function (sectionID, sectionName, sectionText, title, summary, minorEdit) {&lt;br /&gt;
		var finalSummary;&lt;br /&gt;
		if (typeof window.AjaxEditSummary === &amp;quot;string&amp;quot;) {&lt;br /&gt;
			var usedSummary = false;&lt;br /&gt;
			finalSummary = window.AjaxEditSummary.replace(&lt;br /&gt;
				/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,&lt;br /&gt;
				function (fullMatch, name) {&lt;br /&gt;
					switch (name) {&lt;br /&gt;
						case &amp;quot;summary&amp;quot;: {&lt;br /&gt;
							usedSummary = true;&lt;br /&gt;
							return summary;&lt;br /&gt;
						}&lt;br /&gt;
						case &amp;quot;scriptlink&amp;quot;: return window.AjaxEdit.scriptLink;&lt;br /&gt;
						case &amp;quot;sectionname&amp;quot;: return sectionText;&lt;br /&gt;
						case &amp;quot;sectionlink&amp;quot;: return &amp;quot;/* &amp;quot; + sectionName + &amp;quot; */&amp;quot;;&lt;br /&gt;
						default: {&lt;br /&gt;
							mw.notify(&lt;br /&gt;
								&amp;quot;Your edit summary template (window.AjaxEditSummary) contains an unknown variable name. Variable name: &amp;quot;&lt;br /&gt;
								+ name + &amp;quot;. Choose from summary, scriptlink, sectionname, sectionlink.&amp;quot;&lt;br /&gt;
							);&lt;br /&gt;
							return &amp;quot;&amp;quot;;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			if (!usedSummary) {&lt;br /&gt;
				mw.notify(&lt;br /&gt;
					&amp;quot;Your edit summary template (window.AjaxEditSummary) doesn&amp;#039;t use the edit summary you supplied, so your edit summary will be appended to the template: &amp;quot;&lt;br /&gt;
					+ window.AjaxEditSummary);&lt;br /&gt;
				finalSummary += &amp;quot; &amp;quot; + summary;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			finalSummary = &amp;quot;/* &amp;quot; + sectionName + &amp;quot; */ &amp;quot; + summary + &amp;quot; (using [[&amp;quot; + window.AjaxEdit.scriptLink + &amp;quot;|AjaxEdit]])&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		var data = {&lt;br /&gt;
			format: &amp;#039;json&amp;#039;,&lt;br /&gt;
			action: &amp;#039;edit&amp;#039;,&lt;br /&gt;
			title: title,&lt;br /&gt;
			section: sectionID,&lt;br /&gt;
			summary: finalSummary,&lt;br /&gt;
			text: sectionText,&lt;br /&gt;
			token: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;),&lt;br /&gt;
			minor: minorEdit,&lt;br /&gt;
		};&lt;br /&gt;
		return new mw.Api().post(data).then(function (response) {&lt;br /&gt;
			if (response &amp;amp;&amp;amp; response.edit &amp;amp;&amp;amp; response.edit.result == &amp;#039;Success&amp;#039;) {&lt;br /&gt;
				mw.notify(&amp;quot;successful&amp;quot;);&lt;br /&gt;
			} else if (response &amp;amp;&amp;amp; response.error) {&lt;br /&gt;
				mw.notify(&amp;#039;Error: API returned error code &amp;quot;&amp;#039; + response.error.code + &amp;#039;&amp;quot;: &amp;#039; + response.error.info);&lt;br /&gt;
			}&lt;br /&gt;
			return response;&lt;br /&gt;
		}).fail(function (xhr) {&lt;br /&gt;
			mw.notify(&amp;#039;Error: Request failed.&amp;#039;);&lt;br /&gt;
			$(&amp;#039;#ajaxedit-wrapper *&amp;#039;).attr(&amp;#039;disabled&amp;#039;, false);&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	window.AjaxEdit.Submain = function () {&lt;br /&gt;
		$(&amp;quot;.mw-body-content .mw-editsection &amp;gt; .mw-editsection-bracket:contains(&amp;#039;]&amp;#039;)&amp;quot;).each(function () {&lt;br /&gt;
			var btn = $(&amp;#039;&amp;lt;a/&amp;gt;&amp;#039;).text(&amp;quot;Ædit&amp;quot;).on(&amp;quot;click&amp;quot;, function () { window.AjaxEdit.Click(this) });&lt;br /&gt;
			$(this).before(&amp;quot;, &amp;quot;).before(btn);&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	window.AjaxEdit.Main = function () {&lt;br /&gt;
		$(&amp;quot;.mw-editsection &amp;gt; .mw-editsection-bracket:contains(&amp;#039;]&amp;#039;)&amp;quot;).each(function () {&lt;br /&gt;
			var btn = $(&amp;#039;&amp;lt;a/&amp;gt;&amp;#039;).text(&amp;quot;Ædit&amp;quot;).on(&amp;quot;click&amp;quot;, function () { window.AjaxEdit.Click(this) });&lt;br /&gt;
			$(this).before(&amp;quot;, &amp;quot;).before(btn);&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	if (mw.config.get(&amp;#039;wgAction&amp;#039;) == &amp;quot;view&amp;quot;)&lt;br /&gt;
		$(window.AjaxEdit.Main);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>wikt&gt;Ioaxxere</name></author>
	</entry>
</feed>