-
Notifications
You must be signed in to change notification settings - Fork 32
Fix Previous/Next and related navigation glitches after refactor #2231
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 7 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
9b1c722
Ensure SiteNavigation implements INavigationTraverable
Mpdreamz 8a78f00
Ensure we get the current navigation in renderlayout from INavigation…
Mpdreamz 55f6533
remove NavigationIndexedByCrossLink
Mpdreamz 4934e0d
SiteNavigation and DocumentationSet share assignments for INavigation…
Mpdreamz f77544a
Fix tests, SiteNavigation was assuming the narrative docs were there
Mpdreamz db7100a
fix integration tests
Mpdreamz 1c61a5a
fix tests for windows
Mpdreamz eab617c
Refactor INavigationTraversable methods to use `GetNavigationFor` ins…
Mpdreamz File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
97 changes: 97 additions & 0 deletions
97
src/Elastic.Documentation.Navigation/INavigationTraversable.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,97 @@ | ||
| // Licensed to Elasticsearch B.V under one or more agreements. | ||
| // 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.Collections.Frozen; | ||
| using System.Runtime.CompilerServices; | ||
|
|
||
| namespace Elastic.Documentation.Navigation; | ||
|
|
||
| public interface INavigationTraversable | ||
| { | ||
| ConditionalWeakTable<IDocumentationFile, INavigationItem> NavigationDocumentationFileLookup { get; } | ||
| FrozenDictionary<int, INavigationItem> NavigationIndexedByOrder { get; } | ||
|
|
||
| IEnumerable<INavigationItem> YieldAll() | ||
| { | ||
| var current = NavigationIndexedByOrder.Values.First(); | ||
| yield return current; | ||
| do | ||
| { | ||
| current = GetNext(current); | ||
| if (current is not null) | ||
| yield return current; | ||
|
|
||
| } while (current is not null); | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Type-safe helper to get navigation item for a specific documentation file type | ||
| /// </summary> | ||
| INavigationItem? GetNavigationItem<TFile>(TFile file) where TFile : IDocumentationFile => | ||
| NavigationDocumentationFileLookup.TryGetValue(file, out var navigation) ? navigation : null; | ||
|
|
||
| INavigationItem? GetPrevious(IDocumentationFile current) | ||
| { | ||
| var currentNavigation = GetCurrent(current); | ||
| return GetPrevious(currentNavigation); | ||
| } | ||
|
|
||
| private INavigationItem? GetPrevious(INavigationItem currentNavigation) | ||
| { | ||
| var index = currentNavigation.NavigationIndex; | ||
| do | ||
| { | ||
| var previous = NavigationIndexedByOrder.GetValueOrDefault(index - 1); | ||
| if (previous is not null && !previous.Hidden && previous.Url != currentNavigation.Url) | ||
| return previous; | ||
| index--; | ||
| } while (index >= 0); | ||
|
|
||
| return null; | ||
| } | ||
|
|
||
| INavigationItem? GetNext(IDocumentationFile current) | ||
| { | ||
| var currentNavigation = GetCurrent(current); | ||
| return GetNext(currentNavigation); | ||
| } | ||
|
|
||
| private INavigationItem? GetNext(INavigationItem currentNavigation) | ||
| { | ||
| var index = currentNavigation.NavigationIndex; | ||
| do | ||
| { | ||
| var next = NavigationIndexedByOrder.GetValueOrDefault(index + 1); | ||
| if (next is not null && !next.Hidden && next.Url != currentNavigation.Url) | ||
| return next; | ||
| index++; | ||
| } while (index <= NavigationIndexedByOrder.Count - 1); | ||
|
|
||
| return null; | ||
| } | ||
|
|
||
| INavigationItem GetCurrent(IDocumentationFile file) => | ||
| NavigationDocumentationFileLookup.TryGetValue(file, out var navigation) | ||
| ? navigation : throw new InvalidOperationException($"Could not find {file.NavigationTitle} in navigation"); | ||
|
|
||
| INavigationItem[] GetParents(INavigationItem current) | ||
| { | ||
| var parents = new List<INavigationItem>(); | ||
| var parent = current.Parent; | ||
| do | ||
| { | ||
| if (parent is null) | ||
| continue; | ||
| if (parents.All(i => i.Url != parent.Url)) | ||
| parents.Add(parent); | ||
|
|
||
| parent = parent.Parent; | ||
| } while (parent != null); | ||
|
|
||
| return [.. parents]; | ||
| } | ||
|
|
||
| INavigationItem[] GetParentsOfMarkdownFile(IDocumentationFile file) => | ||
| NavigationDocumentationFileLookup.TryGetValue(file, out var navigation) ? GetParents(navigation) : []; | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.