Skip to content
Snippets Groups Projects
main.js 7.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • RABEHI AMIRA p2312013's avatar
    RABEHI AMIRA p2312013 committed
    /**
    * Template Name: Bootslander
    * Template URL: https://bootstrapmade.com/bootslander-free-bootstrap-landing-page-template/
    * Updated: Mar 17 2024 with Bootstrap v5.3.3
    * Author: BootstrapMade.com
    * License: https://bootstrapmade.com/license/
    */
    
    (function() {
      "use strict";
    
      /**
       * Easy selector helper function
       */
      const select = (el, all = false) => {
        el = el.trim()
        if (all) {
          return [...document.querySelectorAll(el)]
        } else {
          return document.querySelector(el)
        }
      }
    
      /**
       * Easy event listener function
       */
      const on = (type, el, listener, all = false) => {
        let selectEl = select(el, all)
        if (selectEl) {
          if (all) {
            selectEl.forEach(e => e.addEventListener(type, listener))
          } else {
            selectEl.addEventListener(type, listener)
          }
        }
      }
    
      /**
       * Easy on scroll event listener 
       */
      const onscroll = (el, listener) => {
        el.addEventListener('scroll', listener)
      }
    
      /**
       * Navbar links active state on scroll
       */
      let navbarlinks = select('#navbar .scrollto', true)
      const navbarlinksActive = () => {
        let position = window.scrollY + 200
        navbarlinks.forEach(navbarlink => {
          if (!navbarlink.hash) return
          let section = select(navbarlink.hash)
          if (!section) return
          if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) {
            navbarlink.classList.add('active')
          } else {
            navbarlink.classList.remove('active')
          }
        })
      }
      window.addEventListener('load', navbarlinksActive)
      onscroll(document, navbarlinksActive)
    
      /**
       * Scrolls to an element with header offset
       */
      const scrollto = (el) => {
        let header = select('#header')
        let offset = header.offsetHeight
    
        if (!header.classList.contains('header-scrolled')) {
          offset -= 20
        }
    
        let elementPos = select(el).offsetTop
        window.scrollTo({
          top: elementPos - offset,
          behavior: 'smooth'
        })
      }
    
      /**
       * Toggle .header-scrolled class to #header when page is scrolled
       */
      let selectHeader = select('#header')
      if (selectHeader) {
        const headerScrolled = () => {
          if (window.scrollY > 100) {
            selectHeader.classList.add('header-scrolled')
          } else {
            selectHeader.classList.remove('header-scrolled')
          }
        }
        window.addEventListener('load', headerScrolled)
        onscroll(document, headerScrolled)
      }
    
      /**
       * Back to top button
       */
      let backtotop = select('.back-to-top')
      if (backtotop) {
        const toggleBacktotop = () => {
          if (window.scrollY > 100) {
            backtotop.classList.add('active')
          } else {
            backtotop.classList.remove('active')
          }
        }
        window.addEventListener('load', toggleBacktotop)
        onscroll(document, toggleBacktotop)
      }
    
      /**
       * Mobile nav toggle
       */
      on('click', '.mobile-nav-toggle', function(e) {
        select('#navbar').classList.toggle('navbar-mobile')
        this.classList.toggle('bi-list')
        this.classList.toggle('bi-x')
      })
    
      /**
       * Mobile nav dropdowns activate
       */
      on('click', '.navbar .dropdown > a', function(e) {
        if (select('#navbar').classList.contains('navbar-mobile')) {
          e.preventDefault()
          this.nextElementSibling.classList.toggle('dropdown-active')
        }
      }, true)
    
      /**
       * Scrool with ofset on links with a class name .scrollto
       */
      on('click', '.scrollto', function(e) {
        if (select(this.hash)) {
          e.preventDefault()
    
          let navbar = select('#navbar')
          if (navbar.classList.contains('navbar-mobile')) {
            navbar.classList.remove('navbar-mobile')
            let navbarToggle = select('.mobile-nav-toggle')
            navbarToggle.classList.toggle('bi-list')
            navbarToggle.classList.toggle('bi-x')
          }
          scrollto(this.hash)
        }
      }, true)
    
      /**
       * Scroll with ofset on page load with hash links in the url
       */
      window.addEventListener('load', () => {
        if (window.location.hash) {
          if (select(window.location.hash)) {
            scrollto(window.location.hash)
          }
        }
      });
    
      /**
       * Preloader
       */
      let preloader = select('#preloader');
      if (preloader) {
        window.addEventListener('load', () => {
          preloader.remove()
        });
      }
    
      /**
       * Initiate glightbox
       */
      const glightbox = GLightbox({
        selector: '.glightbox'
      });
    
      /**
       * Initiate gallery lightbox 
       */
      const galleryLightbox = GLightbox({
        selector: '.gallery-lightbox'
      });
    
      /**
       * Testimonials slider
       */
      new Swiper('.testimonials-slider', {
        speed: 600,
        loop: true,
        autoplay: {
          delay: 5000,
          disableOnInteraction: false
        },
        slidesPerView: 'auto',
        pagination: {
          el: '.swiper-pagination',
          type: 'bullets',
          clickable: true
        }
      });
    
      /**
       * Animation on scroll
       */
      window.addEventListener('load', () => {
        AOS.init({
          duration: 1000,
          easing: 'ease-in-out',
          once: true,
          mirror: false
        })
      });
    
      /**
       * Initiate Pure Counter 
       */
      new PureCounter();
    
    })()
    
    function prepareDataForCharts(categoryData) {
      var chartData = {};
      Object.keys(categoryData).forEach(function(category) {
          chartData[category] = {
              labels: [],
              data: [],
              backgroundColor: [],
              borderColor: []
          };
          var colorPalette = [
            'rgba(52, 78, 65, 1)', // #344E41
            'rgba(58, 90, 64, 1)', // #3A5A40
            'rgba(88, 129, 87, 1)', // #588157
            'rgba(90, 159, 104, 1)', // #5A9F68
            'rgba(62, 130, 65, 1)', // #3E8241
            'rgba(187, 213, 142, 1)', // #BBD58E
            'rgba(75, 111, 68, 1)', // #4B6F44
            'rgba(101, 140, 89, 1)',// #658A59
            'rgba(130, 167, 102, 1)', // #82A766 
            'rgba(168, 192, 120, 1)', // #A8C078 
          ];
    
          categoryData[category].forEach(function(typage, index) {
              chartData[category].labels.push(typage[0]);
              chartData[category].data.push(typage[1]);
              chartData[category].backgroundColor.push(colorPalette[index % colorPalette.length]);
              chartData[category].borderColor.push(colorPalette[index % colorPalette.length]);
          });
      });
      return chartData;
    }
    
    /**
     * Generate graphs
     */
    function generateCharts(categoryData) {
      var chartData = prepareDataForCharts(categoryData);
      Object.keys(chartData).forEach(function(category, index) {
          var canvasId = 'myChart' + (index + 1);
          var ctx = document.getElementById(canvasId).getContext('2d');
          var myChart = new Chart(ctx, {
              type: 'doughnut',
              data: {
                  labels: chartData[category].labels,
                  datasets: [{
                      label: 'Empreinte Carbone',
                      data: chartData[category].data,
                      backgroundColor: chartData[category].backgroundColor,
                      borderColor: chartData[category].borderColor,
                      borderWidth: 1
                  }]
              },
              options: {
                  scales: {
                      y: {
                          display: false
                      }
                  },
                  plugins: {
                      legend: {
                          display: true,
                          position: 'top'
                      }
                  }
              }
          });
      });
    }
    
    document.addEventListener('DOMContentLoaded', function() {
      fetch('http://localhost:8000/get_category_avg_carbon_footprint')
          .then(response => response.json())
          .then(categoryData => {
              generateCharts(categoryData);
          })
          .catch(error => console.error('Erreur lors de la récupération des données:', error));
    });