User:BZPN/RfD.js: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
Content deleted Content added
BZPN (talk | contribs)
No edit summary
BZPN (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
// <nowiki>
// <nowiki>
$(function () {
(function($) {
// Główny obiekt skryptu
// Sprawdzamy, czy strona należy do przestrzeni nazw "Project:Requests for Deletion"
var pageName = mw.config.get('wgPageName');
var QuickCloseRfD = {};
if (!pageName.startsWith("Project:Requests for Deletion")) {
return;
}
// Konfiguracja przestrzeni nazw
// Funkcja dodająca przycisk "Quick Close" w każdej podsekcji
const ALLOWED_NAMESPACES = ['Wikipedia:Requests for deletion'];
function addQuickCloseButtons() {
$('span.mw-editsection-bracket').each(function () {
try {
var $this = $(this);
var sectionLink = $this.find('a').first();
if (!sectionLink.length) return;
// Wyciągnięcie numeru sekcji z URL
var href = sectionLink.attr('href');
var m = href.match(/action=edit&section=(\d+)/);
if (!m) return;
var sectionNumber = m[1];
// Dodajemy separator i przycisk "Quick Close"
$this.append(' | ');
var $btn = $('<a>', {
text: 'Quick Close',
href: 'javascript:void(0)',
'data-section': sectionNumber,
css: { cursor: 'pointer', color: '#0645AD', textDecoration: 'underline' }
});
$this.append($btn);
// Obsługa kliknięcia przycisku
$btn.click(function () {
openQuickCloseDialog(sectionNumber);
});
} catch (e) {
console.error(e);
}
});
}
QuickCloseRfD.setup = function() {
// Funkcja tworząca prosty popup dialogowy
// Sprawdzenie, czy jesteśmy na odpowiedniej stronie
function openQuickCloseDialog(sectionNumber) {
var wgPageName = mw.config.get('wgPageName');
// Usuwamy ewentualny poprzedni dialog
var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
$('#quickclose-dialog').remove();
// Tworzymy element dialogu
if (ALLOWED_NAMESPACES.includes(wgPageName) ||
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>' );
ALLOWED_NAMESPACES.some(ns => wgPageName.startsWith(ns + '/'))) {
// Pole komentarza
var $commentLabel = $('<div style="margin-bottom:5px;">Wynik (komentarz):</div>');
$('span.mw-editsection-bracket:first-child').each(function() {
var $commentInput = $('<textarea rows="4" style="width: 100%;">the outcome...</textarea>');
// Wybór szablonu (radio)
try {
// Pobieranie numeru sekcji
var $templateLabel = $('<div style="margin:10px 0 5px;">Wybierz szablon:</div>');
var sectionNumber = this.parentElement.childNodes[1].href
var $radioDelete = $('<label style="margin-right:10px;"><input type="radio" name="qc-template" value="delete" checked> {{delete}}</label>');
.match(/action=edit&section=(\d+)/)[1];
var $radioKeep = $('<label><input type="radio" name="qc-template" value="keep"> {{keep}}</label>');
// Checkbox dla sysopa
// Dodawanie przycisku Quick Close
var isSysop = (mw.config.get('wgUserGroups').indexOf('sysop') !== -1);
var $deleteCheckbox = '';
$(this).after(' | ');
if (isSysop) {
$(this).after(
$('<a href="javascript:void(0)" class="QuickCloseRfD-close" ' +
$deleteCheckbox = $('<div style="margin-top:10px;"><label><input type="checkbox" id="qc-delete-page"> Delete this page</label></div>');
'data-section="' + sectionNumber + '">Quick Close</a>')
);
} catch(e) {}
});
// Obsługa kliknięcia przycisku
QuickCloseRfD.bindEvents();
}
}
};
// Przyciski akcji
var $btnContainer = $('<div style="margin-top:15px; text-align: right;"></div>');
QuickCloseRfD.bindEvents = function() {
var $btnCancel = $('<button style="margin-right:10px;">Anuluj</button>');
$('.QuickCloseRfD-close').click(function(e) {
var $btnSubmit = $('<button>Zatwierdź</button>');
var sectionNumber = $(this).data('section');
QuickCloseRfD.showQuickCloseDialog(sectionNumber);
});
};
QuickCloseRfD.showQuickCloseDialog = function(sectionNumber) {
// Prosty popup do zamykania dyskusji
var $dialog = $('<div class="quick-close-dialog">' +
'<h3>Close Deletion Request</h3>' +
'<div>' +
'<label>Outcome:</label>' +
'<select id="quick-close-outcome">' +
'<option value="{{delete}}">Delete</option>' +
'<option value="{{keep}}">Keep</option>' +
'<option value="{{merge}}">Merge</option>' +
'<option value="{{redirect}}">Redirect</option>' +
'</select>' +
'</div>' +
'<div>' +
'<label>Additional Comments (optional):</label>' +
'<textarea id="quick-close-comment" rows="3"></textarea>' +
'</div>' +
(mw.config.get('wgUserGroups').includes('sysop') ?
'<div>' +
'<label><input type="checkbox" id="quick-close-delete-page"> Delete this page</label>' +
'</div>' : '') +
'<div class="quick-close-buttons">' +
'<button id="quick-close-confirm">Close Discussion</button>' +
'<button id="quick-close-cancel">Cancel</button>' +
'</div>' +
'</div>');
// Dodanie arkusza stylów dla dialogu
$('head').append(`
<style>
.quick-close-dialog {
background: white;
border: 1px solid #a2a9b1;
border-radius: 5px;
padding: 15px;
width: 400px;
margin: 0 auto;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1000;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.quick-close-dialog h3 {
margin-top: 0;
border-bottom: 1px solid #eaecf0;
padding-bottom: 10px;
}
.quick-close-dialog div {
margin-bottom: 10px;
}
.quick-close-dialog label {
display: block;
margin-bottom: 5px;
}
.quick-close-dialog select,
.quick-close-dialog textarea {
width: 100%;
box-sizing: border-box;
}
.quick-close-buttons {
display: flex;
justify-content: space-between;
}
.quick-close-buttons button {
padding: 5px 10px;
}
</style>
`);
$btnContainer.append($btnCancel, $btnSubmit);
$dialog.append($commentLabel, $commentInput, $templateLabel, $radioDelete, $radioKeep, $deleteCheckbox, $btnContainer);
$('body').append($dialog);
$('body').append($dialog);
// Obsługa przycisku "Anuluj"
// Zamykanie dialogu
$btnCancel.click(function () {
$('#quick-close-cancel').click(function() {
$dialog.remove();
$dialog.remove();
});
});
// Obsługa przycisku "Zatwierdź"
// Potwierdzenie zamknięcia
$btnSubmit.click(function () {
$('#quick-close-confirm').click(function() {
var comment = $commentInput.val().trim();
var outcome = $('#quick-close-outcome').val();
var outcome = $('input[name="qc-template"]:checked').val(); // "delete" lub "keep"
var comment = $('#quick-close-comment').val() || 'The outcome of this discussion is: ';
var templateText = (outcome === 'delete') ? '{{delete}}' : '{{keep}}';
var deleteRequest = $('#quick-close-delete-page:checked').length > 0;
// Łączymy szablon z komentarzem
var fullComment = templateText + ' ' + comment;
// Pobieramy tytuł strony RfD, a także wyciągamy tytuł docelowy (po ostatnim ukośniku)
var pageTitle = mw.config.get('wgPageName');
var targetPage = pageTitle.split('/').pop().trim();
// Pobieramy bieżący wikitext strony
QuickCloseRfD.closeDiscussion(
new mw.Api().get({
sectionNumber,
action: 'parse',
outcome,
page: pageTitle,
comment,
prop: 'wikitext'
deleteRequest
}).done(function (result) {
);
var wikitext = result.parse.wikitext['*'];
$dialog.remove();
// Usuwamy szablon dyskusji z sekcji "Current deletion request discussions"
});
// Przykład: {{Wikipedia:Requests for deletion/Requests/2025/Sticker Mule}}
};
var regex = /\{\{\s*Wikipedia:Requests for deletion\/Requests\/[^\}]+\}\}\s*\n?/g;
var newText = wikitext.replace(regex, '');
QuickCloseRfD.closeDiscussion = function(sectionNumber, outcome, comment, deleteRequest) {
// Dodajemy komentarz na końcu sekcji
var pageTitle = mw.config.get('wgPageName');
newText += '\n:' + fullComment;
var pageName = pageTitle.split('/').pop();
// Edytujemy stronę RfD
new mw.Api().postWithEditToken({
new mw.Api().get({
action: 'edit',
action: 'parse',
title: pageTitle,
page: pageTitle,
text: newText,
prop: 'wikitext',
section: sectionNumber
summary: 'Quick close (' + outcome + '): ' + comment,
}).done(function(result) {
minor: true
}).done(function () {
var wikitext = result.parse.wikitext['*'];
// Jeśli użytkownik sysop i checkbox zaznaczony – usuwamy stronę docelową
// Dodanie zamknięcia dyskusji
if (isSysop && $('#qc-delete-page').is(':checked')) {
new mw.Api().postWithEditToken({
var closingText =
action: 'delete',
'<div class="boilerplate" style="background-color: #EDEAFF; padding: 0px 10px 0px 10px; border: 1px solid #8779DD;">\n' +
':\'\'The following discussion is closed. <span style="color:red">\'\'\'Please do not modify it.\'\'\'\</span> Subsequent comments should be made on the appropriate discussion page. No further changes should be made to this discussion.\'\'\n' +
title: targetPage,
reason: 'Quick close deletion: ' + outcome + ' – ' + comment
'----\n' +
}).done(function () {
outcome + ' - ~~~~\n\n' +
location.reload();
comment + ' ~~~~\n' +
});
'</div>';
} else {
wikitext += '\n' + closingText;
// Edycja strony
new mw.Api().postWithEditToken({
action: 'edit',
title: pageTitle,
section: sectionNumber,
text: wikitext,
summary: 'Closing deletion discussion for ' + pageName
}).done(function() {
// Opcjonalne usunięcie strony dla administratorów
if (deleteRequest) {
new mw.Api().postWithEditToken({
action: 'delete',
title: 'Wikipedia:Requests for deletion/Requests/2025/' + pageName,
reason: 'Deletion discussion completed'
}).done(function() {
location.reload();
location.reload();
}
});
});
} else {
location.reload();
}
});
});
$dialog.remove();
});
});
}
};
// Ładowanie skryptu
// Inicjujemy przyciski po załadowaniu strony
mw.loader.using('mediawiki.api', function() {
addQuickCloseButtons();
$(document).ready(function() {
});
QuickCloseRfD.setup();
});
});
})(jQuery);
// </nowiki>
// </nowiki>

Latest revision as of 20:25, 25 March 2025

// <nowiki>
(function($) {
    // Główny obiekt skryptu
    var QuickCloseRfD = {};
    
    // Konfiguracja przestrzeni nazw
    const ALLOWED_NAMESPACES = ['Wikipedia:Requests for deletion'];
    
    QuickCloseRfD.setup = function() {
        // Sprawdzenie, czy jesteśmy na odpowiedniej stronie
        var wgPageName = mw.config.get('wgPageName');
        var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
        
        if (ALLOWED_NAMESPACES.includes(wgPageName) || 
            ALLOWED_NAMESPACES.some(ns => wgPageName.startsWith(ns + '/'))) {
            
            $('span.mw-editsection-bracket:first-child').each(function() {
                try {
                    // Pobieranie numeru sekcji
                    var sectionNumber = this.parentElement.childNodes[1].href
                        .match(/action=edit&section=(\d+)/)[1];
                    
                    // Dodawanie przycisku Quick Close
                    $(this).after(' | ');
                    $(this).after(
                        $('<a href="javascript:void(0)" class="QuickCloseRfD-close" ' + 
                          'data-section="' + sectionNumber + '">Quick Close</a>')
                    );
                } catch(e) {}
            });
            
            // Obsługa kliknięcia przycisku
            QuickCloseRfD.bindEvents();
        }
    };
    
    QuickCloseRfD.bindEvents = function() {
        $('.QuickCloseRfD-close').click(function(e) {
            var sectionNumber = $(this).data('section');
            QuickCloseRfD.showQuickCloseDialog(sectionNumber);
        });
    };
    
    QuickCloseRfD.showQuickCloseDialog = function(sectionNumber) {
        // Prosty popup do zamykania dyskusji
        var $dialog = $('<div class="quick-close-dialog">' +
            '<h3>Close Deletion Request</h3>' +
            '<div>' +
                '<label>Outcome:</label>' +
                '<select id="quick-close-outcome">' +
                    '<option value="{{delete}}">Delete</option>' +
                    '<option value="{{keep}}">Keep</option>' +
                    '<option value="{{merge}}">Merge</option>' +
                    '<option value="{{redirect}}">Redirect</option>' +
                '</select>' +
            '</div>' +
            '<div>' +
                '<label>Additional Comments (optional):</label>' +
                '<textarea id="quick-close-comment" rows="3"></textarea>' +
            '</div>' +
            (mw.config.get('wgUserGroups').includes('sysop') ? 
                '<div>' +
                    '<label><input type="checkbox" id="quick-close-delete-page"> Delete this page</label>' +
                '</div>' : '') +
            '<div class="quick-close-buttons">' +
                '<button id="quick-close-confirm">Close Discussion</button>' +
                '<button id="quick-close-cancel">Cancel</button>' +
            '</div>' +
        '</div>');
        
        // Dodanie arkusza stylów dla dialogu
        $('head').append(`
            <style>
                .quick-close-dialog {
                    background: white;
                    border: 1px solid #a2a9b1;
                    border-radius: 5px;
                    padding: 15px;
                    width: 400px;
                    margin: 0 auto;
                    position: fixed;
                    top: 50%;
                    left: 50%;
                    transform: translate(-50%, -50%);
                    z-index: 1000;
                    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
                }
                .quick-close-dialog h3 {
                    margin-top: 0;
                    border-bottom: 1px solid #eaecf0;
                    padding-bottom: 10px;
                }
                .quick-close-dialog div {
                    margin-bottom: 10px;
                }
                .quick-close-dialog label {
                    display: block;
                    margin-bottom: 5px;
                }
                .quick-close-dialog select,
                .quick-close-dialog textarea {
                    width: 100%;
                    box-sizing: border-box;
                }
                .quick-close-buttons {
                    display: flex;
                    justify-content: space-between;
                }
                .quick-close-buttons button {
                    padding: 5px 10px;
                }
            </style>
        `);
        
        $('body').append($dialog);
        
        // Zamykanie dialogu
        $('#quick-close-cancel').click(function() {
            $dialog.remove();
        });
        
        // Potwierdzenie zamknięcia
        $('#quick-close-confirm').click(function() {
            var outcome = $('#quick-close-outcome').val();
            var comment = $('#quick-close-comment').val() || 'The outcome of this discussion is: ';
            var deleteRequest = $('#quick-close-delete-page:checked').length > 0;
            
            QuickCloseRfD.closeDiscussion(
                sectionNumber, 
                outcome, 
                comment, 
                deleteRequest
            );
            
            $dialog.remove();
        });
    };
    
    QuickCloseRfD.closeDiscussion = function(sectionNumber, outcome, comment, deleteRequest) {
        var pageTitle = mw.config.get('wgPageName');
        var pageName = pageTitle.split('/').pop();
        
        new mw.Api().get({
            action: 'parse',
            page: pageTitle,
            prop: 'wikitext',
            section: sectionNumber
        }).done(function(result) {
            var wikitext = result.parse.wikitext['*'];
            
            // Dodanie zamknięcia dyskusji
            var closingText = 
                '<div class="boilerplate" style="background-color: #EDEAFF; padding: 0px 10px 0px 10px; border: 1px solid #8779DD;">\n' +
                ':\'\'The following discussion is closed. <span style="color:red">\'\'\'Please do not modify it.\'\'\'\</span> Subsequent comments should be made on the appropriate discussion page. No further changes should be made to this discussion.\'\'\n' +
                '----\n' +
                outcome + ' - ~~~~\n\n' +
                comment + ' ~~~~\n' +
                '</div>';
            
            wikitext += '\n' + closingText;
            
            // Edycja strony
            new mw.Api().postWithEditToken({
                action: 'edit',
                title: pageTitle,
                section: sectionNumber,
                text: wikitext,
                summary: 'Closing deletion discussion for ' + pageName
            }).done(function() {
                // Opcjonalne usunięcie strony dla administratorów
                if (deleteRequest) {
                    new mw.Api().postWithEditToken({
                        action: 'delete',
                        title: 'Wikipedia:Requests for deletion/Requests/2025/' + pageName,
                        reason: 'Deletion discussion completed'
                    }).done(function() {
                        location.reload();
                    });
                } else {
                    location.reload();
                }
            });
        });
    };
    
    // Ładowanie skryptu
    mw.loader.using('mediawiki.api', function() {
        $(document).ready(function() {
            QuickCloseRfD.setup();
        });
    });
})(jQuery);
// </nowiki>