Aller au contenu

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

De Éditions Indépendantes
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);
  });

})();