Järjestelmäviesti:Gadget-OmaLomake.js
Huomautus: Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.
- Firefox ja Safari: Napsauta Shift-näppäin pohjassa Päivitä, tai paina Ctrl-F5 tai Ctrl-R (⌘-R Macilla)
- Google Chrome: Paina Ctrl-Shift-R (⌘-Shift-R Macilla)
- Internet Explorer ja Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
- Opera: Paina Ctrl-F5.
mw.loader.using('mediawiki.api', function () {
var checkedPages = {};
var reg = /\$("([^"]*)"|)([0-9]+)/g;
var $message;
var api = new mw.Api({
ajax: {
headers: {
'Api-User-Agent': 'omapohja/0.1'
}
}
});
function getFilledText($root) {
var text = $root.find('.omapohja-preload').val();
var out = text.replace(reg, function (m, p1, p2, p3) {
return $root.find('input[data-field=' + p3 + ']').val();
});
return out;
}
function disable($root) {
$root.find('input').not('[data-field=0]').prop('disabled', true);
}
function enable($root) {
$root.find('input').prop('disabled', false);
}
function setMessage(msg) {
if ( msg ) {
$message.html(msg);
$message.show();
} else {
$message.hide();
}
}
function makeTitleInput($root) {
var $input = $('<input type="text" style="margin: 0 5px;"></input>'),
$loader = $('<img src="https://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif"/>'),
$indicator = $('<span></span>');
$loader.hide();
$input.attr('data-field', 0);
$input.on('focus', function () {
// Piilotetaan sivulinkki.
$indicator.html("");
});
$input.on('blur', function () {
var $this = $(this),
title = $this.val();
function success (data) {
var curPageData = (data && data.query && data.query.pages &&
data.query.pages[Object.keys(data.query.pages) [0]]);
$loader.hide();
var $lnk = $('<a></a>');
$lnk.html(title);
$indicator.html($lnk);
if ( curPageData.missing !== undefined ) {
$lnk.addClass("new");
$lnk.attr("href", mw.config.get("wgScript") + "?title=" + title + '&action=edit&redlink=1');
$lnk.attr("title", title + " (sivua ei ole)");
setMessage(null);
enable($root);
} else {
$lnk.attr("href", mw.config.get("wgArticlePath").replace("$1", title));
checkedPages[title] = true;
if ( mw.loader.getState("ext.gadget.Artikkeliyhdistaja") !== "ready" ) {
setMessage(
"Sivu on jo olemassa. Kytke asetuksista Artikkeliyhdistäjä-pienoisohjelma "
+ "päälle, jotta voit lisätä tekstiä olemassa oleville sivuille."
);
disable($root);
} else {
setMessage(null);
enable($root);
}
}
}
if ( title ) {
$indicator.html($loader);
if ( checkedPages[title] ) {
f_success();
} else {
$loader.show();
api.get({
action: 'query',
format: 'json',
prop: 'info',
titles: title
}).done(success);
}
}
});
return $('<li></li>').html(['<label style="display: inline-block;">0. Sivu</label>', ' ', $input, ' ', $indicator, '<br/>']);
}
function makeInput(index) {
var $input = $('<input type="text" style="width: 100%; margin: 0 5px;"></input>'),
$label = $('<label style="display: inline-block;"></label>');
$input.attr('data-field', index);
return $('<li></li>').html([$label, " ", $input, "<br/>", ]);
}
function reEvaluate($root) {
var text = $root.find('.omapohja-preload').val();
var $textInputs = $root.find('.textInputs');
var max = 0;
var result;
var texts = {};
var max_text_len = 7;
texts[0] = "0. Sivu";
while((result = reg.exec(text)) !== null) {
texts[result[3]] = texts[result[3]] || (result[3] + ". " + (result[2] || ""));
max = Math.max(max, result[3]);
max_text_len = Math.max(max_text_len, (result[2] ? result[2].length : 0));
}
var top = 10;
var index = $textInputs.children().length;
while ( max >= index ) {
$textInputs.append(makeInput(index));
top--;
if ( top <= 0 ) {
break;
}
index = $textInputs.children().length;
}
$textInputs.find("input").each(function (index) {
if ( texts[index] !== undefined ) {
var $label = $(this).prev('label');
var w = Math.max(max_text_len + 2, 2);
$label.text(texts[index] ? (" " + texts[index]) : "");
$label.css("width", w + "ex");
$label.parent().css("padding-left", $label.width() + 60);
$label.css("margin-left", -$label.width() - 60);
$(this).parent().show();
} else {
$(this).parent().hide();
}
});
}
function updateDeleteButtons() {
if ( $('.omapohja-root').length === 1 ) {
$('.omapohja-root').find('button:contains(Poista)').hide();
} else {
$('.omapohja-root').find('button:contains(Poista)').show();
}
}
function init_unit($placeholder, inputValues) {
var text = $placeholder.text();
var $root = $('<div class="omapohja-root" style="background-color: linen; margin: 2em 0; padding: 1em; border: solid darkorchid 2px; border-radius: 5px;"></div>');
var $preloadInput = $('<textarea class="omapohja-preload"></textarea>').val(text);
var $executeBtn = $('<button>Luo sivu</button>');
var $copyBtn = $('<button>Monista</button>');
var $deleteBtn = $('<button>Poista</button>');
var $textInputs = $('<ul class="textInputs" style="list-style-type: none; padding: 0; margin: 0; white-space: nowrap"></ul>');
$root.data('original', text);
$preloadInput.attr('rows', Math.max(text.split("\n").length + 1, 10));
$root.append($preloadInput);
$placeholder.replaceWith($root);
$preloadInput.on('change', function () {
reEvaluate($root);
$textInputs.find("input:visible:first").focus();
});
$message = $('<div class="omapohja-message" style="background-color: snow; border: solid red 2px; padding: 5px; border-radius: 5px;"></div>');
$message.hide();
$root.append($message);
$root.append($textInputs);
$textInputs.append(makeTitleInput($textInputs));
$executeBtn.on('click', function () {
var title = $textInputs.find('input[data-field=0]').val();
var data = JSON.parse(sessionStorage.getItem('omapohja') || '{}');
data[title] = getFilledText($root);
sessionStorage.setItem('omapohja', JSON.stringify(data));
open(mw.config.get('wgServer')
+ mw.config.get('wgScript')
+ '?title=' + encodeURIComponent(title)
+ '&action=edit', '_blank'
);
});
$root.append($executeBtn);
$copyBtn.on('click', function () {
var $copy = $('<pre.lomake></pre>');
$copy.html($preloadInput.val());
$root.after($copy);
var inputValues = [];
$root.find('input').each(function () { inputValues.push($(this).val()); });
// Palauttaa pre-elementin pohjalta luodun uuden divin.
$copy = init_unit($copy, inputValues);
$copy.hide();
$copy.slideDown();
$copy.find('.omapohja-preload').focus();
});
$deleteBtn.on('click', function () {
if ( $('.omapohja-root').length < 2 ) {
alert("Ei voi poistaa viimeistä");
return;
}
if ( $root.data('original') !== $preloadInput.val() ) {
if ( !confirm("Haluatko varmasti poistaa pohjan?") ) {
return;
}
}
$root.detach();
updateDeleteButtons();
});
$root.append($('<div style="float: right; padding: 5px;"></div>').append([ $deleteBtn, $copyBtn ]));
updateDeleteButtons();
reEvaluate($root);
if ( inputValues ) {
$root.find('input').each(function (index) {
$(this).val(inputValues[index]);
});
}
return $root;
}
function init() {
$placeholders = $('pre.lomake').each(function () {
init_unit($(this));
});
}
if ( mw.config.get('wgAction') === "edit" ) {
var title = mw.config.get('wgTitle');
var data = JSON.parse(sessionStorage.getItem('omapohja') || '{}');
if ( !data || !data[title] || window.location.href.includes('§ion=') ) {
//delete data[title];
sessionStorage.setItem('omapohja', JSON.stringify(data));
return;
}
console.log("state:", mw.loader.getState("ext.gadget.Artikkeliyhdistaja"));
console.log("state:", mw.loader.getState("ext.gadget.SubstitutisSubstituendis"));
// Jos artikkeliyhdistäjä on astettu päälle.
if ( data[title].indexOf("{{" + "subst" + ":") > -1 && [ "ready" ].indexOf(mw.loader.getState("ext.gadget.Artikkeliyhdistaja")) > -1 ) {
// Jos substausgadgetti on asetettu päälle.
if ( [ "ready" ].indexOf(mw.loader.getState("ext.gadget.SubstitutisSubstituendis")) > -1 ) {
$.when(
mw.loader.using( 'ext.gadget.Artikkeliyhdistaja' ),
mw.loader.using( 'ext.gadget.SubstitutisSubstituendis' )
).then(function () {
Muokkaussubst.tee_substaukset(
mw.config.get('wgPageName'),
data[title]
).done(function (new_text) {
console.log("saatu", new_text);
if ( new_text && new_text.parse && new_text.parse.text && new_text.parse.text['*'] ) {
new_text = new_text.parse.text['*'];
}
articleMerger.mergeToArticle(new_text || data[title]);
delete data[title];
sessionStorage.setItem('omapohja', JSON.stringify(data));
})
});
} else {
console.log("Pelkkä yhdistäjä");
$.when( mw.loader.using( 'ext.gadget.Artikkeliyhdistaja' ) )
.then(function () {
articleMerger.mergeToArticle(data[title]);
delete data[title];
sessionStorage.setItem('omapohja', JSON.stringify(data));
});
}
} else if ( $('#wpTextbox1').val().replace(/\s*/, "") === "" ) {
$('#wpTextbox1').val(data[title]);
delete data[title];
sessionStorage.setItem('omapohja', JSON.stringify(data));
} else {
$.ready(function () {
setMessage("Yhdistäminen ei onnistunut, mutta laatikossa on teksiä!");
});
}
} else {
init();
}
});