Aller au contenu

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

De Éditions Indépendantes
mAucun résumé des modifications
mAucun résumé des modifications
 
(Une version intermédiaire par le même utilisateur non affichée)
Ligne 26 : Ligne 26 :
(function () {
(function () {
   'use strict';
   'use strict';
  if (window.__eiRegionDeptInstalledV2) return;
  window.__eiRegionDeptInstalledV2 = true;


  if (window.__eiRegionDeptInstalled) return;
   function normStr(s){ return (s || '').toString().trim(); }
  window.__eiRegionDeptInstalled = true;
   function normPostal(cp){ return normStr(cp).replace(/\s+/g,''); }
 
  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) {
   function countryBucket(paysRaw) {
     var pays = normStr(paysRaw).toLowerCase();
     var p = normStr(paysRaw).toLowerCase();
     if (pays === 'france') return 'France';
     if (p === 'france') return 'France';
     if (pays === 'belgique' || pays === 'luxembourg') return 'Benelux';
     if (p === 'belgique' || p === 'luxembourg') return 'Benelux';
     if (pays === 'suisse') return 'Suisse';
     if (p === 'suisse') return 'Suisse';
     if (pays === 'canada') return 'Canada';
     if (p === 'canada') return 'Canada';
    // Ex: "Autre" (valeur de votre dropdown) ou tout autre libellé
     return 'Reste du monde'; // "Autre" compris
     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 = {
   var deptToRegion = {
     '01': 'FR-ARA', '02': 'FR-HDF', '03': 'FR-ARA', '04': 'FR-PAC', '05': 'FR-PAC',
     '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',
    '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',
     '11': 'FR-OCC', '12': 'FR-OCC', '13': 'FR-PAC', '14': 'FR-NOR', '15': 'FR-ARA',
     '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',
    '16': 'FR-NAQ', '17': 'FR-NAQ', '18': 'FR-CVL', '19': 'FR-NAQ', '21': 'FR-BFC',
     '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',
     '22': 'FR-BRE', '23': 'FR-NAQ', '24': 'FR-NAQ', '25': 'FR-BFC', '26': 'FR-ARA',
     '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',
    '27': 'FR-NOR', '28': 'FR-CVL', '29': 'FR-BRE', '2A': 'FR-COR', '2B': 'FR-COR',
     '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',
     '30': 'FR-OCC', '31': 'FR-OCC', '32': 'FR-OCC', '33': 'FR-NAQ', '34': 'FR-OCC',
     '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',
    '35': 'FR-BRE', '36': 'FR-CVL', '37': 'FR-CVL', '38': 'FR-ARA', '39': 'FR-BFC',
     '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',
     '40': 'FR-NAQ', '41': 'FR-CVL', '42': 'FR-ARA', '43': 'FR-ARA', '44': 'FR-PDL',
     '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',
    '45': 'FR-CVL', '46': 'FR-OCC', '47': 'FR-NAQ', '48': 'FR-OCC', '49': 'FR-PDL',
     '90':'FR-BFC','91':'FR-IDF','92':'FR-IDF','93':'FR-IDF','94':'FR-IDF','95':'FR-IDF',
     '50': 'FR-NOR', '51': 'FR-GES', '52': 'FR-GES', '53': 'FR-PDL', '54': 'FR-GES',
     '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'
    '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) {
   function computeFR(cp) {
     var cp = normPostal(codePostal);
     cp = normPostal(cp);
     if (!/^\d{5}$/.test(cp)) return null;
     if (!/^\d{5}$/.test(cp)) return null;


    // DOM/COM : 97x / 98x -> "département" sur 3 chiffres (971, 972, ...)
     var d3 = cp.slice(0,3);
     var d3 = cp.substring(0, 3);
     if (deptToRegion[d3]) return { dep: d3, reg: deptToRegion[d3] };
     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.slice(0,2) === '20') {
     if (cp.substring(0, 2) === '20') {
       var n = parseInt(cp,10);
       var n = parseInt(cp, 10);
       var dep = (n <= 20199) ? '2A' : '2B';
       var dep = (n <= 20199) ? '2A' : '2B';
       return { departement: dep, region: deptToRegion[dep] || '' };
       return { dep: dep, reg: deptToRegion[dep] || '' };
     }
     }


    // Métropole : 2 premiers chiffres
     var d2 = cp.slice(0,2);
     var d2 = cp.substring(0, 2);
     return { dep: d2, reg: deptToRegion[d2] || '' };
     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) {
   function findField($root, fieldName) {
     // 1) cas standard : name="Template[Champ]"
     return $root.find('[name$="[' + fieldName + ']"]').first();
    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)
  function setValue($field, value) {
    $f = $root.find('[id*="' + fieldName + '"]').first();
     if (!$field.length) return;
     if ($f.length) return $f;
     $field.val(value).trigger('change');
 
     return $(); // vide
   }
   }


   function setIfAllowed($field, value) {
   function update($form) {
     if (!$field || !$field.length) return;
     var $pays = findField($form,'Pays');
     var el = $field.get(0);
    var $cp  = findField($form,'Code_postal');
     var $dep  = findField($form,'Departement');
    var $reg  = findField($form,'Region');


     // si l’utilisateur a déjà saisi quelque chose et que ce n’est pas marqué "autofill", on n’écrase pas
     if (!$pays.length && !$cp.length) return;
    var already = normStr(el.value);
    var wasAuto = $field.data('eiAutofill') === 1;


     if (already !== '' && !wasAuto) return;
     var bucket = countryBucket($pays.val());


     if (normStr(value) !== already) {
     if (bucket !== 'France') {
       el.value = value;
       setValue($reg, bucket);
       $field.data('eiAutofill', 1);
       setValue($dep, '');
       $field.trigger('change');
       return;
     }
     }
  }


  function clearAutofillMark($field) {
    var r = computeFR($cp.val());
     if ($field && $field.length) $field.data('eiAutofill', 0);
     if (!r) return;
 
    setValue($dep, r.dep);
    setValue($reg, r.reg);
   }
   }


   function updateForOneForm($scope) {
   mw.hook('wikipage.content').add(function($content){
     var $pays = findField($scope, 'Pays');
     // On cible les formulaires PageForms (Special:FormEdit)
     var $cp = findField($scope, 'Code_postal');
     $content.find('form').each(function(){
    var $dep = findField($scope, 'Departement');
      var $form = $(this);
    var $reg = findField($scope, 'Region');


    if ((!$pays.length) && (!$cp.length)) return;
      // recalcul dès qu’on touche Pays/CP
      $form.on('change keyup blur', '[name$="[Pays]"], [name$="[Code_postal]"]', function(){
        update($form);
      });


    var paysRaw = $pays.length ? $pays.val() : '';
      // recalcul *juste avant* l'enregistrement (le point clé)
    var bucket = countryBucket(paysRaw);
      $form.on('submit', function(){
        update($form);
      });


    if (bucket !== 'France') {
       // 1er calcul si déjà prérempli
       // Hors France : Région = bucket, Département vidé
       update($form);
       setIfAllowed($reg, bucket);
    });
      if ($dep.length) setIfAllowed($dep, '');
  });
      return;
 
    }
})();
 
/* PageForms: préfixe automatique pour Diffuseur/Distributeur (combobox) */
mw.loader.using(['mediawiki.util']).then(function () {


     // France : calcul depuis CP
  function prefixOne($root, prefix) {
     var cp = $cp.length ? $cp.val() : '';
     // PageForms/OOUI: l'input texte est à l'intérieur du widget
    var res = computeDeptAndRegion_FR(cp);
     var $input = $root.find('input[type="text"], input.oo-ui-inputWidget-input').first();
     if (!res) {
     if (!$input.length) return;
      // CP invalide : on ne force rien (et on “déverrouille” l’autofill)
      clearAutofillMark($dep);
      clearAutofillMark($reg);
      return;
    }


     if ($dep.length) setIfAllowed($dep, res.departement);
     var v = ($input.val() || '').trim();
     setIfAllowed($reg, res.region);
     if (!v) return;
  }


  function attachHandlers($content) {
     // Si déjà un namespace (ou interwiki), on ne touche pas.
     // On vise les formulaires PageForms présents dans le contenu
     if (v.includes(':')) return;
     var $forms = $content.find('form');
    if (!$forms.length) return;


    // Événements délégués (évite les doublons si PageForms recharge partiellement)
     $input.val(prefix + v);
     $(document).off('change.eiRegionDept keyup.eiRegionDept blur.eiRegionDept');
  }


     $(document).on('change.eiRegionDept keyup.eiRegionDept blur.eiRegionDept',
  function applyPrefixes() {
      '[name$="[Pays]"], [name$="[Code_postal]"]',
     $('.js-ns-diffuseur').each(function () { prefixOne($(this), 'Diffuseur:'); });
      function () {
    $('.js-ns-distributeur').each(function () { prefixOne($(this), 'Distributeur:'); });
        // On remonte au form courant
  }
        var $form = $(this).closest('form');
        updateForOneForm($form);
      }
    );


     // Premier calcul au chargement (si CP déjà rempli)
  $(function () {
     $forms.each(function () {
     // À la soumission du formulaire PageForms
       updateForOneForm($(this));
     $(document).on('submit', 'form.pfForm, form#pfForm', function () {
       applyPrefixes();
     });
     });
  }


  mw.hook('wikipage.content').add(function ($content) {
    // Et aussi quand on quitte le champ (confort)
    if (!isPageFormsEdit()) return;
    $(document).on('change blur', '.js-ns-diffuseur, .js-ns-distributeur', function () {
     attachHandlers($content);
      applyPrefixes();
     });
   });
   });


})();
});

Dernière version du 16 décembre 2025 à 12:08

/* 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.__eiRegionDeptInstalledV2) return;
  window.__eiRegionDeptInstalledV2 = true;

  function normStr(s){ return (s || '').toString().trim(); }
  function normPostal(cp){ return normStr(cp).replace(/\s+/g,''); }

  function countryBucket(paysRaw) {
    var p = normStr(paysRaw).toLowerCase();
    if (p === 'france') return 'France';
    if (p === 'belgique' || p === 'luxembourg') return 'Benelux';
    if (p === 'suisse') return 'Suisse';
    if (p === 'canada') return 'Canada';
    return 'Reste du monde'; // "Autre" compris
  }

  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',
    '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 computeFR(cp) {
    cp = normPostal(cp);
    if (!/^\d{5}$/.test(cp)) return null;

    var d3 = cp.slice(0,3);
    if (deptToRegion[d3]) return { dep: d3, reg: deptToRegion[d3] };

    if (cp.slice(0,2) === '20') {
      var n = parseInt(cp,10);
      var dep = (n <= 20199) ? '2A' : '2B';
      return { dep: dep, reg: deptToRegion[dep] || '' };
    }

    var d2 = cp.slice(0,2);
    return { dep: d2, reg: deptToRegion[d2] || '' };
  }

  function findField($root, fieldName) {
    return $root.find('[name$="[' + fieldName + ']"]').first();
  }

  function setValue($field, value) {
    if (!$field.length) return;
    $field.val(value).trigger('change');
  }

  function update($form) {
    var $pays = findField($form,'Pays');
    var $cp   = findField($form,'Code_postal');
    var $dep  = findField($form,'Departement');
    var $reg  = findField($form,'Region');

    if (!$pays.length && !$cp.length) return;

    var bucket = countryBucket($pays.val());

    if (bucket !== 'France') {
      setValue($reg, bucket);
      setValue($dep, '');
      return;
    }

    var r = computeFR($cp.val());
    if (!r) return;

    setValue($dep, r.dep);
    setValue($reg, r.reg);
  }

  mw.hook('wikipage.content').add(function($content){
    // On cible les formulaires PageForms (Special:FormEdit)
    $content.find('form').each(function(){
      var $form = $(this);

      // recalcul dès qu’on touche Pays/CP
      $form.on('change keyup blur', '[name$="[Pays]"], [name$="[Code_postal]"]', function(){
        update($form);
      });

      // recalcul *juste avant* l'enregistrement (le point clé)
      $form.on('submit', function(){
        update($form);
      });

      // 1er calcul si déjà prérempli
      update($form);
    });
  });

})();

/* PageForms: préfixe automatique pour Diffuseur/Distributeur (combobox) */
mw.loader.using(['mediawiki.util']).then(function () {

  function prefixOne($root, prefix) {
    // PageForms/OOUI: l'input texte est à l'intérieur du widget
    var $input = $root.find('input[type="text"], input.oo-ui-inputWidget-input').first();
    if (!$input.length) return;

    var v = ($input.val() || '').trim();
    if (!v) return;

    // Si déjà un namespace (ou interwiki), on ne touche pas.
    if (v.includes(':')) return;

    $input.val(prefix + v);
  }

  function applyPrefixes() {
    $('.js-ns-diffuseur').each(function () { prefixOne($(this), 'Diffuseur:'); });
    $('.js-ns-distributeur').each(function () { prefixOne($(this), 'Distributeur:'); });
  }

  $(function () {
    // À la soumission du formulaire PageForms
    $(document).on('submit', 'form.pfForm, form#pfForm', function () {
      applyPrefixes();
    });

    // Et aussi quand on quitte le champ (confort)
    $(document).on('change blur', '.js-ns-diffuseur, .js-ns-distributeur', function () {
      applyPrefixes();
    });
  });

});