User:DreamRimmer/BlankAPage.js

//<nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui'], function () {
    'use strict';
    var config = {};

    $.when(
        mw.loader.using(['mediawiki.util', 'mediawiki.api']),
        $.ready
    ).then(function () {
        config.mw = mw.config.get([
            "wgPageName",
            "wgNamespaceNumber"
        ]);

        var talkNamespaces = [1, 2, 3, 5, 7, 11, 14, 15];
        if (talkNamespaces.indexOf(config.mw.wgNamespaceNumber) !== -1) {
            mw.util.addPortletLink(
                'p-cactions',
                '#',
                'Blank Page',
                'ca-blankPage',
                'Blank Page',
                null,
                '#ca-move'
            );

            $('#ca-blankPage').on('click', function () {
                showBlankOptionsModal();
            });
        }

        function showBlankOptionsModal() {
            var windowManager = new OO.ui.WindowManager();
            $(document.body).append(windowManager.$element);

            function BlankOptionsDialog(config) {
                BlankOptionsDialog.super.call(this, config);
            }
            OO.inheritClass(BlankOptionsDialog, OO.ui.ProcessDialog);

            BlankOptionsDialog.static.name = 'blankOptionsDialog';
            BlankOptionsDialog.static.title = 'Blank Page';
            BlankOptionsDialog.static.actions = [
                { action: 'accept', label: 'Blank Page', flags: ['primary', 'progressive'] },
                { action: 'cancel', label: 'Cancel', flags: 'safe' }
            ];

            BlankOptionsDialog.prototype.initialize = function () {
                BlankOptionsDialog.super.prototype.initialize.apply(this, arguments);

                var reasonDropdown = new OO.ui.DropdownWidget({
                    menu: {
                        items: [
                            new OO.ui.MenuOptionWidget({ data: 'No useful content', label: 'No useful content' }),
                            new OO.ui.MenuOptionWidget({ data: 'Out of project scope', label: 'Out of project scope' }),
                            new OO.ui.MenuOptionWidget({ data: 'other', label: 'Custom reason', selected: true })
                        ]
                    }
                });

                var manualInput = new OO.ui.TextInputWidget({
                    placeholder: 'Enter custom reason',
                    value: ''
                });

                var manualField = new OO.ui.FieldLayout(manualInput, {
                    label: 'Custom reason:',
                    align: 'top'
                });

                var dialog = this;
                var initialItem = reasonDropdown.getMenu().findSelectedItem();
                if (initialItem && initialItem.getData() === 'other') {
                    manualField.$element.show();
                } else {
                    manualField.$element.hide();
                }
                dialog.$body.css('min-height', '175px');
                reasonDropdown.setLabel(initialItem.getLabel());
                dialog.updateSize();

                reasonDropdown.getMenu().on('choose', function (item) {
                    reasonDropdown.setLabel(item.getLabel());
                    if (item.getData() === 'other') {
                        manualField.$element.show();
                    } else {
                        manualField.$element.hide();
                    }
                    dialog.$body.css('min-height', '175px');
                    dialog.updateSize();
                });

                this.content = new OO.ui.PanelLayout({
                    padded: true,
                    expanded: false
                });
                this.content.$element.append(
                    new OO.ui.FieldsetLayout({
                        items: [
                            new OO.ui.FieldLayout(reasonDropdown, {
                                label: 'Select a reason:',
                                align: 'top'
                            }),
                            manualField
                        ]
                    }).$element
                );

                this.reasonDropdown = reasonDropdown;
                this.manualInput = manualInput;
                this.$body.append(this.content.$element);
            };

            BlankOptionsDialog.prototype.getActionProcess = function (action) {
                if (action === 'accept') {
                    return new OO.ui.Process(() => {
                        var selected = this.reasonDropdown.getMenu().findSelectedItem().getData();
                        var blankReason = selected === 'other' ? this.manualInput.getValue().trim() : selected;
                        blankPageWithoutReplacement(config.mw.wgPageName, blankReason);
                        this.close();
                    });
                } else if (action === 'cancel') {
                    return new OO.ui.Process(() => {
                        this.close();
                    });
                }
                return BlankOptionsDialog.super.prototype.getActionProcess.call(this, action);
            };

            windowManager.addWindows([new BlankOptionsDialog()]);
            windowManager.openWindow('blankOptionsDialog');
        }

        function blankPageWithoutReplacement(pageName, reason) {
            var queryParams = {
                action: "edit",
                title: pageName,
                text: "",
                summary: reason + " (using [[m:User:Max/BlankAPage.js|BlankAPage.js]])",
                nocreate: true
            };
            var API = new mw.Api({
                ajax: {
                    headers: {
                        "Api-User-Agent": "User:Max/BlankAPage"
                    }
                }
            });
            API.postWithToken("csrf", queryParams).then(function () {
                location.reload();
            });
        }
    });
});
//</nowiki>