MediaWiki:Common.js
Apparence
Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
- Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
- Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
- Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
/* Tout JavaScript présent ici sera exécuté par tous les utilisateurs à chaque chargement de page. */
mw.hook( 'wikipage.content' ).add( function ( $content ) {
// On ne touche qu'aux pages dont le titre commence par "Admin:"
var pageName = mw.config.get( 'wgPageName' ); // ex. "Admin:Dashboard"
if ( pageName && pageName.indexOf( 'Admin:' ) === 0 ) {
$content.find( 'a[href]' ).each( function () {
var $a = $( this );
var href = $a.attr( 'href' ) || '';
// On ignore les ancres internes pures (#...).
if ( href.indexOf( '#' ) === 0 ) {
return;
}
$a.attr( 'target', '_blank' )
.attr( 'rel', 'noopener noreferrer' );
} );
}
} );
/* =====================================================================
Auto-calcul Département + Région (PageForms) à partir de Pays + Code postal
- France : Région = code ISO (FR-ARA, etc.), Département = numéro (ou 2A/2B, ou 971…)
- Hors France : Région = Benelux / Suisse / Canada / Reste du monde ; Département vidé
===================================================================== */
(function () {
'use strict';
if (window.__eiRegionDeptInstalled) return;
window.__eiRegionDeptInstalled = true;
function isPageFormsEdit() {
// PageForms passe généralement par Special:FormEdit (canonical special page name "FormEdit")
var canonical = mw.config.get('wgCanonicalSpecialPageName');
var action = mw.config.get('wgAction');
return canonical === 'FormEdit' || action === 'formedit' || document.body.classList.contains('action-formedit');
}
function normStr(s) {
return (s || '').toString().trim();
}
function normPostal(cp) {
return normStr(cp).replace(/\s+/g, '');
}
function countryBucket(paysRaw) {
var pays = normStr(paysRaw).toLowerCase();
if (pays === 'france') return 'France';
if (pays === 'belgique' || pays === 'luxembourg') return 'Benelux';
if (pays === 'suisse') return 'Suisse';
if (pays === 'canada') return 'Canada';
// Ex: "Autre" (valeur de votre dropdown) ou tout autre libellé
return 'Reste du monde';
}
// Département -> Région ISO 3166-2:FR (régions 2016+), + principaux territoires ultramarins
// (base ISO/3166-2 pour les codes FR-xxx) : FR-ARA, FR-IDF, etc. :contentReference[oaicite:5]{index=5}
var deptToRegion = {
'01': 'FR-ARA', '02': 'FR-HDF', '03': 'FR-ARA', '04': 'FR-PAC', '05': 'FR-PAC',
'06': 'FR-PAC', '07': 'FR-ARA', '08': 'FR-GES', '09': 'FR-OCC', '10': 'FR-GES',
'11': 'FR-OCC', '12': 'FR-OCC', '13': 'FR-PAC', '14': 'FR-NOR', '15': 'FR-ARA',
'16': 'FR-NAQ', '17': 'FR-NAQ', '18': 'FR-CVL', '19': 'FR-NAQ', '21': 'FR-BFC',
'22': 'FR-BRE', '23': 'FR-NAQ', '24': 'FR-NAQ', '25': 'FR-BFC', '26': 'FR-ARA',
'27': 'FR-NOR', '28': 'FR-CVL', '29': 'FR-BRE', '2A': 'FR-COR', '2B': 'FR-COR',
'30': 'FR-OCC', '31': 'FR-OCC', '32': 'FR-OCC', '33': 'FR-NAQ', '34': 'FR-OCC',
'35': 'FR-BRE', '36': 'FR-CVL', '37': 'FR-CVL', '38': 'FR-ARA', '39': 'FR-BFC',
'40': 'FR-NAQ', '41': 'FR-CVL', '42': 'FR-ARA', '43': 'FR-ARA', '44': 'FR-PDL',
'45': 'FR-CVL', '46': 'FR-OCC', '47': 'FR-NAQ', '48': 'FR-OCC', '49': 'FR-PDL',
'50': 'FR-NOR', '51': 'FR-GES', '52': 'FR-GES', '53': 'FR-PDL', '54': 'FR-GES',
'55': 'FR-GES', '56': 'FR-BRE', '57': 'FR-GES', '58': 'FR-BFC', '59': 'FR-HDF',
'60': 'FR-HDF', '61': 'FR-NOR', '62': 'FR-HDF', '63': 'FR-ARA', '64': 'FR-NAQ',
'65': 'FR-OCC', '66': 'FR-OCC', '67': 'FR-GES', '68': 'FR-GES', '69': 'FR-ARA',
'70': 'FR-BFC', '71': 'FR-BFC', '72': 'FR-PDL', '73': 'FR-ARA', '74': 'FR-ARA',
'75': 'FR-IDF', '76': 'FR-NOR', '77': 'FR-IDF', '78': 'FR-IDF', '79': 'FR-NAQ',
'80': 'FR-HDF', '81': 'FR-OCC', '82': 'FR-OCC', '83': 'FR-PAC', '84': 'FR-PAC',
'85': 'FR-PDL', '86': 'FR-NAQ', '87': 'FR-NAQ', '88': 'FR-GES', '89': 'FR-BFC',
'90': 'FR-BFC', '91': 'FR-IDF', '92': 'FR-IDF', '93': 'FR-IDF', '94': 'FR-IDF',
'95': 'FR-IDF',
// Outre-mer (départements/collectivités fréquemment utilisées avec CP commençant par 97/98)
'971': 'FR-GP', '972': 'FR-MQ', '973': 'FR-GF', '974': 'FR-RE', '976': 'FR-YT',
'975': 'FR-PM', '986': 'FR-WF', '987': 'FR-PF', '988': 'FR-NC'
};
function computeDeptAndRegion_FR(codePostal) {
var cp = normPostal(codePostal);
if (!/^\d{5}$/.test(cp)) return null;
// DOM/COM : 97x / 98x -> "département" sur 3 chiffres (971, 972, ...)
var d3 = cp.substring(0, 3);
if (d3 in deptToRegion) {
return { departement: d3, region: deptToRegion[d3] };
}
// Corse : CP 20000–20199 => 2A, 20200–20620 => 2B (règle pratique) :contentReference[oaicite:6]{index=6}
if (cp.substring(0, 2) === '20') {
var n = parseInt(cp, 10);
var dep = (n <= 20199) ? '2A' : '2B';
return { departement: dep, region: deptToRegion[dep] || '' };
}
// Métropole : 2 premiers chiffres
var d2 = cp.substring(0, 2);
return { departement: d2, region: deptToRegion[d2] || '' };
}
// Récupération robuste d’un champ PageForms (marche pour Maison[Code_postal], Association[Code_postal], etc.)
function findField($root, fieldName) {
// 1) cas standard : name="Template[Champ]"
var $f = $root.find('[name$="[' + fieldName + ']"]').first();
if ($f.length) return $f;
// 2) fallback : id contient le nom de champ (PageForms fait souvent input_XXX_Champ)
$f = $root.find('[id*="' + fieldName + '"]').first();
if ($f.length) return $f;
return $(); // vide
}
function setIfAllowed($field, value) {
if (!$field || !$field.length) return;
var el = $field.get(0);
// si l’utilisateur a déjà saisi quelque chose et que ce n’est pas marqué "autofill", on n’écrase pas
var already = normStr(el.value);
var wasAuto = $field.data('eiAutofill') === 1;
if (already !== '' && !wasAuto) return;
if (normStr(value) !== already) {
el.value = value;
$field.data('eiAutofill', 1);
$field.trigger('change');
}
}
function clearAutofillMark($field) {
if ($field && $field.length) $field.data('eiAutofill', 0);
}
function updateForOneForm($scope) {
var $pays = findField($scope, 'Pays');
var $cp = findField($scope, 'Code_postal');
var $dep = findField($scope, 'Departement');
var $reg = findField($scope, 'Region');
if ((!$pays.length) && (!$cp.length)) return;
var paysRaw = $pays.length ? $pays.val() : '';
var bucket = countryBucket(paysRaw);
if (bucket !== 'France') {
// Hors France : Région = bucket, Département vidé
setIfAllowed($reg, bucket);
if ($dep.length) setIfAllowed($dep, '');
return;
}
// France : calcul depuis CP
var cp = $cp.length ? $cp.val() : '';
var res = computeDeptAndRegion_FR(cp);
if (!res) {
// CP invalide : on ne force rien (et on “déverrouille” l’autofill)
clearAutofillMark($dep);
clearAutofillMark($reg);
return;
}
if ($dep.length) setIfAllowed($dep, res.departement);
setIfAllowed($reg, res.region);
}
function attachHandlers($content) {
// On vise les formulaires PageForms présents dans le contenu
var $forms = $content.find('form');
if (!$forms.length) return;
// Événements délégués (évite les doublons si PageForms recharge partiellement)
$(document).off('change.eiRegionDept keyup.eiRegionDept blur.eiRegionDept');
$(document).on('change.eiRegionDept keyup.eiRegionDept blur.eiRegionDept',
'[name$="[Pays]"], [name$="[Code_postal]"]',
function () {
// On remonte au form courant
var $form = $(this).closest('form');
updateForOneForm($form);
}
);
// Premier calcul au chargement (si CP déjà rempli)
$forms.each(function () {
updateForOneForm($(this));
});
}
mw.hook('wikipage.content').add(function ($content) {
if (!isPageFormsEdit()) return;
attachHandlers($content);
});
})();