Disclaimer: This website requires JavaScript to function properly. Some features may not work as expected. Please enable JavaScript in your browser settings for the best experience.

HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideLegal TermsGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

Highlight parent menu items

Describes how to highlight parent menu items.

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

  • Overview
  • Create email
  • Reports

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, the form redirects the user to the Mail sent confirmation page, which is not rendered in the menu; however, it should have the Create email menu item highlighted.

Add the Mail sent view 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);
  }
}