<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dmw-wiki.biffify.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadgets%2FuploadMultipleFiles%2Fmain.js</id>
	<title>MediaWiki:Gadgets/uploadMultipleFiles/main.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dmw-wiki.biffify.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadgets%2FuploadMultipleFiles%2Fmain.js"/>
	<link rel="alternate" type="text/html" href="https://dmw-wiki.biffify.com/wiki/index.php?title=MediaWiki:Gadgets/uploadMultipleFiles/main.js&amp;action=history"/>
	<updated>2026-11-05T01:23:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://dmw-wiki.biffify.com/wiki/index.php?title=MediaWiki:Gadgets/uploadMultipleFiles/main.js&amp;diff=27535&amp;oldid=prev</id>
		<title>imported&gt;Westgrass: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://dmw-wiki.biffify.com/wiki/index.php?title=MediaWiki:Gadgets/uploadMultipleFiles/main.js&amp;diff=27535&amp;oldid=prev"/>
		<updated>2025-11-01T06:43:52Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:43, 1 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>imported&gt;Westgrass</name></author>
	</entry>
	<entry>
		<id>https://dmw-wiki.biffify.com/wiki/index.php?title=MediaWiki:Gadgets/uploadMultipleFiles/main.js&amp;diff=27534&amp;oldid=prev</id>
		<title>&gt;Westgrass: refactor, use system messages for l10n now.</title>
		<link rel="alternate" type="text/html" href="https://dmw-wiki.biffify.com/wiki/index.php?title=MediaWiki:Gadgets/uploadMultipleFiles/main.js&amp;diff=27534&amp;oldid=prev"/>
		<updated>2025-07-13T06:11:15Z</updated>

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