MediaWiki:Gadget-TagFilterDeluxe.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/* {{Catégorisation JS|TagFilterDeluxe}} */

if (['Recentchanges', 'Recentchangeslinked', 'Log', 'Newpages', 'Contributions'].includes(mw.config.get('wgCanonicalSpecialPageName'))) {

    mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.storage'], function () {
        $(function ($) {

            // /////////////////////////////////////////// LANCEMENT

            getFilters().then(createOptions);

            // /////////////////////////////////////////// RECHERCHE DES FILTRES EXISTANTS

            function getFilters() {
                function requestFilters(deferred, filterList, apicontinue) {
                    if (!filterList) filterList = [];
                    var queryopt = {
                        action        : 'query',
                        list          : 'tags',
                        tgprop        : 'active',
                        tglimit       : 500,
                        formatversion : 2,
                    };
                    if (apicontinue) Object.assign(queryopt, apicontinue);
                    var api = new mw.Api();
                    api.get(queryopt).then(function (data) {
                        var tags = data.query.tags;
                        for (var a = 0; a < tags.length; a++) {
                            var thistag = tags[a];
                            if (!thistag.active) continue;
                            filterList.push(thistag.name);
                        }
                        if (data['continue']) {
                            requestFilters(deferred, filterList, data['continue']);
                            return;
                        }
                        mw.storage.set('TagFilterDeluxe_filterList', filterList.join('|'), 86400); // 86400 secondes = 24 heures
                        deferred.resolve(filterList);
                    });
                }
                var deferred = $.Deferred();
                var cachedData = mw.storage.get('TagFilterDeluxe_filterList');
                if (cachedData) {
                    var filterList = cachedData.split('|');
                    deferred.resolve(filterList);
                } else {
                    requestFilters(deferred);
                }
                return deferred.promise();
            }

            // /////////////////////////////////////////// MODIF OPTIONS

            function createOptions(filterList) {
                var inputs = document.getElementsByTagName('input');
                for (var a = 0, l = inputs.length; a < l; a++) {
                    if (!inputs[a].name) continue;
                    if (inputs[a].name === 'tagfilter' && inputs[a].type === 'text') {
                        var select = document.createElement('select');
                        select.name = 'tagfilter';
                        var firstOption = document.createElement('option');
                        firstOption.value = '';
                        firstOption.textContent = '* Aucune *';
                        select.appendChild(firstOption);
                        var activeFilter = getActiveFilter();
                        for (var b = 0; b < filterList.length; b++) {
                            var option = document.createElement('option');
                            option.value = filterList[b];
                            option.textContent = filterList[b];
                            if (filterList[b] === activeFilter) {
                                option.selected = 'selected';
                            }
                            select.appendChild(option);
                        }
                        inputs[a].parentNode.replaceChild(select, inputs[a]);
                    }
                }
            }

            // /////////////////////////////////////////// RECHERCHE FILTRE ACTIF DANS L'URL

            function getActiveFilter() {
                var filter = mw.util.getParamValue('tagfilter');
                if (filter) {
                    return filter;
                }
                return false;
            }

        });
    });
}