Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« MediaWiki:Common.js » : différence entre les versions

Page de l’interface de MediaWiki
Aucun résumé des modifications
Aucun résumé des modifications
 
(5 versions intermédiaires par le même utilisateur non affichées)
Ligne 3 : Ligne 3 :
var a = document.createElement('a');
var a = document.createElement('a');
a.id = 'citizen-newpage-button';
a.id = 'citizen-newpage-button';
a.href = mw.util.getUrl('Special:CreatePage');
a.href = '#';
a.title = 'Créer une page';
a.title = 'Créer une page';
a.className = 'citizen-header__item cdx-button cdx-button--icon-only';
a.className = 'citizen-header__item cdx-button cdx-button--icon-only';
a.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6z"/></svg>';
a.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6z"/></svg>';
a.addEventListener('click', function(e) {
    e.preventDefault();
    var isLoggedIn = mw.config.get('wgUserName');
    var userGroups = mw.config.get('wgUserGroups') || [];
    var isAutoconfirmed = userGroups.indexOf('autoconfirmed') !== -1;
    // Utilisateur non connecté
    if (!isLoggedIn) {
        mw.loader.using('oojs-ui-windows').then(function() {
            OO.ui.alert(
                'Vous devez être connecté pour créer ou modifier une page.',
                { title: 'Connexion requise' }
            ).done(function() {
                window.location.href = mw.util.getUrl('Special:UserLogin', {
                    returnto: mw.config.get('wgPageName')
                });
            });
        });
        return;
    }
    // Utilisateur connecté mais compte non validé
    if (!isAutoconfirmed) {
        mw.loader.using('oojs-ui-windows').then(function() {
            OO.ui.alert(
                'Votre compte doit être validé avant de pouvoir créer ou modifier des pages. Pensez a vérifier vos spams.',
                { title: 'Compte non validé' }
            );
        });
        return;
    }
    // Utilisateur autorisé - Afficher le formulaire de création
    mw.loader.using(['oojs-ui-windows', 'oojs-ui-widgets', 'mediawiki.api']).then(function() {
        // Créer le dialogue personnalisé
        function CreatePageDialog(config) {
            CreatePageDialog.super.call(this, config);
        }
        OO.inheritClass(CreatePageDialog, OO.ui.ProcessDialog);
        CreatePageDialog.static.name = 'createPageDialog';
        CreatePageDialog.static.title = 'Créer une page';
        CreatePageDialog.static.actions = [
            { action: 'create', label: 'Créer', flags: ['primary', 'progressive'] },
            { action: 'cancel', label: 'Annuler', flags: 'safe' }
        ];
        CreatePageDialog.prototype.initialize = function() {
            CreatePageDialog.super.prototype.initialize.apply(this, arguments);
            // Champ nom de page
            this.pageNameInput = new OO.ui.TextInputWidget({
                placeholder: 'Nom de la page',
                required: true
            });
            // Récupérer les namespaces avec filtrage selon les permissions
            var namespaces = mw.config.get('wgFormattedNamespaces');
            var userGroups = mw.config.get('wgUserGroups') || [];
            var isAdmin = userGroups.indexOf('sysop') !== -1 || userGroups.indexOf('bureaucrat') !== -1;
            var currentUser = mw.config.get('wgUserName');
            // Namespaces restreints (réservés aux admins)
            var adminOnlyNs = [8, 9]; // MediaWiki, MediaWiki_talk
            // Namespaces de discussion (impairs) - on les exclut car on crée généralement la page principale
            // Namespaces techniques
            var technicalNs = [828, 829, 2300, 2301, 2302, 2303]; // Module, Gadget, etc.
            var nsOptions = [{ data: 0, label: '(Article principal)' }];
            for (var nsId in namespaces) {
                var id = parseInt(nsId);
                if (id <= 0 || !namespaces[nsId]) continue;
                // Exclure les namespaces de discussion (impairs)
                if (id % 2 === 1) continue;
                // Exclure les namespaces techniques
                if (technicalNs.indexOf(id) !== -1) continue;
                // Namespaces admin-only
                if (adminOnlyNs.indexOf(id) !== -1 && !isAdmin) continue;
                // Namespace Utilisateur (2) - ajouter avec le nom de l'utilisateur
                if (id === 2) {
                    nsOptions.push({ data: id, label: namespaces[nsId] + ':' + currentUser + '/...' });
                } else {
                    nsOptions.push({ data: id, label: namespaces[nsId] });
                }
            }
            // Dropdown namespace
            this.namespaceSelect = new OO.ui.DropdownInputWidget({
                options: nsOptions,
                value: 0
            });
            // Section Advanced (cachée par défaut)
            this.advancedToggle = new OO.ui.ButtonWidget({
                label: 'Options avancées',
                framed: false,
                flags: ['progressive']
            });
            this.advancedSection = new OO.ui.FieldsetLayout({ classes: ['create-page-advanced'] });
            this.advancedSection.addItems([
                new OO.ui.FieldLayout(this.namespaceSelect, { label: 'Espace de noms', align: 'top' })
            ]);
            this.advancedSection.$element.hide();
            this.advancedToggle.on('click', function() {
                this.advancedSection.$element.toggle();
            }.bind(this));
            // Message d'erreur/info
            this.messageLabel = new OO.ui.LabelWidget({ classes: ['create-page-message'] });
            this.messageLabel.$element.hide();
            // Layout
            this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
            this.content.$element.append(
                new OO.ui.FieldLayout(this.pageNameInput, { label: 'Nom de la page', align: 'top' }).$element,
                this.advancedToggle.$element,
                this.advancedSection.$element,
                this.messageLabel.$element
            );
            this.$body.append(this.content.$element);
        };
        CreatePageDialog.prototype.getActionProcess = function(action) {
            var dialog = this;
            if (action === 'create') {
                return new OO.ui.Process(function() {
                    var pageName = dialog.pageNameInput.getValue().trim();
                    var nsId = parseInt(dialog.namespaceSelect.getValue());
                    var namespaces = mw.config.get('wgFormattedNamespaces');
                    // Vérification nom vide
                    if (!pageName) {
                        dialog.messageLabel.setLabel('Veuillez entrer un nom de page.');
                        dialog.messageLabel.$element.css('color', 'red').show();
                        return $.Deferred().reject().promise();
                    }
                    // Vérification caractères interdits
                    var invalidChars = /[#<>\[\]{}|]/;
                    if (invalidChars.test(pageName)) {
                        dialog.messageLabel.setLabel('Le nom contient des caractères interdits: # < > [ ] { } |');
                        dialog.messageLabel.$element.css('color', 'red').show();
                        return $.Deferred().reject().promise();
                    }
                    // Construire le titre complet
                    var fullTitle;
                    var currentUser = mw.config.get('wgUserName');
                    if (nsId === 2) {
                        // Namespace Utilisateur - préfixer avec le nom de l'utilisateur
                        fullTitle = namespaces[nsId] + ':' + currentUser + '/' + pageName;
                    } else if (nsId > 0) {
                        fullTitle = namespaces[nsId] + ':' + pageName;
                    } else {
                        fullTitle = pageName;
                    }
                    // Vérifier si la page existe via l'API
                    var api = new mw.Api();
                    return api.get({
                        action: 'query',
                        titles: fullTitle,
                        formatversion: 2
                    }).then(function(data) {
                        var page = data.query.pages[0];
                        if (!page.missing) {
                            // La page existe déjà
                            dialog.messageLabel.$element.html(
                                'Cette page existe déjà. <a href="' + mw.util.getUrl(fullTitle) + '">Voir la page</a> ou <a href="' + mw.util.getUrl(fullTitle, {action: 'edit'}) + '">la modifier</a>.'
                            ).css('color', '#c59000').show();
                            return $.Deferred().reject().promise();
                        }
                        // Rediriger vers l'éditeur
                        window.location.href = mw.util.getUrl(fullTitle, { action: 'edit' });
                    });
                });
            }
            if (action === 'cancel') {
                return new OO.ui.Process(function() {
                    dialog.close();
                });
            }
            return CreatePageDialog.super.prototype.getActionProcess.call(this, action);
        };
        CreatePageDialog.prototype.getBodyHeight = function() {
            return 250;
        };
        // Ouvrir le dialogue
        var windowManager = new OO.ui.WindowManager();
        $(document.body).append(windowManager.$element);
        var dialog = new CreatePageDialog({ size: 'large' });
        windowManager.addWindows([dialog]);
        windowManager.openWindow(dialog);
    });
});
var d = document.querySelector('.citizen-drawer');
var d = document.querySelector('.citizen-drawer');
if (d) d.parentNode.insertBefore(a, d.nextSibling);
if (d) d.parentNode.insertBefore(a, d.nextSibling);
});
});

Dernière version du 30 mai 2026 à 08:48

$(function() {
if (document.getElementById('citizen-newpage-button')) return;
var a = document.createElement('a');
a.id = 'citizen-newpage-button';
a.href = '#';
a.title = 'Créer une page';
a.className = 'citizen-header__item cdx-button cdx-button--icon-only';
a.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6z"/></svg>';
a.addEventListener('click', function(e) {
    e.preventDefault();
    var isLoggedIn = mw.config.get('wgUserName');
    var userGroups = mw.config.get('wgUserGroups') || [];
    var isAutoconfirmed = userGroups.indexOf('autoconfirmed') !== -1;

    // Utilisateur non connecté
    if (!isLoggedIn) {
        mw.loader.using('oojs-ui-windows').then(function() {
            OO.ui.alert(
                'Vous devez être connecté pour créer ou modifier une page.',
                { title: 'Connexion requise' }
            ).done(function() {
                window.location.href = mw.util.getUrl('Special:UserLogin', {
                    returnto: mw.config.get('wgPageName')
                });
            });
        });
        return;
    }

    // Utilisateur connecté mais compte non validé
    if (!isAutoconfirmed) {
        mw.loader.using('oojs-ui-windows').then(function() {
            OO.ui.alert(
                'Votre compte doit être validé avant de pouvoir créer ou modifier des pages. Pensez a vérifier vos spams.',
                { title: 'Compte non validé' }
            );
        });
        return;
    }

    // Utilisateur autorisé - Afficher le formulaire de création
    mw.loader.using(['oojs-ui-windows', 'oojs-ui-widgets', 'mediawiki.api']).then(function() {
        // Créer le dialogue personnalisé
        function CreatePageDialog(config) {
            CreatePageDialog.super.call(this, config);
        }
        OO.inheritClass(CreatePageDialog, OO.ui.ProcessDialog);

        CreatePageDialog.static.name = 'createPageDialog';
        CreatePageDialog.static.title = 'Créer une page';
        CreatePageDialog.static.actions = [
            { action: 'create', label: 'Créer', flags: ['primary', 'progressive'] },
            { action: 'cancel', label: 'Annuler', flags: 'safe' }
        ];

        CreatePageDialog.prototype.initialize = function() {
            CreatePageDialog.super.prototype.initialize.apply(this, arguments);

            // Champ nom de page
            this.pageNameInput = new OO.ui.TextInputWidget({
                placeholder: 'Nom de la page',
                required: true
            });

            // Récupérer les namespaces avec filtrage selon les permissions
            var namespaces = mw.config.get('wgFormattedNamespaces');
            var userGroups = mw.config.get('wgUserGroups') || [];
            var isAdmin = userGroups.indexOf('sysop') !== -1 || userGroups.indexOf('bureaucrat') !== -1;
            var currentUser = mw.config.get('wgUserName');

            // Namespaces restreints (réservés aux admins)
            var adminOnlyNs = [8, 9]; // MediaWiki, MediaWiki_talk
            // Namespaces de discussion (impairs) - on les exclut car on crée généralement la page principale
            // Namespaces techniques
            var technicalNs = [828, 829, 2300, 2301, 2302, 2303]; // Module, Gadget, etc.

            var nsOptions = [{ data: 0, label: '(Article principal)' }];
            for (var nsId in namespaces) {
                var id = parseInt(nsId);
                if (id <= 0 || !namespaces[nsId]) continue;

                // Exclure les namespaces de discussion (impairs)
                if (id % 2 === 1) continue;

                // Exclure les namespaces techniques
                if (technicalNs.indexOf(id) !== -1) continue;

                // Namespaces admin-only
                if (adminOnlyNs.indexOf(id) !== -1 && !isAdmin) continue;

                // Namespace Utilisateur (2) - ajouter avec le nom de l'utilisateur
                if (id === 2) {
                    nsOptions.push({ data: id, label: namespaces[nsId] + ':' + currentUser + '/...' });
                } else {
                    nsOptions.push({ data: id, label: namespaces[nsId] });
                }
            }

            // Dropdown namespace
            this.namespaceSelect = new OO.ui.DropdownInputWidget({
                options: nsOptions,
                value: 0
            });

            // Section Advanced (cachée par défaut)
            this.advancedToggle = new OO.ui.ButtonWidget({
                label: 'Options avancées',
                framed: false,
                flags: ['progressive']
            });
            this.advancedSection = new OO.ui.FieldsetLayout({ classes: ['create-page-advanced'] });
            this.advancedSection.addItems([
                new OO.ui.FieldLayout(this.namespaceSelect, { label: 'Espace de noms', align: 'top' })
            ]);
            this.advancedSection.$element.hide();

            this.advancedToggle.on('click', function() {
                this.advancedSection.$element.toggle();
            }.bind(this));

            // Message d'erreur/info
            this.messageLabel = new OO.ui.LabelWidget({ classes: ['create-page-message'] });
            this.messageLabel.$element.hide();

            // Layout
            this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
            this.content.$element.append(
                new OO.ui.FieldLayout(this.pageNameInput, { label: 'Nom de la page', align: 'top' }).$element,
                this.advancedToggle.$element,
                this.advancedSection.$element,
                this.messageLabel.$element
            );

            this.$body.append(this.content.$element);
        };

        CreatePageDialog.prototype.getActionProcess = function(action) {
            var dialog = this;
            if (action === 'create') {
                return new OO.ui.Process(function() {
                    var pageName = dialog.pageNameInput.getValue().trim();
                    var nsId = parseInt(dialog.namespaceSelect.getValue());
                    var namespaces = mw.config.get('wgFormattedNamespaces');

                    // Vérification nom vide
                    if (!pageName) {
                        dialog.messageLabel.setLabel('Veuillez entrer un nom de page.');
                        dialog.messageLabel.$element.css('color', 'red').show();
                        return $.Deferred().reject().promise();
                    }

                    // Vérification caractères interdits
                    var invalidChars = /[#<>\[\]{}|]/;
                    if (invalidChars.test(pageName)) {
                        dialog.messageLabel.setLabel('Le nom contient des caractères interdits: # < > [ ] { } |');
                        dialog.messageLabel.$element.css('color', 'red').show();
                        return $.Deferred().reject().promise();
                    }

                    // Construire le titre complet
                    var fullTitle;
                    var currentUser = mw.config.get('wgUserName');
                    if (nsId === 2) {
                        // Namespace Utilisateur - préfixer avec le nom de l'utilisateur
                        fullTitle = namespaces[nsId] + ':' + currentUser + '/' + pageName;
                    } else if (nsId > 0) {
                        fullTitle = namespaces[nsId] + ':' + pageName;
                    } else {
                        fullTitle = pageName;
                    }

                    // Vérifier si la page existe via l'API
                    var api = new mw.Api();
                    return api.get({
                        action: 'query',
                        titles: fullTitle,
                        formatversion: 2
                    }).then(function(data) {
                        var page = data.query.pages[0];
                        if (!page.missing) {
                            // La page existe déjà
                            dialog.messageLabel.$element.html(
                                'Cette page existe déjà. <a href="' + mw.util.getUrl(fullTitle) + '">Voir la page</a> ou <a href="' + mw.util.getUrl(fullTitle, {action: 'edit'}) + '">la modifier</a>.'
                            ).css('color', '#c59000').show();
                            return $.Deferred().reject().promise();
                        }
                        // Rediriger vers l'éditeur
                        window.location.href = mw.util.getUrl(fullTitle, { action: 'edit' });
                    });
                });
            }
            if (action === 'cancel') {
                return new OO.ui.Process(function() {
                    dialog.close();
                });
            }
            return CreatePageDialog.super.prototype.getActionProcess.call(this, action);
        };

        CreatePageDialog.prototype.getBodyHeight = function() {
            return 250;
        };

        // Ouvrir le dialogue
        var windowManager = new OO.ui.WindowManager();
        $(document.body).append(windowManager.$element);
        var dialog = new CreatePageDialog({ size: 'large' });
        windowManager.addWindows([dialog]);
        windowManager.openWindow(dialog);
    });
});
var d = document.querySelector('.citizen-drawer');
if (d) d.parentNode.insertBefore(a, d.nextSibling);
});