/** * @author v.lugovsky * created on 03.05.2016 */ (function () { 'use strict'; angular.module('BlurAdmin.theme.components') .directive('baSidebarToggleMenu', baSidebarToggleMenu) .directive('baSidebarCollapseMenu', baSidebarCollapseMenu) .directive('baSidebarTogglingItem', baSidebarTogglingItem) .controller('BaSidebarTogglingItemCtrl', BaSidebarTogglingItemCtrl) .directive('baUiSrefTogglingSubmenu', baUiSrefTogglingSubmenu) .directive('baUiSrefToggler', baUiSrefToggler); /** @ngInject */ function baSidebarToggleMenu(baSidebarService) { return { restrict: 'A', link: function(scope, elem) { elem.on('click', function($evt) { $evt.originalEvent.$sidebarEventProcessed = true; scope.$apply(function() { baSidebarService.toggleMenuCollapsed(); }); }); } }; } /** @ngInject */ function baSidebarCollapseMenu(baSidebarService) { return { restrict: 'A', link: function(scope, elem) { elem.on('click', function($evt) { $evt.originalEvent.$sidebarEventProcessed = true; if (!baSidebarService.isMenuCollapsed()) { scope.$apply(function() { baSidebarService.setMenuCollapsed(true); }); } }); } }; } /** @ngInject */ function baSidebarTogglingItem() { return { restrict: 'A', controller: 'BaSidebarTogglingItemCtrl' }; } /** @ngInject */ function BaSidebarTogglingItemCtrl($scope, $element, $attrs, $state, baSidebarService) { var vm = this; var menuItem = vm.$$menuItem = $scope.$eval($attrs.baSidebarTogglingItem); if (menuItem?.subMenu && menuItem.subMenu.length) { vm.$$expandSubmenu = function() { console.warn('$$expandMenu should be overwritten by baUiSrefTogglingSubmenu') }; vm.$$collapseSubmenu = function() { console.warn('$$collapseSubmenu should be overwritten by baUiSrefTogglingSubmenu') }; var subItemsStateRefs = baSidebarService.getAllStateRefsRecursive(menuItem); vm.$expand = function() { vm.$$expandSubmenu(); $element.addClass('ba-sidebar-item-expanded'); }; vm.$collapse = function() { vm.$$collapseSubmenu(); $element.removeClass('ba-sidebar-item-expanded'); }; vm.$toggle = function() { $element.hasClass('ba-sidebar-item-expanded') ? vm.$collapse() : vm.$expand(); }; if (_isState($state.current)) { $element.addClass('ba-sidebar-item-expanded'); } $scope.$on('$stateChangeStart', function (event, toState) { if (!_isState(toState) && $element.hasClass('ba-sidebar-item-expanded')) { vm.$collapse(); $element.removeClass('ba-sidebar-item-expanded'); } }); $scope.$on('$stateChangeSuccess', function (event, toState) { if (_isState(toState) && !$element.hasClass('ba-sidebar-item-expanded')) { vm.$expand(); $element.addClass('ba-sidebar-item-expanded'); } }); } function _isState(state) { return state && subItemsStateRefs.some(function(subItemState) { return state.name.indexOf(subItemState) == 0; }); } } /** @ngInject */ function baUiSrefTogglingSubmenu($state) { return { restrict: 'A', require: '^baSidebarTogglingItem', link: function(scope, el, attrs, baSidebarTogglingItem) { baSidebarTogglingItem.$$expandSubmenu = function() { el.slideDown(); }; baSidebarTogglingItem.$$collapseSubmenu = function() { el.slideUp(); }; } }; } /** @ngInject */ function baUiSrefToggler(baSidebarService) { return { restrict: 'A', require: '^baSidebarTogglingItem', link: function(scope, el, attrs, baSidebarTogglingItem) { el.on('click', function() { if (baSidebarService.isMenuCollapsed()) { // If the whole sidebar is collapsed and this item has submenu. We need to open sidebar. // This should not affect mobiles, because on mobiles sidebar should be hidden at all scope.$apply(function() { baSidebarService.setMenuCollapsed(false); }); baSidebarTogglingItem.$expand(); } else { baSidebarTogglingItem.$toggle(); } }); } }; } })();