ilscipio/scipio-erp

View on GitHub
themes/bulma/webapp/bulmatheme/src/js/main.js

Summary

Maintainability
A
0 mins
Test Coverage
const $SIDEBAR_COOKIE = 'scpSidebar';
var $SIDEBAR_CLOSED=false;

document.addEventListener('DOMContentLoaded', () => {
    /**
     * Modal
     * */
    // Functions to open and close a modal
    function openModal($el) {
        $el.classList.add('is-active');
    }

    function closeModal($el) {
        $el.classList.remove('is-active');
    }

    function closeAllModals() {
        (document.querySelectorAll('.modal') || []).forEach(($modal) => {
            closeModal($modal);
        });
    }

    // Add a click event on buttons to open a specific modal
    (document.querySelectorAll('.js-modal-trigger') || []).forEach(($trigger) => {
        const modal = $trigger.dataset.target;
        const $target = document.getElementById(modal);

        $trigger.addEventListener('click', () => {
            openModal($target);
        });
    });

    // Add a click event on various child elements to close the parent modal
    (document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button') || []).forEach(($close) => {
        const $target = $close.closest('.modal');

        $close.addEventListener('click', () => {
            closeModal($target);
        });
    });

    // Add a keyboard event to close all modals
    document.addEventListener('keydown', (event) => {
        const e = event || window.event;

        if (e.keyCode === 27) { // Escape key
            closeAllModals();
        }
    });


    /**
     * Burger
     * */
    const $CLASS_ACTIVE = 'is-active';
    const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger,.navbar-apps'), 0);
    $navbarBurgers.forEach( el => {
        el.addEventListener('click', () => {

            // Get the target from the "data-target" attribute
            const target = el.dataset.target;
            const $target = document.getElementById(target);

            // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
            el.classList.toggle($CLASS_ACTIVE);
            $target.classList.toggle($CLASS_ACTIVE);

        });
    });

    /**
     * Sidebar toggle
     * */
    const $sidebarToggle = Array.prototype.slice.call(document.querySelectorAll('.sidebar-toggle'), 0);
    $sidebarToggle.forEach( el => {
        const target = el.dataset.target;
        const $target = document.getElementById(target);
        el.addEventListener('click', () => {
            el.classList.toggle('is-active');
            $target.classList.toggle('is-active')
            $SIDEBAR_CLOSED=$target.classList.contains('is-active');
            setCookie($SIDEBAR_COOKIE,$SIDEBAR_CLOSED,90);
        });
    });

    window.addEventListener("resize", function() {
        $sidebarToggle.forEach( el => {
            const target = el.dataset.target;
            const $target = document.getElementById(target);
            $SIDEBAR_CLOSED=$target.classList.contains('is-active');

            if (document.body.clientWidth > 1023)  {
                if(!$SIDEBAR_CLOSED && $target.classList.contains('is-active')){
                    $target.classList.add('is-active')
                    el.classList.add('is-active');
                }
            } else {
                if($SIDEBAR_CLOSED){
                    $target.classList.remove('is-active')
                    el.classList.remove('is-active');
                }
            }
        })

    });

    //sidebar hover
    const $sidebarMenus = (document.querySelectorAll('aside .menu-list') || []);
    $sidebarMenus.forEach( el => {
        if(el.id !== 'menu_logo'){
            el.addEventListener('mouseover', () => {
                if (!el.classList.contains("is-hovered")) {
                    el.classList.add("is-hovered");
                }
                let pel = el.closest('aside');
                if (!pel.classList.contains("is-hovered")) {
                    pel.classList.add("is-hovered");
                }
            });

            el.addEventListener('mouseout', () => {
                if (el.classList.contains("is-hovered")) {
                    el.classList.remove("is-hovered");
                }
                let pel = el.closest('aside');
                if (pel.classList.contains("is-hovered")) {
                    pel.classList.remove("is-hovered");
                }
            });
        }
    });


    /**
     * Tab
     * */

    let tabsWithContent = function () {
        let tabs = document.querySelectorAll('.tabs li');
        let tabsContent = document.querySelectorAll('.tab-content');

        let deactvateAllTabs = function () {
            tabs.forEach(function (tab) {
                tab.classList.remove('is-active');
            });
        };

        let hideTabsContent = function () {
            tabsContent.forEach(function (tabContent) {
                tabContent.classList.remove('is-active');
            });
        };

        let activateTabsContent = function (tab) {
            tabsContent[getIndex(tab)].classList.add('is-active');
        };

        let getIndex = function (el) {
            return [...el.parentElement.children].indexOf(el);
        };

        tabs.forEach(function (tab) {
            tab.addEventListener('click', function () {
                deactvateAllTabs();
                hideTabsContent();
                tab.classList.add('is-active');
                activateTabsContent(tab);
            });
        })

        if(tabs[0] !== undefined){
            tabs[0].click();
        }
    };

    tabsWithContent();


    /**
     * Notifications
     * */
    (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {
        const $notification = $delete.parentNode;

        $delete.addEventListener('click', () => {
            $notification.parentNode.removeChild($notification);
        });
    });


    /**
     * Notifications
     * */
    (document.querySelectorAll('.fieldgroup-body') || []).forEach(($fieldgrpbody) => {
        const $parent = $fieldgrpbody.parentNode;
        const $legends = Array.prototype.slice.call($parent.querySelectorAll('legend'),0);
        if($legends.length>0){
            const $legend = $legends[0];
            const $icon = $legend.querySelector("i");
            console.log($icon);
            $legend.addEventListener('click', () => {
                $fieldgrpbody.style.display = $fieldgrpbody.style.display === 'none' ? '' : 'none';
                $fieldgrpbody.classList.toggle("is-open");
                $icon.classList.toggle("fa-arrow-right");
                $icon.classList.toggle("fa-arrow-down");
            });
        }
    });

    // Dropdowns

    var $dropdowns = getAll(".dropdown:not(.is-hoverable)");

    if ($dropdowns.length > 0) {
        $dropdowns.forEach(function ($el) {
          $el.addEventListener("click", function (event) {
            event.stopPropagation();
            $el.classList.toggle("is-active");
          });
        });

        document.addEventListener("click", function (event) {
          closeDropdowns();
        });
    }

    function closeDropdowns() {
        $dropdowns.forEach(function ($el) {
          $el.classList.remove("is-active");
        });
    }

});

/**
 * Sidebar
 * */
function openSidebarTab(id){
    var sidebarToggle = Array.prototype.slice.call(document.querySelectorAll('aside .menu-list'), 0);
    sidebarToggle.forEach( em => {
        em.classList.remove('is-open');
    } );
    document.getElementById(id).classList.add("is-open");
}


function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}

// Utils
function getAll(selector) {
    var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
    return Array.prototype.slice.call(parent.querySelectorAll(selector), 0);
}