Skip to content

Commit 9907228

Browse files
authored
fix(Collapse): handle accordion mode by collapsing other items when one is expanded (#5514)
* refactor: Pageable 更改为 IsPagination * feat: 支持 IsTriggerByPagination 参数 * test: 更新单元测试 * doc: 更新文档注释 * refactor: 更新 PageIndex 默认值 * test: 更新单元测试 * refactor: 更新变量名 * refactor: 代码格式化 * fix: 修复手风琴模式逻辑错误 * refactor: 精简代码提高性能 * test: 更新单元测试 * refactor: 重构代码
1 parent 929214d commit 9907228

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

src/BootstrapBlazor/Components/Collapse/Collapse.razor

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@CollapseItems
77
</CascadingValue>
88
<RenderTemplate>
9-
@foreach (var item in Children)
9+
@foreach (var item in Items)
1010
{
1111
<div @key="item" class="@GetItemClassString(item)">
1212
<div class="@GetHeaderClassString(item)">
@@ -16,7 +16,9 @@
1616
@item.HeaderTemplate
1717
</div>
1818
}
19-
<div class="@GetHeaderButtonClassString(item)" data-bs-toggle="collapse" data-bs-target="@GetTargetIdString(item)" aria-expanded="@(item.IsCollapsed ? "false" : "true")" @onclick="() => OnClickItem(item)">
19+
<div class="@GetHeaderButtonClassString(item)"
20+
data-bs-toggle="collapse" data-bs-target="@GetTargetIdString(item)"
21+
aria-expanded="@(item.IsCollapsed ? "false" : "true")" @onclick="() => OnClickItem(item)">
2022
@if(!string.IsNullOrEmpty(item.Icon))
2123
{
2224
<i class="@GetItemIconString(item)"></i>

src/BootstrapBlazor/Components/Collapse/Collapse.razor.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public partial class Collapse
2020
.Build();
2121

2222
private static string? GetHeaderClassString(CollapseItem item) => CssBuilder.Default("accordion-header")
23-
.AddClass("collapsed", item.IsCollapsed)
2423
.AddClass($"bg-{item.TitleColor.ToDescriptionString()}", item.TitleColor != Color.None)
2524
.AddClass(item.HeaderClass)
2625
.Build();
@@ -47,7 +46,7 @@ public partial class Collapse
4746
/// <summary>
4847
/// 获得/设置 CollapseItem 集合
4948
/// </summary>
50-
protected List<CollapseItem> Children { get; } = new(10);
49+
protected List<CollapseItem> Items { get; } = new(10);
5150

5251
/// <summary>
5352
/// 获得/设置 是否为手风琴效果 默认为 false
@@ -69,6 +68,14 @@ public partial class Collapse
6968

7069
private async Task OnClickItem(CollapseItem item)
7170
{
71+
if (IsAccordion && item.IsCollapsed)
72+
{
73+
// 手风琴模式,设置其他项收起
74+
foreach (var i in Items.Where(i => i != item && !i.IsCollapsed))
75+
{
76+
i.SetCollapsed(true);
77+
}
78+
}
7279
item.SetCollapsed(!item.IsCollapsed);
7380
if (OnCollapseChanged != null)
7481
{
@@ -80,11 +87,11 @@ private async Task OnClickItem(CollapseItem item)
8087
/// 添加 CollapseItem 方法 由 CollapseItem 方法加载时调用
8188
/// </summary>
8289
/// <param name="item">TabItemBase 实例</param>
83-
internal void AddItem(CollapseItem item) => Children.Add(item);
90+
internal void AddItem(CollapseItem item) => Items.Add(item);
8491

8592
/// <summary>
8693
/// 移除 CollapseItem 方法 由 CollapseItem 方法 Dispose 时调用
8794
/// </summary>
8895
/// <param name="item">TabItemBase 实例</param>
89-
internal void RemoveItem(CollapseItem item) => Children.Remove(item);
96+
internal void RemoveItem(CollapseItem item) => Items.Remove(item);
9097
}

test/UnitTest/Components/CollapseTest.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Collapse_Ok()
3333
}
3434

3535
[Fact]
36-
public void Accordion_Ok()
36+
public async Task Accordion_Ok()
3737
{
3838
var cut = Context.RenderComponent<Collapse>(pb =>
3939
{
@@ -53,8 +53,11 @@ public void Accordion_Ok()
5353
});
5454
cut.Contains("is-accordion");
5555

56-
var btn = cut.Find(".accordion-button");
57-
cut.InvokeAsync(() => btn.Click());
56+
var buttons = cut.FindAll(".accordion-button");
57+
await cut.InvokeAsync(() => buttons[0].Click());
58+
59+
buttons = cut.FindAll(".accordion-button");
60+
await cut.InvokeAsync(() => buttons[1].Click());
5861
}
5962

6063
[Fact]

0 commit comments

Comments
 (0)