/* Template Name: Minton - Responsive Bootstrap 4 Admin Dashboard Author: CoderThemes Website: https://coderthemes.com/ Contact: support@coderthemes.com File: Layouts Js File */ /** * LeftSidebar * @param {*} $ */ !function ($) { 'use strict'; var LeftSidebar = function () { this.body = $('body'), this.window = $(window) }; /** * Reset the theme */ LeftSidebar.prototype._reset = function() { this.body.removeAttr('data-sidebar-color'); this.body.removeAttr('data-sidebar-size'); this.body.removeAttr('data-sidebar-showuser'); }, /** * Changes the color of sidebar * @param {*} color */ LeftSidebar.prototype.changeColor = function(color) { this.body.attr('data-sidebar-color', color); this.parent.updateConfig("sidebar", { "color": color }); }, /** * Changes the size of sidebar * @param {*} size */ LeftSidebar.prototype.changeSize = function(size) { this.body.attr('data-sidebar-size', size); this.parent.updateConfig("sidebar", { "size": size }); }, /** * Toggle User information * @param {*} showUser */ LeftSidebar.prototype.showUser = function(showUser) { this.body.attr('data-sidebar-showuser', showUser); this.parent.updateConfig("sidebar", { "showuser": showUser }); }, /** * Initilizes the menu */ LeftSidebar.prototype.initMenu = function() { var self = this; var layout = $.LayoutThemeApp.getConfig(); var sidebar = $.extend({}, layout ? layout.sidebar: {}); var defaultSidebarSize = sidebar.size ? sidebar.size : 'default'; // resets everything this._reset(); // Left menu collapse $('.button-menu-mobile').on('click', function (event) { event.preventDefault(); var sidebarSize = self.body.attr('data-sidebar-size'); if (self.window.width() >= 993) { if (sidebarSize === 'condensed') { self.changeSize(defaultSidebarSize === 'condensed'? 'default': defaultSidebarSize); } else { self.changeSize('condensed'); } } else { self.changeSize(defaultSidebarSize); self.body.toggleClass('sidebar-enable'); } }); // sidebar - main menu if ($("#side-menu").length) { var navCollapse = $('#side-menu li .collapse'); // open one menu at a time only navCollapse.on({ 'show.bs.collapse': function (event) { var parent = $(event.target).parents('.collapse.show'); $('#side-menu .collapse.show').not(parent).collapse('hide'); } }); // activate the menu in left side bar (Vertical Menu) based on url $("#side-menu 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"); } }); } // handling two columns menu if present var twoColSideNav = $("#two-col-sidenav-main"); if (twoColSideNav.length) { var twoColSideNavItems = $("#two-col-sidenav-main .nav-link"); var sideSubMenus = $(".twocolumn-menu-item"); // showing/displaying tooltip based on screen size if (this.window.width() >= 585) { twoColSideNavItems.tooltip('enable'); } else { twoColSideNavItems.tooltip('disable'); } var nav = $('.twocolumn-menu-item .nav-second-level'); var navCollapse = $('#two-col-menu li .collapse'); // open one menu at a time only navCollapse.on({ 'show.bs.collapse': function () { var nearestNav = $(this).closest(nav).closest(nav).find(navCollapse); if (nearestNav.length) nearestNav.not($(this)).collapse('hide'); else navCollapse.not($(this)).collapse('hide'); } }); twoColSideNavItems.on('click', function (e) { var target = $($(this).attr('href')); if (target.length) { e.preventDefault(); twoColSideNavItems.removeClass('active'); $(this).addClass('active'); sideSubMenus.removeClass("d-block"); target.addClass("d-block"); // showing full sidebar if menu item is clicked $.LayoutThemeApp.leftSidebar.changeSize('default'); return false; } return true; }); // activate menu with no child var pageUrl = window.location.href.split(/[?#]/)[0]; twoColSideNavItems.each(function () { if (this.href == pageUrl) { $(this).addClass('active'); } }); // activate the menu in left side bar (Two column) based on url $("#two-col-menu a").each(function () { 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"); // opening menu var matchingItem = null; var targetEl = '#' + $(this).parents('.twocolumn-menu-item').attr("id"); $("#two-col-sidenav-main .nav-link").each(function () { if ($(this).attr('href') === targetEl) { matchingItem = $(this); } }); if (matchingItem) matchingItem.trigger('click'); } }); } }, /** * Initilize the left sidebar size based on screen size */ LeftSidebar.prototype.initLayout = function() { var self = this; // in case of small size, activate the small menu if ((this.window.width() >= 768 && this.window.width() <= 1028) || this.body.data('keep-enlarged')) { this.changeSize('condensed'); } else { var layout = JSON.parse(this.body.attr('data-layout') ? this.body.attr('data-layout') : '{}'); var sidebar = $.extend({}, layout ? layout.sidebar: {}); var defaultSidebarSize = sidebar && sidebar.size ? sidebar.size : 'default'; var sidebarSize = self.body.attr('data-sidebar-size'); this.changeSize(defaultSidebarSize ? defaultSidebarSize :(sidebarSize ? sidebarSize : 'default')); } }, /** * Initilizes the menu */ LeftSidebar.prototype.init = function() { var self = this; this.initMenu(); this.initLayout(); // on window resize, make menu flipped automatically this.window.on('resize', function (e) { e.preventDefault(); self.initLayout(); }); }, $.LeftSidebar = new LeftSidebar, $.LeftSidebar.Constructor = LeftSidebar }(window.jQuery), /** * Topbar * @param {*} $ */ function ($) { 'use strict'; var Topbar = function () { this.body = $('body'), this.window = $(window) }; /** * Initilizes the menu */ Topbar.prototype.initMenu = function() { // Serach Toggle $('#top-search').on('click', function (e) { $('#search-dropdown').addClass('d-block'); }); // hide search on opening other dropdown $('.topbar-dropdown').on('show.bs.dropdown', function () { $('#search-dropdown').removeClass('d-block'); }); //activate the menu in topbar(horizontal menu) based on url $(".navbar-nav a").each(function () { var pageUrl = window.location.href.split(/[?#]/)[0]; if (this.href == pageUrl) { $(this).addClass("active"); $(this).parent().addClass("active"); $(this).parent().parent().addClass("active"); $(this).parent().parent().parent().addClass("active"); $(this).parent().parent().parent().parent().addClass("active"); var el = $(this).parent().parent().parent().parent().addClass("active").prev(); if (el.hasClass("nav-link")) el.addClass('active'); } }); // Topbar - main menu $('.navbar-toggle').on('click', function (event) { $(this).toggleClass('open'); $('#navigation').slideToggle(400); }); }, /** * Changes the color of topbar * @param {*} color */ Topbar.prototype.changeColor = function(color) { this.body.attr('data-topbar-color', color); this.parent.updateConfig("topbar", { "color": color }); }, /** * Initilizes the menu */ Topbar.prototype.init = function() { this.initMenu(); }, $.Topbar = new Topbar, $.Topbar.Constructor = Topbar }(window.jQuery), /** * RightBar * @param {*} $ */ function ($) { 'use strict'; var RightBar = function () { this.body = $('body'), this.window = $(window) }; /** * Select the option based on saved config */ RightBar.prototype.selectOptionsFromConfig = function() { var self = this; var config = self.layout.getConfig(); if (config) { $('input[type=radio][name=color-scheme-mode][value=' + config.mode + ']').prop('checked', true); $('input[type=radio][name=width][value=' + config.width + ']').prop('checked', true); $('input[type=radio][name=menus-position][value=' + config.menuPosition + ']').prop('checked', true); $('input[type=radio][name=leftsidebar-color][value=' + config.sidebar.color + ']').prop('checked', true); $('input[type=radio][name=leftsidebar-size][value=' + config.sidebar.size + ']').prop('checked', true); $('input[type=checkbox][name=leftsidebar-user]').prop('checked', config.sidebar.showuser); $('input[type=radio][name=topbar-color][value=' + config.topbar.color + ']').prop('checked', true); } }, /** * Toggles the right sidebar */ RightBar.prototype.toggleRightSideBar = function() { var self = this; self.body.toggleClass('right-bar-enabled'); self.selectOptionsFromConfig(); }, /** * Initilizes the right side bar */ RightBar.prototype.init = function() { var self = this; // right side-bar toggle $(document).on('click', '.right-bar-toggle', function () { self.toggleRightSideBar(); }); $(document).on('click', 'body', function (e) { // hiding search bar if($(e.target).closest('#top-search').length !== 1) { $('#search-dropdown').removeClass('d-block'); } if ($(e.target).closest('.right-bar-toggle, .right-bar').length > 0) { return; } if ($(e.target).closest('.left-side-menu, .side-nav').length > 0 || $(e.target).hasClass('button-menu-mobile') || $(e.target).closest('.button-menu-mobile').length > 0) { return; } $('body').removeClass('right-bar-enabled'); $('body').removeClass('sidebar-enable'); return; }); // overall color scheme $('input[type=radio][name=color-scheme-mode]').change(function () { self.layout.changeMode($(this).val()); }); // width mode $('input[type=radio][name=width]').change(function () { self.layout.changeLayoutWidth($(this).val()); }); // menus-position $('input[type=radio][name=menus-position]').change(function () { self.layout.changeMenuPositions($(this).val()); }); // left sidebar color $('input[type=radio][name=leftsidebar-color]').change(function () { self.layout.leftSidebar.changeColor($(this).val()); }); // left sidebar size $('input[type=radio][name=leftsidebar-size]').change(function () { self.layout.leftSidebar.changeSize($(this).val()); }); // left sidebar user information $('input[type=checkbox][name=leftsidebar-user]').change(function (e) { self.layout.leftSidebar.showUser(e.target.checked); }); // topbar $('input[type=radio][name=topbar-color]').change(function () { self.layout.topbar.changeColor($(this).val()); }); // reset $('#resetBtn').on('click', function (e) { e.preventDefault(); // reset to default self.layout.reset(); self.selectOptionsFromConfig(); }); }, $.RightBar = new RightBar, $.RightBar.Constructor = RightBar }(window.jQuery), /** * Layout and theme manager * @param {*} $ */ function ($) { 'use strict'; // Layout and theme manager var LayoutThemeApp = function () { this.body = $('body'), this.window = $(window), this.config = {}, // styles this.defaultBSStyle = $("#bs-default-stylesheet"), this.defaultAppStyle = $("#app-default-stylesheet"), this.darkBSStyle = $("#bs-dark-stylesheet"), this.darkAppStyle = $("#app-dark-stylesheet"); }; /** * Preserves the config in memory */ LayoutThemeApp.prototype._saveConfig = function(newConfig) { this.config = $.extend(this.config, newConfig); // NOTE: You can make ajax call here to save preference on server side or localstorage as well }, /** * Update the config for given config * @param {*} param * @param {*} config */ LayoutThemeApp.prototype.updateConfig = function(param, config) { var newObj = {}; if (typeof config === 'object' && config !== null) { var originalParam = this.config[param]; newObj[param] = $.extend(originalParam, config); } else { newObj[param] = config; } this._saveConfig(newObj); } /** * Loads the config - takes from body if available else uses default one */ LayoutThemeApp.prototype.loadConfig = function() { var bodyConfig = JSON.parse(this.body.attr('data-layout') ? this.body.attr('data-layout') : '{}'); var config = $.extend({}, { mode: "light", width: "fluid", menuPosition: 'fixed', sidebar: { color: "light", size: "default", showuser: false }, topbar: { color: "dark" }, showRightSidebarOnPageLoad: false }); if (bodyConfig) { config = $.extend({}, config, bodyConfig); }; return config; }, /** * Apply the config */ LayoutThemeApp.prototype.applyConfig = function() { // getting the saved config if available this.config = this.loadConfig(); var topbarConfig = $.extend({}, this.config.topbar); var sidebarConfig = $.extend({}, this.config.sidebar); // activate menus this.leftSidebar.init(); this.topbar.init(); this.leftSidebar.parent = this; this.topbar.parent = this; // mode this.changeMode(this.config.mode); // width this.changeLayoutWidth(this.config.width); // menu position this.changeMenuPositions(this.config.menuPosition); // left sidebar this.leftSidebar.changeColor(sidebarConfig.color); this.leftSidebar.changeSize(sidebarConfig.size); this.leftSidebar.showUser(sidebarConfig.showuser); // topbar this.topbar.changeColor(topbarConfig.color); }, /** * Toggle dark or light mode * @param {*} mode */ LayoutThemeApp.prototype.changeMode = function(mode, notChangeSidebar) { // sets the theme switch (mode) { case "dark": { this.defaultBSStyle.attr("disabled", true); this.defaultAppStyle.attr("disabled", true); this.darkBSStyle.attr("disabled", false); this.darkAppStyle.attr("disabled", false); if (notChangeSidebar) this._saveConfig({ mode: mode }); else { this.leftSidebar.changeColor("dark"); this._saveConfig({ mode: mode, sidebar: $.extend({}, this.config.sidebar, { color: 'dark' }) }); } break; } default: { this.defaultBSStyle.attr("disabled", false); this.defaultAppStyle.attr("disabled", false); this.darkBSStyle.attr("disabled", true); this.darkAppStyle.attr("disabled", true); if (notChangeSidebar) this._saveConfig({ mode: mode }); else { this.leftSidebar.changeColor("light"); this._saveConfig({ mode: mode, sidebar: $.extend({}, this.config.sidebar, { color: 'light' }) }); } break; } } this.rightBar.selectOptionsFromConfig(); } /** * Changes the width of layout */ LayoutThemeApp.prototype.changeLayoutWidth = function(width) { switch (width) { case "boxed": { this.body.attr('data-layout-width', 'boxed'); // automatically activating condensed $.LeftSidebar.changeSize("condensed"); this._saveConfig({ width: width }); break; } default: { this.body.attr('data-layout-width', 'fluid'); // automatically activating provided size var bodyConfig = JSON.parse(this.body.attr('data-layout') ? this.body.attr('data-layout') : '{}'); $.LeftSidebar.changeSize(bodyConfig && bodyConfig.sidebar ? bodyConfig.sidebar.size : "default"); this._saveConfig({ width: width }); break; } } this.rightBar.selectOptionsFromConfig(); } /** * Changes menu positions */ LayoutThemeApp.prototype.changeMenuPositions = function(position) { this.body.attr("data-layout-menu-position", position); } /** * Clear out the saved config */ LayoutThemeApp.prototype.clearSavedConfig = function() { this.config = {}; }, /** * Gets the config */ LayoutThemeApp.prototype.getConfig = function() { return this.config; }, /** * Reset to default */ LayoutThemeApp.prototype.reset = function() { this.clearSavedConfig(); this.applyConfig(); }, /** * Init */ LayoutThemeApp.prototype.init = function() { this.leftSidebar = $.LeftSidebar; this.topbar = $.Topbar; this.leftSidebar.parent = this; this.topbar.parent = this; // initilize the menu this.applyConfig(); }, $.LayoutThemeApp = new LayoutThemeApp, $.LayoutThemeApp.Constructor = LayoutThemeApp }(window.jQuery);