×
Create a new article
Write your page title here:
We currently have 98 articles on DC Comics Wiki. Type your article name above or create one of the articles listed here!



    DC Comics Wiki

    MediaWiki:MultiUpload.js: Difference between revisions

    Content added Content deleted
    (Temp disable license requirement)
    No edit summary
    Tag: Reverted
    Line 1: Line 1:
    /**
    /* @authors Gguigui1, KhangND, Universal Omega */
    * Name: MultiUploadJS
    mw.loader.using([
    * Author: Fujimaru-kun
    'mediawiki.user',
    * Based on: MultiUpload (by Gguigui1 and KhangND), Gadget-multiupload.js (by Pcj)
    'mediawiki.api',
    * Description: Allows upload of multiple files at the same time
    'jquery.client',
    */
    'jquery.spinner',
    mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
    'ext.LinkSuggest'
    'use strict';
    ], function() {
    var groups = mw.config.get('wgUserGroups').join(),
    var config = mw.config.get([
    config = mw.config.get([
    'wgCanonicalSpecialPageName',
    'wgCanonicalSpecialPageName',
    'wgNamespaceNumber',
    'wgTitle',
    'wgUserLanguage',
    'wgUserLanguage',
    'wgUserName'
    'wgUserGroups',
    'wgVersion'
    ]);
    ]);

    mw.loader.implement("mediawiki.legacy.ajax", function($) {
    if (
    window.sajax_debug_mode = !1;
    window.sajax_request_type = 'GET';
    window.MultiUploadJSLoaded ||
    config.wgCanonicalSpecialPageName !== "Upload" ||
    window.sajax_debug = function(text) {
    $("#wpForReUpload").val() || //Disabling for Reupload
    if (!sajax_debug_mode)
    return false;
    !/confirmed/.test(config.wgUserGroups.join())
    ) {
    var e = document.getElementById('sajax_debug');
    if (!e) {
    return;
    e = document.createElement('p');
    e.className = 'sajax_debug';
    e.id = 'sajax_debug';
    var b = document.getElementsByTagName('body')[0];
    if (b.firstChild) {
    b.insertBefore(e, b.firstChild);
    } else {
    b.appendChild(e);
    }
    }
    }
    window.MultiUploadJSLoaded = true;
    var m = document.createElement('div');

    m.appendChild(document.createTextNode(text));
    e.appendChild(m);
    var api = new mw.Api(),
    return true;
    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('|'),
    window.sajax_init_object = function() {
    limit = (window.MultiUploadoption && window.MultiUploadoption.max) ? window.MultiUploadoption.max : -1,
    sajax_debug('sajax_init_object() called..');
    defaultlicense = (window.MultiUploadoption && window.MultiUploadoption.defaultlicense) ? window.MultiUploadoption.defaultlicense : '',
    var A;
    try {
    curFile = 0;

    A = new XMLHttpRequest();
    } catch (e) {
    function init() {
    try {
    setLimit();

    A = new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e) {
    i18n = getMessages();
    $("#wpUploadFile").parent().parent().addClass("regularFileSelect");
    try {
    $("tr.regularFileSelect").after('<tr class="multipleFileSelect"><td class="mw-label">&nbsp;</td><td class="mw-input"><input type="file" id="multiupload" multiple /></td></tr>');
    A = new ActiveXObject('Microsoft.XMLHTTP');
    $("#mw-htmlform-source > tbody > tr.mw-htmlform-field-UploadSourceField.regularFileSelect").remove();
    } catch (oc) {
    A = null;
    $("#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);
    }
    }
    if (!A) {
    /*
    sajax_debug('Could not create connection object.');
    * 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)
    }
    return A;
    */
    function setLimit() {
    }
    if (limit < 0 ||
    ;
    limit > 100 ||
    window.sajax_do_call = function(func_name, args, target) {
    var i, x, n;
    typeof limit !== 'number') {
    if (/staff|util|bot-global|wiki-specialist/.test(config.wgUserGroups.join())) {
    var uri;
    var post_data;
    limit = 200;
    } else if (/bureaucrat|bot/.test(config.wgUserGroups.join())) {
    uri = mw.util.wikiScript() + '?action=ajax';
    limit = 70;
    if (sajax_request_type == 'GET') {
    if (uri.indexOf('?') == -1) {
    } else if (/sysop/.test(config.wgUserGroups.join())) {
    uri = uri + '?rs=' + encodeURIComponent(func_name);
    limit = 50;
    } else {
    } else if (/rollback|content-moderator/.test(config.wgUserGroups.join())) {
    uri = uri + '&rs=' + encodeURIComponent(func_name);
    limit = 30;
    }
    for (i = 0; i < args.length; i++) {
    uri = uri + '&rsargs[]=' + encodeURIComponent(args[i]);
    }
    post_data = null;
    } else {
    post_data = 'rs=' + encodeURIComponent(func_name);
    for (i = 0; i < args.length; i++) {
    post_data = post_data + '&rsargs[]=' + encodeURIComponent(args[i]);
    }
    }
    x = sajax_init_object();
    if (!x) {
    alert('AJAX not supported');
    return false;
    }
    try {
    x.open(sajax_request_type, uri, true);
    } catch (e) {
    if (window.location.hostname == 'localhost') {
    alert("Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing.");
    }
    throw e;
    }
    if (sajax_request_type == 'POST') {
    x.setRequestHeader('Method', 'POST ' + uri + ' HTTP/1.1');
    x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    x.setRequestHeader('Pragma', 'cache=yes');
    x.setRequestHeader('Cache-Control', 'no-transform');
    x.onreadystatechange = function() {
    if (x.readyState != 4) {
    return;
    }
    sajax_debug('received (' + x.status + ' ' + x.statusText + ') ' + x.responseText);
    if (typeof (target) == 'function') {
    target(x);
    } else if (typeof (target) == 'object') {
    if (target.tagName == 'INPUT') {
    if (x.status == 200) {
    target.value = x.responseText;
    }
    } else {
    } else {
    if (x.status == 200) {
    limit = 20;
    target.innerHTML = x.responseText;
    } else {
    target.innerHTML = '<div class="error">Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')</div>';
    }
    }
    }
    } else {
    alert('bad target for sajax_do_call: not a function or object: ' + target);
    }
    }
    }
    }
    ;
    sajax_debug(func_name + ' uri = ' + uri + ' / post = ' + post_data);
    x.send(post_data);
    sajax_debug(func_name + ' waiting..');
    delete x;
    return true;
    }
    ;
    window.wfSupportsAjax = function() {
    var request = sajax_init_object();
    var supportsAjax = request ? true : !1;
    delete request;
    return supportsAjax;
    }
    ;
    ;
    }, {}, {});
    function getLicensePreview(num) {
    window.licenseSelectorCheck = function () {
    var selector = document.getElementById("license" + num);
    var selection = selector.options[selector.selectedIndex].value;
    if (selector.selectedIndex > 0) {
    if (selection == "") {
    // Option disabled, but browser is broken and doesn't respect this
    selector.selectedIndex = 0;
    }
    }
    var UploadLicenseObj = {


    'responseCache': {
    /*
    * Add Fields to change the filename, description and license of each file to DOM
    '': ''
    },
    */
    function addFields() {

    'fetchPreview': function (license) {
    reset();
    files = $("#multiupload")[0].files;
    if (!mw.config.get('wgAjaxLicensePreview'))
    return;
    if (files.length <= limit) {
    var watchuploads = mw.user.options.get('watchuploads') == "1" ? 'checked=\"checked\"' : '';
    for (cached in this.responseCache) {
    if (cached == license) {
    for (var index = 0; index < files.length; index++) {
    this.showPreview(this.responseCache[license]);
    var element = files[index];
    return;
    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 + "\">&nbsp;<label for=\"wpWatchthis" + index + "\">" + 'watchthisupload' + "</label></td>");
    filedesc.append("<td class=\"mw-input\"><input name=\"wpIgnoreWarning" + index + "\" type=\"checkbox\" value=\"1\" id=\"wpIgnoreWarning" + index + "\">&nbsp;<label for=\"wpIgnoreWarning" + index + "\">" + 'ignorewarnings' + "</label></td>");
    $("#mw-upload-form > span").before(filedesc.show());
    }
    }
    } else {
    alert('limit');
    $("#multiupload").val("");
    reset();
    }
    }
    $('#license' + num).injectSpinner('license' + num);

    var title = document.getElementById('imagename' + num).value;
    if (!title)
    title = 'File:Sample.jpg';

    var url = mw.util.wikiScript('api')
    + '?action=parse&text={{' + encodeURIComponent(license) + '}}'
    + '&title=' + encodeURIComponent(title)
    + '&prop=text&pst&format=json';

    var req = sajax_init_object();
    req.onreadystatechange = function () {
    if (req.readyState == 4 && req.status == 200) {
    UploadLicenseObj.processResult(eval('(' + req.responseText + ')'), license);
    }
    };
    req.open('GET', url, true);
    req.send('');

    },

    'processResult': function (result, license) {
    $.removeSpinner('license' + num);
    this.responseCache[license] = result['parse']['text']['*'];
    this.showPreview(this.responseCache[license]);
    },

    'showPreview': function (preview) {
    var previewPanel = document.getElementById('mw-license-preview' + num);
    if (previewPanel.innerHTML != preview)
    previewPanel.innerHTML = preview;
    }
    }


    };
    /*
    // We might show a preview
    * Reset form to its initial state
    */
    UploadLicenseObj.fetchPreview(selection);
    function reset() {
    };
    files = [];
    var wpLicense = document.getElementById('license' + num);
    $("#mw-upload-form > fieldset:nth-of-type(2) ~ fieldset").remove();

    if (mw.config.get('wgAjaxLicensePreview') && wpLicense) {
    // License selector check
    wpLicense.onchange = licenseSelectorCheck;

    // License selector table row
    var wpLicenseRow = wpLicense.parentNode.parentNode;
    var wpLicenseTbody = wpLicenseRow.parentNode;

    var row = document.createElement('tr');
    var td = document.createElement('td');
    row.appendChild(td);
    td = document.createElement('td');
    td.id = 'mw-license-preview' + num;
    row.appendChild(td);

    wpLicenseTbody.insertBefore(row, wpLicenseRow.nextSibling);
    }
    }
    // load protections
    if(window.MultiUploadLoaded
    || config.wgUserName === null
    || ( !/autoconfirmed/.test(groups) && !/confirmed/.test(groups))) {
    return;
    } window.MultiUploadLoaded = true;
    var storage = 'MultiUploadLicenses';
    var content = $('#mw-content-text');
    var allowTypes = $.map( mw.config.get("wgFileExtensions"), function(file_extensions) {
    return('.' + file_extensions)
    });

    var style = {
    block: {
    display: 'inline-block',
    margin: '0 8px'
    },
    textarea: {
    width: '100%',
    height: 150,
    boxSizing: 'border-box',
    resize: 'none'
    }
    }
    };


    /*
    function loadMWMessagesIfMissing(messages) {
    * Get standard messages for supported errors
    var deferred = $.Deferred(),
    */
    missingMessages = messages.filter(function (message) { return !mw.messages.exists(message); });
    if (!missingMessages.length) {
    function getMessages() {
    deferred.resolve();
    var i18n = [];
    } else {
    api.get({
    $.get(mw.util.wikiScript('api'), {
    format: 'json',
    action: 'query',
    action: 'query',
    meta: 'allmessages',
    meta: 'allmessages',
    ammessages: missingMessages.join('|'),
    amlang: config.wgUserLanguage,
    amlang: config.wgUserLanguage
    ammessages: stdmsgs
    }).then(function (data) {
    }).then(function (data) {
    if ($.isArray(data.query.allmessages)) {
    var msg = data.query.allmessages;
    $.each(data.query.allmessages, function (_, message) {
    msg.forEach(function (message) {
    if (message.missing !== '') {
    i18n[message.name] = message['*'];
    mw.messages.set(message.name, message['*']);
    });
    }
    });
    }
    deferred.resolve();
    }, function () {
    // Silently swallow failures; we don't want error reporting to stall just because we failed to fetch some messages.
    deferred.resolve();
    });
    });

    return i18n;
    }
    }
    return deferred;
    }


    MultiUpload = {
    /*
    input: $(), // available on init
    * Initiate uploading process
    editor: $(), // available on init
    */
    button: $(), // available on init
    function uploadFiles() {
    fileCount: 0,// available on create
    preload: function(load) {
    $.extend(this, window.MultiUploadoption || {});
    this.load=load;


    // creates Special page
    if (files.length === 0) {
    if(
    alert('nofile');
    return false;
    (config.wgNamespaceNumber === -1 && config.wgTitle === 'MultiUpload') ||
    } else if (files.length > limit) {
    (config.wgCanonicalSpecialPageName === 'Blankpage' && /MultiUpload/.test($.getUrlVar('blankspecial')))
    ) {
    alert('limit');
    $('#firstHeading').text('Multi Upload');
    return false;
    $('title').text('Multi Upload');
    this.init();
    }
    },
    init: function() {
    content.empty().append([
    $('<input>', {
    id: 'fileinput',
    type: 'file',
    multiple: true,
    accept: allowTypes.join(),
    }),
    $('<div>', {
    id: 'editor',
    css: { display: 'none' },
    }),
    $('<button>', {
    id: 'go',
    text: 'Update the form',
    click: $.proxy(this.getLicenses, this)
    })
    ]);
    this.input = $('#fileinput');
    this.editor = $('#editor');
    this.button = $('#go');
    },
    notify: function(message, type) {
    mw.notify(message, { type: type } );
    },
    getLicenses: function() {
    var data = localStorage.getItem(storage);
    if(data !== null) {
    this.create(data);
    var limit = this.max < this.fileCount ? this.max : this.fileCount;
    for (i = 1; i <= limit; i++) {
    getLicensePreview(i);
    }
    return;
    }
    }


    $.get(mw.util.wikiScript('api'), {
    $("#firstHeading").text('uploading');
    action: 'query',
    $("#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");
    meta: 'allmessages',
    ammessages: 'Licenses',
    apiUpload();
    format: 'json'
    }
    }).done(
    /*
    $.proxy(this.create, this)
    * Make API Requests to upload files
    ).fail($.proxy(function(data) {
    */
    this.notify('Api Error : ' + data.error.info, 'error');
    }), this);
    function apiUpload() {
    if (curFile > files.length) {
    },
    $("<h3>" + 'done' + "</h3>").appendTo("#content");
    create: function(data) {
    // conditions
    var formatError = false;
    this.fileCount = this.input[0].files.length;

    $(this.input[0].files).each(function(i, file) {
    if(!new RegExp(allowTypes.join('|\\'), 'i').test(file.name)) {
    formatError = true;
    return;
    }
    });
    if (formatError) {
    this.notify('Unsupported file format', 'warn');
    return;
    return;
    }
    }
    if (!this.input[0].files) {
    if (files[curFile] === undefined) {
    curFile++;
    this.notify('This browser doesn&#39;t seem to support the `files` property of file inputs.', 'notify');
    apiUpload();
    return;
    return;
    }
    }
    var filename = $("#wpDestFile" + curFile).val() || files[curFile].name;
    if (this.fileCount === 0) {
    var license = $("#wpLicense" + curFile + " option:selected").prop("title") !== "{{}}" ? "== " + 'license-header' + " ==\n" + $("#wpLicense" + curFile + " option:selected").prop("title") : "";
    this.notify('You have to choose a file to upload it', 'warn');
    var description = $("#wpUploadDescription" + curFile).val() ? "== " + i18n['filedesc'] + " ==\n" + $("#wpUploadDescription" + curFile).val() : "";
    return;
    var watch = $("#wpWatchthis" + curFile).is(":checked") ? 'watch' : 'nochange';
    }
    var warning = $("#wpIgnoreWarning" + curFile).is(":checked");
    if(!this.max
    || this.max < 0
    var params = {
    || this.max > 101
    token: token,
    || typeof this.max !== 'number') {
    filename: filename,
    if (/staff|helper|util|bot-global/.test(groups)) {
    text: description + "\n" + license,
    this.max = 200;
    watchlist: watch,
    } else if (/bureaucrat|bot/.test(groups)) {
    ignorewarnings: '1',
    this.max = 70;
    format: 'json'
    } else if (/sysop/.test(groups)) {
    };
    this.max = 50;
    if (!warning) {
    } else if (/rollback/.test(groups)) {
    delete params.ignorewarnings;
    this.max = 30;
    } else {
    this.max = 20;
    }
    }
    if (!this.max) {
    this.notify('A problem occurred, upload cancelled', 'error');
    return;
    }
    }


    // creates form
    api.upload(files[curFile], params).done(function (d) {
    data = typeof data === 'object'
    console.log(d);
    $("#multiUploadDone").append('<li><a href="' + d.upload.imageinfo.descriptionurl + '" target="_blank">' + d.upload.filename + '</a></li>');
    ? data.query.allmessages[0]['*'].trim()
    : data;
    curFile++;
    apiUpload();
    localStorage.setItem(storage, data); // retrieves licenses 1 time only
    var licenses = data.split('\n');
    }).fail(function (d) {
    var limit = this.max < this.fileCount ? this.max : this.fileCount;
    if (!warning || stdmsgs.includes(d)) {
    $("#multiUploadFailed ul").append('<li>' + filename + ': ' + d + "File:"+filename + '</li>');
    for (i = 1; i <= limit; i++) {
    $('<fieldset>', {
    $("#multiUploadFailed").show();
    id: 'field' + i,
    appendTo: this.editor,
    append: [
    $('<legend>', {
    text: 'File n° ' + i
    }),
    $('<div>', {
    css: style.block,
    text: 'Name:',
    append: $('<input>', {
    type: 'text',
    id: 'imagename' + i,
    'class': 'imagename',
    val: this.input[0].files[i - 1].name
    })
    }),
    $('<div>', {
    css: style.block,
    text: 'License:',
    append: $('<select>', {
    id: 'license' + i,
    'class': 'license',
    append: $('<option>', {
    val: 'none',
    text: 'None selected'
    })
    })
    }),

    $('<div>', {
    id: 'progress' + i,
    css: style.block
    }),
    ]
    });
    }
    for (i = 0; i < licenses.length; i++) {
    if (licenses[i].indexOf('**') === 0) {
    var name = licenses[i].split('|')[0].replace('**', '').trim(),
    text = licenses[i].split('|')[1];
    $('<option>', {
    val: name,
    text: text,
    selected: name == this.defaultlicense,
    appendTo: $('.license').find('optgroup:last-child')
    });
    } else {
    } else {
    $('<optgroup>', {
    $("#multiUploadDone").append('<li>' + filename + ': ' + d + '</li>');
    label: licenses[i].replace('*', '').trim(),
    appendTo: $('.license')
    });
    }
    }
    }
    curFile++;
    $('<div>', {
    apiUpload();
    appendTo: this.editor,
    text: 'Summaries:'
    }),
    $('<textarea>', {
    appendTo: this.editor,
    id: 'UploadDescription',
    css: style.textarea,
    }).linksuggest();
    $('.license option[value="none"').attr("disabled", "true");
    $('<button>', {
    'class': 'secondary',
    id: 'reset',
    css: style.block,
    text: 'Reset the form',
    click: $.proxy(this.init, this),
    appendTo: content
    }),
    $('<input>', {
    type: 'checkbox',
    id: 'ignorewarnings',
    name: 'ignorewarnings',
    appendTo: content
    }),
    $('<label>', {
    'for': 'ignorewarnings',
    text: 'Ignore warnings',
    appendTo: content
    });
    });
    jQuery(function ($) {
    }
    init();
    'use strict';
    if ($('#UploadDescription').val()) {
    return;
    }
    var params = {
    action: 'parse',
    page: 'Template:Default Upload Summary',
    format: 'json',
    prop: 'wikitext'
    };
    var api = new mw.Api();

    api.get(params).done(function(data) {
    $('#UploadDescription').val(data.parse.wikitext['*']);
    });
    });

    $('.license option[value="none"]').attr("disabled", "true");
    });

    license = $('#license' + i).find('option:selected').val(),

    this.input.attr('disabled', true);
    this.editor.show();
    this.button
    .unbind('click')
    .click($.proxy(this.upload, this))
    .text('Upload All');
    },
    upload: function() {
    content.find('*').attr('disabled', true);
    $('#reset').removeAttr('disabled');
    var obj = this;
    var loop = function (i) {
    if (i <= obj.fileCount) {
    var file = obj.input[0].files[i - 1],
    filename = $('#imagename' + i).val() || file.name,
    license = $('#license' + i).find('option:selected').val(),
    text = $('#UploadDescription').val();
    if(license == "none"){
    // alert('Licensing must be complete.');
    // $('*').removeAttr('disabled');
    // return;
    }
    if(license !== "none") text = '== Summary ==\n' + text + '\n\n== Licensing ==\n{{' + license + '}}\n';
    obj.uploadFile(file, filename, text, i).always(function(){
    loop(i+1);
    });
    }
    };
    loop(1);
    },
    uploadFile: function(fileToUpload, fileName, text, index) {
    // https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
    formdata = new FormData();
    formdata.append('action', 'upload');
    formdata.append('format', 'json');
    formdata.append('filename', fileName);
    formdata.append('token', mw.user.tokens.get('csrfToken'));
    formdata.append('file', fileToUpload);
    formdata.append('text', text);
    formdata.append(
    $('#ignorewarnings').prop('checked') ? 'ignorewarnings' : '', ''
    );

    // https://stackoverflow.com/a/8244082
    return $.ajax({
    url: mw.util.wikiScript('api'),
    contentType: false,
    processData: false,
    type: 'POST',
    data: formdata,
    dataType: 'json',
    xhr: function() { // https://stackoverflow.com/a/27030092
    myXhr = $.ajaxSettings.xhr();
    myXhr.upload.addEventListener('progress', function(e) {
    MultiUpload.progress(index, e);
    });
    return myXhr;
    },
    success: $.proxy(function(data) {
    this.success(index, data);
    }, this),
    error: $.proxy(function(_, __, error) {
    this.notify(error, 'error');
    }, this)
    });
    },
    progress: function(index, e) {
    var progress = e.loaded / e.total * 100;
    $('#progress' + index).text(progress.toFixed(0) + '%');
    },
    success: function(index, data) {
    // Error
    if (data.error) {
    var errorInfo, errorDetails;

    function displayError() {
    $('#progress' + index).html([
    $('<strong/>').text(errorInfo),
    (errorDetails === undefined) ? null : $('<br/>'),
    (errorDetails === undefined) ? null : $('<div/>').text(errorDetails)
    ]);
    }

    // Excluding variants of `unknownerror`, we're going to ignore `error.info` since it mightn't be localized.
    // See <https://github.com/Wikia/app/blob/release-886.001/includes/upload/UploadBase.php> for special cases.
    if (data.error.code.startsWith('unknownerror')) {
    errorInfo = data.error.info;
    displayError();
    } else {
    var messages = [data.error.code];
    if (data.error.code === 'verification-error') {
    messages.push(data.error.details[0]);
    }
    loadMWMessagesIfMissing(messages).then(function () {
    errorInfo = mw.msg(data.error.code);
    if (data.error.code === 'verification-error') {
    errorDetails = mw.msg.apply(null, data.error.details);
    } else if (data.error.code === 'hookaborted') {
    errorDetails = data.error.error; // TODO: Determine whether it's safe to assume this'll always be properly escaped HTML.
    }
    displayError();
    });
    }
    return;
    }

    // Success
    if(data.upload.result === 'Success') {
    $('#progress' + index).text('File uploaded successfully.');
    return;
    }

    // Warnings
    var msg;
    if(data.upload.warnings.hasOwnProperty('was-deleted')) {
    msg = 'Deleted file';
    } else if(data.upload.warnings.hasOwnProperty('duplicate')) {
    msg = 'Duplicated file';
    } else if(data.upload.warnings.hasOwnProperty('exists')) {
    msg = 'Existing file';
    } else {
    msg = 'File uploaded successfully.';
    }

    $('#progress' + index).text(msg);
    }
    };

    $(function(load) {
    $.proxy(MultiUpload.preload(), MultiUpload);
    });
    });

    Revision as of 00:57, 15 May 2024

    /**
     * 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">&nbsp;</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 + "\">&nbsp;<label for=\"wpWatchthis" + index + "\">" + 'watchthisupload' + "</label></td>");
                        filedesc.append("<td class=\"mw-input\"><input name=\"wpIgnoreWarning" + index + "\" type=\"checkbox\" value=\"1\" id=\"wpIgnoreWarning" + index + "\">&nbsp;<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();
    });
    
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.