Exemple #1
0
        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));
        }
Exemple #2
0
        protected override async Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            // Always resolve against current store, current customer and working language.
            var result = await _linkResolver.ResolveAsync(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 #3
0
        public override async Task <TreeNode <MenuItem> > AppendAsync(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 = await _categoryService.GetCategoryTreeAsync(0, false, _storeContext.CurrentStore.Id);

                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)
                {
                    var tuple = await ConvertNodeAsync(request, child, randomId);

                    AppendToParent(request, tuple.Item1);
                    randomId = tuple.Item2;
                }
            }

            // 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.
        }
Exemple #4
0
        public virtual async Task <TreeNode <MenuItem> > AppendAsync(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));

            await ApplyLinkAsync(request, node);

            return(node);
        }
Exemple #5
0
        protected override Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node)
        {
            try
            {
                node.ApplyRouteData(request.Entity.Model);
            }
            catch { }

            if (request.IsEditMode)
            {
                var item = node.Value;

                item.Summary = T("Providers.MenuItems.FriendlyName.Route");
                item.Icon    = "fas fa-directions";

                if (!item.HasRoute)
                {
                    item.Text   = null;
                    item.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget";
                }
            }

            return(Task.CompletedTask);
        }
Exemple #6
0
        private async Task <Tuple <TreeNode <MenuItem>, int> > ConvertNodeAsync(
            MenuItemProviderRequest request,
            TreeNode <ICategoryNode> categoryNode,
            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),
                MenuItemId = request.Entity.Id,
                Text       = name?.Value ?? node.Name,
                Rtl        = name?.CurrentLanguage?.Rtl ?? false,
                BadgeText  = node.Id > 0 ? node.GetLocalized(x => x.BadgeText) : null,
                BadgeStyle = node.BadgeStyle,
                RouteName  = node.Id > 0 ? "Category" : "HomePage",
                ImageId    = node.MediaFileId
            };

            // Handle external link
            if (node.ExternalLink.HasValue())
            {
                var link = await _linkResolver.ResolveAsync(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", await node.GetActiveSlugAsync());
                }
                else
                {
                    menuItem.RouteName = "Homepage";
                }
            }

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

            // 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)
                {
                    var tuple = await ConvertNodeAsync(request, childNode, randomId);

                    convertedNode.Append(tuple.Item1);
                    randomId = tuple.Item2;
                }
            }

            return(new Tuple <TreeNode <MenuItem>, int>(convertedNode, randomId));
        }
Exemple #7
0
 protected override Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node)
 => Task.CompletedTask;
Exemple #8
0
        /// <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      = "MenuItem", // nameof(MenuItemEntity),
                MenuItemId      = entity.Id,
                Text            = title,
                Summary         = shortDescription,
                Visible         = entity.Published,
                Rtl             = title?.CurrentLanguage?.Rtl ?? false,
                PermissionNames = entity.PermissionNames
            };

            // Common attributes
            if (shortDescription.HasValue())
            {
                menuItem.HtmlAttributes.Add("title", shortDescription);
            }

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

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

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

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

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

                if (entity.IconColor.HasValue())
                {
                    menuItem.Icon += " text-" + entity.IconColor;
                }
            }

            // For future use: entity.ShowExpanded

            return(menuItem);
        }
Exemple #9
0
 protected virtual TreeNode <MenuItem> AppendToParent(MenuItemProviderRequest request, MenuItem item)
 {
     return(AppendToParent(request, new TreeNode <MenuItem>(item)));
 }
Exemple #10
0
 /// <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 Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node);