diff --git a/docs/VNext/_framework/BlazorStrap-Docs.dll b/docs/VNext/_framework/BlazorStrap-Docs.dll index 49d1232c..56b5541b 100755 Binary files a/docs/VNext/_framework/BlazorStrap-Docs.dll and b/docs/VNext/_framework/BlazorStrap-Docs.dll differ diff --git a/docs/VNext/_framework/BlazorStrap-Docs.dll.br b/docs/VNext/_framework/BlazorStrap-Docs.dll.br index 597835d7..185aa111 100755 Binary files a/docs/VNext/_framework/BlazorStrap-Docs.dll.br and b/docs/VNext/_framework/BlazorStrap-Docs.dll.br differ diff --git a/docs/VNext/_framework/BlazorStrap-Docs.dll.gz b/docs/VNext/_framework/BlazorStrap-Docs.dll.gz index b292cdd6..9d7d59f3 100755 Binary files a/docs/VNext/_framework/BlazorStrap-Docs.dll.gz and b/docs/VNext/_framework/BlazorStrap-Docs.dll.gz differ diff --git a/docs/VNext/_framework/BlazorStrap-Docs.pdb.gz b/docs/VNext/_framework/BlazorStrap-Docs.pdb.gz index fe03b2c9..9a0f87a4 100755 Binary files a/docs/VNext/_framework/BlazorStrap-Docs.pdb.gz and b/docs/VNext/_framework/BlazorStrap-Docs.pdb.gz differ diff --git a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll index b56744c6..fe60caa1 100755 Binary files a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll and b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll differ diff --git a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.br b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.br index eeb621aa..b3b05f5d 100755 Binary files a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.br and b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.br differ diff --git a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.gz b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.gz index 4518af23..eae61cbe 100755 Binary files a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.gz and b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.dll.gz differ diff --git a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.pdb.gz b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.pdb.gz index 7d1a2706..5437378c 100755 Binary files a/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.pdb.gz and b/docs/VNext/_framework/BlazorStrap.Extensions.TreeView.pdb.gz differ diff --git a/docs/VNext/_framework/BlazorStrap.WASM.dll b/docs/VNext/_framework/BlazorStrap.WASM.dll index ed39b0bb..f67ed2e4 100755 Binary files a/docs/VNext/_framework/BlazorStrap.WASM.dll and b/docs/VNext/_framework/BlazorStrap.WASM.dll differ diff --git a/docs/VNext/_framework/BlazorStrap.WASM.dll.br b/docs/VNext/_framework/BlazorStrap.WASM.dll.br index ec9f84f8..82fe56f7 100755 Binary files a/docs/VNext/_framework/BlazorStrap.WASM.dll.br and b/docs/VNext/_framework/BlazorStrap.WASM.dll.br differ diff --git a/docs/VNext/_framework/BlazorStrap.WASM.dll.gz b/docs/VNext/_framework/BlazorStrap.WASM.dll.gz index 59acb193..3b4b3eee 100755 Binary files a/docs/VNext/_framework/BlazorStrap.WASM.dll.gz and b/docs/VNext/_framework/BlazorStrap.WASM.dll.gz differ diff --git a/docs/VNext/_framework/BlazorStrap.WASM.pdb.gz b/docs/VNext/_framework/BlazorStrap.WASM.pdb.gz index a0e26228..4e8ff77c 100755 Binary files a/docs/VNext/_framework/BlazorStrap.WASM.pdb.gz and b/docs/VNext/_framework/BlazorStrap.WASM.pdb.gz differ diff --git a/docs/VNext/_framework/blazor.boot.json b/docs/VNext/_framework/blazor.boot.json index 2f3c9507..98910bd4 100755 --- a/docs/VNext/_framework/blazor.boot.json +++ b/docs/VNext/_framework/blazor.boot.json @@ -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=", diff --git a/docs/VNext/_framework/blazor.boot.json.br b/docs/VNext/_framework/blazor.boot.json.br index e81ddd86..8fd43ce9 100755 Binary files a/docs/VNext/_framework/blazor.boot.json.br and b/docs/VNext/_framework/blazor.boot.json.br differ diff --git a/docs/VNext/_framework/blazor.boot.json.gz b/docs/VNext/_framework/blazor.boot.json.gz index db68f694..120a78d6 100755 Binary files a/docs/VNext/_framework/blazor.boot.json.gz and b/docs/VNext/_framework/blazor.boot.json.gz differ diff --git a/docs/VNext/docs/Static/V5/Extensions/TreeView.md b/docs/VNext/docs/Static/V5/Extensions/TreeView.md index 7f009f85..9fae9215 100644 --- a/docs/VNext/docs/Static/V5/Extensions/TreeView.md +++ b/docs/VNext/docs/Static/V5/Extensions/TreeView.md @@ -41,4 +41,18 @@ ##### Dynamic Example with Multi-Select -{{sample=V5/Extensions/TreeView2}} \ No newline at end of file +{{sample=V5/Extensions/TreeView2}} + +#### Methods \ +::: + +| 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 | + + +::: diff --git a/src/BlazorStrap-Docs/wwwroot/Static/V5/Extensions/TreeView.md b/src/BlazorStrap-Docs/wwwroot/Static/V5/Extensions/TreeView.md index ef16ec6f..5a5fd878 100644 --- a/src/BlazorStrap-Docs/wwwroot/Static/V5/Extensions/TreeView.md +++ b/src/BlazorStrap-Docs/wwwroot/Static/V5/Extensions/TreeView.md @@ -41,4 +41,18 @@ ##### Dynamic Example with Multi-Select -{{sample=V5/Extensions/TreeView2}} \ No newline at end of file +{{sample=V5/Extensions/TreeView2}} + +#### Methods \ +::: + +| 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 | + + +::: diff --git a/src/Extensions/BlazorStrap.Extensions.TreeView/BSTree.razor.cs b/src/Extensions/BlazorStrap.Extensions.TreeView/BSTree.razor.cs index 43d8d597..534ea34f 100644 --- a/src/Extensions/BlazorStrap.Extensions.TreeView/BSTree.razor.cs +++ b/src/Extensions/BlazorStrap.Extensions.TreeView/BSTree.razor.cs @@ -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 { @@ -16,62 +18,100 @@ public partial class BSTree : ComponentBase [Parameter] public EventCallback ActiveItemAdded { get; set; } [Obsolete("Use OnUnselect")] [Parameter] public EventCallback ActiveItemRemoved { get; set; } - public List ActiveTreeItem { get; set; } = new List(); + public ConcurrentDictionary ActiveTreeItem { get; set; } = new(); + public Func? 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(); - 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(); + 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(); + } + } } diff --git a/src/Extensions/BlazorStrap.Extensions.TreeView/BSTreeItem.razor b/src/Extensions/BlazorStrap.Extensions.TreeView/BSTreeItem.razor index d17f4bf2..4c4e5cf2 100644 --- a/src/Extensions/BlazorStrap.Extensions.TreeView/BSTreeItem.razor +++ b/src/Extensions/BlazorStrap.Extensions.TreeView/BSTreeItem.razor @@ -1,7 +1,8 @@ - +@implements IDisposable +