PageSourceSearch

https://abonnement.lardennais.fr/sites/all/themes/pcg/js/toggle.js?v=1.12

js lardennais.fr collected 2026-10-02 03:46:58 UTC 5,174 bytes, 118 lines download raw bytes

1// Toggle Element
2import { config } from './config.js';
3import { log } from './function/log.js';
4
5
6const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
7
8// Ex: <div data-target=".element"></div>
9const toggle = () => {
10  log('data', 'component toggle', 'init');
11
12  let cssClass = '-is-toggle';
13  let cssClassSlide = '-is-toggle-slide';
14  let toggles = document.querySelectorAll('[data-toggle], .js-toggle');
15
16  toggles.forEach(toggle => {
17    toggle.addEventListener('click', function (e) {
18      e.preventDefault();
19      e.stopPropagation();
20     // console.log(toggle);
21      let cible = (toggle.dataset.target) ? toggle.dataset.target : config.toggle[toggle.id];
22      let name = cible.replace(/\.|#/i, '');
23      // let name = toggle.dataset.toggle;
24      let element = document.querySelector(cible);
25      let childrenElementWithToggle = document.querySelector(cible + " ." + cssClass);
26      let childrenBtnClick = document.querySelector(cible + " .-is-click");
27
28      // Si la cible contient la class is-toggle, on retire toutes les class
29      if (element.classList.contains(cssClass)) {
30
31        element.classList.remove(cssClass);
32        config.body.classList.remove('-is-toggle-' + name);
33        // document.removeEventListener('click', outsideClickListener);
34        toggle.classList.remove('-is-click');
35
36        // on ferme aussi les enfants
37        if(childrenElementWithToggle) {
38          childrenBtnClick.classList.remove('-is-click');
39          childrenElementWithToggle.classList.remove(cssClass);
40        }
41
42        // si il contient la classe slide, on l'enlève et on remet le height à 0
43        if(element.classList.contains(cssClassSlide)) {
44          element.classList.remove(cssClassSlide);
45          element.style.height = `0`;
46        }
47        // Sinon si la cible ne contient pas la class is-toggle, on l'ajoute
48      } else {
49        toggle.classList.add('-is-click');
50        // Mais on retire au préalable la class du body d'un menu toggle préalablement ouvert.
51        let bodyElem = document.querySelector('body');
52        for (let i = bodyElem.classList.length - 1; i >= 0; i--) {
53          const className = bodyElem.classList[i];
54          if (className.startsWith('-is-toggle-')) {
55            bodyElem.classList.remove(className);
56          }
57        }
58
59        let isToggleElements = document.querySelectorAll('.-is-toggle');
60        // Et on retire également la class is-toggle d'autres éléments ouverts.
61        if(!toggle.dataset.allvisible || toggle.dataset.allvisible != "visible") {
62          isToggleElements.forEach(function (element){
63            element.classList.remove(cssClass);
64          });
65        }
66
67        // on ajoute la classe à l'élément cible et au body
68        element.classList.add(cssClass);
69        config.body.classList.add('-is-toggle-' + name);
70
71        // Si le bouton contient data animation="slide", on ajoute une classe -is-toggle-sllide
72        // et on récupère la hauteur et on l'ajoute à l'élément cible
73        if(toggle.dataset.animation && toggle.dataset.animation == "slide") {
74          element.style.height = `${element.scrollHeight}px`;
75          element.classList.add(cssClassSlide);
76        }
77
78        // On supprime les autres class sauf si data-allvisible="visible" est présent sur le bouton
79        if(!toggle.dataset.allvisible || toggle.dataset.allvisible != "visible") {
80          toggles.forEach(item => {
81            if (toggle != item) {
82              let itemCible = item.dataset.target;
83              let itemName = item.dataset.toggle;
84              let elementCible = document.querySelector(itemCible);
85
86              if (elementCible && element != elementCible) {
87                config.body.classList.remove('-is-toggle-' + itemName);
88                elementCible.classList.remove(cssClass);
89              }
90            }
91          });
92        }
93
94        // fermeture au click extérieur
95        /** En rajoutant un data-outside="no-close" sur le bouton, le clic extérieur ne ferme plus le bloc ouvert
96         * -> à condition qu'il n'y ai pas de background transparent avec les data de fermeture dessus */
97        if(!toggle.dataset.outside || toggle.dataset.outside != "no-close" ) { // si il n'a pas de data-outside no-close alors on ferme lorsque l'on clique à l'exterieur de element
98          document.addEventListener('click', function outsideClickListener(e){
99
100            // log('data', 'component toggle', 'fermeture', e.target, config.body.classList);
101            if (element && !element.contains(e.target) && config.body.classList.contains('-is-toggle-' + name)) {
102              e.preventDefault();
103              e.stopPropagation();
104              log('data', 'component toggle', 'fermeture');
105
106              element.classList.remove(cssClass);
107              config.body.classList.remove('-is-toggle-' + name);
108              document.removeEventListener('click', outsideClickListener);
109            }
110
111          });
112        }
113      }
114    });
115  });
116}
117
118toggle();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.