diff --git a/src/Elastic.ApiExplorer/ApiRenderContext.cs b/src/Elastic.ApiExplorer/ApiRenderContext.cs index 5d6dd220c..73d37bdd9 100644 --- a/src/Elastic.ApiExplorer/ApiRenderContext.cs +++ b/src/Elastic.ApiExplorer/ApiRenderContext.cs @@ -17,4 +17,5 @@ StaticFileContentHashProvider StaticFileContentHashProvider : RenderContext(BuildContext, Model) { public required string NavigationHtml { get; init; } + public required INavigationItem CurrentNavigation { get; init; } } diff --git a/src/Elastic.ApiExplorer/ApiViewModel.cs b/src/Elastic.ApiExplorer/ApiViewModel.cs index 9a8f22856..762ae9a75 100644 --- a/src/Elastic.ApiExplorer/ApiViewModel.cs +++ b/src/Elastic.ApiExplorer/ApiViewModel.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information using Elastic.Documentation.Site.FileProviders; +using Elastic.Documentation.Site.Navigation; namespace Elastic.ApiExplorer; @@ -10,4 +11,5 @@ public abstract class ApiViewModel { public required string NavigationHtml { get; init; } public required StaticFileContentHashProvider StaticFileContentHashProvider { get; init; } + public required INavigationItem CurrentNavigationItem { get; init; } } diff --git a/src/Elastic.ApiExplorer/Endpoints/ApiEndpoint.cs b/src/Elastic.ApiExplorer/Endpoints/ApiEndpoint.cs index f65f8ba7b..356e7651c 100644 --- a/src/Elastic.ApiExplorer/Endpoints/ApiEndpoint.cs +++ b/src/Elastic.ApiExplorer/Endpoints/ApiEndpoint.cs @@ -4,32 +4,24 @@ using System.IO.Abstractions; using Elastic.ApiExplorer.Landing; +using Elastic.ApiExplorer.Operations; using Elastic.Documentation.Site.Navigation; using Microsoft.OpenApi.Models.Interfaces; using RazorSlices; namespace Elastic.ApiExplorer.Endpoints; -public record ApiEndpoint : IPageInformation, IPageRenderer +public record ApiEndpoint : INavigationModel, IPageRenderer { - public ApiEndpoint(string url, string route, IOpenApiPathItem pathValue, IGroupNavigationItem navigationRoot) + public ApiEndpoint(string route, IOpenApiPathItem openApiPath) { Route = route; - PathValue = pathValue; - NavigationRoot = navigationRoot; + OpenApiPath = openApiPath; - //TODO - NavigationTitle = pathValue.Summary; - CrossLink = pathValue.Summary; - Url = url; } - public string NavigationTitle { get; } - public string CrossLink { get; } - public string Url { get; } public string Route { get; } - public IOpenApiPathItem PathValue { get; } - public IGroupNavigationItem NavigationRoot { get; } + public IOpenApiPathItem OpenApiPath { get; } public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default) { @@ -37,34 +29,39 @@ public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, { ApiEndpoint = this, StaticFileContentHashProvider = context.StaticFileContentHashProvider, - NavigationHtml = context.NavigationHtml + NavigationHtml = context.NavigationHtml, + CurrentNavigationItem = context.CurrentNavigation + }; var slice = EndpointView.Create(viewModel); await slice.RenderAsync(stream, cancellationToken: ctx); } } -public class EndpointNavigationItem : IGroupNavigationItem +public class EndpointNavigationItem : INodeNavigationItem { - public EndpointNavigationItem(int depth, ApiEndpoint apiEndpoint, IGroupNavigationItem? parent, LandingNavigationItem root) + public EndpointNavigationItem(int depth, string url, ApiEndpoint apiEndpoint, LandingNavigationItem parent, LandingNavigationItem root) { Parent = parent; Depth = depth; - //Current = group.Current; NavigationRoot = root; Id = NavigationRoot.Id; Index = apiEndpoint; - Current = apiEndpoint; - Endpoint = apiEndpoint; + Url = url; + //TODO + NavigationTitle = apiEndpoint.OpenApiPath.Summary; } - public IGroupNavigationItem NavigationRoot { get; } public string Id { get; } - public IGroupNavigationItem? Parent { get; set; } public int Depth { get; } - public IPageInformation? Current { get; } - public IPageInformation? Index { get; } - public ApiEndpoint Endpoint { get; } - public IReadOnlyCollection NavigationItems { get; set; } = []; + public ApiEndpoint Index { get; } + public string Url { get; } + public string NavigationTitle { get; } + + public IReadOnlyCollection NavigationItems { get; set; } = []; + + public INodeNavigationItem NavigationRoot { get; } + + public INodeNavigationItem? Parent { get; set; } } diff --git a/src/Elastic.ApiExplorer/Endpoints/EndpointView.cshtml b/src/Elastic.ApiExplorer/Endpoints/EndpointView.cshtml index 27bfd0e0a..023545495 100644 --- a/src/Elastic.ApiExplorer/Endpoints/EndpointView.cshtml +++ b/src/Elastic.ApiExplorer/Endpoints/EndpointView.cshtml @@ -9,7 +9,7 @@ Description = "", Layout = null, PageTocItems = [], - CurrentDocument = Model.ApiEndpoint, + CurrentNavigationItem = Model.CurrentNavigationItem, Previous = null, Next = null, NavigationHtml = Model.NavigationHtml, @@ -29,5 +29,5 @@ }; }
-

@Model.ApiEndpoint.Url

+

@Model.CurrentNavigationItem.Url

diff --git a/src/Elastic.ApiExplorer/Landing/LandingNavigationItem.cs b/src/Elastic.ApiExplorer/Landing/LandingNavigationItem.cs index a12b2c3a7..6a1f798a9 100644 --- a/src/Elastic.ApiExplorer/Landing/LandingNavigationItem.cs +++ b/src/Elastic.ApiExplorer/Landing/LandingNavigationItem.cs @@ -3,21 +3,15 @@ // See the LICENSE file in the project root for more information using System.IO.Abstractions; +using Elastic.ApiExplorer.Endpoints; using Elastic.Documentation.Extensions; using Elastic.Documentation.Site.Navigation; using RazorSlices; namespace Elastic.ApiExplorer.Landing; -public class ApiLanding(IGroupNavigationItem root, string url) : IPageInformation, IPageRenderer +public class ApiLanding : INavigationModel, IPageRenderer { - public IGroupNavigationItem NavigationRoot { get; } = root; - public string Url { get; } = url; - - //TODO - public string NavigationTitle { get; } = "API Documentation"; - public string CrossLink { get; } = string.Empty; - public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default) { var viewModel = new LandingViewModel @@ -26,34 +20,36 @@ public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, StaticFileContentHashProvider = context.StaticFileContentHashProvider, NavigationHtml = context.NavigationHtml, ApiInfo = context.Model.Info, + CurrentNavigationItem = context.CurrentNavigation }; var slice = LandingView.Create(viewModel); await slice.RenderAsync(stream, cancellationToken: ctx); } } -public class LandingNavigationItem : IGroupNavigationItem +public class LandingNavigationItem : INodeNavigationItem { - public IGroupNavigationItem NavigationRoot { get; } + public INodeNavigationItem NavigationRoot { get; } public string Id { get; } - public IGroupNavigationItem? Parent { get; set; } public int Depth { get; } - public IPageInformation Current { get; set; } - public IPageInformation Index { get; set; } - public ApiLanding Landing { get; set; } - public IReadOnlyCollection NavigationItems { get; set; } = []; + public ApiLanding Index { get; } + public INodeNavigationItem? Parent { get; set; } + public IReadOnlyCollection NavigationItems { get; set; } = []; + public string Url { get; } + + //TODO + public string NavigationTitle { get; } = "API Documentation"; + public LandingNavigationItem(string url) { - Parent = null; Depth = 0; NavigationRoot = this; Id = ShortId.Create("root"); - var landing = new ApiLanding(this, url); + var landing = new ApiLanding(); + Url = url; Index = landing; - Current = landing; - Landing = landing; } } diff --git a/src/Elastic.ApiExplorer/Landing/LandingView.cshtml b/src/Elastic.ApiExplorer/Landing/LandingView.cshtml index 4716512f8..ac0db7b18 100644 --- a/src/Elastic.ApiExplorer/Landing/LandingView.cshtml +++ b/src/Elastic.ApiExplorer/Landing/LandingView.cshtml @@ -9,7 +9,7 @@ Description = "", Layout = null, PageTocItems = [], - CurrentDocument = Model.Landing, + CurrentNavigationItem = Model.CurrentNavigationItem, Previous = null, Next = null, NavigationHtml = Model.NavigationHtml, diff --git a/src/Elastic.ApiExplorer/OpenApiGenerator.cs b/src/Elastic.ApiExplorer/OpenApiGenerator.cs index a93d24e45..595430bee 100644 --- a/src/Elastic.ApiExplorer/OpenApiGenerator.cs +++ b/src/Elastic.ApiExplorer/OpenApiGenerator.cs @@ -29,14 +29,14 @@ public static LandingNavigationItem CreateNavigation(OpenApiDocument openApiDocu foreach (var path in openApiDocument.Paths) { var endpointUrl = $"{url}/{path.Key.Trim('/').Replace('/', '-').Replace("{", "").Replace("}", "")}"; - var apiEndpoint = new ApiEndpoint(endpointUrl, path.Key, path.Value, rootNavigation); - var endpointNavigationItem = new EndpointNavigationItem(1, apiEndpoint, rootNavigation, rootNavigation); + var apiEndpoint = new ApiEndpoint(path.Key, path.Value); + var endpointNavigationItem = new EndpointNavigationItem(1, endpointUrl, apiEndpoint, rootNavigation, rootNavigation); var endpointNavigationItems = new List(); foreach (var operation in path.Value.Operations) { var operationUrl = $"{endpointUrl}/{operation.Key.ToString().ToLowerInvariant()}"; - var apiOperation = new ApiOperation(operationUrl, operation.Key, operation.Value, rootNavigation); - var navigation = new OperationNavigationItem(2, apiOperation, endpointNavigationItem, rootNavigation); + var apiOperation = new ApiOperation(operation.Key, operation.Value); + var navigation = new OperationNavigationItem(2, operationUrl, apiOperation, endpointNavigationItem, rootNavigation); endpointNavigationItems.Add(navigation); } @@ -65,21 +65,22 @@ public async Task Generate(Cancel ctx = default) var renderContext = new ApiRenderContext(context, openApiDocument, _contentHashProvider) { - NavigationHtml = navigationHtml + NavigationHtml = navigationHtml, + CurrentNavigation = navigation, }; - _ = await Render(navigation.Landing, renderContext, ctx); - foreach (var endpoint in navigation.NavigationItems.OfType()) + _ = await Render(navigation.Index, renderContext, ctx); + foreach (var endpoint in navigation.NavigationItems) { - _ = await Render(endpoint.Endpoint, renderContext, ctx); - foreach (var operation in endpoint.NavigationItems.OfType()) - _ = await Render(operation.Operation, renderContext, ctx); + _ = await Render(endpoint.Index, renderContext, ctx); + foreach (var operation in endpoint.NavigationItems) + _ = await Render(operation.Model, renderContext, ctx); } } private async Task Render(T page, ApiRenderContext renderContext, Cancel ctx) - where T : IPageInformation, IPageRenderer + where T : INavigationModel, IPageRenderer { - var outputFile = OutputFile(page); + var outputFile = OutputFile(renderContext.CurrentNavigation); if (!outputFile.Directory!.Exists) outputFile.Directory.Create(); @@ -87,10 +88,10 @@ private async Task Render(T page, ApiRenderContext renderContext, await page.RenderAsync(stream, renderContext, ctx); return outputFile; - IFileInfo OutputFile(IPageInformation pageInformation) + IFileInfo OutputFile(INavigationItem currentNavigation) { const string indexHtml = "index.html"; - var fileName = pageInformation.Url + "/" + indexHtml; + var fileName = currentNavigation.Url + "/" + indexHtml; var fileInfo = _writeFileSystem.FileInfo.New(Path.Combine(context.DocumentationOutputDirectory.FullName, fileName.Trim('/'))); return fileInfo; } diff --git a/src/Elastic.ApiExplorer/Operations/OperationNavigationItem.cs b/src/Elastic.ApiExplorer/Operations/OperationNavigationItem.cs index 98fe4d220..81c040654 100644 --- a/src/Elastic.ApiExplorer/Operations/OperationNavigationItem.cs +++ b/src/Elastic.ApiExplorer/Operations/OperationNavigationItem.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information using System.IO.Abstractions; +using Elastic.ApiExplorer.Endpoints; using Elastic.ApiExplorer.Landing; using Elastic.Documentation.Site.Navigation; using Microsoft.OpenApi.Models; @@ -10,62 +11,44 @@ namespace Elastic.ApiExplorer.Operations; -public record ApiOperation : IPageInformation, IPageRenderer +public record ApiOperation(OperationType OperationType, OpenApiOperation Operation) : INavigationModel, IPageRenderer { - public ApiOperation(string url, OperationType operationType, OpenApiOperation operation, IGroupNavigationItem navigationRoot) - { - OperationType = operationType; - Operation = operation; - NavigationRoot = navigationRoot; - - //TODO - NavigationTitle = $"{operationType.ToString().ToLowerInvariant()} {operation.OperationId}"; - CrossLink = ""; - Url = url; - } - - public string NavigationTitle { get; } - public string CrossLink { get; } - public string Url { get; } - - public OperationType OperationType { get; } - public OpenApiOperation Operation { get; } - public IGroupNavigationItem NavigationRoot { get; } - - public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, CancellationToken ctx = default) + public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default) { var viewModel = new OperationViewModel { Operation = this, StaticFileContentHashProvider = context.StaticFileContentHashProvider, - NavigationHtml = context.NavigationHtml + NavigationHtml = context.NavigationHtml, + CurrentNavigationItem = context.CurrentNavigation }; var slice = OperationView.Create(viewModel); await slice.RenderAsync(stream, cancellationToken: ctx); } } -public class OperationNavigationItem : IGroupNavigationItem +public class OperationNavigationItem : ILeafNavigationItem { - public OperationNavigationItem(int depth, ApiOperation apiOperation, IGroupNavigationItem? parent, LandingNavigationItem root) + public OperationNavigationItem(int depth, string url, ApiOperation apiOperation, EndpointNavigationItem parent, LandingNavigationItem root) { Parent = parent; Depth = depth; //Current = group.Current; NavigationRoot = root; Id = NavigationRoot.Id; - - Index = apiOperation; - Current = apiOperation; - Operation = apiOperation; + Model = apiOperation; + Url = url; + //TODO + NavigationTitle = $"{apiOperation.OperationType.ToString().ToLowerInvariant()} {apiOperation.Operation.OperationId}"; } - public IGroupNavigationItem NavigationRoot { get; } + public INodeNavigationItem NavigationRoot { get; } public string Id { get; } - public IGroupNavigationItem? Parent { get; set; } public int Depth { get; } - public IPageInformation Current { get; } - public IPageInformation Index { get; } - public IReadOnlyCollection NavigationItems { get; set; } = []; - public ApiOperation Operation { get; set; } + public ApiOperation Model { get; } + public string Url { get; } + + public string NavigationTitle { get; } + + public INodeNavigationItem? Parent { get; set; } } diff --git a/src/Elastic.ApiExplorer/Operations/OperationView.cshtml b/src/Elastic.ApiExplorer/Operations/OperationView.cshtml index deff450bb..8404f7fbe 100644 --- a/src/Elastic.ApiExplorer/Operations/OperationView.cshtml +++ b/src/Elastic.ApiExplorer/Operations/OperationView.cshtml @@ -9,7 +9,7 @@ Description = "", Layout = null, PageTocItems = [], - CurrentDocument = Model.Operation, + CurrentNavigationItem = Model.CurrentNavigationItem, Previous = null, Next = null, NavigationHtml = Model.NavigationHtml, diff --git a/src/Elastic.Documentation.Configuration/Assembler/AssemblyConfiguration.cs b/src/Elastic.Documentation.Configuration/Assembler/AssemblyConfiguration.cs index da49bfbf9..285cdca6b 100644 --- a/src/Elastic.Documentation.Configuration/Assembler/AssemblyConfiguration.cs +++ b/src/Elastic.Documentation.Configuration/Assembler/AssemblyConfiguration.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information using System.Text.RegularExpressions; -using Elastic.Documentation.Serialization; using YamlDotNet.Serialization; using YamlStaticContext = Elastic.Documentation.Configuration.Serialization.YamlStaticContext; diff --git a/src/Elastic.Documentation.LinkIndex/LinkIndexReader.cs b/src/Elastic.Documentation.LinkIndex/LinkIndexReader.cs index b66b69aba..b3a51192f 100644 --- a/src/Elastic.Documentation.LinkIndex/LinkIndexReader.cs +++ b/src/Elastic.Documentation.LinkIndex/LinkIndexReader.cs @@ -2,7 +2,6 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -using System.Net; using Amazon.Runtime; using Amazon.S3; using Amazon.S3.Model; @@ -15,7 +14,7 @@ public class Aws3LinkIndexReader(IAmazonS3 s3Client, string bucketName = "elasti // // Using to access the link index - // allows to read from the link index without the need to provide AWS credentials. + // allows reading from the link index without the need to provide AWS credentials. // public static Aws3LinkIndexReader CreateAnonymous() { diff --git a/src/Elastic.Documentation.LinkIndex/LinkIndexReaderWriter.cs b/src/Elastic.Documentation.LinkIndex/LinkIndexReaderWriter.cs index aee8d47c6..358bb309d 100644 --- a/src/Elastic.Documentation.LinkIndex/LinkIndexReaderWriter.cs +++ b/src/Elastic.Documentation.LinkIndex/LinkIndexReaderWriter.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information using System.Net; -using Amazon.Runtime; using Amazon.S3; using Amazon.S3.Model; using Elastic.Documentation.Links; diff --git a/src/Elastic.Documentation.Site/FileProviders/Preloader.cs b/src/Elastic.Documentation.Site/FileProviders/Preloader.cs index eb6d7f243..1364995a8 100644 --- a/src/Elastic.Documentation.Site/FileProviders/Preloader.cs +++ b/src/Elastic.Documentation.Site/FileProviders/Preloader.cs @@ -5,7 +5,7 @@ using System.Reflection; using System.Text.RegularExpressions; -namespace Elastic.Markdown.Helpers; +namespace Elastic.Documentation.Site.FileProviders; public static partial class FontPreloader { diff --git a/src/Elastic.Documentation.Site/Layout/_Head.cshtml b/src/Elastic.Documentation.Site/Layout/_Head.cshtml index 272833b44..0080c521e 100644 --- a/src/Elastic.Documentation.Site/Layout/_Head.cshtml +++ b/src/Elastic.Documentation.Site/Layout/_Head.cshtml @@ -1,5 +1,5 @@ @inherits RazorSlice -@using Elastic.Markdown.Helpers +@using FontPreloader = Elastic.Documentation.Site.FileProviders.FontPreloader @Model.Title diff --git a/src/Elastic.Documentation.Site/Navigation/INavigationHtmlWriter.cs b/src/Elastic.Documentation.Site/Navigation/INavigationHtmlWriter.cs index 23a6e28fb..f916e635e 100644 --- a/src/Elastic.Documentation.Site/Navigation/INavigationHtmlWriter.cs +++ b/src/Elastic.Documentation.Site/Navigation/INavigationHtmlWriter.cs @@ -8,7 +8,7 @@ namespace Elastic.Documentation.Site.Navigation; public interface INavigationHtmlWriter { - Task RenderNavigation(IGroupNavigationItem currentRootNavigation, Uri navigationSource, Cancel ctx = default); + Task RenderNavigation(INodeNavigationItem currentRootNavigation, Uri navigationSource, Cancel ctx = default); async Task Render(NavigationViewModel model, Cancel ctx) { diff --git a/src/Elastic.Documentation.Site/Navigation/INavigationItem.cs b/src/Elastic.Documentation.Site/Navigation/INavigationItem.cs index 3ea77cd9d..5cf0894bf 100644 --- a/src/Elastic.Documentation.Site/Navigation/INavigationItem.cs +++ b/src/Elastic.Documentation.Site/Navigation/INavigationItem.cs @@ -4,33 +4,62 @@ namespace Elastic.Documentation.Site.Navigation; -public interface INavigationScope +/// Represents navigation model data for documentation elements. +public interface INavigationModel { - IGroupNavigationItem NavigationRoot { get; } + // This interface serves as a marker interface for navigation models + // It's used as a constraint in other navigation-related interfaces } -public interface INavigationItem : INavigationScope +/// Represents an item in the navigation hierarchy. +public interface INavigationItem { - string Id { get; } - IGroupNavigationItem? Parent { get; set; } - int Depth { get; } - //TODO not nullable - IPageInformation? Current { get; } + /// Gets the URL for this navigation item. + string Url { get; } + + /// Gets the title displayed in navigation. + string NavigationTitle { get; } + + /// Gets the root navigation item. + INodeNavigationItem NavigationRoot { get; } + + /// + /// Gets or sets the parent navigation item. + /// + /// + /// TODO: This should be read-only however currently needs the setter in assembler. + /// + INodeNavigationItem? Parent { get; set; } } -// TODO make generic TINdex and TNavigationItem -public interface IGroupNavigationItem : INavigationItem +/// Represents a leaf node in the navigation tree with associated model data. +/// The type attached to the navigation model. +public interface ILeafNavigationItem : INavigationItem + where TModel : INavigationModel { - IPageInformation? Index { get; } - IReadOnlyCollection NavigationItems { get; } + /// Gets the navigation model associated with this navigation item. + TModel Model { get; } } -public interface IPageInformation : INavigationScope + +/// Represents a node in the navigation tree that can contain child items. +/// The type of the index model. +/// The type of child navigation items. +public interface INodeNavigationItem : INavigationItem + where TIndex : INavigationModel + where TChildNavigation : INavigationItem { - string Url { get; } - string NavigationTitle { get; } + /// Gets the depth level in the navigation hierarchy. + int Depth { get; } - //TODO investigate if this is needed, only used by breadcrumbs to deduplicate - string CrossLink { get; } -} + /// Gets the unique identifier for this node. + string Id { get; } + + /// Gets the index model associated with this node. + TIndex Index { get; } + /// + /// Gets the collection of child navigation items. + /// + IReadOnlyCollection NavigationItems { get; } +} diff --git a/src/Elastic.Documentation.Site/Navigation/IsolatedBuildNavigationHtmlWriter.cs b/src/Elastic.Documentation.Site/Navigation/IsolatedBuildNavigationHtmlWriter.cs index f3a686773..d43e7c7cc 100644 --- a/src/Elastic.Documentation.Site/Navigation/IsolatedBuildNavigationHtmlWriter.cs +++ b/src/Elastic.Documentation.Site/Navigation/IsolatedBuildNavigationHtmlWriter.cs @@ -7,12 +7,12 @@ namespace Elastic.Documentation.Site.Navigation; -public class IsolatedBuildNavigationHtmlWriter(BuildContext context, IGroupNavigationItem siteRoot) +public class IsolatedBuildNavigationHtmlWriter(BuildContext context, INodeNavigationItem siteRoot) : INavigationHtmlWriter { private readonly ConcurrentDictionary _renderedNavigationCache = []; - public async Task RenderNavigation(IGroupNavigationItem currentRootNavigation, Uri navigationSource, Cancel ctx = default) + public async Task RenderNavigation(INodeNavigationItem currentRootNavigation, Uri navigationSource, Cancel ctx = default) { var navigation = context.Configuration.Features.IsPrimaryNavEnabled ? currentRootNavigation @@ -27,14 +27,14 @@ public async Task RenderNavigation(IGroupNavigationItem currentRootNavig return value; } - private NavigationViewModel CreateNavigationModel(IGroupNavigationItem navigation) => + private NavigationViewModel CreateNavigationModel(INodeNavigationItem navigation) => new() { - Title = navigation.Index?.NavigationTitle ?? "Docs", - TitleUrl = navigation.Index?.Url ?? context.UrlPathPrefix ?? "/", + Title = navigation.NavigationTitle, + TitleUrl = navigation.Url, Tree = navigation, IsPrimaryNavEnabled = context.Configuration.Features.IsPrimaryNavEnabled, IsGlobalAssemblyBuild = false, - TopLevelItems = siteRoot.NavigationItems.OfType().ToList() + TopLevelItems = siteRoot.NavigationItems.OfType>().ToList() }; } diff --git a/src/Elastic.Documentation.Site/Navigation/NavigationTreeItem.cs b/src/Elastic.Documentation.Site/Navigation/NavigationTreeItem.cs index 64b3d9b3c..8e689111e 100644 --- a/src/Elastic.Documentation.Site/Navigation/NavigationTreeItem.cs +++ b/src/Elastic.Documentation.Site/Navigation/NavigationTreeItem.cs @@ -8,7 +8,7 @@ public class NavigationTreeItem { public required int Level { get; init; } //public required MarkdownFile CurrentDocument { get; init; } - public required IGroupNavigationItem SubTree { get; init; } + public required INodeNavigationItem SubTree { get; init; } public required bool IsPrimaryNavEnabled { get; init; } public required bool IsGlobalAssemblyBuild { get; init; } public required string RootNavigationId { get; set; } diff --git a/src/Elastic.Documentation.Site/Navigation/NavigationViewModel.cs b/src/Elastic.Documentation.Site/Navigation/NavigationViewModel.cs index 1c13ce5b7..70800b015 100644 --- a/src/Elastic.Documentation.Site/Navigation/NavigationViewModel.cs +++ b/src/Elastic.Documentation.Site/Navigation/NavigationViewModel.cs @@ -8,10 +8,10 @@ public class NavigationViewModel { public required string Title { get; init; } public required string TitleUrl { get; init; } - public required IGroupNavigationItem Tree { get; init; } + public required INodeNavigationItem Tree { get; init; } /// controls whether to split the navigation tree automatically public required bool IsPrimaryNavEnabled { get; init; } public required bool IsGlobalAssemblyBuild { get; init; } //public required IEnumerable TopLevelItems { get; init; } - public required IEnumerable TopLevelItems { get; init; } + public required IEnumerable> TopLevelItems { get; init; } } diff --git a/src/Elastic.Documentation.Site/Navigation/_TocTree.cshtml b/src/Elastic.Documentation.Site/Navigation/_TocTree.cshtml index 7c16ddf72..d47cf40f6 100644 --- a/src/Elastic.Documentation.Site/Navigation/_TocTree.cshtml +++ b/src/Elastic.Documentation.Site/Navigation/_TocTree.cshtml @@ -12,9 +12,9 @@
@@ -33,14 +33,13 @@