public async static Task <HashSet <JsonMenu> > GetAllMenuItems(IEnumerable <AuthroziedFeatureInfo> items)
        {
            var menuITems = new HashSet <JsonMenu>();

            foreach (var item in items)
            {
                var feature = item.Feature;

                var children = FeatureSecurityFilter.GetAuthorizedFeatures(Context.Current.User(), parent: feature);

                var sumMenu = new JsonMenu
                {
                    ID          = item.Feature.ID,
                    Icon        = item.Feature.Icon,
                    Title       = item.Feature.Title,
                    LoadUrl     = item.AddQueryString(),
                    LogicalPath = feature.ToString(),
                    UseIframe   = item.Feature.UseIframe
                };

                if (children.Any())
                {
                    sumMenu.Children = await GetAllMenuItems(children);
                }

                menuITems.Add(sumMenu);
            }

            return(menuITems);
        }
        public static XElement RenderMenu(Feature currentFeature)
        {
            var items = FeatureSecurityFilter.GetAuthorizedFeatures(Context.Current.User());

            items = AddEverythingItem(items);
            return(RenderMenu(currentFeature, items));
        }
        public async static Task <string> RenderJsonMenu()
        {
            var items = FeatureSecurityFilter.GetAuthorizedFeatures(Context.Current.User());

            var jsonSerializerSettings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects
            };

            return(JsonConvert.SerializeObject(await GetAllMenuItems(items), Formatting.None, jsonSerializerSettings));
        }
        public static async Task <string> RenderFullMenu()
        {
            var items     = FeatureSecurityFilter.GetAuthorizedFeatures(Context.Current.User());
            var menuItems = await GetAllMenuItems(items);

            var sorted = menuItems
                         .OrderBy(x => x.Children == null ? 0 : x.Children.Sum(c => c.Children == null ? 1 : c.Children.Count() + 1))
                         .ToList();

            var container = new XElement("div");

            sorted.ForEach(item =>
            {
                var div = new XElement("div");
                div.Add(new XAttribute("class", "full-menu-item"));

                if (item.Children != null && item.Children.Any())
                {
                    var ul = new XElement("ul");

                    item.Children.ToList().ForEach(subItem =>
                    {
                        var li = new XElement("li", CreateSubLink(subItem, ColourPalette.GetColourCode()));
                        ul.Add(li);
                        AddChildItems(subItem, ColourPalette.GetColourCode(), li);
                    });

                    div.Add(ul);
                    div.Add(new XElement("h3", new XAttribute("class", "full-menu-text"),
                                         new XElement("a", item.Title, new XAttribute("href", item.LoadUrl))));
                }
                else
                {
                    div.Add(new XElement("ul", new XElement("li", CreateSubLink(item, ColourPalette.GetColourCode()))));
                }

                container.Add(div);
            });

            return(container.ToString().TrimStart("<div>").TrimEnd("</div>"));
        }
        static XElement RenderMenu(Feature currentFeature, IEnumerable <AuthroziedFeatureInfo> items)
        {
            if (items.None())
            {
                return(null);
            }

            var rootMEnuId = Guid.NewGuid();

            if (currentFeature != null)
            {
                rootMEnuId = currentFeature.ID;
            }

            var ul = new XElement("ul", new XAttribute("class", "nav navbar-nav dropped-submenu"), new XAttribute("id", rootMEnuId));

            foreach (var item in items)
            {
                var feature = item.Feature;

                var li = new XElement("li",
                                      new XAttribute("id", feature.ID),
                                      new XAttribute("class",
                                                     string.Format("feature-menu-item{0}{1}",
                                                                   " active".OnlyWhen(feature == currentFeature),
                                                                   " d-none".OnlyWhen(item.Feature.Hide)))
                                      ).AddTo(ul);

                li.Add(new XAttribute("expand", currentFeature.IsAnyOf(feature.WithAllChildren())));

                if (feature.Parent != null)
                {
                    li.Add(new XAttribute("is-side-menu-child", "true"));
                    li.Add(new XAttribute("side-menu-parent", feature.Parent.ID));
                }
                else
                {
                    li.Add(new XAttribute("is-side-menu-child", "false"));
                }

                var link = new XElement("a",
                                        new XAttribute("href", item.AddQueryString()),
                                        new XAttribute("data-badgeurl", feature.GetBadgeUrl().OrEmpty()),
                                        new XAttribute("data-badge-optional", feature.IsBadgeOptional()),
                                        new XAttribute("data-service", (feature.Service?.Name).OrEmpty()),
                                        new XAttribute("class", "badge-number"),
                                        new XElement("i", string.Empty,
                                                     new XAttribute("class", $"{feature.Icon}"),
                                                     new XAttribute("aria-hidden", "true")),
                                        feature.Title
                                        ).AddTo(li);

                if (!item.IsDisabled && !feature.UseIframe)
                {
                    link.Add(new XAttribute("data-redirect", "ajax"));
                }

                var children = FeatureSecurityFilter.GetAuthorizedFeatures(Context.Current.User(), parent: feature);

                if (children.Any())
                {
                    li.Add(RenderMenu(currentFeature, children));
                }
            }

            return(ul);
        }