From 4e9ba8ab4ec51572c9987462b6752dd8747518c0 Mon Sep 17 00:00:00 2001 From: esadouski Date: Thu, 22 Sep 2016 02:24:54 +0300 Subject: [PATCH 1/2] Sidebar is built once --- .../components/baSidebar/baSidebar.service.js | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/app/theme/components/baSidebar/baSidebar.service.js b/src/app/theme/components/baSidebar/baSidebar.service.js index 3c19627..8678995 100644 --- a/src/app/theme/components/baSidebar/baSidebar.service.js +++ b/src/app/theme/components/baSidebar/baSidebar.service.js @@ -7,6 +7,7 @@ /** @ngInject */ function baSidebarServiceProvider() { var staticMenuItems = []; + var menuItems = []; this.addStaticItem = function() { staticMenuItems.push.apply(staticMenuItems, arguments); @@ -19,20 +20,15 @@ function _factory() { var isMenuCollapsed = shouldMenuBeCollapsed(); - this.getMenuItems = function() { - var states = defineMenuItemStates(); - var menuItems = states.filter(function(item) { - return item.level == 0; - }); + this.getMenuItems = function () { + if (!menuItems.length) { + menuItems = createMenu(); + } + return menuItems; + }; - menuItems.forEach(function(item) { - var children = states.filter(function(child) { - return child.level == 1 && child.name.indexOf(item.name) === 0; - }); - item.subMenu = children.length ? children : null; - }); - - return menuItems.concat(staticMenuItems); + this.addMenuItem = function(item) { + menuItems.push(item); }; this.shouldMenuBeCollapsed = shouldMenuBeCollapsed; @@ -63,6 +59,32 @@ } }; + function createMenu() { + var parentLevel = 0; + var states = defineMenuItemStates(); + var parents = states.filter(function(item) { + return item.level == parentLevel; + }); + + bindMenuItems(parents, ++parentLevel); + return parents.concat(staticMenuItems); + + function bindMenuItems(parents, childLevel) { + var child = states.filter(function (item) { + return item.level == childLevel; + }); + if (child.length) { + parents.forEach(function (p) { + var children = child.filter(function (c) { + return c.name.indexOf(p.name) === 0; + }); + p.subMenu = children.length ? children : null; + }); + bindMenuItems(child, ++childLevel) + } + } + } + function defineMenuItemStates() { return $state.get() .filter(function(s) { From b03539ab95cebb9205e3e7c3defeb6f6299980ef Mon Sep 17 00:00:00 2001 From: esadouski Date: Sat, 24 Sep 2016 02:23:46 +0300 Subject: [PATCH 2/2] Implemented functional for adding new item --- src/app/pages/pages.module.js | 9 ++++ .../components/baSidebar/baSidebar.service.js | 47 +++++++++++++++---- .../components/baSidebar/baSidebarModel.js | 24 ++++++++++ 3 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 src/app/theme/components/baSidebar/baSidebarModel.js diff --git a/src/app/pages/pages.module.js b/src/app/pages/pages.module.js index ea11f40..86c73b1 100644 --- a/src/app/pages/pages.module.js +++ b/src/app/pages/pages.module.js @@ -24,34 +24,43 @@ $urlRouterProvider.otherwise('/dashboard'); baSidebarServiceProvider.addStaticItem({ + name: 'pages', title: 'Pages', icon: 'ion-document', subMenu: [{ + name: 'pages.signIn', title: 'Sign In', fixedHref: 'auth.html', blank: true }, { + name: 'pages.signUp', title: 'Sign Up', fixedHref: 'reg.html', blank: true }, { + name: 'pages.userProfile', title: 'User Profile', stateRef: 'profile' }, { + name: 'pages.page404', title: '404 Page', fixedHref: '404.html', blank: true }] }); baSidebarServiceProvider.addStaticItem({ + name: 'menuLevel1', title: 'Menu Level 1', icon: 'ion-ios-more', subMenu: [{ + name: 'menuLevel1.menuLevel1.1', title: 'Menu Level 1.1', disabled: true }, { + name: 'menuLevel1.menuLevel1.2', title: 'Menu Level 1.2', subMenu: [{ + name: 'menuLevel1.menuLevel1.2.1', title: 'Menu Level 1.2.1', disabled: true }] diff --git a/src/app/theme/components/baSidebar/baSidebar.service.js b/src/app/theme/components/baSidebar/baSidebar.service.js index 8678995..76b3ff5 100644 --- a/src/app/theme/components/baSidebar/baSidebar.service.js +++ b/src/app/theme/components/baSidebar/baSidebar.service.js @@ -7,28 +7,57 @@ /** @ngInject */ function baSidebarServiceProvider() { var staticMenuItems = []; - var menuItems = []; this.addStaticItem = function() { staticMenuItems.push.apply(staticMenuItems, arguments); }; /** @ngInject */ - this.$get = function($state, layoutSizes) { - return new _factory(); + this.$get = function ($state, layoutSizes, baSidebarModel) { + return new _factory(); function _factory() { var isMenuCollapsed = shouldMenuBeCollapsed(); this.getMenuItems = function () { - if (!menuItems.length) { + var menuItems = baSidebarModel.getMenuItems(); + if (!menuItems) { menuItems = createMenu(); + baSidebarModel.setMenuItems(menuItems); } return menuItems; }; - this.addMenuItem = function(item) { - menuItems.push(item); + this.addMenuItem = function (item) { + var menuItems = baSidebarModel.getMenuItems(); + var parent = null; + _findParent(menuItems, item); + if (parent) { + _addToSubMenu(item); + } else { + menuItems.push(item); + } + + baSidebarModel.setMenuItems(menuItems); + + function _findParent(parents, item) { + parent = parents + .filter(function (p) { + return item.name.indexOf(p.name) === 0; + }) + .pop(); + if (parent && parent.subMenu) { + _findParent(parent.subMenu, item); + } + } + + function _addToSubMenu(item) { + if (parent.subMenu) { + parent.subMenu.push(item); + } else { + parent.subMenu = [item]; + } + } }; this.shouldMenuBeCollapsed = shouldMenuBeCollapsed; @@ -66,10 +95,10 @@ return item.level == parentLevel; }); - bindMenuItems(parents, ++parentLevel); + _bindMenuItems(parents, ++parentLevel); return parents.concat(staticMenuItems); - function bindMenuItems(parents, childLevel) { + function _bindMenuItems(parents, childLevel) { var child = states.filter(function (item) { return item.level == childLevel; }); @@ -80,7 +109,7 @@ }); p.subMenu = children.length ? children : null; }); - bindMenuItems(child, ++childLevel) + _bindMenuItems(child, ++childLevel) } } } diff --git a/src/app/theme/components/baSidebar/baSidebarModel.js b/src/app/theme/components/baSidebar/baSidebarModel.js new file mode 100644 index 0000000..555aa42 --- /dev/null +++ b/src/app/theme/components/baSidebar/baSidebarModel.js @@ -0,0 +1,24 @@ +(function () { + 'use strict'; + + angular.module('BlurAdmin.theme.components') + .factory('baSidebarModel', baSidebarModel); + + /** @ngInject */ + function baSidebarModel() { + var menuItems = null; + + function getMenuItems() { + return menuItems; + } + + function setMenuItems(items) { + menuItems = items; + } + + return { + getMenuItems: getMenuItems, + setMenuItems: setMenuItems + }; + } +})(); \ No newline at end of file