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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 * VReport
 * Fonctionnalité : Signalement de vandalisme
 * Auteurs : Google Gemini et Laurent04000
 * {{Catégorisation JS|VReport}}
 */
// <nowiki>
$.when(mw.loader.using(['oojs-ui-core', 'oojs-ui-windows', 'mediawiki.util', 'mediawiki.api']), $.ready).then(() => {
    const pageName = mw.config.get('wgPageName');
    const userName = mw.config.get('wgRelevantUserName');
    
    // Ajout dans les menus
    const portletLink = mw.util.addPortletLink('p-cactions', '#', 'Signaler', 'ca-vreport', 'Signaler un vandalisme sur WP:VEC') ||
                        mw.util.addPortletLink('p-tb', '#', 'Signaler', 'ca-vreport', 'Signaler un vandalisme sur WP:VEC');

    if (!portletLink) {
        console.error("VReport : Impossible de trouver un menu pour placer le lien.");
        return;
    }

    $(portletLink).click((e) => {
        e.preventDefault();
        openReportDialog();
    });

    function openReportDialog() {
        function ReportDialog(config) {
            ReportDialog.super.call(this, config);
        }
        OO.inheritClass(ReportDialog, OO.ui.ProcessDialog);

        ReportDialog.static.name = 'reportDialog';
        ReportDialog.static.title = 'Signaler';
        ReportDialog.static.actions = [
            { action: 'save', label: 'Envoyer', flags: ['primary', 'progressive'] },
            { label: 'Annuler', flags: 'safe' }
        ];

        ReportDialog.prototype.initialize = function () {
            ReportDialog.super.prototype.initialize.apply(this, arguments);
            this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false });

            this.targetInput = new OO.ui.TextInputWidget({
                value: userName || pageName.replace(/_/g, ' '),
                indicator: 'required'
            });

            this.reasonInput = new OO.ui.TextInputWidget({
                placeholder: 'Expliquez le motif...',
                indicator: 'required'
            });

            const fieldset = new OO.ui.FieldsetLayout({ label: 'Détails de la requête' });
            fieldset.addItems([
                new OO.ui.FieldLayout(this.targetInput, { label: 'Cible :', align: 'top' }),
                new OO.ui.FieldLayout(this.reasonInput, { label: 'Motif :', align: 'top' })
            ]);

            this.panel.$element.append(fieldset.$element);
            this.$body.append(this.panel.$element);
        };

        ReportDialog.prototype.getActionProcess = function (action) {
            const dialog = this;
            if (action === 'save') {
                return new OO.ui.Process(() => {
                    const target = dialog.targetInput.getValue().trim();
                    const reason = dialog.reasonInput.getValue().trim();

                    if (!target || !reason) {
                        mw.notify('Veuillez remplir tous les champs.', { type: 'error' });
                        return;
                    }

                    return sendReport(target, reason).then(() => {
                        mw.notify('Requête envoyée !', { type: 'success' });
                        dialog.close({ action: action });
                    }).catch((err) => {
                        mw.notify(`Erreur : ${err}`, { type: 'error' });
                    });
                });
            }
            if (action) {
                return new OO.ui.Process(() => {
                    dialog.close({ action: action });
                });
            }
            return ReportDialog.super.prototype.getActionProcess.call(this, action);
        };

        const windowManager = new OO.ui.WindowManager();
        $(document.body).append(windowManager.$element);
        const dialog = new ReportDialog();
        windowManager.addWindows([dialog]);
        windowManager.openWindow(dialog);
    }

    function sendReport(target, reason) {
        const api = new mw.Api();
        const pageToEdit = 'Wikipédia:Vandalisme en cours';
        const newSectionTitle = `Demande de blocage de ${target}`;
        const signatureLine = '<small>([[Utilisateur:Laurent04000/vreport.js|VReport]])</small> Message déposé par ~~~~';
        const textToAppend = `* Auteur du vandalisme : {{u+|${target}}}\n* Type de dégâts : ${reason}\n<!-- Merci de ne pas modifier la ligne ci-dessous -->\n${signatureLine}`;

        return api.postWithToken('csrf', {
            action: 'edit',
            title: pageToEdit,
            section: 'new',
            sectiontitle: newSectionTitle,
            text: textToAppend,
            summary: `[[${pageToEdit}#${newSectionTitle}|Signalement]] de [[Spécial:Contributions/${target}|${target}]] via [[Utilisateur:Laurent04000/vreport.js|VReport]]`
        });
    }
});
// </nowiki>