| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 | //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();    });});
 |