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)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/**
* Name: MultiUploadJS
* Author: Fujimaru-kun
* Based on: MultiUpload (by Gguigui1 and KhangND), Gadget-multiupload.js (by Pcj)
* Description: Allows upload of multiple files at the same time
*/
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
'use strict';
var config = mw.config.get([
'wgCanonicalSpecialPageName',
'wgUserLanguage',
'wgUserGroups',
'wgVersion'
]);
if (
window.MultiUploadJSLoaded ||
config.wgCanonicalSpecialPageName !== "Upload" ||
$("#wpForReUpload").val() || //Disabling for Reupload
!/confirmed/.test(config.wgUserGroups.join())
) {
return;
}
window.MultiUploadJSLoaded = true;
var api = new mw.Api(),
i18n,
token = mw.user.tokens.get('csrfToken'),
files = [],
stdmsgs = ['filedesc', 'license-header', 'fileexists-no-change', 'fileexists-duplicate-version', 'verification-error', 'fileexists-shared-forbidden', 'permissiondenied', 'watchthisupload', 'ignorewarnings', 'filewasdeleted'].join('|'),
limit = (window.MultiUploadoption && window.MultiUploadoption.max) ? window.MultiUploadoption.max : -1,
defaultlicense = (window.MultiUploadoption && window.MultiUploadoption.defaultlicense) ? window.MultiUploadoption.defaultlicense : '',
curFile = 0;
function init() {
setLimit();
i18n = getMessages();
$("#wpUploadFile").parent().parent().addClass("regularFileSelect");
$("tr.regularFileSelect").after('<tr class="multipleFileSelect"><td class="mw-label"> </td><td class="mw-input"><input type="file" id="multiupload" multiple /></td></tr>');
$("#mw-htmlform-source > tbody > tr.mw-htmlform-field-UploadSourceField.regularFileSelect").remove();
$("#mw-upload-form > fieldset:nth-of-type(3)").remove();
$("#mw-upload-form > span > input.mw-htmlform-submit").remove();
$("#mw-upload-form > fieldset:nth-of-type(2)").hide();
$("span.mw-htmlform-submit-buttons").append('<input type="button" value="' + i18n['uploadfiles'] + '" class="multipleFileSelect" id="multiFileSubmit" />');
$("span.mw-htmlform-submit-buttons").append('<input type="button" value="' + 'reset' + '" class="multipleFileSelect" id="multiFileReset" />');
$("#multiupload").change(addFields);
$("#multiFileSubmit").click(uploadFiles);
$("#multiFileReset").click(reset);
}
/*
* Set Maximum number of file the user can import at one time (can be overriden by a config var but its value is capped at 100)
*/
function setLimit() {
if (limit < 0 ||
limit > 100 ||
typeof limit !== 'number') {
if (/staff|util|bot-global|wiki-specialist/.test(config.wgUserGroups.join())) {
limit = 200;
} else if (/bureaucrat|bot/.test(config.wgUserGroups.join())) {
limit = 70;
} else if (/sysop/.test(config.wgUserGroups.join())) {
limit = 50;
} else if (/rollback|content-moderator/.test(config.wgUserGroups.join())) {
limit = 30;
} else {
limit = 20;
}
}
}
/*
* Add Fields to change the filename, description and license of each file to DOM
*/
function addFields() {
reset();
files = $("#multiupload")[0].files;
if (files.length <= limit) {
var watchuploads = mw.user.options.get('watchuploads') == "1" ? 'checked=\"checked\"' : '';
for (var index = 0; index < files.length; index++) {
var element = files[index];
var filedesc = $("#mw-upload-form > fieldset:nth-of-type(2)").clone();
filedesc.attr("id", "file-" + index);
filedesc.children("legend").text('imagename' + (index + 1));
filedesc.find("#mw-htmlform-description > tbody > tr.mw-htmlform-field-HTMLTextField > td.mw-label > label").attr("for", "wpDestFile" + index);
filedesc.find("#mw-htmlform-description > tbody > tr.mw-htmlform-field-HTMLTextAreaField > td.mw-label > label").attr("for", "wpUploadDescription" + index);
filedesc.find("#wpDestFile").attr("name", "wpDestFile" + index).attr("id", "wpDestFile" + index).val(element.name);
filedesc.find("#wpUploadDescription").attr("name", "wpUploadDescription" + index).attr("id", "wpUploadDescription" + index);
filedesc.find("#wpLicense").attr("name", "wpLicense" + index).attr("id", "wpLicense" + index).val(defaultlicense);
filedesc.append("<hr />");
filedesc.append("<td class=\"mw-input\"><input name=\"wpWatchthis" + index + "\" type=\"checkbox\" value=\"1\" " + watchuploads + " id=\"wpWatchthis" + index + "\"> <label for=\"wpWatchthis" + index + "\">" + 'watchthisupload' + "</label></td>");
filedesc.append("<td class=\"mw-input\"><input name=\"wpIgnoreWarning" + index + "\" type=\"checkbox\" value=\"1\" id=\"wpIgnoreWarning" + index + "\"> <label for=\"wpIgnoreWarning" + index + "\">" + 'ignorewarnings' + "</label></td>");
$("#mw-upload-form > span").before(filedesc.show());
}
} else {
alert('limit');
$("#multiupload").val("");
reset();
}
}
/*
* Reset form to its initial state
*/
function reset() {
files = [];
$("#mw-upload-form > fieldset:nth-of-type(2) ~ fieldset").remove();
}
/*
* Get standard messages for supported errors
*/
function getMessages() {
var i18n = [];
api.get({
action: 'query',
meta: 'allmessages',
amlang: config.wgUserLanguage,
ammessages: stdmsgs
}).then(function (data) {
var msg = data.query.allmessages;
msg.forEach(function (message) {
i18n[message.name] = message['*'];
});
});
return i18n;
}
/*
* Initiate uploading process
*/
function uploadFiles() {
if (files.length === 0) {
alert('nofile');
return false;
} else if (files.length > limit) {
alert('limit');
return false;
}
$("#firstHeading").text('uploading');
$("#mw-content-text").hide();
$("<h3>" + 'successful' + "</h3><ul id='multiUploadDone'></ul><div style='display:none;' id='multiUploadFailed'><h3>" + 'failed' + "</h3><ul></ul></div>").prependTo("#content");
apiUpload();
}
/*
* Make API Requests to upload files
*/
function apiUpload() {
if (curFile > files.length) {
$("<h3>" + 'done' + "</h3>").appendTo("#content");
return;
}
if (files[curFile] === undefined) {
curFile++;
apiUpload();
return;
}
var filename = $("#wpDestFile" + curFile).val() || files[curFile].name;
var license = $("#wpLicense" + curFile + " option:selected").prop("title") !== "{{}}" ? "== " + 'license-header' + " ==\n" + $("#wpLicense" + curFile + " option:selected").prop("title") : "";
var description = $("#wpUploadDescription" + curFile).val() ? "== " + i18n['filedesc'] + " ==\n" + $("#wpUploadDescription" + curFile).val() : "";
var watch = $("#wpWatchthis" + curFile).is(":checked") ? 'watch' : 'nochange';
var warning = $("#wpIgnoreWarning" + curFile).is(":checked");
var params = {
token: token,
filename: filename,
text: description + "\n" + license,
watchlist: watch,
ignorewarnings: '1',
format: 'json'
};
if (!warning) {
delete params.ignorewarnings;
}
api.upload(files[curFile], params).done(function (d) {
console.log(d);
$("#multiUploadDone").append('<li><a href="' + d.upload.imageinfo.descriptionurl + '" target="_blank">' + d.upload.filename + '</a></li>');
curFile++;
apiUpload();
}).fail(function (d) {
if (!warning || stdmsgs.includes(d)) {
$("#multiUploadFailed ul").append('<li>' + filename + ': ' + d + "File:"+filename + '</li>');
$("#multiUploadFailed").show();
} else {
$("#multiUploadDone").append('<li>' + filename + ': ' + d + '</li>');
}
curFile++;
apiUpload();
});
}
init();
});