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)); }
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; } }
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. }
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); }
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); }
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)); }
protected override Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node) => Task.CompletedTask;
/// <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); }
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 Task ApplyLinkAsync(MenuItemProviderRequest request, TreeNode <MenuItem> node);