User:BZPN/RfD.js

From Test Wiki
Revision as of 20:17, 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 () {
    // Sprawdzamy, czy strona należy do przestrzeni "Project:Requests for Deletion"
    var pageName = mw.config.get('wgPageName');
    if (pageName.indexOf("Project:Requests for Deletion") !== 0) {
        return;
    }
    
    // Dodajemy przycisk "Quick Close" do paska Toolbox (#p-tb)
    var $toolboxList = $('#p-tb ul');
    if (!$toolboxList.length) return;
    
    var $li = $('<li>', { id: 't-quickclose' });
    var $link = $('<a>', { href: 'javascript:void(0)', text: 'Quick Close' });
    $link.click(function () {
        openQuickCloseDialog();
    });
    $li.append($link);
    $toolboxList.append($li);
    
    // Funkcja otwierająca popup dialogowy
    function openQuickCloseDialog() {
        // Usuwamy ewentualny poprzedni dialog
        $('#quickclose-dialog').remove();
        
        var $dialog = $('<div id="quickclose-dialog" style="position: fixed; top: 30%; left: 50%; transform: translate(-50%, -30%); background: #fff; border: 1px solid #aaa; padding: 20px; z-index: 10000; width: 400px; box-shadow: 0 0 10px rgba(0,0,0,0.5);"></div>');
        
        // Pole tekstowe na komentarz
        var $commentLabel = $('<div style="margin-bottom:5px;">Wynik (komentarz):</div>');
        var $commentInput = $('<textarea rows="4" style="width: 100%;">the outcome...</textarea>');
        
        // Wybór szablonu: {{delete}} lub {{keep}}
        var $templateLabel = $('<div style="margin:10px 0 5px;">Wybierz szablon:</div>');
        var $radioDelete = $('<label style="margin-right:10px;"><input type="radio" name="qc-template" value="delete" checked> {{delete}}</label>');
        var $radioKeep = $('<label><input type="radio" name="qc-template" value="keep"> {{keep}}</label>');
        
        // Checkbox dla sysopów – usunięcie strony docelowej
        var isSysop = (mw.config.get('wgUserGroups').indexOf('sysop') !== -1);
        var $deleteCheckbox = '';
        if (isSysop) {
            $deleteCheckbox = $('<div style="margin-top:10px;"><label><input type="checkbox" id="qc-delete-page"> Delete this page</label></div>');
        }
        
        // Przyciski akcji
        var $btnContainer = $('<div style="margin-top:15px; text-align: right;"></div>');
        var $btnCancel = $('<button style="margin-right:10px;">Anuluj</button>');
        var $btnSubmit = $('<button>Zatwierdź</button>');
        $btnContainer.append($btnCancel, $btnSubmit);
        
        // Składamy zawartość dialogu
        $dialog.append($commentLabel, $commentInput, $templateLabel, $radioDelete, $radioKeep, $deleteCheckbox, $btnContainer);
        $('body').append($dialog);
        
        // Obsługa przycisków
        $btnCancel.click(function () {
            $dialog.remove();
        });
        
        $btnSubmit.click(function () {
            var comment = $commentInput.val().trim();
            var outcome = $('input[name="qc-template"]:checked').val(); // "delete" lub "keep"
            var templateText = (outcome === 'delete') ? '{{delete}}' : '{{keep}}';
            var fullComment = templateText + ' ' + comment;
            
            // Tytuł strony RfD i wyznaczenie strony docelowej (tekst po ostatnim ukośniku)
            var pageTitle = mw.config.get('wgPageName');
            var targetPage = pageTitle.split('/').pop().trim();
            
            // Pobieramy aktualny wikitext strony
            new mw.Api().get({
                action: 'parse',
                page: pageTitle,
                prop: 'wikitext'
            }).done(function (result) {
                var wikitext = result.parse.wikitext['*'];
                // Usuwamy szablon dyskusji, np. {{Wikipedia:Requests for deletion/Requests/2025/Sticker Mule}}
                var regex = /\{\{\s*Wikipedia:Requests for deletion\/Requests\/[^\}]+\}\}\s*\n?/g;
                var newText = wikitext.replace(regex, '');
                // Dodajemy komentarz na końcu
                newText += '\n:' + fullComment;
                
                // Edytujemy stronę RfD
                new mw.Api().postWithEditToken({
                    action: 'edit',
                    title: pageTitle,
                    text: newText,
                    summary: 'Quick close (' + outcome + '): ' + comment,
                    minor: true
                }).done(function () {
                    // Jeśli sysop i checkbox zaznaczony – usuwamy stronę docelową
                    if (isSysop && $('#qc-delete-page').is(':checked')) {
                        new mw.Api().postWithEditToken({
                            action: 'delete',
                            title: targetPage,
                            reason: 'Quick close deletion: ' + outcome + ' – ' + comment
                        }).done(function () {
                            location.reload();
                        });
                    } else {
                        location.reload();
                    }
                });
            });
            $dialog.remove();
        });
    }
});
// </nowiki>