Try our conversational search powered by Generative AI!

Loading...
Area: Optimizely CMS
Applies to versions: 11.21 and higher

How to highlight parent menu items

Recommended reading 
Note: This documentation is for the preview version of the upcoming release of CMS 12/Commerce 14/Search & Navigation 14. Features included here might not be complete, and might be changed before becoming available in the public release. This documentation is provided for evaluation purposes only.

There are scenarios where an add-on has a few views, but only some of them should be accessible through the menu. For example, the add-on "Email manager" has three views available in its menu:

  • Overview
  • Create email
  • Reports

imageiaadj.png

The menu provider looks like this:

 [MenuProvider]
    public class EmailsMenuProvider : IMenuProvider
    {
        public IEnumerable<MenuItem> GetMenuItems()
        {
            // parent
            var emailsSection = new SectionMenuItem("Email manager", "/global/emails")
            {
                IsAvailable = (request) => true
            };

            var overview = new UrlMenuItem("Overview", "/global/emails/overview", ResolveMenuUrl("Overview"))
            {
                IsAvailable = (request) => true,
                SortIndex = 100
            };
            var create = new UrlMenuItem("Create email", "/global/emails/create", ResolveMenuUrl("Create"))
            {
                IsAvailable = (request) => true,
                SortIndex = 200
            };
            var reports = new UrlMenuItem("Reports", "/global/emails/reports", ResolveMenuUrl("Reports"))
            {
                IsAvailable = (request) => true,
                SortIndex = 300
            };

            return new MenuItem[]
            {
                emailsSection,
                overview,
                create,
                reports,
            };
        }

        public static string ResolveMenuUrl(string item)
        {
            var moduleUrl = Paths.ToResource(typeof(EmailsMenuProvider), "emails");
            return UriUtil.Combine(moduleUrl, item);
        }
    }

Create email is a form with a regular submit button. After a user sends an email, they are redirected to the Mail sent confirmation page, which is not rendered in the menu; however, it should have the Create email menu item highlighted.

To do this, the Mail sent view should also be added to the provider with its path based on the Create email path (/global/emails/create/mailsent) and the IsAvailable option set to false. Then, the option is not rendered in the menu, but will highlight its direct parent.

 [MenuProvider]
    public class EmailsMenuProvider : IMenuProvider
    {
        public IEnumerable<MenuItem> GetMenuItems()
        {
            // parent
            var emailsSection = new SectionMenuItem("Email manager", "/global/emails")
            {
                IsAvailable = (request) => true
            };

            var overview = new UrlMenuItem("Overview", "/global/emails/overview", ResolveMenuUrl("Overview"))
            {
                IsAvailable = (request) => true,
                SortIndex = 100
            };
            var create = new UrlMenuItem("Create email", "/global/emails/create", ResolveMenuUrl("Create"))
            {
                IsAvailable = (request) => true,
                SortIndex = 200
            };
            var reports = new UrlMenuItem("Reports", "/global/emails/reports", ResolveMenuUrl("Reports"))
            {
                IsAvailable = (request) => true,
                SortIndex = 300
            };
            var mailSent = new UrlMenuItem(string.Empty, "/global/emails/create/mailsent", ResolveMenuUrl("ResendMessage"))
            {
                IsAvailable = (request) => false,
                SortIndex = 400
            };

            return new MenuItem[]
            {
                emailsSection,
                overview,
                create,
                reports,
                mailSent
            };
        }

        public static string ResolveMenuUrl(string item)
        {
            var moduleUrl = Paths.ToResource(typeof(EmailsMenuProvider), "emails");
            return UriUtil.Combine(moduleUrl, item);
        }
    }
Do you find this information helpful? Please log in to provide feedback.

Last updated: Jul 02, 2021

Recommended reading