« MediaWiki:Common.js » : différence entre les versions
Page de l’interface de MediaWiki
Autres actions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| Ligne 63 : | Ligne 63 : | ||
}); | }); | ||
// Récupérer les namespaces | // Récupérer les namespaces avec filtrage selon les permissions | ||
var namespaces = mw.config.get('wgFormattedNamespaces'); | 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)' }]; | var nsOptions = [{ data: 0, label: '(Article principal)' }]; | ||
for (var nsId in namespaces) { | for (var nsId in namespaces) { | ||
if (nsId | var id = parseInt(nsId); | ||
nsOptions.push({ data: | 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] }); | |||
} | } | ||
} | } | ||
| Ligne 134 : | Ligne 159 : | ||
// Construire le titre complet | // Construire le titre complet | ||
var fullTitle = nsId > 0 | 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 | // Vérifier si la page existe via l'API | ||
| Ligne 165 : | Ligne 199 : | ||
CreatePageDialog.prototype.getBodyHeight = function() { | CreatePageDialog.prototype.getBodyHeight = function() { | ||
return | return 250; | ||
}; | }; | ||
| Ligne 171 : | Ligne 205 : | ||
var windowManager = new OO.ui.WindowManager(); | var windowManager = new OO.ui.WindowManager(); | ||
$(document.body).append(windowManager.$element); | $(document.body).append(windowManager.$element); | ||
var dialog = new CreatePageDialog({ size: ' | var dialog = new CreatePageDialog({ size: 'large' }); | ||
windowManager.addWindows([dialog]); | windowManager.addWindows([dialog]); | ||
windowManager.openWindow(dialog); | windowManager.openWindow(dialog); | ||
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);
});