Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Gadgets/uploadMultipleFiles/main.js

MediaWiki interface page

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" /> '),
                ' &nbsp; ',
                $("<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();
    });
});

Join the DMW Community

Guides, patch discussion, and help from the community all happen on Discord.

Join Discord