MediaWiki:Gadgets/uploadMultipleFiles/main.js
MediaWiki interface page
More actions
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)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Modified version of https://dev.fandom.com/wiki/UploadMultipleFiles
* from https://terraria.wiki.gg/wiki/MediaWiki:Gadget-uploadMultipleFiles.js */
$.when( mw.loader.using( ['site', 'mediawiki.util', 'mediawiki.api', 'mediawiki.jqueryMsg'] ), $.ready )
.then( () => new mw.Api().loadMessagesIfMissing([
'gadget-uploadMultipleFiles-multiupload',
'gadget-uploadMultipleFiles-yes',
'gadget-uploadMultipleFiles-no',
'gadget-uploadMultipleFiles-sourcefiles',
'gadget-uploadMultipleFiles-categoryname',
'gadget-uploadMultipleFiles-categorynamehint',
'gadget-uploadMultipleFiles-categorynamespace',
'gadget-uploadMultipleFiles-uploadfiles',
'gadget-uploadMultipleFiles-nofiles',
'gadget-uploadMultipleFiles-nolicense',
'gadget-uploadMultipleFiles-summary',
'gadget-uploadMultipleFiles-license',
'gadget-uploadMultipleFiles-categories',
'gadget-uploadMultipleFiles-uploading',
'gadget-uploadMultipleFiles-uploaded',
'gadget-uploadMultipleFiles-failed',
'gadget-uploadMultipleFiles-done',
'gadget-uploadMultipleFiles-ratelimited',
]) )
.then(function(){
if (mw.config.get("wgCanonicalSpecialPageName") !== "Upload"){ return; }
if (window.__wgg_UploadMultipleFiles_IsLoaded) { return; }
window.__wgg_UploadMultipleFiles_IsLoaded = true;
const getUploadDescription = function() {
var sections = [];
var summary = $("#wpUploadDescription").val();
var licenseDisplayName = $("#wpLicense option:selected").val();
var categoryName = $("#multiFileCategory").val();
if (summary !== ""){
sections.push(summary);
}
if (licenseDisplayName !== "") {
var licenseTemplateText = $("#wpLicense option:selected").prop("title");
sections.push("== " + mw.msg("gadget-uploadMultipleFiles-license") + " ==\n" + licenseTemplateText);
}
if (categoryName !== "")
sections.push("[[" + mw.msg("gadget-uploadMultipleFiles-categorynamespace") + ":" + categoryName + "]]");
return sections.join("\n\n");
};
const getWatchlistPreference = function() {
if ($("#wpWatchthis").is(":checked")) {
return "watch";
} else {
return "nochange";
}
};
$("#wpUploadFile").parent().parent().addClass("regularFileSelect");
$("tr.regularFileSelect").before(
$("<tr></tr>").append(
$('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-multiupload"),
$('<td class="mw-input"></td>').append(
$("<label></label>").msg("gadget-uploadMultipleFiles-yes").prepend('<input type="radio" name="multipleFiles" value="yes" /> '),
' ',
$("<label></label>").msg("gadget-uploadMultipleFiles-no" ).prepend('<input type="radio" name="multipleFiles" value="no" checked/> '),
)
)
).after(
$('<tr class="multipleFileSelect" style="display:none;"></tr>').append(
$('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-sourcefiles"),
$('<td class="mw-input"></td>').append('<input type="file" id="multiupload" multiple />')
)
);
$("input[name='wpUpload']").addClass("regularFileSelect");
$("#wpDestFile").parent().parent().addClass("regularFileSelect");
$("#wpIgnoreWarning").parent().parent().addClass("regularFileSelect");
// Append "category name" textbox to multiupload section
$("#mw-upload-form #mw-htmlform-description tbody").append(
$('<tr class="mw-htmlform-field-HTMLTextField multipleFileSelect" style="display:none;"></tr>').append(
$('<td class="mw-label"></td>').append('<label for="multiFileCategory"><abbr title="' + mw.msg("gadget-uploadMultipleFiles-categorynamehint") + '">' + mw.msg("gadget-uploadMultipleFiles-categoryname") + '</abbr></label>'),
$('<td class="mw-input"></td>').append('<input id="multiFileCategory" name="multiFileCategory" size="60">')
)
);
$("input[name='wpUpload']").after('<input type="button" value="' + mw.msg("gadget-uploadMultipleFiles-uploadfiles") + '" class="multipleFileSelect" style="display:none;" id="multiFileSubmit" />');
$("input[name='multipleFiles']").change(function() {
if (this.value === 'yes') {
$(".regularFileSelect").hide();
$(".multipleFileSelect").show();
} else {
$(".regularFileSelect").show();
$(".multipleFileSelect").hide();
}
});
$("#multiFileSubmit").click(function() {
var files = $("#multiupload")[0].files;
// Cancel upload if no files are selected
if (files.length === 0) {
alert(mw.msg("gadget-uploadMultipleFiles-nofiles"));
return false;
}
// Cancel upload if no license is selected
if ($("#wpLicense option:selected").val() === "" && !mw.config.get("UMFBypassLicenseCheck")) {
alert(mw.msg("gadget-uploadMultipleFiles-nolicense"));
return false;
}
// Description is summary + license + category
var description = getUploadDescription();
var watch = getWatchlistPreference();
$("#firstHeading").msg("gadget-uploadMultipleFiles-uploading");
$("#mw-content-text").html("<h3>" + mw.msg("gadget-uploadMultipleFiles-uploaded") + "</h3><ul></ul><div style='display:none;' id='multiUploadFailed'><h3>" + mw.msg("gadget-uploadMultipleFiles-failed") + "</h3><ul></ul></div>");
var currentFileIdx = 0;
var uploadCurrentFile;
uploadCurrentFile = function() {
if (currentFileIdx > files.length) {
$("#mw-content-text").append($("<h3></h3>").msg("gadget-uploadMultipleFiles-done"));
return;
}
if (files[currentFileIdx] === undefined) {
currentFileIdx++;
uploadCurrentFile();
return;
}
fd = new FormData();
fd.append("action", "upload");
fd.append("token", mw.user.tokens.get("csrfToken"));
fd.append("filename", files[currentFileIdx].name);
fd.append("file", files[currentFileIdx]);
fd.append("text", description);
fd.append("watchlist", watch);
fd.append("ignorewarnings", 1);
fd.append("format", "json");
const $output = $("#mw-content-text > ul");
const $failed = $("#multiUploadFailed");
const $failedOutput = $('#multiUploadFailed ul');
$.ajax({
url: mw.util.wikiScript("api"),
method: "POST",
data: fd,
cache: false,
contentType: false,
processData: false,
type: "POST"
}).done(function(d) {
if (d.error == undefined) {
$output.append('<li><a href="' + d.upload.imageinfo.descriptionurl + '" target="_blank">' + d.upload.filename + '</a></li>');
}
// specific catch for ratelimiting
else if(d.error.code === "ratelimited") {
timer = 60;
console.log(mw.msg('gadget-uploadMultipleFiles-ratelimited', timer));
$message = $('<li class="multiUploadActive"></li>').msg('gadget-uploadMultipleFiles-ratelimited', $('<span id="rateLimitCounter">' + timer + '</span>'));
$output.append($message);
var countdown = setInterval(function(){
// count the timer down, and remove at 0
timer -= 1;
document.getElementById('rateLimitCounter').textContent = timer;
if (timer <= 0) {
$message.remove()
clearInterval(countdown);
}
}, 1000);
setTimeout(function(){
// redundant clearing of the interval and message in case of race conditions
clearInterval(countdown);
$message.remove();
uploadCurrentFile();
}, timer * 1000);
return;
}
// generic fallback
else {
$failedOutput.append('<li>' + files[currentFileIdx].name + ': ' + d.error.info + '</li>');
$failed.show();
}
currentFileIdx++;
uploadCurrentFile();
}).fail(function() {
$failedOutput.append('<li>' + files[currentFileIdx].name + '</li>');
$failed.show();
currentFileIdx++;
uploadCurrentFile();
});
};
uploadCurrentFile();
});
});



