Skip to content

Commit 612a4d4

Browse files
committed
more navigation interface refactorings
1 parent 8ddde21 commit 612a4d4

File tree

16 files changed

+45
-67
lines changed

16 files changed

+45
-67
lines changed

src/Elastic.ApiExplorer/Endpoints/ApiEndpoint.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,17 @@
1111

1212
namespace Elastic.ApiExplorer.Endpoints;
1313

14-
public record ApiEndpoint : IPageInformation, IPageRenderer<ApiRenderContext>
14+
public record ApiEndpoint : INavigationModel, IPageRenderer<ApiRenderContext>
1515
{
16-
public ApiEndpoint(string route, IOpenApiPathItem openApiPath, LandingNavigationItem navigationRoot)
16+
public ApiEndpoint(string route, IOpenApiPathItem openApiPath)
1717
{
1818
Route = route;
1919
OpenApiPath = openApiPath;
20-
NavigationRoot = navigationRoot;
2120

2221
}
2322

2423
public string Route { get; }
2524
public IOpenApiPathItem OpenApiPath { get; }
26-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
2725

2826
public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default)
2927
{
@@ -63,7 +61,7 @@ public EndpointNavigationItem(int depth, string url, ApiEndpoint apiEndpoint, La
6361

6462
public IReadOnlyCollection<OperationNavigationItem> NavigationItems { get; set; } = [];
6563

66-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
64+
public INodeNavigationItem<INavigationModel, INavigationItem> NavigationRoot { get; }
6765

68-
public INodeNavigationItem<IPageInformation, INavigationItem>? Parent { get; set; }
66+
public INodeNavigationItem<INavigationModel, INavigationItem>? Parent { get; set; }
6967
}

src/Elastic.ApiExplorer/Landing/LandingNavigationItem.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010

1111
namespace Elastic.ApiExplorer.Landing;
1212

13-
public class ApiLanding(INodeNavigationItem<IPageInformation, INavigationItem> root) : IPageInformation, IPageRenderer<ApiRenderContext>
13+
public class ApiLanding : INavigationModel, IPageRenderer<ApiRenderContext>
1414
{
15-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; } = root;
16-
1715
public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default)
1816
{
1917
var viewModel = new LandingViewModel
@@ -31,11 +29,11 @@ public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context,
3129

3230
public class LandingNavigationItem : INodeNavigationItem<ApiLanding, EndpointNavigationItem>
3331
{
34-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
32+
public INodeNavigationItem<INavigationModel, INavigationItem> NavigationRoot { get; }
3533
public string Id { get; }
3634
public int Depth { get; }
3735
public ApiLanding Index { get; }
38-
public INodeNavigationItem<IPageInformation, INavigationItem>? Parent { get; set; }
36+
public INodeNavigationItem<INavigationModel, INavigationItem>? Parent { get; set; }
3937
public IReadOnlyCollection<EndpointNavigationItem> NavigationItems { get; set; } = [];
4038
public string Url { get; }
4139

@@ -49,7 +47,7 @@ public LandingNavigationItem(string url)
4947
NavigationRoot = this;
5048
Id = ShortId.Create("root");
5149

52-
var landing = new ApiLanding(this);
50+
var landing = new ApiLanding();
5351
Url = url;
5452

5553
Index = landing;

src/Elastic.ApiExplorer/OpenApiGenerator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ public static LandingNavigationItem CreateNavigation(OpenApiDocument openApiDocu
2929
foreach (var path in openApiDocument.Paths)
3030
{
3131
var endpointUrl = $"{url}/{path.Key.Trim('/').Replace('/', '-').Replace("{", "").Replace("}", "")}";
32-
var apiEndpoint = new ApiEndpoint(path.Key, path.Value, rootNavigation);
32+
var apiEndpoint = new ApiEndpoint(path.Key, path.Value);
3333
var endpointNavigationItem = new EndpointNavigationItem(1, endpointUrl, apiEndpoint, rootNavigation, rootNavigation);
3434
var endpointNavigationItems = new List<OperationNavigationItem>();
3535
foreach (var operation in path.Value.Operations)
3636
{
3737
var operationUrl = $"{endpointUrl}/{operation.Key.ToString().ToLowerInvariant()}";
38-
var apiOperation = new ApiOperation(operation.Key, operation.Value, rootNavigation);
38+
var apiOperation = new ApiOperation(operation.Key, operation.Value);
3939
var navigation = new OperationNavigationItem(2, operationUrl, apiOperation, endpointNavigationItem, rootNavigation);
4040
endpointNavigationItems.Add(navigation);
4141
}
@@ -78,7 +78,7 @@ public async Task Generate(Cancel ctx = default)
7878
}
7979

8080
private async Task<IFileInfo> Render<T>(T page, ApiRenderContext renderContext, Cancel ctx)
81-
where T : IPageInformation, IPageRenderer<ApiRenderContext>
81+
where T : INavigationModel, IPageRenderer<ApiRenderContext>
8282
{
8383
var outputFile = OutputFile(renderContext.CurrentNavigation);
8484
if (!outputFile.Directory!.Exists)

src/Elastic.ApiExplorer/Operations/OperationNavigationItem.cs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,9 @@
1111

1212
namespace Elastic.ApiExplorer.Operations;
1313

14-
public record ApiOperation : IPageInformation, IPageRenderer<ApiRenderContext>
14+
public record ApiOperation(OperationType OperationType, OpenApiOperation Operation) : INavigationModel, IPageRenderer<ApiRenderContext>
1515
{
16-
public ApiOperation(OperationType operationType, OpenApiOperation operation, LandingNavigationItem navigationRoot)
17-
{
18-
OperationType = operationType;
19-
Operation = operation;
20-
NavigationRoot = navigationRoot;
21-
22-
}
23-
24-
public OperationType OperationType { get; }
25-
public OpenApiOperation Operation { get; }
26-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
27-
28-
public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, CancellationToken ctx = default)
16+
public async Task RenderAsync(FileSystemStream stream, ApiRenderContext context, Cancel ctx = default)
2917
{
3018
var viewModel = new OperationViewModel
3119
{
@@ -54,13 +42,13 @@ public OperationNavigationItem(int depth, string url, ApiOperation apiOperation,
5442
NavigationTitle = $"{apiOperation.OperationType.ToString().ToLowerInvariant()} {apiOperation.Operation.OperationId}";
5543
}
5644

57-
public INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
45+
public INodeNavigationItem<INavigationModel, INavigationItem> NavigationRoot { get; }
5846
public string Id { get; }
5947
public int Depth { get; }
6048
public ApiOperation Model { get; }
6149
public string Url { get; }
6250

6351
public string NavigationTitle { get; }
6452

65-
public INodeNavigationItem<IPageInformation, INavigationItem>? Parent { get; set; }
53+
public INodeNavigationItem<INavigationModel, INavigationItem>? Parent { get; set; }
6654
}

src/Elastic.Documentation.Site/Navigation/INavigationHtmlWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Elastic.Documentation.Site.Navigation;
88

99
public interface INavigationHtmlWriter
1010
{
11-
Task<string> RenderNavigation(INodeNavigationItem<IPageInformation, INavigationItem> currentRootNavigation, Uri navigationSource, Cancel ctx = default);
11+
Task<string> RenderNavigation(INodeNavigationItem<INavigationModel, INavigationItem> currentRootNavigation, Uri navigationSource, Cancel ctx = default);
1212

1313
async Task<string> Render(NavigationViewModel model, Cancel ctx)
1414
{

src/Elastic.Documentation.Site/Navigation/INavigationItem.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,27 @@
44

55
namespace Elastic.Documentation.Site.Navigation;
66

7-
public interface INavigationScope
8-
{
9-
INodeNavigationItem<IPageInformation, INavigationItem> NavigationRoot { get; }
10-
}
7+
public interface INavigationModel;
118

12-
public interface INavigationItem : INavigationScope
9+
public interface INavigationItem
1310
{
1411
string Url { get; }
1512
string NavigationTitle { get; }
13+
INodeNavigationItem<INavigationModel, INavigationItem> NavigationRoot { get; }
1614

1715
//TODO the setter smells
18-
INodeNavigationItem<IPageInformation, INavigationItem>? Parent { get; set; }
16+
INodeNavigationItem<INavigationModel, INavigationItem>? Parent { get; set; }
1917
}
2018

2119
public interface ILeafNavigationItem<out TModel> : INavigationItem
22-
where TModel : IPageInformation
20+
where TModel : INavigationModel
2321
{
2422
TModel Model { get; }
2523
}
2624

2725
public interface INodeNavigationItem<out TIndex, out TChildNavigation>
2826
: INavigationItem
29-
where TIndex : IPageInformation
27+
where TIndex : INavigationModel
3028
where TChildNavigation : INavigationItem
3129
{
3230
int Depth { get; }
@@ -35,5 +33,3 @@ public interface INodeNavigationItem<out TIndex, out TChildNavigation>
3533
IReadOnlyCollection<TChildNavigation> NavigationItems { get; }
3634
}
3735

38-
public interface IPageInformation : INavigationScope;
39-

src/Elastic.Documentation.Site/Navigation/IsolatedBuildNavigationHtmlWriter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
namespace Elastic.Documentation.Site.Navigation;
99

10-
public class IsolatedBuildNavigationHtmlWriter(BuildContext context, INodeNavigationItem<IPageInformation, INavigationItem> siteRoot)
10+
public class IsolatedBuildNavigationHtmlWriter(BuildContext context, INodeNavigationItem<INavigationModel, INavigationItem> siteRoot)
1111
: INavigationHtmlWriter
1212
{
1313
private readonly ConcurrentDictionary<string, string> _renderedNavigationCache = [];
1414

15-
public async Task<string> RenderNavigation(INodeNavigationItem<IPageInformation, INavigationItem> currentRootNavigation, Uri navigationSource, Cancel ctx = default)
15+
public async Task<string> RenderNavigation(INodeNavigationItem<INavigationModel, INavigationItem> currentRootNavigation, Uri navigationSource, Cancel ctx = default)
1616
{
1717
var navigation = context.Configuration.Features.IsPrimaryNavEnabled
1818
? currentRootNavigation
@@ -27,14 +27,14 @@ public async Task<string> RenderNavigation(INodeNavigationItem<IPageInformation,
2727
return value;
2828
}
2929

30-
private NavigationViewModel CreateNavigationModel(INodeNavigationItem<IPageInformation, INavigationItem> navigation) =>
30+
private NavigationViewModel CreateNavigationModel(INodeNavigationItem<INavigationModel, INavigationItem> navigation) =>
3131
new()
3232
{
3333
Title = navigation.NavigationTitle ?? "Docs",
3434
TitleUrl = navigation.Url ?? context.UrlPathPrefix ?? "/",
3535
Tree = navigation,
3636
IsPrimaryNavEnabled = context.Configuration.Features.IsPrimaryNavEnabled,
3737
IsGlobalAssemblyBuild = false,
38-
TopLevelItems = siteRoot.NavigationItems.OfType<INodeNavigationItem<IPageInformation, INavigationItem>>().ToList()
38+
TopLevelItems = siteRoot.NavigationItems.OfType<INodeNavigationItem<INavigationModel, INavigationItem>>().ToList()
3939
};
4040
}

src/Elastic.Documentation.Site/Navigation/NavigationTreeItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class NavigationTreeItem
88
{
99
public required int Level { get; init; }
1010
//public required MarkdownFile CurrentDocument { get; init; }
11-
public required INodeNavigationItem<IPageInformation, INavigationItem> SubTree { get; init; }
11+
public required INodeNavigationItem<INavigationModel, INavigationItem> SubTree { get; init; }
1212
public required bool IsPrimaryNavEnabled { get; init; }
1313
public required bool IsGlobalAssemblyBuild { get; init; }
1414
public required string RootNavigationId { get; set; }

src/Elastic.Documentation.Site/Navigation/NavigationViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ public class NavigationViewModel
88
{
99
public required string Title { get; init; }
1010
public required string TitleUrl { get; init; }
11-
public required INodeNavigationItem<IPageInformation, INavigationItem> Tree { get; init; }
11+
public required INodeNavigationItem<INavigationModel, INavigationItem> Tree { get; init; }
1212
/// controls whether to split the navigation tree automatically
1313
public required bool IsPrimaryNavEnabled { get; init; }
1414
public required bool IsGlobalAssemblyBuild { get; init; }
1515
//public required IEnumerable<GroupNavigationItem> TopLevelItems { get; init; }
16-
public required IEnumerable<INodeNavigationItem<IPageInformation, INavigationItem>> TopLevelItems { get; init; }
16+
public required IEnumerable<INodeNavigationItem<INavigationModel, INavigationItem>> TopLevelItems { get; init; }
1717
}

src/Elastic.Documentation.Site/Navigation/_TocTree.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
if (item.Id == current?.Id) continue;
3737
<li class="block">
3838
<a
39-
class="block py-2 px-4 hover:underline hover:text-black hover:bg-grey-10 active:bg-blue-elastic-70 active:text-white font-semibold @(item.Index.NavigationRoot.Id == Model.Tree.Id ? "text-blue-elastic" : "")"
39+
class="block py-2 px-4 hover:underline hover:text-black hover:bg-grey-10 active:bg-blue-elastic-70 active:text-white font-semibold @(item.NavigationRoot.Id == Model.Tree.Id ? "text-blue-elastic" : "")"
4040
href="@item.Url"
4141
@Htmx.GetNavHxAttributes(false, "mouseover")>
4242
@item.NavigationTitle

0 commit comments

Comments
 (0)