User:Jayanta (CIS-A2K)/DiscussionCloser.js

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)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//<nowiki>
//Credits to Equazcion, Evad37, and Abelmoschus Esculentus
//Date: 6 Mar 2019
//Forked from [[User:Abelmoschus Esculentus/DiscussionCloser.js]
//Maintained by DannyS712
var DiscussionCloser_config = {
    name: '[[User:Jayanta (CIS-A2K)/DiscussionCloser.js|DiscussionCloser]]',
    version: '1.7.3',
    debug: false
};
var DiscussionCloser_ending = ' (' + DiscussionCloser_config.name + ' v.' + DiscussionCloser_config.version + ')';

/* HELPER FUNCTIONS */
function dc_make_bottom(template){
    var bottom;
    switch (template) {
        case "atop":
        case "atopr":
        case "atopy":
        case "atopg":
        case "subst:RMT":
            bottom = "abot";
            break;
        case "hat":
            bottom = "hab";
            break;
        default:
            bottom = "closed rfc bottom";
            break;
    }
    bottom = "{{" + bottom + "}}";
    return bottom;
}
function alreadyClosed ( content ){
    content = content.toLowerCase();
    if (content.includes('{{atop') ||
        content.includes('{{hat') ||
        content.includes('{{abot') ||
        content.includes('{{archive') ||
        content.includes('{{rfctop') ||
        content.includes('{{rfc bottom') ||
        content.includes('{{archive bottom') ||
        content.includes('{{hidden archive bottom') ||
        content.includes('<!-- template:rm top -->')
    ) return true;
    return false;
}
function dc_radio(i) {
    $('#DC-e').val("");
    if (i == 1) {
        $('#DC-e').prop('disabled', false);
    }
    if (i == 2) {
        $('#DC-e').prop('disabled', true);
    }
}

/* MAIN FUNCTIONs */

function dc_init(){
    if ((($('#ca-addsection').length > 0) ||
                (mw.config.get('wgPageName') == 'CIS-A2K/Requests/Projects') ||
                (mw.config.get('wgPageName') == 'CIS-A2K/Requests/IT Allowance') ||
                (mw.config.get('wgPageName') == 'CIS-A2K/Requests/Internet_support')) &&
            (mw.config.get('wgAction') == 'view')) {
        dc_run();
    }
}

function dc_run() {
    $('span.mw-headline').each(function(index, value){
        var editSectionUrl = $(this).parent().find('.mw-editsection a:first').attr('href');
        var sectionReg = /&section=(.*)/;
        var sectionRaw = sectionReg.exec(editSectionUrl);
        if ((sectionRaw !== null) && (sectionRaw[1].indexOf('T') < 0)){
            var section = parseInt(sectionRaw[1]);
            var sectionLevel = false;
            switch ($(this).parent().prop("tagName")) {
                case 'H2':
                    sectionLevel = 'h2';
                    break;
                case 'H3':
                    sectionLevel = 'h3';
                    break;
                case 'H4':
                    sectionLevel = 'h4';
                    break;
                default:
                    break;
            }
            if (sectionLevel && sectionLevel !== false) {
                $(this).parent(sectionLevel).append(' <div style="font-size:.6em;font-weight:bold;float:right"> | <a id="' + section +
                    '" class="closeLink">' + 'Close' + '</a></div>');
                $(this).parent(sectionLevel).find('a.closeLink').click(function(){
                    $('body').prepend('<div id="DC-modal">'+
                        '<div id="DC-interface">'+
                        '<h4 id="DC-interface-header"></h4>'+
                        '<hr>'+
                        '<div id="DC-interface-content"></div>'+
                        '<hr>'+
                        '<div id="DC-interface-footer"></div>'+
                        '</div>'+
                        '</div>');
                    $("#DC-interface-header, #DC-interface-content, #DC-interface-footer").empty();
                    $("#DC-interface-header").text("Discussion Closer");
                    $("#DC-interface-content").append(
                        $('<div class="DC-bottom">').append(
                            $('<label>').attr({'id':'DC-label'}).text('Options: '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio1','value':'atop','checked':'true','onchange':'dc_radio(1)'}),
                            $('<label>').text('Generic (blue) '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio2','value':'atopg','onchange':'dc_radio(1)'}),
                            $('<label>').text('Generic (green) '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio3','value':'atopy','onchange':'dc_radio(1)'}),
                            $('<label>').text('Generic (yellow) '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio4','value':'atopr','onchange':'dc_radio(1)'}),
                            $('<label>').text('Generic (red) '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio5','value':'closed rfc top','onchange':'dc_radio(2)'}),
                            $('<label>').text('RfC '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio6','value':'hat','onchange':'dc_radio(2)'}),
                            $('<label>').text('Hidden archive '),
                            $('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio7','value':'subst:RMT','onchange':'dc_radio(2)'}),
                            $('<label>').text('Requested move ')
                        ),
                        $('<div class="DC-bottom">').append(
                            $('<label>').text('Status (optional): '),
                            $('<input>').attr({'type':'text','name':'DC-e','id':'DC-e'})
                        ),
                        $('<div class="DC-bottom">').append(
                            $('<label>').text('Closing comment:'),
                            $('<textarea>').css({'resize':'none'}).attr({'name':'DC-com','id':'DC-com','rows':'17','cols':'30'})
                        ),
                        $('<div class="DC-bottom">').append(
                            $('<label>').text('Edit summary ("Closing discussion" if left blank): '),
                            $('<input>').attr({'type':'text','name':'DC-es','id':'DC-es'})
                        ),
                        $('<div class="DC-bottom">').attr('id','DC-prevt'),
                        $('<div class="DC-bottom">').attr('id','DC-prevdiv'),
                        $('<button>').attr('id', 'DC-closeprev').text('Close preview').hide()
                    );
                    $("#DC-interface-footer").append(
                        $('<button>').attr({'name':'DC-done', 'id':'DC-done'}).text('Close discussion'),
                        $('<button>').attr({'name':'DC-prev', 'id':'DC-prev'}).text('Preview'),
                        $('<button>').attr('id', 'DC-cancel').text('Cancel'),
                        $('<label>').attr('id','DC-loading').text(' Loading preview...').hide()
                    );
                    document.getElementById("DC-modal").addEventListener( "keydown", function ( key ) {
                        if( key.ctrlKey && ( key.keyCode == 10 || key.keyCode == 13 ) ) {
                            document.getElementById("DC-done").click();
                        }
                        else if ( key.keyCode == 27 ){
                            document.getElementById("DC-cancel").click();
                        }
                    });
                    $('#DC-cancel').click(function() {
                        $('#DC-modal').remove();
                    });
                    $('#DC-prev').click(function() {
                        $('#DC-loading').show();
                        var template = $("input[name=DC-radio]:checked").val();
                        var status = $('#DC-e').val();
                        var comment = $('#DC-com').val();
                        var request = {
                            action:"query",
                            titles: mw.config.get('wgPageName'),
                            rvsection: section,
                            prop: "revisions|info",
                            intoken: "edit",
                            rvprop: "content",
                            indexpageids: 1,
                            dataType: "xml",
                            format: "xml"
                        };
                        var bottom = dc_make_bottom( template );
                        $.get(mw.config.get("wgScriptPath")+"/api.php", request, function(response){
                            var contentSection = '\r\r' + $(response).find('rev').text();
                            var discussiontext = contentSection.substring(contentSection.substring(3,contentSection.length).indexOf('\n')+3, contentSection.length);
                            var title = contentSection.substring(2, contentSection.length - discussiontext.length);
                            var wikitext = title + '\n{{'+template+'\n| status = '+status+'\n| result = '+comment+'\n}}'+discussiontext+'\n'+bottom;
                            var sectiontitle = title.replace('==', '').replace('==', '').replace('\n', '').replace('/r','').trim();
                            var sectiontitle2 = sectiontitle.replace(/ /g, '_');
                            if (template === "closed rfc top") {
                                wikitext = wikitext.replace(/(\r|\n)?{{rfc[^\}]*}}/g, '')
                                                    .replace(/(\r|\n)?<!--\s\[\[User:DoNotArchiveUntil\]\][^->]*-->{{[^C]+ClueBot\sIII\/DoNotArchiveUntil\|\d*}}/g, '');
                            } else if (template === "subst:RMT"){
                                wikitext = wikitext.replace(/{{requested move\/dated\|[^}]*?}}\n?/i, '');
                            }
                            jQuery.ajax({
                                url:mw.util.wikiScript('api'),
                                dataType:'json',
                                type:'POST',
                                data:{
                                    format:'json',
                                    action:'parse',
                                    pst:1,
                                    text:wikitext,
                                    title:mw.config.get('wgPageName'),
                                    prop:'text'
                                }
                            }).done(function(r) {
                                if(!r.parse || !r.parse.text || !r.parse.text['*']){
                                    alert('Error previewing.');
                                }
                                $('#DC-loading').hide();
                                $('#DC-prevt').html('<hr>Preview:<br>');
                                $('#DC-prevdiv').html(r.parse.text['*']+'<br />').css({'display':'block','background-color':'white'});
                                $('#DC-closeprev').show();
                                $('#DC-closeprev').click(function() {
                                    $('#DC-prevt').empty();
                                    $('#DC-prevdiv').empty().css({'display':'','background-color':'','border-color':'',"border-width":"", "border-style":""});
                                    $('#DC-closeprev').hide();
                                });
                            });
                        });
                    });
                    $('#DC-done').click(function() {
                        var template = $("input[name=DC-radio]:checked").val();
                        var status = $('#DC-e').val();
                        var editsummary = $('#DC-es').val();
                        if (editsummary === "") {
                            editsummary = "Closing discussion";
                        }
                        var comment = $('#DC-com').val();
                        $('#DC-done').remove();
                        $('#DC-prev').remove();
                        $('#DC-cancel').remove();
                        $('#DC-interface-content').empty();
                        $("#DC-interface-content").text('Retrieving information...');
                        var request = {
                            action:"query",
                            titles: mw.config.get('wgPageName'),
                            rvsection: section,
                            prop: "revisions|info",
                            intoken: "edit",
                            rvprop: "content",
                            indexpageids: 1,
                            dataType: "xml",
                            format: "xml"
                        };
                        $("#DC-interface-content").append('<b>Done!</b><br>Closing discussion...');
                        var bottom = dc_make_bottom( template );
                        $.get(mw.config.get("wgScriptPath")+"/api.php", request, function(response){
                            var contentSection = '\r\r' + $(response).find('rev').text();
                            var discussiontext = contentSection.substring(contentSection.substring(3,contentSection.length).indexOf('\n')+3, contentSection.length);
                            var title = contentSection.substring(2, contentSection.length - discussiontext.length);
                            var wikitext = title + '\n{{'+template+'\n| status = '+status+'\n| result = '+comment+'\n}}\n\n'+discussiontext+'\n'+bottom;
                            var sectiontitle = title.replace(/=/g, '').replace('\n', '').replace('/r','').trim();
                            var sectiontitle2 = sectiontitle.replace(/ /g, '_');
                            if (template === "closed rfc top") {
                                wikitext = wikitext.replace(/(\r|\n)?{{rfc[^\}]*}}/g, '')
                                                    .replace(/(\r|\n)?<!--\s\[\[User:DoNotArchiveUntil\]\][^->]*-->{{[^C]+ClueBot\sIII\/DoNotArchiveUntil\|\d*}}/g, '');
                            } else if (template === "subst:RMT" ){
                                wikitext = wikitext.replace(/\n?{{requested move\/dated\|[^}]*?}}\n?\n?/i, '');
                            }
                            var request2 = {
                                action:"edit",
                                section: section,
                                title: mw.config.get('wgPageName'),
                                text: wikitext,
                                summary: '/* ' + sectiontitle + ' */ ' + editsummary + DiscussionCloser_ending,
                                token: mw.user.tokens.get("csrfToken")
                            };
                            var willClose = true;
                            if (alreadyClosed( contentSection )) {
                                willClose = confirm('The discussion may have already been closed. Continue?');
                            }
                            if (!willClose) {
                                $("#DC-interface-content").append('<b>Aborted by user</b><br><b>Finished!</b>');
                                $('#DC-interface-footer').append(
                                    $('<button>').attr('id', 'DC-close').text('Done')
                                );
                                $('#DC-close').click(function() {
                                    $('#DC-modal').remove();
                                    window.location.href = 'https://meta.wikimedia.org/wiki/'+mw.config.get('wgPageName')+'#'+sectiontitle2;
                                    window.location.reload();
                                });
                            }
                            else {
                                $.when(
                                    $.post(mw.config.get("wgScriptPath")+"/api.php", request2, function(response2){
                                }).done(function() {
                                    $("#DC-interface-content").append('<b>Done!</b><br><b>Finished!</b>');
                                    $('#DC-interface-footer').append(
                                        $('<button>').attr('id', 'DC-close').text('Done')
                                    );
                                    $('#DC-close').click(function() {
                                        $('#DC-modal').remove();
                                        window.location.href = 'https://meta.wikimedia.org/wiki/'+mw.config.get('wgPageName')+'#'+sectiontitle2;
                                        window.location.reload();
                                    });
                                }));
                            }
                        });
                    });
                });
            }
        }
    });
}
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.Title'], function() {
    mw.loader.load('//en.wikipedia.org/w/index.php?title=User:DannyS712/DiscussionCloser.css&action=raw&ctype=text/css', 'text/css'); // Import stylesheet
    dc_init();
});
//</nowiki>