Skip to content

Commit

Permalink
TreeView: check SelectedNode against internal state value (#4598)
Browse files Browse the repository at this point in the history
* TreeView: check SelectedNode against internal state value

* Fix expanded node when node is first initialized

* Remove null check
  • Loading branch information
stsrki authored Feb 17, 2023
1 parent 09cd682 commit 5a0d8ff
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ internal static class NodeStateExtensions
public static async IAsyncEnumerable<TreeViewNodeState<TNode>> ToNodeStates<TNode>( this IEnumerable<TNode> nodes,
Func<TNode, Task<bool>> hasChildNodesAsync,
Func<TNode, bool> hasChildNodes,
bool expanded )
Func<TNode, bool> expanded )
{
foreach ( var node in nodes ?? Enumerable.Empty<TNode>() )
{
var hasChildren = hasChildNodesAsync is not null
? await hasChildNodesAsync( node )
: hasChildNodes( node );

yield return new TreeViewNodeState<TNode>( node, hasChildren, expanded );
yield return new TreeViewNodeState<TNode>( node, hasChildren, expanded( node ) );
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@ protected override async Task OnInitializedAsync()
{
await AutoExpandNodes();
}
else if ( ExpandedNodes?.Count > 0 )
{
foreach ( var nodeState in NodeStates ?? Enumerable.Empty<TreeViewNodeState<TNode>>() )
{
if ( nodeState.HasChildren && ExpandedNodes.Contains( nodeState.Node ) == true )
{
await LoadChildNodes( nodeState );
}
}
}

await base.OnInitializedAsync();
}
Expand Down Expand Up @@ -60,21 +70,7 @@ private async Task ToggleNode( TreeViewNodeState<TNode> nodeState, bool refresh

if ( nodeState.HasChildren )
{
var childNodes = GetChildNodesAsync is not null
? await GetChildNodesAsync( nodeState.Node )
: GetChildNodes is not null
? GetChildNodes( nodeState.Node )
: null;

if ( !nodeState.Children.Select( x => x.Node ).AreEqual( childNodes ) )
{
nodeState.Children.Clear();

await foreach ( var childNodeState in childNodes.ToNodeStates( HasChildNodesAsync, HasChildNodes, ExpandedNodes.Intersect( childNodes ?? Enumerable.Empty<TNode>() ).Any() ) )
{
nodeState.Children.Add( childNodeState );
}
}
await LoadChildNodes( nodeState );
}
}
else
Expand All @@ -93,6 +89,25 @@ private async Task ToggleNode( TreeViewNodeState<TNode> nodeState, bool refresh
}
}

private async Task LoadChildNodes( TreeViewNodeState<TNode> nodeState )
{
var childNodes = GetChildNodesAsync is not null
? await GetChildNodesAsync( nodeState.Node )
: GetChildNodes is not null
? GetChildNodes( nodeState.Node )
: null;

if ( !nodeState.Children.Select( x => x.Node ).AreEqual( childNodes ) )
{
nodeState.Children.Clear();

await foreach ( var childNodeState in childNodes.ToNodeStates( HasChildNodesAsync, HasChildNodes, ( node ) => ExpandedNodes?.Contains( node ) == true ) )
{
nodeState.Children.Add( childNodeState );
}
}
}

public async Task ExpandAll()
{
foreach ( var nodeState in NodeStates ?? Enumerable.Empty<TreeViewNodeState<TNode>>() )
Expand Down
6 changes: 3 additions & 3 deletions Source/Extensions/Blazorise.TreeView/TreeView.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public partial class TreeView<TNode> : BaseComponent
public override async Task SetParametersAsync( ParameterView parameters )
{
bool nodesChanged = parameters.TryGetValue<IEnumerable<TNode>>( nameof( Nodes ), out var paramNodes ) && !paramNodes.AreEqual( Nodes );
bool selectedNodeChanged = parameters.TryGetValue<TNode>( nameof( SelectedNode ), out var paramSelectedNode ) && !paramSelectedNode.IsEqual( SelectedNode );
bool selectedNodesChanged = parameters.TryGetValue<IList<TNode>>( nameof( SelectedNodes ), out var paramSelectedNodes ) && !paramSelectedNodes.AreEqual( SelectedNodes );
bool selectedNodeChanged = parameters.TryGetValue<TNode>( nameof( SelectedNode ), out var paramSelectedNode ) && !paramSelectedNode.IsEqual( treeViewState.SelectedNode );
bool selectedNodesChanged = parameters.TryGetValue<IList<TNode>>( nameof( SelectedNodes ), out var paramSelectedNodes ) && !paramSelectedNodes.AreEqual( treeViewState.SelectedNodes );

if ( selectedNodeChanged )
{
Expand All @@ -53,7 +53,7 @@ public override async Task SetParametersAsync( ParameterView parameters )
{
treeViewNodeStates = new();

await foreach ( var nodeState in paramNodes.ToNodeStates( HasChildNodesAsync, HasChildNodes, ExpandedNodes.Intersect( paramNodes ?? Enumerable.Empty<TNode>() ).Any() ) )
await foreach ( var nodeState in paramNodes.ToNodeStates( HasChildNodesAsync, HasChildNodes, ( node ) => ExpandedNodes?.Contains( node ) == true ) )
{
treeViewNodeStates.Add( nodeState );
}
Expand Down

0 comments on commit 5a0d8ff

Please sign in to comment.