User:BZPN/RfD.js

From Test Wiki
Revision as of 20:00, 25 March 2025 by BZPN (talk | contribs)
Jump to navigation Jump to search

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.
// <nowiki>
$(function () {
    var QC = {};
    QC.summary = ' - with QuickClose';
    
    // Dodaj przycisk "Quick Close" obok tytułu strony
    var $title = $('#firstHeading');
    if ($title.length) {
        var $btn = $('<a>', {
            text: '[Quick Close]',
            href: 'javascript:void(0)',
            id: 'quickclose-btn',
            css: { marginLeft: '10px', cursor: 'pointer', color: '#0645AD', textDecoration: 'underline' }
        });
        $title.append($btn);
        
        $btn.click(function () {
            openQuickCloseDialog();
        });
    }
    
    function openQuickCloseDialog() {
        // Definicja okna dialogowego z użyciem OO.ui
        function QuickCloseDialog(config) {
            QuickCloseDialog.super.call(this, config);
        }
        OO.inheritClass(QuickCloseDialog, OO.ui.ProcessDialog);
        QuickCloseDialog.static.name = 'quickCloseDialog';
        QuickCloseDialog.static.title = 'Quick Close RfD';
        QuickCloseDialog.static.actions = [
            { action: 'cancel', label: 'Anuluj', flags: 'safe' },
            { action: 'submit', label: 'Zatwierdź', flags: ['primary', 'progressive'] }
        ];
        
        QuickCloseDialog.prototype.initialize = function () {
            QuickCloseDialog.super.prototype.initialize.call(this);
            
            // Pole tekstowe dla komentarza z wynikiem
            this.commentInput = new OO.ui.MultilineTextInputWidget({
                rows: 5,
                value: 'the outcome...'
            });
            
            // Wybór szablonu – {{delete}} lub {{keep}}
            this.outcomeSelect = new OO.ui.RadioSelectInputWidget({
                options: [
                    { data: 'delete', label: '{{delete}}' },
                    { data: 'keep', label: '{{keep}}' }
                ]
            });
            this.outcomeSelect.selectItemByData('delete');
            
            // Jeśli użytkownik ma uprawnienia sysopa – dodatkowy checkbox
            this.sysopCheckbox = null;
            if (mw.config.get('wgUserGroups').indexOf('sysop') !== -1) {
                this.sysopCheckbox = new OO.ui.CheckboxInputWidget();
                this.sysopCheckboxField = new OO.ui.FieldLayout(this.sysopCheckbox, {
                    label: 'Delete this page'
                });
            }
            
            // Komponowanie formularza
            var $form = $('<div>');
            $form.append($('<div>').css('margin-bottom', '10px').append(
                $('<label>').text('Wynik zamknięcia:'),
                this.commentInput.$element
            ));
            $form.append($('<div>').css('margin-bottom', '10px').append(
                $('<label>').text('Wybierz szablon: '),
                this.outcomeSelect.$element
            ));
            if (this.sysopCheckboxField) {
                $form.append($('<div>').css('margin-bottom', '10px').append(
                    this.sysopCheckboxField.$element
                ));
            }
            this.content = new OO.ui.PanelLayout({
                padded: true,
                expanded: false
            });
            this.content.$element.append($form);
            this.$body.append(this.content.$element);
        };
        
        QuickCloseDialog.prototype.getActionProcess = function (action) {
            var dialog = this;
            if (action === 'submit') {
                // Pobranie danych z formularza
                var comment = this.commentInput.getValue().trim();
                var outcome = this.outcomeSelect.getSelectedItem().getData(); // 'delete' lub 'keep'
                var templateText = (outcome === 'delete') ? '{{delete}}' : '{{keep}}';
                comment = templateText + ' ' + comment;
                
                var pageTitle = mw.config.get('wgPageName');
                
                // Pobierz bieżący wikitext strony i usuń szablon z sekcji "Current deletion request discussions"
                new mw.Api().get({
                    action: 'parse',
                    page: pageTitle,
                    prop: 'wikitext'
                }).done(function (result) {
                    var wikitext = result.parse.wikitext['*'];
                    // Zakładamy, że szablon ma postać:
                    // {{Wikipedia:Requests for deletion/Requests/2025/Sticker Mule}}
                    // Usuwamy go przy pomocy wyrażenia regularnego
                    var regex = /\{\{\s*Wikipedia:Requests for deletion\/Requests\/[^\}]+\}\}\s*\n?/g;
                    var newText = wikitext.replace(regex, '');
                    
                    new mw.Api().postWithEditToken({
                        action: 'edit',
                        title: pageTitle,
                        text: newText,
                        summary: 'Quick close: ' + outcome + '. ' + comment + QC.summary,
                        minor: true
                    }).done(function () {
                        // Jeśli użytkownik sysop i checkbox "Delete this page" został zaznaczony – usuń stronę
                        if (dialog.sysopCheckbox && dialog.sysopCheckbox.isSelected()) {
                            new mw.Api().postWithEditToken({
                                action: 'delete',
                                title: pageTitle,
                                reason: 'Quick close deletion: ' + outcome + '. ' + comment
                            }).done(function () {
                                location.reload();
                            });
                        } else {
                            location.reload();
                        }
                    });
                });
                dialog.close();
            }
            return QuickCloseDialog.super.prototype.getActionProcess.call(this, action);
        };
        
        var quickDialog = new QuickCloseDialog({ size: 'large' });
        var windowManager = new OO.ui.WindowManager();
        $(document.body).append(windowManager.$element);
        windowManager.addWindows([quickDialog]);
        windowManager.openWindow(quickDialog);
    }
});
// </nowiki>