User:BZPN/RfD.js: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
Content deleted Content added
No edit summary
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>