« MediaWiki:Common.js » : différence entre les versions
Apparence
Page créée avec « →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 );... » |
mAucun résumé des modifications |
||
| Ligne 18 : | Ligne 18 : | ||
} | } | ||
} ); | } ); | ||
/* ===================================================================== | |||
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); | |||
}); | |||
})(); | |||
Version du 15 décembre 2025 à 17:29
/* 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);
});
})();