MediaWiki:SimpleBatchUploadUpgrade.js

Aus FürthWiki

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
if (mw.config.get('wgCanonicalSpecialPageName') === 'BatchUpload') {
    $(function () {
        const $uploadForm = $('#fileupload');
        const $uploadTable = $('<table id="file-preview"><thead><tr><th>Datei</th><th>Neuer Name</th><th>Status</th></tr></thead><tbody></tbody></table>');
        const $uploadButton = $('<button id="start-upload" disabled>📤 Hochladen</button>');
        let fileEntries = [];

        // Upload-Button und Tabelle einfügen
        $uploadForm.before($uploadTable);
        $uploadForm.after($uploadButton);

        // Verhindere Sofort-Upload
        $uploadForm.fileupload('option', 'autoUpload', false);

        // Datei-Existenzprüfung via MediaWiki-API
        function checkFileExists(fileName, callback) {
            $.get(mw.util.wikiScript('api'), {
                action: 'query',
                format: 'json',
                titles: 'File:' + fileName
            }).done(function (data) {
                const exists = data.query.pages && !data.query.pages["-1"];
                callback(exists);
            });
        }

        // Prüft alle Dateien in der Liste neu (nach Umbenennung)
        function recheckAll() {
            let allValid = true;

            fileEntries.forEach(entry => {
                const newName = entry.input.val().trim();
                checkFileExists(newName, function (exists) {
                    if (exists) {
                        entry.status.text('⚠️ Existiert');
                        entry.row.css('background-color', '#ffe0e0');
                        allValid = false;
                    } else {
                        entry.status.text('✅ OK');
                        entry.row.css('background-color', '#e0ffe0');
                    }
                    // Nur Button aktivieren, wenn alle Namen OK sind
                    $uploadButton.prop('disabled', !fileEntries.every(en =>
                        en.status.text() === '✅ OK'
                    ));
                });
            });
        }

        // Drag & Drop: Dateien hinzufügen
        $uploadForm.on('fileuploadadd', function (e, data) {
            fileEntries = []; // Reset

            $uploadTable.find('tbody').empty();
            data.files.forEach((file, index) => {
                const defaultName = file.name;
                const row = $('<tr></tr>');
                const input = $('<input type="text">').val(defaultName);
                const status = $('<td>⏳</td>');

                const nameCell = $('<td></td>').append(input);
                row.append($('<td></td>').text(file.name)); // Originalname
                row.append(nameCell);
                row.append(status);
                $uploadTable.find('tbody').append(row);

                const entry = {
                    file: file,
                    data: data,
                    input: input,
                    status: status,
                    row: row
                };

                fileEntries.push(entry);

                // Erste Prüfung
                checkFileExists(defaultName, function (exists) {
                    if (exists) {
                        status.text('⚠️ Existiert');
                        row.css('background-color', '#ffe0e0');
                    } else {
                        status.text('✅ OK');
                        row.css('background-color', '#e0ffe0');
                    }
                    $uploadButton.prop('disabled', !fileEntries.every(en =>
                        en.status.text() === '✅ OK'
                    ));
                });

                // Wenn Benutzer Namen ändert, neu prüfen
                input.on('input', function () {
                    recheckAll();
                });
            });
        });

        // Upload starten bei Klick
        $uploadButton.on('click', function (e) {
            e.preventDefault();
            fileEntries.forEach(entry => {
                const formData = new FormData();
                formData.append('file', entry.file);
                formData.append('filename', entry.input.val().trim());

                // Optional: weitere Parameter, wie Edit-Summary oder Watch
                formData.append('token', mw.user.tokens.get('csrfToken'));
                formData.append('action', 'upload');
                formData.append('format', 'json');
                formData.append('ignorewarnings', '1'); // optional

                $.ajax({
                    url: mw.util.wikiScript('api'),
                    type: 'POST',
                    data: formData,
                    processData: false,
                    contentType: false,
                    success: function (res) {
                        entry.status.text('✅ Hochgeladen');
                        entry.row.css('background-color', '#d0f0d0');
                    },
                    error: function () {
                        entry.status.text('❌ Fehler');
                        entry.row.css('background-color', '#fdd');
                    }
                });
            });
        });
    });
}