using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Nop.Core; using Nop.Core.Events; using Nop.Services.Localization; using Nop.Services.Plugins; using Nop.Services.Security; using Nop.Web.Framework.Events; namespace Nop.Web.Framework.Menu; /// /// Admin menu /// public partial class AdminMenu : IAdminMenu { #region Fields protected AdminMenuItem _baseRootMenuItem; protected AdminMenuItem _rootItem; protected readonly IActionContextAccessor _actionContextAccessor; protected readonly IEventPublisher _eventPublisher; protected readonly ILocalizationService _localizationService; protected readonly IPermissionService _permissionService; #pragma warning disable CS0618 // Type or member is obsolete protected readonly IPluginManager _adminMenuPluginManager; #pragma warning restore CS0618 // Type or member is obsolete protected readonly IUrlHelperFactory _urlHelperFactory; protected readonly IWorkContext _workContext; #endregion #region Ctor /// /// Ctor /// public AdminMenu(IActionContextAccessor actionContextAccessor, IEventPublisher eventPublisher, ILocalizationService localizationService, IPermissionService permissionService, #pragma warning disable CS0618 // Type or member is obsolete IPluginManager adminMenuPluginManager, #pragma warning restore CS0618 // Type or member is obsolete IUrlHelperFactory urlHelperFactory, IWorkContext workContext) { _actionContextAccessor = actionContextAccessor; _eventPublisher = eventPublisher; _localizationService = localizationService; _permissionService = permissionService; _adminMenuPluginManager = adminMenuPluginManager; _urlHelperFactory = urlHelperFactory; _workContext = workContext; } #endregion #region Utilities /// /// Fills the base root menu item data /// /// A task that represents the asynchronous operation protected virtual async Task FillBaseRootAsync() { if (_baseRootMenuItem != null) return; _baseRootMenuItem = new AdminMenuItem { SystemName = "Home", Title = await _localizationService.GetResourceAsync("Admin.Home"), Url = GetMenuItemUrl("Home", "Overview"), ChildNodes = new List { //dashboard new() { SystemName = "Dashboard", Title = await _localizationService.GetResourceAsync("Admin.Dashboard"), Url = GetMenuItemUrl("Home", "Index"), IconClass = "fas fa-desktop" }, //catalog new() { SystemName = "Catalog", Title = await _localizationService.GetResourceAsync("Admin.Catalog"), IconClass = "fas fa-book", ChildNodes = new List { new() { SystemName = "Products", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Products"), PermissionNames = new List { StandardPermission.Catalog.PRODUCTS_VIEW }, Url = GetMenuItemUrl("Product", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Categories", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Categories"), PermissionNames = new List { StandardPermission.Catalog.CATEGORIES_VIEW }, Url = GetMenuItemUrl("Category", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Manufacturers", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Manufacturers"), PermissionNames = new List { StandardPermission.Catalog.MANUFACTURER_VIEW }, Url = GetMenuItemUrl("Manufacturer", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Product reviews", Title = await _localizationService.GetResourceAsync("Admin.Catalog.ProductReviews"), PermissionNames = new List { StandardPermission.Catalog.PRODUCT_REVIEWS_VIEW }, Url = GetMenuItemUrl("ProductReview", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Product tags", Title = await _localizationService.GetResourceAsync("Admin.Catalog.ProductTags"), PermissionNames = new List { StandardPermission.Catalog.PRODUCT_TAGS_VIEW }, Url = GetMenuItemUrl("Product", "ProductTags"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Attributes", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Attributes"), IconClass = "far fa-dot-circle", ChildNodes = new List { new() { SystemName = "Product attributes", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Attributes.ProductAttributes"), Url = GetMenuItemUrl("ProductAttribute", "List"), PermissionNames = new List { StandardPermission.Catalog.PRODUCT_ATTRIBUTES_VIEW }, IconClass = "far fa-circle" }, new() { SystemName = "Specification attributes", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Attributes.SpecificationAttributes"), Url = GetMenuItemUrl("SpecificationAttribute", "List"), PermissionNames = new List { StandardPermission.Catalog.SPECIFICATION_ATTRIBUTES_VIEW }, IconClass = "far fa-circle" }, new() { SystemName = "Checkout attributes", Title = await _localizationService.GetResourceAsync("Admin.Catalog.Attributes.CheckoutAttributes"), PermissionNames = new List { StandardPermission.Catalog.CHECKOUT_ATTRIBUTES_VIEW }, Url = GetMenuItemUrl("CheckoutAttribute", "List"), IconClass = "far fa-circle" } } } } }, //sales new() { SystemName = "Sales", Title = await _localizationService.GetResourceAsync("Admin.Sales"), IconClass = "fas fa-shopping-cart", ChildNodes = new List { new() { SystemName = "Orders", Title = await _localizationService.GetResourceAsync("Admin.Orders"), PermissionNames = new List { StandardPermission.Orders.ORDERS_VIEW }, Url = GetMenuItemUrl("Order", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Shipments", Title = await _localizationService.GetResourceAsync("Admin.Orders.Shipments.List"), PermissionNames = new List { StandardPermission.Orders.SHIPMENTS_VIEW }, Url = GetMenuItemUrl("Order", "ShipmentList"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Return requests", Title = await _localizationService.GetResourceAsync("Admin.ReturnRequests"), PermissionNames = new List { StandardPermission.Orders.RETURN_REQUESTS_VIEW }, Url = GetMenuItemUrl("ReturnRequest", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Recurring payments", Title = await _localizationService.GetResourceAsync("Admin.RecurringPayments"), PermissionNames = new List { StandardPermission.Orders.RECURRING_PAYMENTS_VIEW }, Url = GetMenuItemUrl("RecurringPayment", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Gift cards", Title = await _localizationService.GetResourceAsync("Admin.GiftCards"), PermissionNames = new List { StandardPermission.Orders.GIFT_CARDS_VIEW }, Url = GetMenuItemUrl("GiftCard", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Current shopping carts and wishlists", Title = await _localizationService.GetResourceAsync("Admin.CurrentCarts.CartsAndWishlists"), PermissionNames = new List { StandardPermission.Orders.CURRENT_CARTS_MANAGE }, Url = GetMenuItemUrl("ShoppingCart", "CurrentCarts"), IconClass = "far fa-dot-circle" } } }, //customers new() { SystemName = "Customers", Title = await _localizationService.GetResourceAsync("Admin.Customers"), IconClass = "far fa-user", ChildNodes = new List { new() { SystemName = "Customers list", Title = await _localizationService.GetResourceAsync("Admin.Customers.Customers"), PermissionNames = new List { StandardPermission.Customers.CUSTOMERS_VIEW }, Url = GetMenuItemUrl("Customer", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Customer roles", Title = await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles"), PermissionNames = new List { StandardPermission.Customers.CUSTOMER_ROLES_VIEW }, Url = GetMenuItemUrl("CustomerRole", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Online customers", Title = await _localizationService.GetResourceAsync("Admin.Customers.OnlineCustomers"), PermissionNames = new List { StandardPermission.Customers.CUSTOMERS_VIEW }, Url = GetMenuItemUrl("OnlineCustomer", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Vendors", Title = await _localizationService.GetResourceAsync("Admin.Vendors"), PermissionNames = new List { StandardPermission.Customers.VENDORS_VIEW }, Url = GetMenuItemUrl("Vendor", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Activity logs", Title = await _localizationService.GetResourceAsync("Admin.Customers.ActivityLog"), PermissionNames = new List { StandardPermission.Customers.ACTIVITY_LOG_VIEW }, Url = GetMenuItemUrl("ActivityLog", "ActivityLogs"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Activity types", Title = await _localizationService.GetResourceAsync("Admin.Customers.ActivityLogType"), PermissionNames = new List { StandardPermission.Customers.ACTIVITY_LOG_VIEW }, Url = GetMenuItemUrl("ActivityLog", "ActivityTypes"), IconClass = "far fa-dot-circle" }, new() { SystemName = "GDPR log", Title = await _localizationService.GetResourceAsync("Admin.Customers.GdprLog"), PermissionNames = new List { StandardPermission.Customers.GDPR_MANAGE }, Url = GetMenuItemUrl("Customer", "GdprLog"), IconClass = "far fa-dot-circle" } } }, //promotions new() { SystemName = "Promotions", Title = await _localizationService.GetResourceAsync("Admin.Promotions"), IconClass = "fas fa-tags", ChildNodes = new List { new() { SystemName = "Discounts", Title = await _localizationService.GetResourceAsync("Admin.Promotions.Discounts"), PermissionNames = new List { StandardPermission.Promotions.DISCOUNTS_VIEW }, Url = GetMenuItemUrl("Discount", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Affiliates", Title = await _localizationService.GetResourceAsync("Admin.Affiliates"), PermissionNames = new List { StandardPermission.Promotions.AFFILIATES_VIEW }, Url = GetMenuItemUrl("Affiliate", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Newsletter subscriptions", Title = await _localizationService.GetResourceAsync("Admin.Promotions.NewsletterSubscriptions"), PermissionNames = new List { StandardPermission.Promotions.SUBSCRIBERS_VIEW }, Url = GetMenuItemUrl("NewsLetterSubscription", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Campaigns", Title = await _localizationService.GetResourceAsync("Admin.Promotions.Campaigns"), PermissionNames = new List { StandardPermission.Promotions.CAMPAIGNS_VIEW }, Url = GetMenuItemUrl("Campaign", "List"), IconClass = "far fa-dot-circle" } } }, //content management new() { SystemName = "Content Management", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement"), IconClass = "fas fa-cubes", ChildNodes = new List { new() { SystemName = "Topics", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Topics"), PermissionNames = new List { StandardPermission.ContentManagement.TOPICS_VIEW }, Url = GetMenuItemUrl("Topic", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Message templates", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.MessageTemplates"), PermissionNames = new List { StandardPermission.ContentManagement.MESSAGE_TEMPLATES_VIEW }, Url = GetMenuItemUrl("MessageTemplate", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "News items", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.News.NewsItems"), PermissionNames = new List { StandardPermission.ContentManagement.NEWS_VIEW }, Url = GetMenuItemUrl("News", "NewsItems"), IconClass = "far fa-dot-circle" }, new() { SystemName = "News comments", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.News.Comments"), PermissionNames = new List { StandardPermission.ContentManagement.NEWS_COMMENTS_VIEW }, Url = GetMenuItemUrl("News", "NewsComments"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Blog posts", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Blog.BlogPosts"), PermissionNames = new List { StandardPermission.ContentManagement.BLOG_VIEW }, Url = GetMenuItemUrl("Blog", "BlogPosts"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Blog comments", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Blog.Comments"), PermissionNames = new List { StandardPermission.ContentManagement.BLOG_COMMENTS_VIEW }, Url = GetMenuItemUrl("Blog", "BlogComments"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Polls", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Polls"), PermissionNames = new List { StandardPermission.ContentManagement.POLLS_VIEW }, Url = GetMenuItemUrl("Poll", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Manage forums", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Forums"), PermissionNames = new List { StandardPermission.ContentManagement.FORUMS_VIEW }, Url = GetMenuItemUrl("Forum", "List"), IconClass = "far fa-dot-circle" } } }, //configuration new() { SystemName = "Configuration", Title = await _localizationService.GetResourceAsync("Admin.Configuration"), IconClass = "fas fa-cogs", ChildNodes = new List { new() { SystemName = "Settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_SETTINGS }, IconClass = "far fa-dot-circle", ChildNodes = new List { new() { SystemName = "General settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.GeneralCommon"), Url = GetMenuItemUrl("Setting", "GeneralCommon"), IconClass = "far fa-circle" }, new() { SystemName = "Customer and user settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.CustomerUser"), Url = GetMenuItemUrl("Setting", "CustomerUser"), IconClass = "far fa-circle" }, new() { SystemName = "Order settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Order"), Url = GetMenuItemUrl("Setting", "Order"), IconClass = "far fa-circle" }, new() { SystemName = "Shipping settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Shipping"), Url = GetMenuItemUrl("Setting", "Shipping"), IconClass = "far fa-circle" }, new() { SystemName = "Tax settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Tax"), Url = GetMenuItemUrl("Setting", "Tax"), IconClass = "far fa-circle" }, new() { SystemName = "Catalog settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Catalog"), Url = GetMenuItemUrl("Setting", "Catalog"), IconClass = "far fa-circle" }, new() { SystemName = "Shopping cart settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.ShoppingCart"), Url = GetMenuItemUrl("Setting", "ShoppingCart"), IconClass = "far fa-circle" }, new() { SystemName = "Reward points", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.RewardPoints"), Url = GetMenuItemUrl("Setting", "RewardPoints"), IconClass = "far fa-circle" }, new() { SystemName = "GDPR settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Gdpr"), Url = GetMenuItemUrl("Setting", "Gdpr"), IconClass = "far fa-circle" }, new() { SystemName = "Vendor settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Vendor"), Url = GetMenuItemUrl("Setting", "Vendor"), IconClass = "far fa-circle" }, new() { SystemName = "Blog settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Blog"), Url = GetMenuItemUrl("Setting", "Blog"), IconClass = "far fa-circle" }, new() { SystemName = "News settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.News"), Url = GetMenuItemUrl("Setting", "News"), IconClass = "far fa-circle" }, new() { SystemName = "Forums settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Forums"), Url = GetMenuItemUrl("Setting", "Forum"), IconClass = "far fa-circle" }, new() { SystemName = "Media settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.Media"), Url = GetMenuItemUrl("Setting", "Media"), IconClass = "far fa-circle" }, new() { SystemName = "App settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.AppSettings"), PermissionNames = new List { StandardPermission.System.MANAGE_APP_SETTINGS }, Url = GetMenuItemUrl("Setting", "AppSettings"), IconClass = "far fa-circle" }, new() { SystemName = "All settings", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.AllSettings"), Url = GetMenuItemUrl("Setting", "AllSettings"), IconClass = "far fa-circle" } } }, new() { SystemName = "Email accounts", Title = await _localizationService.GetResourceAsync("Admin.Configuration.EmailAccounts"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_EMAIL_ACCOUNTS }, Url = GetMenuItemUrl("EmailAccount", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Stores", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Stores"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_STORES }, Url = GetMenuItemUrl("Store", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Countries", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Countries"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_COUNTRIES }, Url = GetMenuItemUrl("Country", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Languages", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Languages"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_LANGUAGES }, Url = GetMenuItemUrl("Language", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Currencies", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Currencies"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_CURRENCIES }, Url = GetMenuItemUrl("Currency", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Payment methods", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Payment.Methods"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_PAYMENT_METHODS }, Url = GetMenuItemUrl("Payment", "Methods"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Payment restrictions", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Payment.MethodRestrictions"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_PAYMENT_METHODS }, Url = GetMenuItemUrl("Payment", "MethodRestrictions"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Tax providers", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Tax.Providers"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_TAX_SETTINGS }, Url = GetMenuItemUrl("Tax", "Providers"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Tax categories", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Tax.Categories"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_TAX_SETTINGS }, Url = GetMenuItemUrl("Tax", "Categories"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Shipping", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_SHIPPING_SETTINGS }, IconClass = "far fa-dot-circle", ChildNodes = new List { new() { SystemName = "Shipping providers", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping.Providers"), Url = GetMenuItemUrl("Shipping", "Providers"), IconClass = "far fa-circle" }, new() { SystemName = "Warehouses", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping.Warehouses"), Url = GetMenuItemUrl("Shipping", "Warehouses"), IconClass = "far fa-circle" }, new() { SystemName = "Pickup points", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping.PickupPoints"), Url = GetMenuItemUrl("Shipping", "PickupPointProviders"), IconClass = "far fa-circle" }, new() { SystemName = "Dates and ranges", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping.DatesAndRanges"), Url = GetMenuItemUrl("Shipping", "DatesAndRanges"), IconClass = "far fa-circle" }, new() { SystemName = "Measures", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Shipping.Measures"), Url = GetMenuItemUrl("Measure", "List"), IconClass = "far fa-circle" } } }, new() { SystemName = "Access control list", Title = await _localizationService.GetResourceAsync("Admin.Configuration.ACL"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_ACL }, Url = GetMenuItemUrl("Security", "Permissions"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Widgets", Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Widgets"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_WIDGETS }, Url = GetMenuItemUrl("Widget", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Authentication", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Authentication"), IconClass = "far fa-dot-circle", ChildNodes = new List { new() { SystemName = "External authentication methods", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Authentication.ExternalMethods"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_EXTERNAL_AUTHENTICATION_METHODS }, Url = GetMenuItemUrl("Authentication", "ExternalMethods"), IconClass = "far fa-circle" }, new() { SystemName = "Multi-factor authentication methods", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Authentication.MultiFactorMethods"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_MULTIFACTOR_AUTHENTICATION_METHODS }, Url = GetMenuItemUrl("Authentication", "MultiFactorMethods"), IconClass = "far fa-circle" } } }, new() { SystemName = "Local plugins", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.Local"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_PLUGINS }, Url = GetMenuItemUrl("Plugin", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "All plugins and themes", Title = await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.OfficialFeed"), PermissionNames = new List { StandardPermission.Configuration.MANAGE_PLUGINS }, Url = GetMenuItemUrl("Plugin", "OfficialFeed"), IconClass = "far fa-dot-circle" } } }, //system new() { SystemName = "System", Title = await _localizationService.GetResourceAsync("Admin.System"), IconClass = "fas fa-cube", ChildNodes = new List { new() { SystemName = "System information", Title = await _localizationService.GetResourceAsync("Admin.System.SystemInfo"), PermissionNames = new List { StandardPermission.System.MANAGE_MAINTENANCE }, Url = GetMenuItemUrl("Common", "SystemInfo"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Log", Title = await _localizationService.GetResourceAsync("Admin.System.Log"), PermissionNames = new List { StandardPermission.System.MANAGE_SYSTEM_LOG }, Url = GetMenuItemUrl("Log", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Warnings", Title = await _localizationService.GetResourceAsync("Admin.System.Warnings"), PermissionNames = new List { StandardPermission.System.MANAGE_MAINTENANCE }, Url = GetMenuItemUrl("Common", "Warnings"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Maintenance", Title = await _localizationService.GetResourceAsync("Admin.System.Maintenance"), PermissionNames = new List { StandardPermission.System.MANAGE_MAINTENANCE }, Url = GetMenuItemUrl("Common", "Maintenance"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Queued emails", Title = await _localizationService.GetResourceAsync("Admin.System.QueuedEmails"), PermissionNames = new List { StandardPermission.System.MANAGE_MESSAGE_QUEUE }, Url = GetMenuItemUrl("QueuedEmail", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Schedule tasks", Title = await _localizationService.GetResourceAsync("Admin.System.ScheduleTasks"), PermissionNames = new List { StandardPermission.System.MANAGE_SCHEDULE_TASKS }, Url = GetMenuItemUrl("ScheduleTask", "List"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Search engine friendly names", Title = await _localizationService.GetResourceAsync("Admin.System.SeNames"), PermissionNames = new List { StandardPermission.System.MANAGE_MAINTENANCE }, Url = GetMenuItemUrl("Common", "SeNames"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Templates", Title = await _localizationService.GetResourceAsync("Admin.System.Templates"), PermissionNames = new List { StandardPermission.System.MANAGE_MAINTENANCE }, Url = GetMenuItemUrl("Template", "List"), IconClass = "far fa-dot-circle" } } }, //reports new() { SystemName = "Reports", Title = await _localizationService.GetResourceAsync("Admin.Reports"), IconClass = "fas fa-chart-line", ChildNodes = new List { new() { SystemName = "Sales summary", Title = await _localizationService.GetResourceAsync("Admin.Reports.SalesSummary"), PermissionNames = new List { StandardPermission.Reports.SALES_SUMMARY }, Url = GetMenuItemUrl("Report", "SalesSummary"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Low stock", Title = await _localizationService.GetResourceAsync("Admin.Reports.LowStock"), PermissionNames = new List { StandardPermission.Catalog.PRODUCTS_VIEW, StandardPermission.Reports.LOW_STOCK }, Url = GetMenuItemUrl("Report", "LowStock"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Bestsellers", Title = await _localizationService.GetResourceAsync("Admin.Reports.Sales.Bestsellers"), PermissionNames = new List { StandardPermission.Orders.ORDERS_VIEW, StandardPermission.Reports.BESTSELLERS }, Url = GetMenuItemUrl("Report", "Bestsellers"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Products never purchased", Title = await _localizationService.GetResourceAsync("Admin.Reports.Sales.NeverSold"), PermissionNames = new List { StandardPermission.Orders.ORDERS_VIEW, StandardPermission.Reports.PRODUCTS_NEVER_PURCHASED }, Url = GetMenuItemUrl("Report", "NeverSold"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Country sales", Title = await _localizationService.GetResourceAsync("Admin.Reports.Sales.Country"), PermissionNames = new List { StandardPermission.Reports.COUNTRY_SALES }, Url = GetMenuItemUrl("Report", "CountrySales"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Customers", Title = await _localizationService.GetResourceAsync("Admin.Reports.Customers"), IconClass = "far fa-dot-circle", ChildNodes = new List { new() { SystemName = "Registered customers", Title = await _localizationService.GetResourceAsync("Admin.Reports.Customers.RegisteredCustomers"), PermissionNames = new List { StandardPermission.Customers.CUSTOMERS_VIEW, StandardPermission.Reports.REGISTERED_CUSTOMERS }, Url = GetMenuItemUrl("Report", "RegisteredCustomers"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Customers by order total", Title = await _localizationService.GetResourceAsync("Admin.Reports.Customers.BestBy.BestByOrderTotal"), PermissionNames = new List { StandardPermission.Customers.CUSTOMERS_VIEW, StandardPermission.Reports.CUSTOMERS_BY_ORDER_TOTAL }, Url = GetMenuItemUrl("Report", "BestCustomersByOrderTotal"), IconClass = "far fa-dot-circle" }, new() { SystemName = "Customers by number of orders", Title = await _localizationService.GetResourceAsync("Admin.Reports.Customers.BestBy.BestByNumberOfOrders"), PermissionNames = new List { StandardPermission.Customers.CUSTOMERS_VIEW, StandardPermission.Reports.CUSTOMERS_BY_NUMBER_OF_ORDERS }, Url = GetMenuItemUrl("Report", "BestCustomersByNumberOfOrders"), IconClass = "far fa-dot-circle" } } } } }, //help new() { SystemName = "Help", Title = await _localizationService.GetResourceAsync("Admin.Help"), IconClass = "fas fa-question-circle", ChildNodes = new List { new() { SystemName = "Training", Title = await _localizationService.GetResourceAsync("Admin.Help.Training"), Url = "https://www.nopcommerce.com/training?utm_source=admin-panel&utm_medium=menu&utm_campaign=course&utm_content=help", IconClass = "far fa-dot-circle", OpenUrlInNewTab = true }, new() { SystemName = "Documentation", Title = await _localizationService.GetResourceAsync("Admin.Help.Documentation"), Url = "https://docs.nopcommerce.com?utm_source=admin-panel&utm_medium=menu&utm_campaign=documentation&utm_content=help", IconClass = "far fa-dot-circle", OpenUrlInNewTab = true }, new() { SystemName = "Community forums", Title = await _localizationService.GetResourceAsync("Admin.Help.Forums"), Url = "https://www.nopcommerce.com/boards?utm_source=admin-panel&utm_medium=menu&utm_campaign=forum&utm_content=help", IconClass = "far fa-dot-circle", OpenUrlInNewTab = true }, new() { SystemName = "Premium support services", Title = await _localizationService.GetResourceAsync("Admin.Help.SupportServices"), Url = "https://www.nopcommerce.com/nopcommerce-premium-support-services?utm_source=admin-panel&utm_medium=menu&utm_campaign=premium_support&utm_content=help", IconClass = "far fa-dot-circle", OpenUrlInNewTab = true }, new() { SystemName = "Solution partners", Title = await _localizationService.GetResourceAsync("Admin.Help.SolutionPartners"), Url = "https://www.nopcommerce.com/solution-partners?utm_source=admin-panel&utm_medium=menu&utm_campaign=solution_partners&utm_content=help", IconClass = "far fa-dot-circle", OpenUrlInNewTab = true } } }, //third party plugins new() { SystemName = "Third party plugins", Title = await _localizationService.GetResourceAsync("Admin.Plugins"), IconClass = "fas fa-bars" } } }; } /// /// Loads admin menu /// /// A value indicating whether to show hidden records (Visible == false) /// /// A task that represents the asynchronous operation /// The task result contains the root menu item for admin menu /// protected virtual async Task LoadMenuAsync(bool showHidden) { await FillBaseRootAsync(); AdminMenuItem cloneMenuItem(AdminMenuItem item) { return new AdminMenuItem { PermissionNames = item.PermissionNames, ChildNodes = item.ChildNodes.Select(cloneMenuItem).ToList(), IconClass = item.IconClass, Visible = item.Visible, OpenUrlInNewTab = item.OpenUrlInNewTab, SystemName = item.SystemName, Title = item.Title, Url = item.Url }; } var root = cloneMenuItem(_baseRootMenuItem); var customer = await _workContext.GetCurrentCustomerAsync(); await _eventPublisher.PublishAsync(new AdminMenuCreatedEvent(this, root)); if (await _permissionService.AuthorizeAsync(StandardPermission.Configuration.MANAGE_PLUGINS, customer)) { await _eventPublisher.PublishAsync(new ThirdPartyPluginsMenuItemCreatedEvent(this, root.GetItemBySystem("Third party plugins"))); var adminMenuPlugins = await _adminMenuPluginManager.LoadAllPluginsAsync(customer); foreach (var adminMenuPlugin in adminMenuPlugins) await adminMenuPlugin.ManageSiteMapAsync(root); } async ValueTask authorizePermission(string permissionName) => await _permissionService.AuthorizeAsync(permissionName.Trim()); async Task checkPermissions(AdminMenuItem menuItem, AdminMenuItem rootItem = null) { var permissions = (menuItem.PermissionNames.Any() ? menuItem.PermissionNames : (rootItem?.PermissionNames ?? new List())).Distinct().Where(p => !string.IsNullOrEmpty(p)).ToList(); if (permissions.Any()) menuItem.Visible = menuItem.ChildNodes.Any() ? await permissions.AnyAwaitAsync(authorizePermission) : await permissions.AllAwaitAsync(authorizePermission); foreach (var childNode in menuItem.ChildNodes) await checkPermissions(childNode, menuItem); } await checkPermissions(root); if (showHidden) return root; void checkVisible(AdminMenuItem menuItem) { if (!menuItem.ChildNodes.Any()) { menuItem.Visible = menuItem.Visible && !string.IsNullOrEmpty(menuItem.Url); return; } foreach (var childNode in menuItem.ChildNodes) checkVisible(childNode); menuItem.Visible = menuItem.ChildNodes.Any(n => n.Visible); } checkVisible(root); return root; } #endregion #region Methods /// /// Gets the root node /// /// A value indicating whether to show hidden records (Visible == false) /// /// A task that represents the asynchronous operation /// The task result contains the root menu item /// public async Task GetRootNodeAsync(bool showHidden = false) { if (_rootItem != null) return _rootItem; _rootItem = await LoadMenuAsync(showHidden); var urlHelper = _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext ?? throw new ArgumentNullException(nameof(_actionContextAccessor.ActionContext))); void transformUrl(AdminMenuItem node) { if (node.Url?.StartsWith("~/", StringComparison.Ordinal) ?? false) node.Url = urlHelper.Content(node.Url); foreach (var childNode in node.ChildNodes) transformUrl(childNode); } transformUrl(_rootItem); return _rootItem; } /// /// Generates an admin menu item URL /// /// The name of the controller /// The name of the action method /// Menu item URL public string GetMenuItemUrl(string controllerName, string actionName) { if (string.IsNullOrEmpty(controllerName) || string.IsNullOrEmpty(actionName)) return null; var urlHelper = _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext ?? throw new ArgumentNullException(nameof(_actionContextAccessor.ActionContext))); return urlHelper.Action(actionName, controllerName, new RouteValueDictionary { { "area", AreaNames.ADMIN } }, null, null); } #endregion }