Skip to content

Commit

Permalink
More updates for treeview
Browse files Browse the repository at this point in the history
  • Loading branch information
jbomhold3 committed May 27, 2023
1 parent 6e18e87 commit 158cdf1
Show file tree
Hide file tree
Showing 22 changed files with 175 additions and 78 deletions.
Binary file modified docs/VNext/_framework/BlazorStrap-Docs.dll
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap-Docs.dll.br
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap-Docs.dll.gz
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap-Docs.pdb.gz
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.br
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.gz
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.Extensions.TreeView.pdb.gz
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.WASM.dll
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.WASM.dll.br
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.WASM.dll.gz
Binary file not shown.
Binary file modified docs/VNext/_framework/BlazorStrap.WASM.pdb.gz
Binary file not shown.
6 changes: 3 additions & 3 deletions docs/VNext/_framework/blazor.boot.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
"BlazorComponentUtilities.dll": "sha256-UapksNiQg3lu5QM9uVSLyjEuzRH\/7o22fmcmxcLAAeI=",
"BlazorStrap.dll": "sha256-0aAdXAI4AcUF1VP0aTEiQuZ6DtIIw\/G8fLqvfU2eUBs=",
"BlazorStrap.Extensions.FluentValidation.dll": "sha256-BzhF3enm19S\/hDwxJuWjJ+PiCPNYesAuAjudTtvh70s=",
"BlazorStrap.Extensions.TreeView.dll": "sha256-jtIP6vkXIEL1alGkOy8OMcevalFkGOpAw25puSM6kCk=",
"BlazorStrap.Extensions.TreeView.dll": "sha256-Xk3PmCkKI3l8fIE0i2q2X\/aT2ts3gb3QpdNV5mp1Qbk=",
"BlazorStrap.Extensions.Wizard.dll": "sha256-c\/KTfBSCLKE7\/LdjOApOl8Lj5LttHa0ocUz0ICjhvd0=",
"BlazorStrap.V4.dll": "sha256-s9iBJBxoPyHu\/OT06Thx8uazBj3COgQnm64elQvERLM=",
"BlazorStrap.V5.dll": "sha256-2UojoG0\/HC1140xV\/+c6PGe5K58as0ttWqSQ2BimYE8=",
"BlazorStrap.WASM.dll": "sha256-Qr1fswjA1QpQBuJbuXnuER\/9BJZJQCsT\/psqUx0e9oo=",
"BlazorStrap-Docs.dll": "sha256-RoD4YEI3ol0L5+2VETeVne3zoBBssZQPfch9zPf0\/rc=",
"BlazorStrap.WASM.dll": "sha256-aTNmg7Ip1MGoi1X7NJP10ToaOfBX9190NkDB09+qbfs=",
"BlazorStrap-Docs.dll": "sha256-1beCU4P8JLV6aJwP27v72+4BOtuzExrHNYRu6VNNIUI=",
"ColorCode.dll": "sha256-hF07ps23in9mbwaN4uSoZklQVfyJIw2Ep4R448bfkOk=",
"FluentValidation.dll": "sha256-NflrIQKcfYxeVjrVYw+AP1+xnZJp67Wq9L5Vsd5Cr\/8=",
"Markdig.dll": "sha256-9\/ICq2gSL+hjhMdZXNoIRs8wyZFtZpr3yFSW+RQVdoQ=",
Expand Down
Binary file modified docs/VNext/_framework/blazor.boot.json.br
Binary file not shown.
Binary file modified docs/VNext/_framework/blazor.boot.json.gz
Binary file not shown.
16 changes: 15 additions & 1 deletion docs/VNext/docs/Static/V5/Extensions/TreeView.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,18 @@

##### Dynamic Example with Multi-Select

{{sample=V5/Extensions/TreeView2}}
{{sample=V5/Extensions/TreeView2}}

#### Methods \<BSTree\>
:::

| Method | Return Type | Parameters | Remarks/Output |
|---------------------------|---------------|---------------|-------------------------------|
| SelectAsync | Task | string | Selects item by id | {.table-striped}
| SelectAsync | Task | BSTreeItem | Selects item by BSTreeItem |
| UnselectAsync | Task | string | Unselects item by id |
| UnselectAsync | Task | BSTreeItem | Unselects item by BSTreeItem |
| ClearSelectionAsync | Task | BSTreeItem | Clears Selection |


:::
16 changes: 15 additions & 1 deletion src/BlazorStrap-Docs/wwwroot/Static/V5/Extensions/TreeView.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,18 @@

##### Dynamic Example with Multi-Select

{{sample=V5/Extensions/TreeView2}}
{{sample=V5/Extensions/TreeView2}}

#### Methods \<BSTree\>
:::

| Method | Return Type | Parameters | Remarks/Output |
|---------------------------|---------------|---------------|-------------------------------|
| SelectAsync | Task | string | Selects item by id | {.table-striped}
| SelectAsync | Task | BSTreeItem | Selects item by BSTreeItem |
| UnselectAsync | Task | string | Unselects item by id |
| UnselectAsync | Task | BSTreeItem | Unselects item by BSTreeItem |
| ClearSelectionAsync | Task | BSTreeItem | Clears Selection |


:::
114 changes: 77 additions & 37 deletions src/Extensions/BlazorStrap.Extensions.TreeView/BSTree.razor.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace BlazorStrap.Extensions.TreeView
{
Expand All @@ -16,62 +18,100 @@ public partial class BSTree : ComponentBase
[Parameter] public EventCallback<BSTreeItem> ActiveItemAdded { get; set; }
[Obsolete("Use OnUnselect")]
[Parameter] public EventCallback<BSTreeItem> ActiveItemRemoved { get; set; }
public List<BSTreeItem> ActiveTreeItem { get; set; } = new List<BSTreeItem>();
public ConcurrentDictionary<string, BSTreeItem> ActiveTreeItem { get; set; } = new();
public Func<string,string, Task>? OnRequest { get; set; }

public void AddActiveChild(BSTreeItem child)
public async Task SelectAsync(string id)
{
if (ActiveTreeItem.Contains(child)) return;
ActiveTreeItem.Add(child);

if (ActiveItemAdded.HasDelegate)
{
ActiveItemAdded.InvokeAsync(child);
}
if (OnSelect.HasDelegate)
{
OnSelect.InvokeAsync(child);
}
StateHasChanged();
if(OnRequest != null)
await OnRequest.Invoke("select", id);
}
public void RemoveAllChildren()
public async Task UnselectAsync(string id)
{
var toRemove = new List<BSTreeItem>();
foreach (var child in ActiveTreeItem)
if (OnRequest != null)
await OnRequest.Invoke("unselect", id);
}

public async Task SelectAsync(BSTreeItem child)
{
if (ActiveTreeItem.Values.Contains(child)) return;
if (ActiveTreeItem.TryAdd(child.Id, child))
{
if(child.IsAlwaysActive) continue;
if (ActiveItemRemoved.HasDelegate)
if (ActiveItemAdded.HasDelegate)
{
ActiveItemRemoved.InvokeAsync(child);
await ActiveItemAdded.InvokeAsync(child);
}
if (OnUnselect.HasDelegate)
if (OnSelect.HasDelegate)
{
OnUnselect.InvokeAsync(child);
await OnSelect.InvokeAsync(child);
}
}
await InvokeAsync(StateHasChanged);
}

public async Task ClearSelectionAsync()
{
var toRemove = new List<BSTreeItem>();
foreach (var child in ActiveTreeItem.Values)
{
if (child.IsAlwaysActive) continue;
toRemove.Add(child);
}
foreach (var item in toRemove)
{
ActiveTreeItem.Remove(item);
if(ActiveTreeItem.TryRemove(item.Id, out _))
{
if (ActiveItemRemoved.HasDelegate)
{
await ActiveItemRemoved.InvokeAsync(item);
}
if (OnUnselect.HasDelegate)
{
await OnUnselect.InvokeAsync(item);
}
}
}
await InvokeAsync(StateHasChanged);
}
public void RemoveActiveChild(BSTreeItem child)


public async Task UnselectAsync(BSTreeItem child)
{
if(child.IsAlwaysActive) return;
if (ActiveTreeItem.Contains(child))
if (child.IsAlwaysActive) return;
if (ActiveTreeItem.Values.Contains(child))
{
ActiveTreeItem.Remove(child);
if (ActiveTreeItem.TryRemove(child.Id, out _))
{
if (ActiveItemRemoved.HasDelegate)
{
await ActiveItemRemoved.InvokeAsync(child);
}
if (OnUnselect.HasDelegate)
{
await OnUnselect.InvokeAsync(child);
}
}
}
await InvokeAsync(StateHasChanged);
}

if (ActiveItemRemoved.HasDelegate)
{
ActiveItemRemoved.InvokeAsync(child);
}
if (OnUnselect.HasDelegate)
{
OnUnselect.InvokeAsync(child);
}
if (IsMultiSelect)
StateHasChanged();
[Obsolete("Use AddActiveChildAsync")]
public void AddActiveChild(BSTreeItem child)
{
_ = SelectAsync(child);
}

[Obsolete("Use RemoveActiveChildAsync")]
public void RemoveActiveChild(BSTreeItem child)
{
_ = UnselectAsync(child);
}

[Obsolete("Use RemoveAllChildrenAsync")]
public void RemoveAllChildren()
{
_ = ClearSelectionAsync();
}

}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<CascadingValue Value="this">
@implements IDisposable
<CascadingValue Value="this">
<li class="nav-item">
<div class="nav-link @((IsActive) ? "active" : "") d-flex @Class">
<a @onclick="OnClickEvent" @onclick:preventDefault @onclick:stopPropagation @ondblclick="OnDblClickEvent" @ondblclick:preventDefault @ondblclick:stopPropagation @attributes="AdditionalAttributes">
<a @onclick="OnClickEventAsync" @onclick:preventDefault @onclick:stopPropagation @ondblclick="OnDblClickEventAsync" @ondblclick:preventDefault @ondblclick:stopPropagation @attributes="AdditionalAttributes">
<span class="@(Child != null ? "tree-toggle" : "tree-spacer") @((IsOpen && Child != null) ? "open" : "")"></span>
@GetLabel()
</a>
Expand Down
70 changes: 48 additions & 22 deletions src/Extensions/BlazorStrap.Extensions.TreeView/BSTreeItem.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
using Microsoft.AspNetCore.Components.Web;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace BlazorStrap.Extensions.TreeView
{
public partial class BSTreeItem : ComponentBase
public partial class BSTreeItem : ComponentBase, IDisposable
{
[Parameter(CaptureUnmatchedValues = true)]
public Dictionary<string, object>? AdditionalAttributes { get; set; }
[Parameter] public string? Id { get; set; }
[Parameter] public string Id { get; set; } = Guid.NewGuid().ToString();
[Parameter] public RenderFragment? Label { get; set; }
[Parameter] public string? TextLabel { get; set; }
[Parameter] public string? Class { get; set; }
Expand All @@ -31,67 +32,86 @@ public bool IsOpen
set { _isOpen = value; if (Child != null) Child.IsOpen = value; StateHasChanged(); }
}
private bool _isOpen { get; set; }
protected override void OnParametersSet()
protected async override Task OnParametersSetAsync()
{
if (IsAlwaysActive)
{
IsActive = true;
if(!_defaultSet)
if (!_defaultSet)
{
DoActive(new MouseEventArgs() { CtrlKey = true });
}
await DoActiveAsync(new MouseEventArgs() { CtrlKey = true });
}
_defaultSet = true;
}
else if (IsDefaultActive && !_defaultSet)
{
_defaultSet = true;
IsActive = true;
DoActive(new MouseEventArgs() { CtrlKey = true });
await DoActiveAsync(new MouseEventArgs() { CtrlKey = true });
}
else if (Root != null)
{
IsActive = Root.ActiveTreeItem.Contains(this);
IsActive = Root.ActiveTreeItem.Values.Contains(this);
}

}
protected override void OnInitialized()
{
if(Root != null)
{
Root.OnRequest += OnRequestAsync;
}
if (Root?.IsExpanded ?? false)
{
IsOpen = true;
}
}

private void DoActive(MouseEventArgs e)
private async Task OnRequestAsync(string type, string id)
{
if (Root == null) return;
if(id != Id) return;
if (type == "select")
{
if(!Root.IsMultiSelect)
await Root.ClearSelectionAsync();
await Root.SelectAsync(this);
}
else
{
await Root.UnselectAsync(this);
}
}

private async Task DoActiveAsync(MouseEventArgs e)
{
if (Root == null) return;
if (Root.IsMultiSelect && e.CtrlKey)
{
if (Root.ActiveTreeItem.Contains(this))
Root.RemoveActiveChild(this);
if (Root.ActiveTreeItem.Values.Contains(this))
await Root.UnselectAsync(this);
else
Root.AddActiveChild(this);
await Root.SelectAsync(this);
}
else
{
Root.RemoveAllChildren();
Root.AddActiveChild(this);
await Root.ClearSelectionAsync();
await Root.SelectAsync(this);
}
}
protected void OnClickEvent(MouseEventArgs e)
protected async Task OnClickEventAsync(MouseEventArgs e)
{
if (Root == null) return;
DoActive(e);
await DoActiveAsync(e);
if (!Root.IsDoubleClickToOpen)
{
IsOpen = !IsOpen;
if (OnClick.HasDelegate)
{
OnClick.InvokeAsync(e);
await OnClick.InvokeAsync(e);
}
}
}
protected void OnDblClickEvent(MouseEventArgs e)
protected async Task OnDblClickEventAsync(MouseEventArgs e)
{
if (Root == null) return;
if (Root.IsDoubleClickToOpen)
Expand All @@ -100,7 +120,7 @@ protected void OnDblClickEvent(MouseEventArgs e)

if (OnClick.HasDelegate)
{
OnClick.InvokeAsync(e);
await OnClick.InvokeAsync(e);
}
}
}
Expand All @@ -113,9 +133,15 @@ private RenderFragment GetLabel()
return new RenderFragment(builder => builder.AddContent(0, Label));
}

public void ChildSet()
public async Task ChildSetAsync()
{
await InvokeAsync(StateHasChanged);
}

public void Dispose()
{
StateHasChanged();
if(Root != null)
Root.OnRequest -= OnRequestAsync;
}
}
}
Loading

0 comments on commit 158cdf1

Please sign in to comment.