public Menu(MenuGroup menu = null) { if (menu == null) { this.MenuRoot = new MenuGroup(); } else { this.MenuRoot = menu; } this.MenuRoot.GroupID = IdentityNext(); }
/// <summary> /// Adds a new menu Group. /// </summary> /// <param name="headGroup">The menu to add the group too</param> /// <param name="searchExpression">Where to add the group</param> /// <param name="menuGroupToAdd">The group to add</param> /// <returns>The menu that was added</returns> public MenuGroup AddMenuGroup(MenuGroup headGroup, Expression<Func<MenuGroup, bool>> searchExpression, MenuGroup menuGroupToAdd) { // Compiling the expression tree into a delegate. Func<MenuGroup, bool> expressionResult = searchExpression.Compile(); if (headGroup == null) { return null; } if (expressionResult(headGroup)) { menuGroupToAdd.GroupID = IdentityNext(); headGroup.MenuSubGroups.Add(menuGroupToAdd); headGroup.MenuSubGroups = headGroup.MenuSubGroups.OrderBy(x => x.GroupSortOrder).ThenBy(x => x.GroupName).ToList<MenuGroup>(); return menuGroupToAdd; } foreach (MenuGroup item in headGroup.MenuSubGroups) { MenuGroup result = AddMenuGroup(item, searchExpression, menuGroupToAdd); if (result != null) { return result; } } return null; }
private void RenderHTML(MenuGroup menuToRender, ref bool active, ref int parentGroupID, List<int> allChildGroups, ref int groupOfActiveTag) { bool showActiveTag = false; if (menuToRender.GroupID != 1 && !menuToRender.HideGroupOnTheMenu) { MenuHTMLPartsRender.Add(new MenuHTMLRender() { GroupID = menuToRender.GroupID, IsHead = true, HTMLBody = RenderMenuGroupHead(menuToRender) }); } //Assign new parent group parentGroupID = menuToRender.GroupID; //Get all group items if (menuToRender.MenuSubGroups.Count > 0) { allChildGroups = menuToRender.MenuSubGroups.Select<MenuGroup, int>(x => x.GroupID).ToList<int>(); } //Render the menu items foreach (var item in menuToRender.MenuItems) { item.IsActive = IsMenuItemActive(item); ; MenuHTMLPartsRender.Add(new MenuHTMLRender() { GroupID = menuToRender.GroupID, IsHead = false, HTMLBody = RenderListItem(item, menuToRender.HideGroupOnTheMenu) }); if (item.IsActive) { groupOfActiveTag = menuToRender.GroupID; } if (!active && item.IsActive) { active = true; } } if (parentGroupID == 1) { active = false; } //Render the subgroups foreach (MenuGroup item in menuToRender.MenuSubGroups) { RenderHTML(item, ref active, ref parentGroupID, allChildGroups, ref groupOfActiveTag); } if (menuToRender.GroupID == groupOfActiveTag) { showActiveTag = true; groupOfActiveTag = menuToRender.GroupID; } if (active && parentGroupID == 1) { showActiveTag = true; } if (active && !allChildGroups.Contains(menuToRender.GroupID) && allChildGroups.Contains(groupOfActiveTag)) { showActiveTag = true; groupOfActiveTag = menuToRender.GroupID; } //Render group setup if (menuToRender.GroupID != 1 && !menuToRender.HideGroupOnTheMenu) { //render new header tag if the selected menu item was in the group if (showActiveTag) { int indexOfHeadElement = MenuHTMLPartsRender.FindIndex(x => x.GroupID == menuToRender.GroupID && x.IsHead); MenuHTMLPartsRender.RemoveAt(indexOfHeadElement); MenuHTMLPartsRender.Insert(indexOfHeadElement, new MenuHTMLRender() { GroupID = menuToRender.GroupID, IsHead = true, HTMLBody = RenderMenuGroupHead(menuToRender, true) }); } //group closing tags MenuHTMLPartsRender.Add(new MenuHTMLRender() { GroupID = menuToRender.GroupID, IsHead = false, HTMLBody = RenderClosingGroupTags() }); } }
private string RenderMenuGroupHead(MenuGroup group, bool active = false) { return String.Format(@" <li {0}> <a href=""javascript:;""> <i class="" fa {1} ""></i> <span class="" {2} "">{3}</span> <span class="" {4} ""></span> </a> <ul class=""sub-menu""> ", (active ? @"class="" active open """ : String.Empty) + " " + group.GroupListClass + " ", HtmlHelperExtensions.RenderClassName(group.GroupIconClass.ToString()), " title ", group.GroupName, group.GroupArrowCssClass + (active ? " open " : String.Empty)); }
/// <summary> /// Finds a Menu Group /// </summary> /// <param name="menuToSearch">Menu to search</param> /// <param name="searchExpression">The search criteria</param> /// <returns>The Menu Group if found or null if not found</returns> public MenuGroup FindMenuGroup(MenuGroup menuToSearch, Expression<Func<MenuGroup, bool>> searchExpression) { // Compiling the expression tree into a delegate. Func<MenuGroup, bool> expressionResult = searchExpression.Compile(); if (menuToSearch == null) { return null; } if (expressionResult(menuToSearch)) { return menuToSearch; } foreach (MenuGroup item in menuToSearch.MenuSubGroups) { MenuGroup foundGroup = FindMenuGroup(item, searchExpression); if (foundGroup != null) { return foundGroup; } } return null; }