Try your search with a different keyword or use * as a wildcard.
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
using Nop.Core;
using Nop.Core.Domain.FilterLevels;
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 FilterLevelSettings _filterLevelSettings;
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(FilterLevelSettings filterLevelSettings,
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)
{
_filterLevelSettings = filterLevelSettings;
_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 = "Filter level values",
Title = await _localizationService.GetResourceAsync("Admin.Catalog.FilterLevelValues"),
PermissionNames = new List { StandardPermission.Catalog.FILTER_LEVEL_VALUE_VIEW },
Url = GetMenuItemUrl("FilterLevelValue", "List"),
Visible = _filterLevelSettings.FilterLevelEnabled,
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 = "Newsletter subscription types",
Title = await _localizationService.GetResourceAsync("Admin.Promotions.NewsLetterSubscriptionType"),
PermissionNames = new List { StandardPermission.Promotions.SUBSCRIPTION_TYPE_VIEW },
Url = GetMenuItemUrl("NewsLetterSubscriptionType", "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 = "Menus",
Title = await _localizationService.GetResourceAsync("Admin.ContentManagement.Menus"),
PermissionNames = new List { StandardPermission.ContentManagement.MENU_VIEW },
Url = GetMenuItemUrl("Menu", "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 = "Filter (YMM) settings",
Title = await _localizationService.GetResourceAsync("Admin.Configuration.Settings.FilterLevel"),
Url = GetMenuItemUrl("Setting", "FilterLevel"),
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.GetItemBySystemName("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)
{
if (menuItem.Visible)
{
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 virtual 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 virtual 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
}