protected virtual TreeNode <MenuItem> AppendToParent(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            var root      = request.Parent.Root;
            var providers = root.GetMetadata <List <string> >("Providers");
            var provider  = request.Entity.ProviderName;

            node.SetMetadata("Provider", provider);

            if (providers == null)
            {
                root.SetMetadata("Providers", new List <string> {
                    provider
                });
            }
            else if (!providers.Contains(provider))
            {
                providers.Add(provider);
            }

            if (node.Id == null && node.Value.Id.HasValue())
            {
                node.Id = node.Value.Id;
            }

            return(request.Parent.Append(node));
        }
        private TreeNode <MenuItem> ConvertNode(
            MenuItemProviderRequest request,
            TreeNode <ICategoryNode> categoryNode,
            IDictionary <int, PictureInfo> allPictureInfos)
        {
            var node = categoryNode.Value;
            var name = node.Id > 0 ? node.GetLocalized(x => x.Name) : null;

            var menuItem = new MenuItem
            {
                EntityId   = node.Id,
                EntityName = nameof(Category),
                Text       = name?.Value ?? node.Name,
                Rtl        = name?.CurrentLanguage?.Rtl ?? false,
                BadgeText  = node.Id > 0 ? node.GetLocalized(x => x.BadgeText) : null,
                BadgeStyle = (BadgeStyle)node.BadgeStyle,
                RouteName  = node.Id > 0 ? "Category" : "HomePage"
            };

            if (node.Id > 0)
            {
                menuItem.RouteValues.Add("SeName", node.GetSeName());

                if (node.ParentCategoryId == 0 && node.Published && node.PictureId != null)
                {
                    menuItem.ImageId = node.PictureId;
                }
            }

            // Apply inheritable properties.
            menuItem.Visible         = request.Entity.Published;
            menuItem.PermissionNames = request.Entity.PermissionNames;

            if (request.Entity.NoFollow)
            {
                menuItem.LinkHtmlAttributes.Add("rel", "nofollow");
            }

            if (request.Entity.NewWindow)
            {
                menuItem.LinkHtmlAttributes.Add("target", "_blank");
            }

            var convertedNode = new TreeNode <MenuItem>(menuItem)
            {
                Id = categoryNode.Id
            };

            if (categoryNode.HasChildren)
            {
                foreach (var childNode in categoryNode.Children)
                {
                    convertedNode.Append(ConvertNode(request, childNode, allPictureInfos));
                }
            }

            return(convertedNode);
        }
        /// <summary>
        /// Converts the passed menu item entity to a <see cref="MenuItem"/> object.
        /// </summary>
        /// <param name="entity">The entity to convert.</param>
        /// <returns>Menu item.</returns>
        protected virtual MenuItem ConvertToMenuItem(MenuItemProviderRequest request)
        {
            var    entity           = request.Entity;
            var    title            = entity.GetLocalized(x => x.Title);
            string shortDescription = entity.GetLocalized(x => x.ShortDescription);

            var menuItem = new MenuItem
            {
                EntityId        = entity.Id,
                EntityName      = nameof(MenuItemRecord),
                MenuItemId      = entity.Id,
                Text            = title,
                Summary         = shortDescription,
                Visible         = entity.Published,
                Rtl             = title?.CurrentLanguage?.Rtl ?? false,
                PermissionNames = entity.PermissionNames
            };

            if (shortDescription.HasValue())
            {
                menuItem.LinkHtmlAttributes.Add("title", shortDescription);
            }

            if (entity.NoFollow)
            {
                menuItem.LinkHtmlAttributes.Add("rel", "nofollow");
            }

            if (entity.NewWindow)
            {
                menuItem.LinkHtmlAttributes.Add("target", "_blank");
            }

            if (entity.CssClass.HasValue())
            {
                menuItem.LinkHtmlAttributes.Add("class", entity.CssClass);
            }

            if (entity.HtmlId.HasValue())
            {
                menuItem.LinkHtmlAttributes.Add("id", entity.HtmlId);
                menuItem.Id = entity.HtmlId;
            }

            if (entity.Icon.HasValue() && !request.IsEditMode)
            {
                menuItem.Icon = IconExplorer.GetIconByName(entity.Icon).GetCssClass(entity.Style);
            }

            // For future use: entity.ShowExpanded

            return(menuItem);
        }
Exemple #4
0
        protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            // Always resolve against current store, current customer and working language.
            var result = _linkResolver.Resolve(request.Entity.Model);
            var item   = node.Value;

            item.Url     = result.Link;
            item.ImageId = result.PictureId;

            if (item.Text.IsEmpty())
            {
                item.Text = result.Label;
            }

            switch (result.Type)
            {
            case LinkType.Product:
            case LinkType.Category:
            case LinkType.Manufacturer:
            case LinkType.Topic:
                if (request.IsEditMode)
                {
                    // Info: node.Value.EntityId is MenuItemRecord.Id for editing MenuItemRecord.
                }
                else
                {
                    item.EntityId   = result.Id;
                    item.EntityName = result.Type.ToString();
                }
                break;
            }

            if (request.IsEditMode)
            {
                var info = result.Type.GetLinkTypeInfo();
                item.Summary = T(info.ResKey);
                item.Icon    = info.Icon;

                if (item.Url.IsEmpty())
                {
                    item.Text   = null;
                    item.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget";
                }
            }
            else
            {
                // For edit mode, only apply MenuItemRecord.Published.
                item.Visible = result.Status == LinkStatus.Ok;
            }
        }
Exemple #5
0
        protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            try
            {
                node.ApplyRouteData(request.Entity.Model);
            }
            catch { }

            if (request.IsEditMode)
            {
                node.Value.Summary = T("Providers.MenuItems.FriendlyName.Route");
                node.Value.Icon    = "fas fa-directions";

                if (!node.Value.HasRoute())
                {
                    node.Value.Text   = null;
                    node.Value.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget";
                }
            }
        }
        public override TreeNode <MenuItem> Append(MenuItemProviderRequest request)
        {
            if (request.IsEditMode)
            {
                var item = ConvertToMenuItem(request);
                item.Summary = T("Providers.MenuItems.FriendlyName.Catalog");
                item.Icon    = "fa fa-cubes";

                AppendToParent(request, item);
            }
            else
            {
                var tree            = _categoryService.GetCategoryTree(0, false, _services.StoreContext.CurrentStore.Id);
                var allPictureIds   = tree.Flatten().Select(x => x.PictureId.GetValueOrDefault());
                var allPictureInfos = _pictureService.GetPictureInfos(allPictureIds);
                var randomId        = CommonHelper.GenerateRandomInteger(0, 1000000);

                if (request.Entity.BeginGroup)
                {
                    AppendToParent(request, new MenuItem
                    {
                        IsGroupHeader = true,
                        Text          = request.Entity.GetLocalized(x => x.ShortDescription)
                    });
                }

                // Do not append the root itself.
                foreach (var child in tree.Children)
                {
                    AppendToParent(request, ConvertNode(request, child, allPictureInfos, ref randomId));
                }
            }

            // Do not traverse appended items.
            return(null);

            // TBD: Cache invalidation workflow changes, because the catalog tree
            // is now contained within other menus. Invalidating the tree now means:
            // invalidate all containing menus also.
        }
        public virtual TreeNode <MenuItem> Append(MenuItemProviderRequest request)
        {
            Guard.NotNull(request, nameof(request));
            Guard.NotNull(request.Parent, nameof(request.Parent));
            Guard.NotNull(request.Entity, nameof(request.Entity));

            // Add group header item.
            if (request.Entity.BeginGroup && !request.IsEditMode)
            {
                AppendToParent(request, new MenuItem
                {
                    IsGroupHeader = true,
                    Text          = request.Entity.GetLocalized(x => x.ShortDescription)
                });
            }

            var node = AppendToParent(request, ConvertToMenuItem(request));

            ApplyLink(request, node);

            return(node);
        }
        protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            try
            {
                if (request.Entity.Model.HasValue())
                {
                    var routeValues = JsonConvert.DeserializeObject <RouteValueDictionary>(request.Entity.Model);
                    var routeName   = string.Empty;

                    if (routeValues.TryGetValue("routename", out var val))
                    {
                        routeName = val as string;
                        routeValues.Remove("routename");
                    }

                    if (routeName.HasValue())
                    {
                        node.Value.Route(routeName, routeValues);
                    }
                    else
                    {
                        node.Value.Action(routeValues);
                    }
                }
            }
            catch { }

            if (request.IsEditMode)
            {
                node.Value.Summary = T("Providers.MenuItems.FriendlyName.Route");
                node.Value.Icon    = "fas fa-directions";

                if (!node.Value.HasRoute())
                {
                    node.Value.Text   = null;
                    node.Value.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget";
                }
            }
        }
        private TreeNode <MenuItem> ConvertNode(
            MenuItemProviderRequest request,
            TreeNode <ICategoryNode> categoryNode,
            IDictionary <int, PictureInfo> allPictureInfos,
            ref int randomId)
        {
            var node = categoryNode.Value;
            var name = node.Id > 0 ? node.GetLocalized(x => x.Name) : null;

            var menuItem = new MenuItem
            {
                Id         = randomId++.ToString(),
                EntityId   = node.Id,
                EntityName = nameof(Category),
                Text       = name?.Value ?? node.Name,
                Rtl        = name?.CurrentLanguage?.Rtl ?? false,
                BadgeText  = node.Id > 0 ? node.GetLocalized(x => x.BadgeText) : null,
                BadgeStyle = (BadgeStyle)node.BadgeStyle,
                RouteName  = node.Id > 0 ? "Category" : "HomePage",
            };

            // Handle external link
            if (node.ExternalLink.HasValue())
            {
                var link = _linkResolver.Resolve(node.ExternalLink);
                if (link.Status == LinkStatus.Ok)
                {
                    menuItem.Url = link.Link;
                }
            }

            if (menuItem.Url.IsEmpty())
            {
                if (node.Id > 0)
                {
                    menuItem.RouteName = "Category";
                    menuItem.RouteValues.Add("SeName", node.GetSeName());
                }
                else
                {
                    menuItem.RouteName = "HomePage";
                }
            }

            // Picture
            if (node.Id > 0 && node.ParentCategoryId == 0 && node.Published && node.PictureId != null)
            {
                menuItem.ImageId = node.PictureId;
            }

            // Apply inheritable properties.
            menuItem.Visible         = request.Entity.Published;
            menuItem.PermissionNames = request.Entity.PermissionNames;

            if (request.Entity.NoFollow)
            {
                menuItem.LinkHtmlAttributes.Add("rel", "nofollow");
            }

            if (request.Entity.NewWindow)
            {
                menuItem.LinkHtmlAttributes.Add("target", "_blank");
            }

            var convertedNode = new TreeNode <MenuItem>(menuItem)
            {
                Id = categoryNode.Id
            };

            if (categoryNode.HasChildren)
            {
                foreach (var childNode in categoryNode.Children)
                {
                    convertedNode.Append(ConvertNode(request, childNode, allPictureInfos, ref randomId));
                }
            }

            return(convertedNode);
        }
 protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node)
 {
     // Void, does nothing here.
 }
 protected virtual TreeNode <MenuItem> AppendToParent(MenuItemProviderRequest request, MenuItem item)
 {
     return(AppendToParent(request, new TreeNode <MenuItem>(item)));
 }
 /// <summary>
 /// Generates and applies the link to the converted <see cref="MenuItem"/> object.
 /// </summary>
 /// <param name="request">Contains information about the request to the provider.</param>
 /// <param name="node">The newly created menu item node to apply the generated link to.</param>
 protected abstract void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node);