User:Eatcha/rollbackconf.js

Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
mw.loader.using(['oojs-ui'], function() {
    "use strict";


    function getRollbackStatus(pageType, deviceType) {
        var defaultConfig = {
            desktop: {
                watchlist: 'confirm',
                contributions: 'confirm',
                recentchanges: 'confirm',
                relatedchanges: 'confirm',
                history: 'confirm',
                diff: 'confirm'
            },
            mobile: {
                watchlist: 'confirm',
                contributions: 'confirm',
                recentchanges: 'confirm',
                relatedchanges: 'confirm',
                history: 'confirm',
                diff: 'confirm'
            }
        };
        var scriptConfig = window.ConfirmRollback || {};
        var deviceDefaults = defaultConfig[deviceType];

        function resolveRollbackStatus(cfg) {

            var ret;
            if (typeof(cfg) === 'object') {
                if (cfg.mobile || cfg.desktop) {
                    return resolveRollbackStatus(cfg[deviceType]);
                } else {
                    ret = cfg[pageType];
                }
            } else if (cfg === 'hide' || cfg === 'allow' || cfg === 'confirm') {
                ret = cfg;
            }
            return ret || deviceDefaults[pageType] || 'confirm';
        }

        return resolveRollbackStatus(scriptConfig);
    }


    function makeRollbackMessage(event) {
        var targetText = $(event.target).text();
        var count = targetText.match(/\d/) ? targetText.match(/\d+/)[0] : null;
        var edits = count ? count + ' edits' : 'edit';
        var user = mw.util.getParamValue('from', event.target.href);
        return 'Rollback ' + edits + ' by User:' + user + ' ?';
    }


    function handleMobileClicks($rollbackLinks) {
        $rollbackLinks.click(function(event) {
            var message = makeRollbackMessage(event);
            if (!confirm(message)) {
                return event.preventDefault();
            }
        });
    }


    function handleDesktopClicks($rollbackLinks) {
        // Initialize the dialog object.
        var confirmationDialog = new OO.ui.MessageDialog();
        var windowManager = new OO.ui.WindowManager();
        $('body').append(windowManager.$element);
        windowManager.addWindows([confirmationDialog]);

        $rollbackLinks.click(function(event) {
            event.preventDefault();
            var message = makeRollbackMessage(event);
            windowManager.openWindow(confirmationDialog, {
                title: 'Confirm rollback',
                message: message,
                actions: [{
                        action: 'rollback',
                        label: 'OK',
                        flags: ['primary', 'destructive']
                    },
                    {
                        label: 'Cancel'
                    }
                ]
            }).then(function(opening) {
                opening.then(function(opened) {
                    opening.then(function(closing, data) {

                        if (data && data.action === 'rollback') {
                            window.open($(event.target).attr('href'), '_top');
                        }
                    });
                });
            });
        });
    }

    var pageType, deviceType, rollbackStatus, $rollbackLinks;
    var mwConfig = mw.config.get(['wgCanonicalSpecialPageName', 'wgAction']);


    if (mwConfig.wgCanonicalSpecialPageName === 'Watchlist') {
        pageType = 'watchlist';
    } else if (mwConfig.wgCanonicalSpecialPageName === 'Contributions') {
        pageType = 'contributions';
    } else if (mwConfig.wgCanonicalSpecialPageName === 'Recentchanges') {
        pageType = 'recentchanges';
    } else if (mwConfig.wgCanonicalSpecialPageName === 'Recentchangeslinked') {
        pageType = 'relatedchanges';
    } else if (mwConfig.wgAction === 'history') {
        pageType = 'history';
    } else if ($(location).attr('href').indexOf('&diff') !== -1) {
        pageType = 'diff';
    } else {
        return;
    }

    deviceType = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent ) ? 'mobile' : 'desktop';
    rollbackStatus = getRollbackStatus(pageType, deviceType);
    $rollbackLinks = $('.mw-rollback-link');

    if (rollbackStatus === 'hide') {
        $rollbackLinks.css('display', 'none');
    } else if (rollbackStatus === 'allow') {
        $rollbackLinks.css('display', 'inline');
    } else if (rollbackStatus === 'confirm') {
        // Display rollback links if they are hidden.
        $rollbackLinks.css('display', 'inline');
        // Handle rollback clicks.
        if (deviceType === 'mobile') {
            handleMobileClicks($rollbackLinks);
        } else {
            handleDesktopClicks($rollbackLinks);
        }
    }
});

// </nowiki>