/** * Theme: Jidox - Responsive Bootstrap 5 Admin Dashboard * Author: Coderthemes * Module/App: Main Js */ (function ($) { 'use strict'; // Bootstrap Components function initComponents() { // loader - Preloader $(window).on('load', function () { $('#status').fadeOut(); $('#preloader').delay(350).fadeOut('slow'); }); // Popovers const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]') const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)) // Tooltips const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) // offcanvas const offcanvasElementList = document.querySelectorAll('.offcanvas') const offcanvasList = [...offcanvasElementList].map(offcanvasEl => new bootstrap.Offcanvas(offcanvasEl)) //Toasts var toastPlacement = document.getElementById("toastPlacement"); if (toastPlacement) { document.getElementById("selectToastPlacement").addEventListener("change", function () { if (!toastPlacement.dataset.originalClass) { toastPlacement.dataset.originalClass = toastPlacement.className; } toastPlacement.className = toastPlacement.dataset.originalClass + " " + this.value; }); } var toastElList = [].slice.call(document.querySelectorAll('.toast')) var toastList = toastElList.map(function (toastEl) { return new bootstrap.Toast(toastEl) }) // Bootstrap Alert Live Example const alertPlaceholder = document.getElementById('liveAlertPlaceholder') const alert = (message, type) => { const wrapper = document.createElement('div') wrapper.innerHTML = [ `' ].join('') alertPlaceholder.append(wrapper) } const alertTrigger = document.getElementById('liveAlertBtn') if (alertTrigger) { alertTrigger.addEventListener('click', () => { alert('Nice, you triggered this alert message!', 'success') }) } // RTL Layout if (document.getElementById('app-style').href.includes('rtl.min.css')) { document.getElementsByTagName('html')[0].dir = "rtl"; } } // Portlet Widget (Card Reload, Collapse, and Delete) function initPortletCard() { var portletIdentifier = ".card" var portletCloser = '.card a[data-bs-toggle="remove"]' var portletRefresher = '.card a[data-bs-toggle="reload"]' let self = this // Panel closest $(document).on("click", portletCloser, function (ev) { ev.preventDefault(); var $portlet = $(this).closest(portletIdentifier); var $portlet_parent = $portlet.parent(); $portlet.remove(); if ($portlet_parent.children().length == 0) { $portlet_parent.remove(); } }); // Panel Reload $(document).on("click", portletRefresher, function (ev) { ev.preventDefault(); var $portlet = $(this).closest(portletIdentifier); // This is just a simulation, nothing is going to be reloaded $portlet.append('
'); var $pd = $portlet.find('.card-disabled'); setTimeout(function () { $pd.fadeOut('fast', function () { $pd.remove(); }); }, 500 + 300 * (Math.random() * 5)); }); } // Multi Dropdown function initMultiDropdown() { $('.dropdown-menu a.dropdown-toggle').on('click', function () { var dropdown = $(this).next('.dropdown-menu'); var otherDropdown = $(this).parent().parent().find('.dropdown-menu').not(dropdown); otherDropdown.removeClass('show') otherDropdown.parent().find('.dropdown-toggle').removeClass('show') return false; }); } // Left Sidebar Menu (Vertical Menu) function initLeftSidebar() { var self = this; if ($(".side-nav").length) { var navCollapse = $('.side-nav li .collapse'); var navToggle = $(".side-nav li [data-bs-toggle='collapse']"); navToggle.on('click', function (e) { return false; }); // open one menu at a time only navCollapse.on({ 'show.bs.collapse': function (event) { var parent = $(event.target).parents('.collapse.show'); $('.side-nav .collapse.show').not(event.target).not(parent).collapse('hide'); } }); // activate the menu in left side bar (Vertical Menu) based on url $(".side-nav a").each(function () { var pageUrl = window.location.href.split(/[?#]/)[0]; if (this.href == pageUrl) { $(this).addClass("active"); $(this).parent().addClass("menuitem-active"); $(this).parent().parent().parent().addClass("show"); $(this).parent().parent().parent().parent().addClass("menuitem-active"); // add active to li of the current link var firstLevelParent = $(this).parent().parent().parent().parent().parent().parent(); if (firstLevelParent.attr('id') !== 'sidebar-menu') firstLevelParent.addClass("show"); $(this).parent().parent().parent().parent().parent().parent().parent().addClass("menuitem-active"); var secondLevelParent = $(this).parent().parent().parent().parent().parent().parent().parent().parent().parent(); if (secondLevelParent.attr('id') !== 'wrapper') secondLevelParent.addClass("show"); var upperLevelParent = $(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent(); if (!upperLevelParent.is('body')) upperLevelParent.addClass("menuitem-active"); } }); setTimeout(function () { var activatedItem = document.querySelector('li.menuitem-active .active'); if (activatedItem != null) { var simplebarContent = document.querySelector('.leftside-menu .simplebar-content-wrapper'); var offset = activatedItem.offsetTop - 300; if (simplebarContent && offset > 100) { scrollTo(simplebarContent, offset, 600); } } }, 200); // scrollTo (Left Side Bar Active Menu) function easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } function scrollTo(element, to, duration) { var start = element.scrollTop, change = to - start, currentTime = 0, increment = 20; var animateScroll = function () { currentTime += increment; var val = easeInOutQuad(currentTime, start, change, duration); element.scrollTop = val; if (currentTime < duration) { setTimeout(animateScroll, increment); } }; animateScroll(); } } } // Topbar Menu (HOrizontal Menu) function initTopbarMenu() { if ($('.navbar-nav').length) { $('.navbar-nav li a').each(function () { var pageUrl = window.location.href.split(/[?#]/)[0]; if (this.href == pageUrl) { $(this).addClass('active'); $(this).parent().parent().addClass('active'); // add active to li of the current link $(this).parent().parent().parent().parent().addClass('active'); $(this).parent().parent().parent().parent().parent().parent().addClass('active'); } }); // Topbar - main menu $('.navbar-toggle').on('click', function () { $(this).toggleClass('open'); $('#navigation').slideToggle(400); }); } } // Topbar Search Form function initSearch() { // Serach Toggle var navDropdowns = $('.navbar-custom .dropdown:not(.app-search)'); // hide on other click $(document).on('click', function (e) { if (e.target.id == "top-search" || e.target.closest('#search-dropdown')) { $('#search-dropdown').addClass('show'); } else { $('#search-dropdown').removeClass('show'); } return true; }); // Serach Toggle $('#top-search').on('focus', function (e) { e.preventDefault(); navDropdowns.children('.dropdown-menu.show').removeClass('show'); $('#search-dropdown').addClass('show'); return false; }); // hide search on opening other dropdown navDropdowns.on('show.bs.dropdown', function () { $('#search-dropdown').removeClass('show'); }); } // Topbar Fullscreen Button function initfullScreenListener() { var self = this; var fullScreenBtn = document.querySelector('[data-toggle="fullscreen"]'); if (fullScreenBtn) { fullScreenBtn.addEventListener('click', function (e) { e.preventDefault(); document.body.classList.toggle('fullscreen-enable') if (!document.fullscreenElement && /* alternative standard method */ !document.mozFullScreenElement && !document.webkitFullscreenElement) { // current working methods if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } } else { if (document.cancelFullScreen) { document.cancelFullScreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } } }); } } // Show/Hide Password function initShowHidePassword() { $("[data-password]").on('click', function () { if ($(this).attr('data-password') == "false") { $(this).siblings("input").attr("type", "text"); $(this).attr('data-password', 'true'); $(this).addClass("show-password"); } else { $(this).siblings("input").attr("type", "password"); $(this).attr('data-password', 'false'); $(this).removeClass("show-password"); } }); } // Form Validation function initFormValidation() { // Example starter JavaScript for disabling form submissions if there are invalid fields // Fetch all the forms we want to apply custom Bootstrap validation styles to // Loop over them and prevent submission document.querySelectorAll('.needs-validation').forEach(form => { form.addEventListener('submit', event => { if (!form.checkValidity()) { event.preventDefault() event.stopPropagation() } form.classList.add('was-validated') }, false) }) } // Form Advance function initFormAdvance() { // Select2 if (jQuery().select2) { $('[data-toggle="select2"]').select2(); } // Input Mask if (jQuery().mask) { $('[data-toggle="input-mask"]').each(function (idx, obj) { var maskFormat = $(obj).data("maskFormat"); var reverse = $(obj).data("reverse"); if (reverse != null) $(obj).mask(maskFormat, { 'reverse': reverse }); else $(obj).mask(maskFormat); }); } // Bootstrap Touchspin if (jQuery().TouchSpin) { var defaultOptions = { }; $('[data-toggle="touchspin"]').each(function (idx, obj) { var objOptions = $.extend({}, defaultOptions, $(obj).data()); $(obj).TouchSpin(objOptions); }); } // Bootstrap Maxlength if (jQuery().maxlength) { var defaultOptions = { warningClass: "badge bg-success", limitReachedClass: "badge bg-danger", separator: ' out of ', preText: 'You typed ', postText: ' chars available.', placement: 'bottom', }; $('[data-toggle="maxlength"]').each(function (idx, obj) { var objOptions = $.extend({}, defaultOptions, $(obj).data()); $(obj).maxlength(objOptions); }); } } function init() { initComponents(); initPortletCard(); initMultiDropdown(); initLeftSidebar() initTopbarMenu(); initSearch(); initfullScreenListener(); initShowHidePassword(); initFormValidation(); initFormAdvance(); } init(); })(jQuery) /** * Theme: Jidox - Responsive Bootstrap 5 Admin Dashboard * Author: Coderthemes * Module/App: Layout Js */ class ThemeCustomizer { constructor() { this.html = document.getElementsByTagName('html')[0] this.config = {}; this.defaultConfig = window.config; } initConfig() { this.defaultConfig = JSON.parse(JSON.stringify(window.defaultConfig)); this.config = JSON.parse(JSON.stringify(window.config)); this.setSwitchFromConfig(); } changeMenuColor(color) { this.config.menu.color = color; this.html.setAttribute('data-menu-color', color); this.setSwitchFromConfig(); } changeLeftbarSize(size, save = true) { this.html.setAttribute('data-sidenav-size', size); if (save) { this.config.sidenav.size = size; this.setSwitchFromConfig(); } } changeLayoutMode(mode, save = true) { this.html.setAttribute('data-layout-mode', mode); if (save) { this.config.layout.mode = mode; this.setSwitchFromConfig(); } } changeLayoutPosition(position) { this.config.layout.position = position; this.html.setAttribute('data-layout-position', position); this.setSwitchFromConfig(); } changeLayoutColor(color) { this.config.theme = color; this.html.setAttribute('data-bs-theme', color); this.setSwitchFromConfig(); } changeTopbarColor(color) { this.config.topbar.color = color; this.html.setAttribute('data-topbar-color', color); this.setSwitchFromConfig(); } changeSidebarUser(showUser) { this.config.sidenav.user = showUser; if (showUser) { this.html.setAttribute('data-sidenav-user', showUser); } else { this.html.removeAttribute('data-sidenav-user'); } this.setSwitchFromConfig(); } resetTheme() { this.config = JSON.parse(JSON.stringify(window.defaultConfig)); this.changeMenuColor(this.config.menu.color); this.changeLeftbarSize(this.config.sidenav.size); this.changeLayoutColor(this.config.theme); this.changeLayoutMode(this.config.layout.mode); this.changeLayoutPosition(this.config.layout.position); this.changeTopbarColor(this.config.topbar.color); this.changeSidebarUser(this.config.sidenav.user); this._adjustLayout(); } initSwitchListener() { var self = this; document.querySelectorAll('input[name=data-menu-color]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeMenuColor(element.value); }) }); document.querySelectorAll('input[name=data-sidenav-size]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeLeftbarSize(element.value); }) }); document.querySelectorAll('input[name=data-bs-theme]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeLayoutColor(element.value); }) }); document.querySelectorAll('input[name=data-layout-mode]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeLayoutMode(element.value); }) }); document.querySelectorAll('input[name=data-layout-position]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeLayoutPosition(element.value); }) }); document.querySelectorAll('input[name=data-layout]').forEach(function (element) { element.addEventListener('change', function (e) { window.location = element.value === 'horizontal' ? '/layouts-horizontal' : '/' }) }); document.querySelectorAll('input[name=data-topbar-color]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeTopbarColor(element.value); }) }); document.querySelectorAll('input[name=sidebar-user]').forEach(function (element) { element.addEventListener('change', function (e) { self.changeSidebarUser(element.checked); }) }); //TopBar Light Dark var themeColorToggle = document.getElementById('light-dark-mode'); if (themeColorToggle) { themeColorToggle.addEventListener('click', function (e) { if (self.config.theme === 'light') { self.changeLayoutColor('dark'); } else { self.changeLayoutColor('light'); } }); } var resetBtn = document.querySelector('#reset-layout') if (resetBtn) { resetBtn.addEventListener('click', function (e) { self.resetTheme(); }); } var menuToggleBtn = document.querySelector('.button-toggle-menu'); if (menuToggleBtn) { menuToggleBtn.addEventListener('click', function () { var configSize = self.config.sidenav.size; var size = self.html.getAttribute('data-sidenav-size', configSize); if (size === 'full') { self.showBackdrop(); } else { if (configSize == 'fullscreen') { if (size === 'fullscreen') { self.changeLeftbarSize(configSize == 'fullscreen' ? 'default' : configSize, false); } else { self.changeLeftbarSize('fullscreen', false); } } else { if (size === 'condensed') { self.changeLeftbarSize(configSize == 'condensed' ? 'default' : configSize, false); } else { self.changeLeftbarSize('condensed', false); } } } // Todo: old implementation self.html.classList.toggle('sidebar-enable'); }); } var menuCloseBtn = document.querySelector('.button-close-fullsidebar'); if (menuCloseBtn) { menuCloseBtn.addEventListener('click', function () { self.html.classList.remove('sidebar-enable'); self.hideBackdrop(); }); } var hoverBtn = document.querySelectorAll('.button-sm-hover'); hoverBtn.forEach(function (element) { element.addEventListener('click', function () { var configSize = self.config.sidenav.size; var size = self.html.getAttribute('data-sidenav-size', configSize); if (size === 'sm-hover-active') { self.changeLeftbarSize('sm-hover', false); } else { self.changeLeftbarSize('sm-hover-active', false); } }); }) } showBackdrop() { const backdrop = document.createElement('div'); backdrop.id = 'custom-backdrop'; backdrop.classList = 'offcanvas-backdrop fade show'; document.body.appendChild(backdrop); document.body.style.overflow = "hidden"; if (window.innerWidth > 767) { document.body.style.paddingRight = "15px"; } const self = this backdrop.addEventListener('click', function (e) { self.html.classList.remove('sidebar-enable'); self.hideBackdrop(); }) } hideBackdrop() { var backdrop = document.getElementById('custom-backdrop'); if (backdrop) { document.body.removeChild(backdrop); document.body.style.overflow = null; document.body.style.paddingRight = null; } } initWindowSize() { var self = this; window.addEventListener('resize', function (e) { self._adjustLayout(); }) } _adjustLayout() { var self = this; if (window.innerWidth <= 767.98) { self.changeLeftbarSize('full', false); } else if (window.innerWidth >= 767 && window.innerWidth <= 1140) { if (self.config.sidenav.size !== 'full' && self.config.sidenav.size !== 'fullscreen') { if (self.config.sidenav.size === 'sm-hover') { self.changeLeftbarSize('condensed'); } else { self.changeLeftbarSize('condensed', false); } } } else { self.changeLeftbarSize(self.config.sidenav.size); self.changeLayoutMode(self.config.layout.mode); } } setSwitchFromConfig() { sessionStorage.setItem('__CONFIG__', JSON.stringify(this.config)); // localStorage.setItem('__CONFIG__', JSON.stringify(this.config)); document.querySelectorAll('#theme-settings-offcanvas input[type=checkbox]').forEach(function (checkbox) { checkbox.checked = false; }) var config = this.config; if (config) { var layoutNavSwitch = document.querySelector('input[type=checkbox][name=data-layout][value=' + config.nav + ']'); var layoutColorSwitch = document.querySelector('input[type=checkbox][name=data-bs-theme][value=' + config.theme + ']'); var layoutModeSwitch = document.querySelector('input[type=checkbox][name=data-layout-mode][value=' + config.layout.mode + ']'); var topbarColorSwitch = document.querySelector('input[type=checkbox][name=data-topbar-color][value=' + config.topbar.color + ']'); var menuColorSwitch = document.querySelector('input[type=checkbox][name=data-menu-color][value=' + config.menu.color + ']'); var leftbarSizeSwitch = document.querySelector('input[type=checkbox][name=data-sidenav-size][value=' + config.sidenav.size + ']'); var layoutPositionSwitch = document.querySelector('input[type=radio][name=data-layout-position][value=' + config.layout.position + ']'); var sidebarUserSwitch = document.querySelector('input[type=checkbox][name=sidebar-user]'); if (layoutNavSwitch) layoutNavSwitch.checked = true; if (layoutColorSwitch) layoutColorSwitch.checked = true; if (layoutModeSwitch) layoutModeSwitch.checked = true; if (topbarColorSwitch) topbarColorSwitch.checked = true; if (menuColorSwitch) menuColorSwitch.checked = true; if (leftbarSizeSwitch) leftbarSizeSwitch.checked = true; if (layoutPositionSwitch) layoutPositionSwitch.checked = true; if (sidebarUserSwitch && config.sidenav.user.toString() === "true") sidebarUserSwitch.checked = true; } } init() { this.initConfig(); this.initSwitchListener(); this.initWindowSize(); this._adjustLayout(); this.setSwitchFromConfig(); } } new ThemeCustomizer().init();