diff --git a/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs b/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs index fc47e48..7e6a2eb 100644 --- a/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs +++ b/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs @@ -1,5 +1,7 @@ using Microsoft.AspNetCore.Mvc; using SmartBreadcrumbs.Attributes; +using SmartBreadcrumbs.Extensions; +using SmartBreadcrumbs.Nodes; namespace RazorPagesAndMvc.Controllers.Java { @@ -19,5 +21,19 @@ public IActionResult Post1() return View(); } + public IActionResult Post2() + { + var builder = new FluentBreadcrumbNodeBuilder() + .AddMvcNode("Index", "Java", "Java") + .AddMvcNode(nameof(Index), "EasyJava", "Easy") + .AddMvcNode(nameof(Post2), "EasyJava", "Post 2") + .EndNode() + .EndNode() + .EndNode(); + + ViewData.SetBreadcrumbs(builder.Build()); + + return View(); + } } } \ No newline at end of file diff --git a/examples/RazorPagesAndMvc/Pages/Index.cshtml b/examples/RazorPagesAndMvc/Pages/Index.cshtml index 0a51718..2a1eccc 100644 --- a/examples/RazorPagesAndMvc/Pages/Index.cshtml +++ b/examples/RazorPagesAndMvc/Pages/Index.cshtml @@ -43,6 +43,9 @@
  • Post 1
  • +
  • + Post 2 +
  • diff --git a/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml b/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml index 5193a8e..8a4f17d 100644 --- a/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml +++ b/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml @@ -10,4 +10,7 @@
  • Post 1
  • +
  • + Post 2 +
  • \ No newline at end of file diff --git a/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml b/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml new file mode 100644 index 0000000..19e8111 --- /dev/null +++ b/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml @@ -0,0 +1,8 @@ + +@{ + ViewData["Title"] = "Post2"; + Layout = "~/Pages/Shared/_Layout.cshtml"; +} + +

    Post 2

    + diff --git a/examples/RazorPagesAndMvc/Views/Java/Index.cshtml b/examples/RazorPagesAndMvc/Views/Java/Index.cshtml index 193f53c..a0eb26d 100644 --- a/examples/RazorPagesAndMvc/Views/Java/Index.cshtml +++ b/examples/RazorPagesAndMvc/Views/Java/Index.cshtml @@ -12,6 +12,9 @@
  • Post 1
  • +
  • + Post 2 +
  • diff --git a/src/Extensions/ViewDataDictionaryExtensions.cs b/src/Extensions/ViewDataDictionaryExtensions.cs new file mode 100644 index 0000000..c54cbfb --- /dev/null +++ b/src/Extensions/ViewDataDictionaryExtensions.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using SmartBreadcrumbs.Nodes; + +namespace SmartBreadcrumbs.Extensions +{ + public static class ViewDataDictionaryExtensions + { + public static void SetBreadcrumbs(this ViewDataDictionary viewData, BreadcrumbNode breadcrumb) + { + viewData["BreadcrumbNode"] = breadcrumb; + } + } +} \ No newline at end of file diff --git a/src/Nodes/FluentBreadcrumbNodeBuilder.cs b/src/Nodes/FluentBreadcrumbNodeBuilder.cs new file mode 100644 index 0000000..148f658 --- /dev/null +++ b/src/Nodes/FluentBreadcrumbNodeBuilder.cs @@ -0,0 +1,137 @@ +namespace SmartBreadcrumbs.Nodes +{ + public class FluentBreadcrumbNodeBuilder + { + private readonly FluentBreadcrumbNodeBuilder parent; + private BreadcrumbNode node; + private bool isFirstNodeInitializing; + + private BreadcrumbNode lastNode; + + public FluentBreadcrumbNodeBuilder() + { + isFirstNodeInitializing = true; + } + + public FluentBreadcrumbNodeBuilder(BreadcrumbNode node, FluentBreadcrumbNodeBuilder parent = null) + { + this.node = node; + this.parent = parent; + } + + public FluentBreadcrumbNodeBuilder AddNode(BreadcrumbNode node) + { + if (isFirstNodeInitializing) + { + this.node = node; + isFirstNodeInitializing = false; + return this; + } + else + { + return new FluentBreadcrumbNodeBuilder(node, this); + } + } + + public FluentBreadcrumbNodeBuilder AddMvcNode( + string action, string controller, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null) + { + var node = new MvcBreadcrumbNode(action, controller, title, overwriteTitleOnExactMatch, iconClasses, areaName); + + if (isFirstNodeInitializing) + { + this.node = node; + isFirstNodeInitializing = false; + return this; + } + else + { + return new FluentBreadcrumbNodeBuilder(node, this); + } + } + + public FluentBreadcrumbNodeBuilder AddMvcControllerNode( + string controller, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null) + { + var node = new MvcControllerBreadcrumbNode(controller, title, overwriteTitleOnExactMatch, iconClasses, areaName); + + if (isFirstNodeInitializing) + { + this.node = node; + isFirstNodeInitializing = false; + return this; + } + else + { + return new FluentBreadcrumbNodeBuilder(node, this); + } + } + + public FluentBreadcrumbNodeBuilder AddRazorPageNode( + string path, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null) + { + var node = new RazorPageBreadcrumbNode(path, title, overwriteTitleOnExactMatch, iconClasses, areaName); + + if (isFirstNodeInitializing) + { + this.node = node; + isFirstNodeInitializing = false; + return this; + } + else + { + return new FluentBreadcrumbNodeBuilder(node, this); + } + } + + public FluentBreadcrumbNodeBuilder EndNode() + { + if (parent != null) + { + node.Parent = parent.node; + + if (lastNode == null) // Should only happen one time + { + parent.lastNode = node; + } + else // Bubble the last node up the chain.. (to use inside Build()) + { + parent.lastNode = lastNode; + } + + return parent; + } + + return this; + } + + public FluentBreadcrumbNodeBuilder SetIconClasses(string iconClasses) + { + node.IconClasses = iconClasses; + return this; + } + + public FluentBreadcrumbNodeBuilder SetOverwriteTitleOnExactMatch(bool overwriteTitleOnExactMatch) + { + node.OverwriteTitleOnExactMatch = overwriteTitleOnExactMatch; ; + return this; + } + + public FluentBreadcrumbNodeBuilder SetRouteValues(object routeValues) + { + node.RouteValues = routeValues; + return this; + } + + public FluentBreadcrumbNodeBuilder SetTitle(string title) + { + node.Title = title; + return this; + } + + public BreadcrumbNode Build() + { + return lastNode; + } + } +} \ No newline at end of file