MediaWiki:Gadget-AjaxEdit.js

Vikisözlük sitesinden
"use strict";

// Description         : With a new button "Ædit" one can edit specific sections without reloading the whole page. 
//                       Supports TabbedLanguages gadget
// Dependencies: mediawiki.util, mediawiki.Uri, mediawiki.user, mediawiki.api
/* jshint maxerr:1048576, strict:true, undef:true, latedef:true, sub:true */
/* global mw, $ */

window.AjaxEdit = {};

window.AjaxEdit.Click = function (ajaxEditAnchor) {
	var _query = new mw.Uri($(ajaxEditAnchor).parent().find("a[href*='action=edit']").attr("href")).query,
	    title = _query.title,
	    section = _query.section;

	section = section.replace("T-", ""); //translcusions...
	var hdr = $(ajaxEditAnchor).parent().parent();
	var sectionName = hdr.children(".mw-headline").first().text();
	if (window.tabbedLanguages && !hdr.is(":header")) {
		sectionName = window.tabbedLanguages[window.currentLanguageTab];
	}

	$("#ajaxedit-wrapper").remove();

	var data = { action: 'raw', title: title, section: section };
	$.get(mw.util.wikiScript('index'), data).then(function (wikitext) {
		var rowHeight = Math.min(15, 1 + wikitext.split("\n").length);
		var textarea = $("<textarea></textarea>").attr({ rows: rowHeight }).text(wikitext);
		var saveButton = $('<button>Kaydet</button>').click(function () {
			window.AjaxEdit.Save(section, sectionName, textarea.val(), title).then(function (apiSaveResponse) {
				if (apiSaveResponse.error) return; //if abusefilter was triggered
				new mw.Api().parse(new mw.Title(mw.config.get("wgPageName"))).then(function (newHtml) {
					$("#mw-content-text").html(newHtml);

					mw.loader.moduleRegistry["site"].state = "registered";
					//mw.loader.moduleRegistry["site"].version="generate-unique-guid-here";
					mw.loader.moduleRegistry["site"].script = undefined;
					mw.loader.using("site", function () {});

					window.AjaxEdit.Main();
					// run NavToggle stuff
				});
			});
		}).css("margin-left", "3px");
		var cancelButton = $('<button>İptal</button>').css({"margin-left": "10px" }).click(function () {
			$("#ajaxedit-wrapper").remove();
		});
		var previewDiv = $("<div></div>").css({
			"border-style": "solid", "border-width": "1px 1px 1px 4px",
			"border-radius": "0.33em", "border-color": "#a3d3ff" }).hide();

		var loadPreview = function loadPreview() {
			new mw.Api().parse(textarea.val(), { title: mw.config.get("wgPageName") }).done(function (html) {
				previewDiv.html(html);
			});
		};
		var previewIntervalId = -1;
		var livePreviewCheckbox = $("<input type='checkbox'/>").attr("id", "ajaxedit-live-preview-checkbox").css({ "margin-left": "10px", "margin-right": "3px" }).on("change", function () {
			if ($(this).is(':checked')) {
				previewDiv.show("slow");
				loadPreview();
				previewIntervalId = setInterval(loadPreview, 500);
			} else {
				clearInterval(previewIntervalId);
				previewDiv.hide("fast");
				previewDiv.empty();
			}
		});

		var wrapper = $("<div></div>").attr("id", "ajaxedit-wrapper").css({ width: "auto", "margin": 0, "overflow": "hidden" }).append(textarea).append(saveButton).append(livePreviewCheckbox).append('<label for="ajaxedit-live-preview-checkbox">Canlı önizle</label>').append(cancelButton).append(previewDiv);

		//tabbed languages support
		if ($(ajaxEditAnchor).is("#tabstable .editlangsection a")) $(".languageContainer:not(:hidden)").first().prepend(wrapper);else hdr.after(wrapper);
	});
};

window.AjaxEdit.Save = function (sectionID, sectionName, sectionText, title) {
	var scriptLink = "";
	if (mw.config.get("wgSiteName") !== "Vikisözlük")
		scriptLink += "wikt:";
	if (mw.config.get("wgContentLanguage") !== "tr")
		scriptLink += "tr:";
	scriptLink += "MediaWiki:Gadget-AjaxEdit.js";
	var data = {
		format: 'json',
		action: 'edit',
		title: title,
		section: sectionID,
		summary: "/* " + sectionName + " */ [[" + scriptLink + "|AjaxDüzenle]] kullanılarak değiştirildi",
		text: sectionText,
		token: mw.user.tokens.get('csrfToken')
	};
	return $.post(mw.util.wikiScript('api'), data, function (data) {
		if (data && data.edit && data.edit.result == 'Success') {
			mw.notify("Başarılı");
		} else if (data && data.error) {
			mw.notify('Hata: API bir hata kodu oluşturdu, "' + data.error.code + '": ' + data.error.info);
		}
	}).fail(function (xhr) {
		mw.notify('Hata: İstek başarısız oldu.');
	}, "json");
};

window.AjaxEdit.Main = function () {
	$(".mw-editsection > .mw-editsection-bracket:contains(']')").each(function () {
		var btn = $('<a>αÐüzenle</a>').attr("onclick", "AjaxEdit.Click(this)");
		$(this).before(", ").before(btn);
	});
};

if (mw.config.get('wgAction') == "view")
	$(window.AjaxEdit.Main);