Skip to content

Commit 3d2bbff

Browse files
ArgoZhangLekco1320
andauthored
refactor(TreeView): add FlatItems parameter (#4930)
* refactor: 更改扩展文件名 Co-Authored-By: Lukaß Zhang <lekco_1320@qq.com> * refactor: 利用扩展方法精简代码 Co-Authored-By: Lukaß Zhang <lekco_1320@qq.com> * doc: 增加 FlatItems 示例 * refactor: 临时移除 IsReset 参数逻辑 * chore: bump version 9.1.9-beta01 Co-Authored-By: Lukaß Zhang <lekco_1320@qq.com> --------- Co-Authored-By: Lukaß Zhang <lekco_1320@qq.com>
1 parent 5ca7516 commit 3d2bbff

File tree

7 files changed

+90
-57
lines changed

7 files changed

+90
-57
lines changed

src/BootstrapBlazor.Server/Components/Samples/TreeViews.razor

+10
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,16 @@
211211
</div>
212212
</DemoBlock>
213213

214+
<DemoBlock Title="@Localizer["TreeViewFlatTitle"]"
215+
Introduction="@Localizer["TreeViewFlatIntro"]"
216+
Name="FlatItems">
217+
<section ignore>
218+
@((MarkupString)Localizer["TreeViewFlatItemsDescription"].Value)
219+
</section>
220+
<TreeView TItem="TreeFoo" Items="@FlatItems" ShowCheckbox="true"
221+
AutoCheckChildren="true" AutoCheckParent="true"></TreeView>
222+
</DemoBlock>
223+
214224
<AttributeTable Items="@GetAttributes()"></AttributeTable>
215225

216226
<AttributeTable Items="@GetTreeItemAttributes()" Title="@Localizer["TreeViewsAttribute"]"></AttributeTable>

src/BootstrapBlazor.Server/Components/Samples/TreeViews.razor.cs

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public sealed partial class TreeViews
5757

5858
private List<TreeViewItem<TreeFoo>> VirtualizeItems { get; } = TreeFoo.GetVirtualizeTreeItems();
5959

60+
private List<TreeViewItem<TreeFoo>> FlatItems { get; } = TreeFoo.GetFlatItems();
61+
6062
private Foo Model => Foo.Generate(LocalizerFoo);
6163

6264
private string? _selectedValue;

src/BootstrapBlazor.Server/Data/TreeFoo.cs

+28-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,30 @@ public static List<TreeViewItem<TreeFoo>> GetVirtualizeTreeItems()
7373
return ret;
7474
}
7575

76+
public static List<TreeViewItem<TreeFoo>> GetFlatItems()
77+
{
78+
var items = new List<TreeViewItem<TreeFoo>>();
79+
var foo = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "navigation one", Id = "1010", Icon = "fa-solid fa-font-awesome" }) { Text = "TreeNode 1" };
80+
items.Add(foo);
81+
82+
foo = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "Navigation two", Id = "1020", Icon = "fa-solid fa-font-awesome" }) { Text = "TreeNode 2", HasChildren = true };
83+
items.Add(foo);
84+
85+
var sub = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "Sub menu 1", Id = "1040", ParentId = "1020", Icon = "fa-solid fa-font-awesome" }) { Parent = foo, Text = "TreeNode 1001" };
86+
foo.Items.Add(sub);
87+
88+
sub = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "Sub menu 2", Id = "1050", ParentId = "1020", Icon = "fa-solid fa-font-awesome" }) { Parent = foo, Text = "TreeNode 1002" };
89+
foo.Items.Add(sub);
90+
91+
sub = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "Sub menu 3", Id = "1060", ParentId = "1020", Icon = "fa-solid fa-font-awesome" }) { Parent = foo, Text = "TreeNode 1003" };
92+
foo.Items.Add(sub);
93+
94+
foo = new TreeViewItem<TreeFoo>(new TreeFoo() { Text = "Navigation three", Id = "1030", Icon = "fa-solid fa-font-awesome" }) { Text = "TreeNode 2" };
95+
items.Add(foo);
96+
97+
return items;
98+
}
99+
76100
/// <summary>
77101
/// TreeFoo 带选择框树状数据集
78102
/// </summary>
@@ -81,11 +105,13 @@ public static List<TreeViewItem<TreeFoo>> GetCheckedTreeItems(string? parentId =
81105
{
82106
var node1 = new TreeViewItem<TreeFoo>(new TreeFoo() { Id = $"{parentId}-101", ParentId = parentId })
83107
{
84-
Text = "navigation one", HasChildren = true
108+
Text = "navigation one",
109+
HasChildren = true
85110
};
86111
var node2 = new TreeViewItem<TreeFoo>(new TreeFoo() { Id = $"{parentId}-102", ParentId = parentId })
87112
{
88-
Text = "navigation two", CheckedState = CheckboxState.Checked
113+
Text = "navigation two",
114+
CheckedState = CheckboxState.Checked
89115
};
90116
return [node1, node2];
91117
}

src/BootstrapBlazor/BootstrapBlazor.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.1.8</Version>
4+
<Version>9.1.9-beta01</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Select/SelectTree.razor.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ private List<TreeViewItem<TValue>> GetExpandedItems()
228228
if (ItemCache != Items)
229229
{
230230
ItemCache = Items;
231-
ExpandedItemsCache = TreeItemExtensions.GetAllItems(ItemCache).ToList();
231+
ExpandedItemsCache = TreeViewExtensions.GetAllItems(ItemCache).ToList();
232232
}
233233
return ExpandedItemsCache;
234234
}

src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs

+24-52
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,12 @@ public partial class TreeView<TItem> : IModelEqualityComparer<TItem>
168168
[NotNull]
169169
public List<TreeViewItem<TItem>>? Items { get; set; }
170170

171+
/// <summary>
172+
/// 获得/设置 扁平化数据集合注意 <see cref="TreeViewItem{TItem}.Parent"/> 参数一定要赋值,不然无法呈现层次结构
173+
/// </summary>
174+
[Parameter]
175+
public List<TreeViewItem<TItem>>? FlatItems { get; set; }
176+
171177
/// <summary>
172178
/// 获得/设置 是否显示 CheckBox 默认 false 不显示
173179
/// </summary>
@@ -349,44 +355,32 @@ protected override void OnParametersSet()
349355
/// <returns></returns>
350356
protected override async Task OnParametersSetAsync()
351357
{
352-
if (Items != null)
358+
_rows = null;
359+
Items ??= [];
360+
if (Items.Count > 0)
353361
{
354-
if (IsReset)
355-
{
356-
_rows = null;
357-
TreeNodeStateCache.Reset();
358-
}
359-
else
360-
{
361-
if (Items.Count > 0)
362-
{
363-
await CheckExpand(Items);
364-
}
362+
await CheckExpand(Items);
363+
}
365364

366-
if (ShowCheckbox && (AutoCheckParent || AutoCheckChildren))
367-
{
368-
// 开启 Checkbox 功能时初始化选中节点
369-
TreeNodeStateCache.IsChecked(Items);
370-
}
365+
if (ShowCheckbox && (AutoCheckParent || AutoCheckChildren))
366+
{
367+
// 开启 Checkbox 功能时初始化选中节点
368+
TreeNodeStateCache.IsChecked(Items);
369+
}
371370

372-
// 从数据源中恢复当前 active 节点
373-
if (ActiveItem != null)
374-
{
375-
ActiveItem = TreeNodeStateCache.Find(Items, ActiveItem.Value, out _);
376-
}
377-
}
371+
// 从数据源中恢复当前 active 节点
372+
if (ActiveItem != null)
373+
{
374+
ActiveItem = TreeNodeStateCache.Find(Items, ActiveItem.Value, out _);
375+
}
378376

377+
if (_init == false)
378+
{
379379
// 设置 ActiveItem 默认值
380380
ActiveItem ??= Items.FirstOrDefaultActiveItem();
381381
ActiveItem?.SetParentExpand<TreeViewItem<TItem>, TItem>(true);
382382
_init = true;
383383
}
384-
else
385-
{
386-
_rows = null;
387-
TreeNodeStateCache.Reset();
388-
ActiveItem = null;
389-
}
390384
}
391385

392386
/// <summary>
@@ -838,33 +832,11 @@ private List<TreeViewItem<TItem>> Rows
838832
{
839833
get
840834
{
841-
_rows ??= GetTreeRows(Items);
835+
_rows ??= FlatItems ?? Items.ToFlat<TItem>().ToList();
842836
return _rows;
843837
}
844838
}
845839

846-
/// <summary>
847-
/// 将带层次结构的数据转换为扁平化数据
848-
/// </summary>
849-
/// <param name="items"></param>
850-
/// <returns></returns>
851-
private static List<TreeViewItem<TItem>> GetTreeRows(List<TreeViewItem<TItem>> items)
852-
{
853-
var rows = new List<TreeViewItem<TItem>>();
854-
if (items != null)
855-
{
856-
foreach (var item in items)
857-
{
858-
rows.Add(item);
859-
if (item.IsExpand)
860-
{
861-
rows.AddRange(GetTreeRows(item.Items));
862-
}
863-
}
864-
}
865-
return rows;
866-
}
867-
868840
private static string? GetTreeRowStyle(TreeViewItem<TItem> item)
869841
{
870842
var level = 0;

src/BootstrapBlazor/Extensions/TreeItemExtensions.cs src/BootstrapBlazor/Extensions/TreeViewExtensions.cs

+24-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace BootstrapBlazor.Components;
88
/// <summary>
99
/// 树状结构获取所有项目扩展方法类
1010
/// </summary>
11-
public static class TreeItemExtensions
11+
public static class TreeViewExtensions
1212
{
1313
/// <summary>
1414
/// 在全部树状结构 <paramref name="source"/> 中寻找第一个 Active 节点/>
@@ -43,4 +43,27 @@ public static class TreeItemExtensions
4343
/// <param name="source"></param>
4444
/// <returns></returns>
4545
public static IEnumerable<TreeViewItem<TItem>> GetAllSubItems<TItem>(this IEnumerable<TreeViewItem<TItem>> source) => source.SelectMany(i => i.Items.Count > 0 ? i.Items.Concat(GetAllSubItems(i.Items)) : i.Items);
46+
47+
/// <summary>
48+
/// 将带层次结构的树状数据转换为扁平数据集合
49+
/// </summary>
50+
/// <typeparam name="TItem"></typeparam>
51+
/// <param name="source"></param>
52+
/// <returns></returns>
53+
public static IEnumerable<TreeViewItem<TItem>> ToFlat<TItem>(this IEnumerable<TreeViewItem<TItem>> source)
54+
{
55+
var rows = new List<TreeViewItem<TItem>>();
56+
if (source != null)
57+
{
58+
foreach (var item in source)
59+
{
60+
rows.Add(item);
61+
if (item.IsExpand)
62+
{
63+
rows.AddRange(ToFlat(item.Items));
64+
}
65+
}
66+
}
67+
return rows;
68+
}
4669
}

0 commit comments

Comments
 (0)