МедияУики:Gadget-Quick rollback.js

Забележка: За да се видят промените, необходимо е след съхраняване на страницата, кешът на браузъра да бъде изтрит.

  • Firefox / Safari: Задържа се клавиш Shift и се щраква върху Презареждане (Reload) или чрез клавишната комбинация Ctrl-Shift-R (⌘-Shift-R за Mac);
  • Google Chrome: клавишна комбинация Ctrl-Shift-R (⌘-Shift-R за Mac)
  • Internet Explorer: Задържа се клавиш Ctrl и се щраква върху Refresh или чрез клавишната комбинация CTRL-F5;
  • Opera: кешът се изчиства през менюто Tools → Preferences.


// Quick Rollback е инструмент за администратори, който позволява отмяна на редакции без да се напуска текущата страница. В допълнение към стандартните препратки [отмяна] се добавят по две нови препратки – „доб“ (отбелязва в резюмето, че отменените редакции са били добронамерени) и „ком“ (позволява да се въведе коментар, който да бъде включен в резюмето).

mw.ext = mw.ext || {};

// $('.quickRollbackLinks').remove();
// $('body').off("click.QuickRollback", ".mw-rollback-link a");

mw.ext.QuickRollback = {
	gadgetName: 'Бързо отменяне',
	scriptPath: mw.config.get('wgScriptPath'),

    mkRollbkLink: function (n) {
        var links = [ {}
                    , { label: 'доб', info: 'Отмяна с резюме за добронамерени редакции', type: 'good' }
                    , { label: 'ком', info: 'Отмяна с ръчно въведен коментар в резюмето', type: 'comm' }
                    ];
        var lnk = links[n];
        return $('<a href="#' + lnk.info + '" title="' + lnk.info
                + '" class="quickRollback_' + lnk.type + '">' + lnk.label + '</a>');
    },

    enable: function ($link) {
        var onClick = function (e) {
            e.preventDefault();
            mw.ext.QuickRollback.executeRollback(this);
        };
        var mkRollbkLink = mw.ext.QuickRollback.mkRollbkLink;
        var $rollbkLinks = $link || $('.mw-rollback-link a');
        var $afterSpan = $('<span class="quickRollbackLinks"/>').append(': ').append( mkRollbkLink(1) )
                         .append(', ').append( mkRollbkLink(2) );
        $rollbkLinks.each(function (i, link) {
            $(link).after($afterSpan.clone());
        });
        if (!$link) $("body").on("click.QuickRollback", ".mw-rollback-link a", onClick);
    },

    rollbkWithToken: function ($link, token, summary) {
        var $rollbkLink = $link.closest('.mw-rollback-link').children('a').first();
        var href = $rollbkLink.attr('href');
        var titleEncoded = (href.match(/(?:\?|&)title=([^&]*)(&|$)/) || ['', ''])[1];
        var userEncoded = (href.match(/(?:\?|&)from=([^&]*)(&|$)/) || ['', ''])[1].replace(/\+/g, ' ');
        var user = decodeURIComponent(userEncoded);
        var goodFaithLink = $link.hasClass('quickRollback_good');
        if (summary || goodFaithLink)
            summary = 'Премахнати ' + (goodFaithLink ? '[[У:ДОБРО|добронамерени]] ' : '')
                    + '[[Special:Contributions/' + user + '|редакции на ' + user
                    + ']] ([[User talk:' + user + '|б.]])'
                    + (typeof summary == 'string' ? ': ' + summary : '');
        var rollbkUrl = mw.ext.QuickRollback.scriptPath + '/api.php?action=rollback&title='
                          + titleEncoded + '&user=' + userEncoded + '&format=json'
                          + (summary ? '&summary=' + encodeURIComponent(summary) : '');

        $.post(rollbkUrl, {token: token}, function (resp) {
              var error = resp.error;
              var msgs = {
              	  'onlyauthor': 'Последният редактор е и единствен автор на страницата.\n'
                              + 'Не може да бъде извършена отмяна на редакциите.',
              	  'alreadyrolled': 'Редакциите веча са били отменени.',
              	  'editconflict': 'Конфликт на редакциите' // Edit conflict detected
              };
              if (error) {
              	   if (error.code == 'editconflict' && !$link[0])
              	       return; // user probably clicked the link twice
              	   $link.removeClass('working');
              	   alert( mw.ext.QuickRollback.gadgetName
              	        + ':\n' + (msgs[error.code] || error.info) );
              }
              else {
                  $rollbkLink.parent().find('.quickRollbackLinks').remove();
                  $rollbkLink.replaceWith($('<span class="done">' + $rollbkLink.text() + '</span>'));
              }
        });
    },

    executeRollback: function(link) {
        var summary;
        var $link = $(link);
        if ($link.hasClass('quickRollback_comm')) {
            summary = prompt('Въведете коментар за отмяната:');
            if (!summary) return;
        }
        else if (window.quickRollback_confirm) {
        	if ( !confirm('Отмяна?') ) return;
        }
        $link.addClass('working');
        $.getJSON(mw.ext.QuickRollback.scriptPath + '/api.php?action=query&meta=tokens&type=rollback&format=json',
                  function (resp) {
            var token = resp && resp.query && resp.query.tokens && resp.query.tokens.rollbacktoken;
            if (token) mw.ext.QuickRollback.rollbkWithToken($link, token, summary);
            else { // no token in response for some reason
                $link.removeClass('working');
                $link.attr('target', '_blank')[0].click();
            }
        });
    }

};

mw.ext.QuickRollback.enable();