Jump to content

User:AramilFeraxa/QD.js

From Meta, a Wikimedia project coordination wiki

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.
var QuickDelete = {

    createFieldSet: function() {
        // Tworzy div, który jest głównym kontenerem
		document.getElementsByTagName("h1")[0].textContent = "Quick delete pages";
		document.title = "Quick delete pages";
		
        jQuery('<div/>', {
            id: 'QD-container',
            style: 'max-width: 750px; border: 1px solid #CCC; text-align:center; border-radius: 10px; padding: 15px; margin: 0 auto;'
        }).appendTo('#mw-content-text');

        // Tworzy fieldset layout
        var QD_fieldset = new OO.ui.FieldsetLayout({
            label: 'Quick Delete',
            classes: ['container']
        });

        // Tworzy pole formularza na wpisanie nazwy kategorii
        var defCategory = ''; // Domyślna kategoria
        var QD_input_category = new OO.ui.TextInputWidget({
            placeholder: 'Category',
            "class": "QD-input",
            id: 'QD-category',
            required: true,
            validate: 'non-empty',
            value: defCategory
        });

        // Tworzy pole formularza na wpisanie powodu usunięcia
    	var defReason = 'NowCommons'; // Domyślny powód usunięcia
        var QD_input_reason = new OO.ui.TextInputWidget({
            placeholder: 'Reason',
            "class": "QD-input",
            id: 'QD-reason',
            required: true,
            validate: 'non-empty',
            value: defReason
        });

        // Dodaje stworzone elementy do fieldsetu
        QD_fieldset.addItems([
            new OO.ui.FieldLayout(QD_input_category, {
                label: 'Category name',
                align: 'right',
            }),
            new OO.ui.FieldLayout(QD_input_reason, {
                label: 'Reason',
                align: 'right',
            }),
        ]);

        // Dołącza fieldset do kontenera
        $('#QD-container').append(QD_fieldset.$element);
        
		jQuery('#QD-reason').css('margin-bottom', '15px');

        // Przycisk "Analizuj strony"
        var QD_button_analyze = new OO.ui.ButtonInputWidget({
            type: 'submit',
            useInputTag: true,
            id: 'QD-analyze-button',
            label: 'Analyze pages',
            flags: [
                'primary'
            ]
        });

        $('#QD-container').append(QD_button_analyze.$element);

        // Przycisk "Usuń strony"
        var QD_button_delete = new OO.ui.ButtonInputWidget({
            type: 'submit',
            useInputTag: true,
            id: 'QD-delete-button',
            label: 'Delete listed pages',
            flags: [
                'primary',
                'destructive'
            ],
        });
        QD_button_delete.$element.hide(); // Ukryj przycisk na początku
        $('#QD-container').append(QD_button_delete.$element);

        // Div na komunikaty otrzymywane później
        jQuery('<div/>', {
            id: 'QD-message-container',
            style: 'width:100%; margin:5px;'
        }).appendTo('#QD-container');

        console.log("QD: Utworzono formularz");

        // Po kliknięciu na "Analizuj strony" -> idź do funkcji analyzePages()
        $(document).on('click', '#QD-analyze-button', function() {
            var catName = QD_input_category.getValue().trim(); // Pobierz nazwę kategorii od użytkownika
            console.log("QD: Rozpoczynam analizę stron z kategorii: " + catName);
            QuickDelete.analyzePages(catName);
        });
		
        var QD_button_confirmDelete = new OO.ui.ButtonInputWidget({
            type: 'submit',
            useInputTag: true,
            id: 'QD-confirm-delete-button',
            label: 'Confirm',
            flags: [
                'primary',
                'destructive'
            ],
        });
        QD_button_confirmDelete.$element.hide(); // Ukryj przycisk na początku
        $('#QD-container').append(QD_button_confirmDelete.$element);

        // Po kliknięciu na "Usuń strony" -> pokaż przycisk potwierdzenia
        $(document).on('click', '#QD-delete-button', function() {
            $('#QD-delete-button').hide();
            $('#QD-confirm-delete-button').show();
        });

        // Po kliknięciu na "Potwierdź usunięcie" -> idź do funkcji deletePages()
        $(document).on('click', '#QD-confirm-delete-button', function() {
            var catName = QD_input_category.getValue().trim(); // Pobierz nazwę kategorii od użytkownika
            console.log("QD: Rozpoczynam usuwanie stron z kategorii: " + catName);
            // Pobierz powód usunięcia z formularza
            var deleteReason = QD_input_reason.getValue().trim();
            QuickDelete.deletePages(catName, deleteReason);
        });
    },

    analyzePages: function(catName) {
        // Wyczyść dotychczasowe komunikaty (jeśli są)
        $('#QD-message-container').empty();

        // Parametry dla zapytania API
        var params = {
            action: 'query',
            list: 'categorymembers',
            cmtitle: 'Category:' + catName,
            cmlimit: 'max',
            format: 'json'
        };

        // Wywołanie API, aby pobrać listę stron w kategorii
        $.ajax({
            url: mw.util.wikiScript('api'),
            data: params,
            success: function(data) {
                if (data.query && data.query.categorymembers.length > 0) {
                    var pagesToAnalyze = data.query.categorymembers.map(function(member) {
                        return member.title;
                    });
                    console.log("QD: Znaleziono " + pagesToAnalyze.length + " stron do analizy.");

                    QuickDelete.displayMsg("Pages to delete:<br>" + pagesToAnalyze.join("<br>"), 'success');
                    $('#QD-delete-button').show();
                } else if (data.query.categorymembers.length === 0 || data.query.categorymembers.missing !== undefined) {
                	QuickDelete.displayMsg("Category does not exist or is empty: " + catName, 'error');
                	console.error("QD: Category does not exist or is empty: " + catName);
                } else {
                    QuickDelete.displayMsg("No pages found in the category: " + catName, 'error');
                    console.error("QD: Nie znaleziono stron w kategorii, bądź jest ona pusta: " + catName);
                }
            },
            error: function(xhr, status, error) {
                QuickDelete.displayMsg("Error when searching pages from category: " + error, 'error');
                console.error("QD: Błąd podczas pobierania stron z kategorii: " + error);
            }
        });
    },

    deletePages: function(catName, deleteReason) {
        // Wyczyść dotychczasowe komunikaty (jeśli są)
        $('#QD-message-container').empty();

        // Parametry dla zapytania API
        var params = {
            action: 'query',
            list: 'categorymembers',
            cmtitle: 'Category:' + catName,
            cmlimit: 'max',
            format: 'json'
        };

        // Wywołanie API, aby pobrać listę stron w kategorii
        $.ajax({
            url: mw.util.wikiScript('api'),
            data: params,
            success: function(data) {
                if (data.query && data.query.categorymembers) {
                    var pagesToDelete = data.query.categorymembers.map(function(member) {
                        return member.title;
                    });
                    console.log("QD: Znaleziono " + pagesToDelete.length + " stron do usunięcia.");

                    // Wywołanie funkcji usuwającej strony
                    QuickDelete.deletePagesInCategory(pagesToDelete, deleteReason);
                } else {
                    QuickDelete.displayMsg("No pages found in the category: " + catName, 'error');
                    console.error("QD: Nie znaleziono stron w kategorii: " + catName);
                }
            },
            error: function(xhr, status, error) {
                QuickDelete.displayMsg("Error when searching pages from category: " + error, 'error');
                console.error("QD: Błąd podczas pobierania stron z kategorii: " + error);
            }
        });
    },

    deletePagesInCategory: function(pages, deleteReason) {
            var suffix = "";
			if (mw.config.get("wgGlobalGroups").indexOf("global-sysop") >= 0) {
				suffix = " ([[m:GS|global sysop]] action)";
			} else if (mw.config.get("wgGlobalGroups").indexOf("steward") >= 0) {
				suffix = " ([[m:stewards|steward]] action)";
			}
        // Iteracja przez listę stron i usuwanie każdej z nich
        pages.forEach(function(page) {
            var deleteParams = {
                action: 'delete',
                title: page,
                reason: deleteReason + suffix,
                token: mw.user.tokens.get('csrfToken'),
                format: 'json'
            };

            // Wywołanie API, aby usunąć stronę
            $.ajax({
                url: mw.util.wikiScript('api'),
                type: 'POST',
                data: deleteParams,
                success: function(data) {
                    console.log("QD: Usunięto stronę: " + page);
                    QuickDelete.displayMsg("Deleted: " + page, 'success');
                },
                error: function(xhr, status, error) {
                    console.error("QD: Błąd podczas usuwania strony " + page + ": " + error);
                    QuickDelete.displayMsg("Error while deleting: " + page + ": " + error, 'error');
                }
            });
        });
    },

    displayMsg: function(QD_msg, QD_msgtype) {
        $('#QD-message-container').css({
            'border-top': '1px solid #EEE',
            'padding-top': '5px',
            'margin-top': '5px'
        });

        var msgbox = document.createElement('div');
        msgbox.style.width = "90%";
        msgbox.style.margin = "0 auto";
        msgbox.style.marginBottom = "5px";
        msgbox.style.padding = "2px 5px 2px 20px";
        msgbox.style.borderRadius = "0.2em";
        msgbox.style.textAlign = "left";
        if (QD_msgtype == 'error') {
            msgbox.style.backgroundColor = "#FF9494";
            msgbox.style.border = "2px solid #CB4154";
            msgbox.innerHTML = "<b>ERROR:</b> ";
        }
        if (QD_msgtype == 'success') {
            msgbox.style.backgroundColor = "#93DB70";
            msgbox.style.border = "2px solid #659D32";
            msgbox.innerHTML = "<b>OK:</b> ";
        }
        msgbox.innerHTML += QD_msg;
        $(msgbox).appendTo('#QD-message-container');
    }
};

$(document).ready(function() {
    mw.loader.using(['oojs-ui', 'mediawiki.util']).done(function() {
        if (mw.config.get('wgContentLanguage') !== "pl" && mw.config.get('wgNamespaceNumber') == -1 && mw.config.get('wgTitle').toLowerCase() == "qd" && ((mw.config.get("wgGlobalGroups").indexOf("global-sysop") >= 0) || (mw.config.get("wgGlobalGroups").indexOf("steward") >= 0) || (mw.config.get("wgUserGroups").indexOf("sysop") >= 0))) {
            $('#mw-content-text').empty();
            var QD_p = document.createElement('p');
            QD_p.innerHTML = "QuickDelete (QD) tool allows you to quickly delete the pages contained in the category.<br /><br />Suffix <b>global sysop/steward action</b> is added automatically.";
            $('#mw-content-text').append(QD_p);
            QuickDelete.createFieldSet();
        }
    });
});