Jump to content

User:AramilFeraxa/QuickProtect.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 QuickProtect = {

    createFieldSet: function () {
        document.getElementsByTagName("h1")[0].textContent = "Quick protect/unprotect pages";
        document.title = "Quick protect/unprotect pages";

        jQuery('<div/>', {
            id: 'QP-container',
            style: 'max-width: 750px; border: 1px solid #CCC; text-align:center; border-radius: 10px; padding: 15px; margin: 0 auto;'
        }).appendTo('#mw-content-text');

        var QP_fieldset = new OO.ui.FieldsetLayout({
            label: 'Quick Protect',
            classes: ['container']
        });

        var QP_input_pages = new OO.ui.MultilineTextInputWidget({
            placeholder: 'Page names (one per line)',
            multiline: true,
            rows: 15,
            "class": "QP-input",
            id: 'QP-pages',
            required: true,
            validate: 'non-empty'
        });

        var QP_select_action = new OO.ui.DropdownWidget({
            menu: {
                items: [
                    new OO.ui.MenuOptionWidget({
                        data: 'protect',
                        label: 'Protect'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: 'unprotect',
                        label: 'Unprotect'
                    })
                ]
            }
        });

        var QP_input_reason = new OO.ui.TextInputWidget({
            placeholder: 'Reason',
            "class": "QP-input",
            id: 'QP-reason',
            required: true,
            validate: 'non-empty'
        });

        var QP_input_protection_level = new OO.ui.DropdownWidget({
            menu: {
                items: [
                    new OO.ui.MenuOptionWidget({
                        data: 'sysop',
                        label: 'Sysop'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: 'autoconfirmed',
                        label: 'Autoconfirmed'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: 'none',
                        label: 'None'
                    })
                ]
            }
        });

        var QP_input_expiry = new OO.ui.DropdownWidget({
            menu: {
                items: [
                    new OO.ui.MenuOptionWidget({
                        data: 'infinite',
                        label: 'Infinite'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '1 day',
                        label: '1 day'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '1 week',
                        label: '1 week'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '1 month',
                        label: '1 month'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '3 months',
                        label: '3 months'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '6 months',
                        label: '6 months'
                    }),
                    new OO.ui.MenuOptionWidget({
                        data: '1 year',
                        label: '1 year'
                    })
                ]
            }
        });

        var QP_reason_field = new OO.ui.FieldLayout(QP_input_reason, {
            label: 'Reason',
            align: 'top',
            id: 'QP-reason'
        });

        var QP_level_field = new OO.ui.FieldLayout(QP_input_protection_level, {
            label: 'Protection level',
            align: 'top',
            id: 'QP-protection-level'
        });

        var QP_expiry_field = new OO.ui.FieldLayout(QP_input_expiry, {
            label: 'Expiry',
            align: 'top',
            id: 'QP-expiry'
        });

        QP_reason_field.$element.hide();
        QP_level_field.$element.hide();
        QP_expiry_field.$element.hide();

        QP_select_action.getMenu().on('choose', function (item) {
            var selectedAction = item?.getData();
            if (selectedAction === 'protect') {
                QP_reason_field.$element.fadeIn();
                QP_level_field.$element.fadeIn();
                QP_expiry_field.$element.fadeIn();
            } else if (selectedAction === 'unprotect') {
            	QP_reason_field.$element.fadeIn();
				QP_level_field.$element.fadeOut();
                QP_expiry_field.$element.fadeOut();
            } else {
                QP_reason_field.$element.fadeOut();
                QP_level_field.$element.fadeOut();
                QP_expiry_field.$element.fadeOut();
            }
        });

        QP_fieldset.addItems([
            new OO.ui.FieldLayout(QP_input_pages, {
                label: 'Page names',
                align: 'top',
            }),
            new OO.ui.FieldLayout(QP_select_action, {
                label: 'Action',
                align: 'top'
            }),
            QP_reason_field,
            QP_level_field,
            QP_expiry_field
        ]);

        $('#QP-container').append(QP_fieldset.$element);

        var QP_button_execute = new OO.ui.ButtonInputWidget({
            type: 'submit',
            useInputTag: true,
            id: 'QP-execute-button',
            label: 'Execute Action',
            flags: [
                'primary'
            ]
        });

        $('#QP-container').append(QP_button_execute.$element);

        jQuery('<div/>', {
            id: 'QP-message-container',
            style: 'width:100%; margin:5px;'
        }).appendTo('#QP-container');

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

        $(document).on('click', '#QP-execute-button', function () {
            var pages = QP_input_pages.getValue().trim().split('\n');
            var action = QP_select_action.getMenu().findSelectedItem()?.getData();
            var reason = QP_input_reason.getValue();
            var protectionLevel = QP_input_protection_level.getMenu().findSelectedItem()?.getData();
            var expiry = QP_input_expiry.getMenu().findSelectedItem()?.getData();

            console.log("QP: Rozpoczynam wykonanie akcji: " + action + " dla stron: ", pages);
            QuickProtect.executeAction(pages, action, reason, protectionLevel, expiry);
        });
    },

    executeAction: function (pages, action, reason, protectionLevel, expiry) {
        $('#QP-message-container').empty();

        pages.forEach(function (page) {
            if (action === 'protect') {
                QuickProtect.protectPage(page, reason, protectionLevel, expiry);
            } else if (action === 'unprotect') {
                QuickProtect.unprotectPage(page, reason);
            }
        });
    },

    protectPage: function (page, reason, protectionLevel, expiry) {
        var protectParams = {
            action: 'protect',
            title: page,
            protections: 'edit=' + protectionLevel,
            expiry: expiry,
            reason: reason,
            token: mw.user.tokens.get('csrfToken'),
            format: 'json'
        };

        $.ajax({
            url: mw.util.wikiScript('api'),
            type: 'POST',
            data: protectParams,
            success: function (data) {
                console.log("QP: Zabezpieczono stronę: " + page);
                QuickProtect.displayMsg("Protected: " + page, 'success');
            },
            error: function (xhr, status, error) {
                console.error("QP: Błąd podczas zabezpieczania strony " + page + ": " + error);
                QuickProtect.displayMsg("Error while protecting: " + page + ": " + error, 'error');
            }
        });
    },

    unprotectPage: function (page, reason) {
        var unprotectParams = {
            action: 'protect',
            title: page,
            protections: '',
            reason: reason || 'Mass unprotection using [[meta:User:AramilFeraxa/QuickProtect.js|QuickProtect tool]]',
            token: mw.user.tokens.get('csrfToken'),
            format: 'json'
        };

        $.ajax({
            url: mw.util.wikiScript('api'),
            type: 'POST',
            data: unprotectParams,
            success: function (data) {
                console.log("QP: Odbezpieczono stronę: " + page);
                QuickProtect.displayMsg("Unprotected: " + page + ": " + reason, 'success');
            },
            error: function (xhr, status, error) {
                console.error("QP: Błąd podczas odbezpieczania strony " + page + ": " + error);
                QuickProtect.displayMsg("Error while unprotecting: " + page + ": " + error, 'error');
            }
        });
    },

    displayMsg: function (QP_msg, QP_msgtype) {
        $('#QP-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 (QP_msgtype == 'error') {
            msgbox.style.backgroundColor = "#FF9494";
            msgbox.style.border = "2px solid #CB4154";
            msgbox.innerHTML = "<b>ERROR:</b> ";
        }
        if (QP_msgtype == 'success') {
            msgbox.style.backgroundColor = "#93DB70";
            msgbox.style.border = "2px solid #659D32";
            msgbox.innerHTML = "<b>OK:</b> ";
        }
        msgbox.innerHTML += QP_msg;
        $(msgbox).appendTo('#QP-message-container');
    }
};

$(document).ready(function () {
    mw.loader.using(['oojs-ui', 'mediawiki.util']).done(function () {
        if (mw.config.get('wgNamespaceNumber') == -1 && mw.config.get('wgTitle').toLowerCase() == "qp" && ((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 QP_p = document.createElement('p');
            QP_p.innerHTML = "QuickProtect (QP) tool allows you to quickly protect or unprotect pages.";
            $('#mw-content-text').append(QP_p);
            QuickProtect.createFieldSet();
        }
    });
});