//visibles = {}; $(function() { //BemsWebApplication.app.navigation.forEach(function (item) //{ // visibles[item._options.id] = ko.observable(false); //}); "use strict"; var self = window.$SideMenu = { currentNavigationId: undefined, currentViewId: ko.observable('Building'), sideMenuSet: {}, selectedNavIndex: ko.observable(-1), sideMenuItems: ko.observableArray([]), isWillShowSideMenu: false, visible: ko.observable(false), height: ko.observable(''), selectedItems: ko.observableArray(), animationConfig: { show: { type: "slide", duration: 500, from: { left: -260, opacity: 1 }, to: { left: 0, opacity: 1 } }, hide: { type: "slide", duration: 300, from: { left: 0, opacity: 1 }, to: { left: -260, opacity: 1 } } }, setNavigationId: function(id) { if (this.currentNavigationId !== id) { // self.configureMenus( id ); } this.currentNavigationId = id; this.isWillShowSideMenu = true; }, getNavigationIdFromViewId: function(viewId) { var isExist = function(array) { return array.some(function(element) { if (element.subMenus) { return isExist(element.subMenus); } if (element.viewId === viewId) { return true; } return false; }); } var navId = null; var index = 0; $.each(this.sideMenuSet, function(name, value) { index++; if (isExist(value)) { navId = name; return false; } }); BWA.config.navigation.forEach(function(item, i) { if (item.id === navId) { index = i; return false; } }); return { index: index, id: navId }; }, setupGroupItemState: function(jElement) { }, // viewId를 입력받아서 해당하는 id의 상단 메뉴와 좌측 메뉴 항목을 // 선택되도록 만드는 함수 // 해당 하는 view가 Shown 이벤트가 발생할 때 반드시 호출해야 한다. showSideMenuIfWill: function(viewId) { viewId = viewId || this.currentViewId(); var loaded = false; if (_.isEmpty(self.sideMenuItems())) { var selectedNavItem = self.getNavigationIdFromViewId(viewId); self.setNavigationId(selectedNavItem.id); self.selectedNavIndex(selectedNavItem.index); self.configureMenus(selectedNavItem.id); //if (_.isUndefined(selectedNavItem.mode) === false) { // BWA.BemsFmsMode.setBemsMode(selectedNavItem.mode === 'bems'); //} loaded = true; } if (self.isWillShowSideMenu) { if (loaded == false) self.configureMenus(self.currentNavigationId); BWA.BemsFmsMode.setNavId(self.currentNavigationId); self.showSideMenu(); //console.log( self.sideMenuItems() ); self.isWillShowSideMenu = false; } self.currentViewId(viewId); var done = false; //var selectedItem = null; //var selectedParentItem = null; //console.log( self.sideMenuItems() ); var selectedItems = null; (function selectItem(array, selectedViewId, parents) { if (_.isUndefined(array)) return; //if( done ) return false; return array.forEach(function(element) { if (element.subMenus) { var newParents = parents.slice(0); newParents.push(element); return selectItem(element.subMenus, selectedViewId, newParents); } if (element.viewId === selectedViewId) { parents.forEach(function(item) { item.isSelected(true); }); selectedItems = parents.slice(0); } else { parents.forEach(function(item) { if (selectedItems) { if (selectedItems.indexOf(item) >= 0) { return true; } } // 주석을 풀면 선택된 후 선택된 다른 메뉴를 collapse 한다. //item.isSelected(true); //item.isSelected(false); }); //} } }); })(self.sideMenuItems(), viewId, []); this.selectedItems(selectedItems); if (_.isNull(selectedItems)) { self.visible(false); } // console.log( selectedItems ); }, toggleSideMenu: function() { self.visible(!self.visible()); //var visible = visibles[currentSideMenuId]; //visible( !visible() ); }, showSideMenu: function() { this.recalulateHeight(); this.visible(true); //isWillShowSideMenu = false; //visibles[id]( true ); }, hideSideMenu: function() { self.visible(false); }, configureMenus: function(navId) { self.sideMenuItems(self.sideMenuSet[navId]); //console.log( self.sideMenuSet[navId] ); }, selectedMenuItemProperties: [], pushSideMenu: function (menuItems) { // 2018 01 19 hcLee -> 메뉴 Show,Hide를 위해 기존의 Menu 속성에 ... (function pushItem(array) { _.each(array, function (element) { $.extend(element, { show: ko.observable(true) }); if (element.subMenus) { return pushItem(element.subMenus); } }); })(menuItems[Object.getOwnPropertyNames(menuItems)[0]]); // .. show 를 추가한다. 2018 01 19 hcLee // menuItems.getOwnPropertyNames()[0]; //selectedMenuItemProperties.clear(); //console.log( Object.getOwnPropertyNames( menuItems ) ); (function pushItem(array, path, pathDepth) { _.each(array, function (element) { if (element.subMenus) { path[pathDepth] = element.title; element.isSelected = ko.observable(false); return pushItem(element.subMenus, path, pathDepth + 1); } else { element.path = path.slice(0, pathDepth); element.link = "$SideMenu.navigate('" + element.viewId + "')"; } }); })(menuItems[Object.getOwnPropertyNames(menuItems)[0]], [], 0); //}); $.extend(self.sideMenuSet, menuItems); }, expandSubMenu: function () { var next = $(this).next(); var parent = next.parent().parent(); //console.log( parent.html() ); //parent.children().each(function(i, item) { // var element = $(item).children()[0]; // element = $(element).next(); // if (element != next) { // if (!element.hasClass('side-menu-collapse')) { // element.addClass('side-menu-collapse'); // } // } //}); var obj = ko.dataFor(this); if (next.hasClass('side-menu-collapse')) { obj.isSelected(true); next.removeClass('side-menu-collapse'); } else { obj.isSelected(false); next.addClass('side-menu-collapse'); } }, recalulateHeight: function() { var height = $('.header_wrap').height(); this.height($(window).height() - height); }, SideMenuShowingAction: function(e) { //this.recalulateHeight(); }, SideMenuHidingAction: function(e) { //$(e.element).children().find('#sideMenu').remove(); }, navigate: function(id) { if (_.isUndefined(id) || id === 'undefined') { utils.toast.show('설정된 화면이 없습니다.', 'error'); return; } BemsWebApplication.app.navigate(id); }, // hashset으로 가지고 있다가 path와 이름을 넘겨준다. 오로지 menuId만 post할 때 필요하다. // CmMenu를 사용하지 않도록 구현한다. getSidemenuHashSet: function() { var navigations = {}; _.each(BWA.config.navigation, function(x) { navigations[x.id] = x.title; }); var menuHashSet = {}; _.each(self.sideMenuSet, function(subMenus, navId) { var navTitleArray = [navigations[navId]]; (function findMenuLeaf(subMenus) { _.each(subMenus, function(menu) { if (_.has(menu, 'subMenus')) { findMenuLeaf(menu.subMenus); } else if (_.isUndefined(menu.viewId) === false) { menuHashSet[menu.viewId] = { Name: menu.title, MenuPath: navTitleArray.concat(menu.path).join('/') }; } }); })(subMenus); }); return menuHashSet; }, getSidemenusForPermission: function() { var navigations = {}; _.each(BWA.config.navigation, function(x) { navigations[x.id] = x.title; }); var menus = []; _.each(self.sideMenuSet, function(subMenus, navId) { var path = [navigations[navId]]; (function findMenuLeaf(subMenus) { _.each(subMenus, function(menu) { if (_.has(menu, 'subMenus')) { findMenuLeaf(menu.subMenus); } else if (_.isUndefined(menu.viewId) === false) { var viewId = menu.viewId; if (menus.some(function(x) { return x.MenuId === viewId; })) { throw new Exception('Same MenuId.'); return; } menus.push({ MenuId: viewId, Name: menu.title, MenuPath: path.concat(menu.path).join('/'), MenuPermission: 7 // 모든 권한 }); } }); })(subMenus); }); return menus; } }; $(window).resize(function(event) { self.recalulateHeight(); }); });