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 $form = $('#fileupload');
        const $preview = $('<div id="file-preview-area"><h3>📄 Dateivorschau</h3><table><thead><tr><th>Original</th><th>Neuer Name</th><th>Status</th></tr></thead><tbody></tbody></table></div>');
        const $uploadBtn = $('<button>📤 Hochladen</button>').prop('disabled', true);
        const uploadQueue = [];

        $form.before($preview);
        $preview.after($uploadBtn);

        // ⛔️ Verhindert automatischen Upload
        $form.fileupload('option', 'autoUpload', false);

        function checkFileExists(name, callback) {
            $.get(mw.util.wikiScript('api'), {
                action: 'query',
                format: 'json',
                titles: 'File:' + name
            }).done(function (res) {
                const exists = res.query.pages && !res.query.pages['-1'];
                callback(exists);
            });
        }

        function updateUploadButtonState() {
            const allClear = uploadQueue.every(entry => entry.status.text() === '✅ OK');
            $uploadBtn.prop('disabled', !allClear);
        }

        $form.on('fileuploadadd', function (e, data) {
            data.files.forEach(file => {
                const row = $('<tr></tr>');
                const originalName = file.name;
                const input = $('<input type="text">').val(originalName);
                const status = $('<td>🔍 Prüfe …</td>');

                row.append($('<td>').text(originalName));
                row.append($('<td>').append(input));
                row.append(status);
                $preview.find('tbody').append(row);

                const entry = { file, data, input, status, row };
                uploadQueue.push(entry);

                // Erste Prüfung
                checkFileExists(input.val(), function (exists) {
                    if (exists) {
                        status.text('⚠️ Existiert');
                        row.css('background', '#ffe0e0');
                    } else {
                        status.text('✅ OK');
                        row.css('background', '#e0ffe0');
                    }
                    updateUploadButtonState();
                });

                // Bei Namensänderung neu prüfen
                input.on('input', function () {
                    const newName = input.val().trim();
                    checkFileExists(newName, function (exists) {
                        if (exists) {
                            status.text('⚠️ Existiert');
                            row.css('background', '#ffe0e0');
                        } else {
                            status.text('✅ OK');
                            row.css('background', '#e0ffe0');
                        }
                        updateUploadButtonState();
                    });
                });
            });
        });

        // Upload starten
        $uploadBtn.on('click', function (e) {
            e.preventDefault();
            uploadQueue.forEach(entry => {
                const formData = new FormData();
                formData.append('file', entry.file);
                formData.append('filename', entry.input.val().trim());
                formData.append('token', mw.user.tokens.get('csrfToken'));
                formData.append('action', 'upload');
                formData.append('format', 'json');
                formData.append('ignorewarnings', '1');

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