Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(Collapse): handle accordion mode by collapsing other items when one is expanded #5514

Merged
merged 13 commits into from
Mar 4, 2025
6 changes: 4 additions & 2 deletions src/BootstrapBlazor/Components/Collapse/Collapse.razor
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@CollapseItems
</CascadingValue>
<RenderTemplate>
@foreach (var item in Children)
@foreach (var item in Items)
{
<div @key="item" class="@GetItemClassString(item)">
<div class="@GetHeaderClassString(item)">
Expand All @@ -16,7 +16,9 @@
@item.HeaderTemplate
</div>
}
<div class="@GetHeaderButtonClassString(item)" data-bs-toggle="collapse" data-bs-target="@GetTargetIdString(item)" aria-expanded="@(item.IsCollapsed ? "false" : "true")" @onclick="() => OnClickItem(item)">
<div class="@GetHeaderButtonClassString(item)"
data-bs-toggle="collapse" data-bs-target="@GetTargetIdString(item)"
aria-expanded="@(item.IsCollapsed ? "false" : "true")" @onclick="() => OnClickItem(item)">
@if(!string.IsNullOrEmpty(item.Icon))
{
<i class="@GetItemIconString(item)"></i>
Expand Down
12 changes: 8 additions & 4 deletions src/BootstrapBlazor/Components/Collapse/Collapse.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ public partial class Collapse
.Build();

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

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

private async Task OnClickItem(CollapseItem item)
{
if (IsAccordion && item.IsCollapsed)
{
// 手风琴模式,设置其他项收起
Items.Where(i => i != item && !i.IsCollapsed).ToList().ForEach(i => i.SetCollapsed(true));
}
item.SetCollapsed(!item.IsCollapsed);
if (OnCollapseChanged != null)
{
Expand All @@ -80,11 +84,11 @@ private async Task OnClickItem(CollapseItem item)
/// 添加 CollapseItem 方法 由 CollapseItem 方法加载时调用
/// </summary>
/// <param name="item">TabItemBase 实例</param>
internal void AddItem(CollapseItem item) => Children.Add(item);
internal void AddItem(CollapseItem item) => Items.Add(item);

/// <summary>
/// 移除 CollapseItem 方法 由 CollapseItem 方法 Dispose 时调用
/// </summary>
/// <param name="item">TabItemBase 实例</param>
internal void RemoveItem(CollapseItem item) => Children.Remove(item);
internal void RemoveItem(CollapseItem item) => Items.Remove(item);
}
9 changes: 6 additions & 3 deletions test/UnitTest/Components/CollapseTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public void Collapse_Ok()
}

[Fact]
public void Accordion_Ok()
public async Task Accordion_Ok()
{
var cut = Context.RenderComponent<Collapse>(pb =>
{
Expand All @@ -53,8 +53,11 @@ public void Accordion_Ok()
});
cut.Contains("is-accordion");

var btn = cut.Find(".accordion-button");
cut.InvokeAsync(() => btn.Click());
var buttons = cut.FindAll(".accordion-button");
await cut.InvokeAsync(() => buttons[0].Click());

buttons = cut.FindAll(".accordion-button");
await cut.InvokeAsync(() => buttons[1].Click());
}

[Fact]
Expand Down