mirror of
https://github.com/radzenhq/radzen-blazor.git
synced 2026-02-04 05:35:44 +00:00
216 lines
7.4 KiB
C#
216 lines
7.4 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.AspNetCore.Components.Web;
|
|
using Radzen.Blazor.Rendering;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Radzen.Blazor
|
|
{
|
|
/// <summary>
|
|
/// A fieldset container component that groups related form fields with a legend/header and optional collapse functionality.
|
|
/// RadzenFieldset provides semantic form grouping with visual borders, useful for organizing complex forms into logical sections.
|
|
/// Fieldsets are HTML form elements that semantically group related inputs, improving form structure and accessibility.
|
|
/// Features visual and semantic grouping of related form fields, customizable header via Text or HeaderTemplate, optional expand/collapse to hide/show grouped fields,
|
|
/// optional icon in the legend, optional summary content shown when collapsed, and screen reader announcement of fieldset legends for grouped fields.
|
|
/// Use to organize forms into sections like "Personal Information", "Address", "Payment Details". When AllowCollapse is enabled, users can collapse sections they don't need to see.
|
|
/// </summary>
|
|
/// <example>
|
|
/// Basic fieldset grouping form fields:
|
|
/// <code>
|
|
/// <RadzenFieldset Text="Personal Information">
|
|
/// <RadzenStack Gap="1rem">
|
|
/// <RadzenFormField Text="First Name">
|
|
/// <RadzenTextBox @bind-Value=@model.FirstName />
|
|
/// </RadzenFormField>
|
|
/// <RadzenFormField Text="Last Name">
|
|
/// <RadzenTextBox @bind-Value=@model.LastName />
|
|
/// </RadzenFormField>
|
|
/// </RadzenStack>
|
|
/// </RadzenFieldset>
|
|
/// </code>
|
|
/// Collapsible fieldset:
|
|
/// <code>
|
|
/// <RadzenFieldset Text="Advanced Options" Icon="settings" AllowCollapse="true">
|
|
/// Advanced configuration fields...
|
|
/// </RadzenFieldset>
|
|
/// </code>
|
|
/// </example>
|
|
public partial class RadzenFieldset : RadzenComponent
|
|
{
|
|
/// <inheritdoc />
|
|
protected override string GetComponentCssClass() =>
|
|
ClassList.Create("rz-fieldset")
|
|
.Add("rz-fieldset-toggleable", AllowCollapse)
|
|
.ToString();
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether collapsing is allowed. Set to <c>false</c> by default.
|
|
/// </summary>
|
|
/// <value><c>true</c> if collapsing is allowed; otherwise, <c>false</c>.</value>
|
|
[Parameter]
|
|
public bool AllowCollapse { get; set; }
|
|
|
|
private bool collapsed;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether this <see cref="RadzenFieldset"/> is collapsed.
|
|
/// </summary>
|
|
/// <value><c>true</c> if collapsed; otherwise, <c>false</c>.</value>
|
|
[Parameter]
|
|
public bool Collapsed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the title attribute of the expand button.
|
|
/// </summary>
|
|
/// <value>The title attribute value of the expand button.</value>
|
|
[Parameter]
|
|
public string? ExpandTitle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the title attribute of the collapse button.
|
|
/// </summary>
|
|
/// <value>The title attribute value of the collapse button.</value>
|
|
[Parameter]
|
|
public string? CollapseTitle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the aria-label attribute of the expand button.
|
|
/// </summary>
|
|
/// <value>The aria-label attribute value of the expand button.</value>
|
|
[Parameter]
|
|
public string? ExpandAriaLabel { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the aria-label attribute of the collapse button.
|
|
/// </summary>
|
|
/// <value>The aria-label attribute value of the collapse button.</value>
|
|
[Parameter]
|
|
public string? CollapseAriaLabel { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the icon.
|
|
/// </summary>
|
|
/// <value>The icon.</value>
|
|
[Parameter]
|
|
public string? Icon { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the icon color.
|
|
/// </summary>
|
|
/// <value>The icon color.</value>
|
|
[Parameter]
|
|
public string? IconColor { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the text.
|
|
/// </summary>
|
|
/// <value>The text.</value>
|
|
[Parameter]
|
|
public string Text { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the header template.
|
|
/// </summary>
|
|
/// <value>The header template.</value>
|
|
[Parameter]
|
|
public RenderFragment? HeaderTemplate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the child content.
|
|
/// </summary>
|
|
/// <value>The child content.</value>
|
|
[Parameter]
|
|
public RenderFragment? ChildContent { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the summary template.
|
|
/// </summary>
|
|
/// <value>The summary template.</value>
|
|
[Parameter]
|
|
public RenderFragment? SummaryTemplate { get; set; } = null;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the expand callback.
|
|
/// </summary>
|
|
/// <value>The expand callback.</value>
|
|
[Parameter]
|
|
public EventCallback Expand { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the collapse callback.
|
|
/// </summary>
|
|
/// <value>The collapse callback.</value>
|
|
[Parameter]
|
|
public EventCallback Collapse { get; set; }
|
|
|
|
async Task Toggle(EventArgs args)
|
|
{
|
|
collapsed = !collapsed;
|
|
|
|
if (collapsed)
|
|
{
|
|
await Collapse.InvokeAsync(args);
|
|
}
|
|
else
|
|
{
|
|
await Expand.InvokeAsync(args);
|
|
}
|
|
|
|
StateHasChanged();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void OnInitialized()
|
|
{
|
|
base.OnInitialized();
|
|
collapsed = Collapsed;
|
|
}
|
|
|
|
private string TitleAttribute()
|
|
{
|
|
if (collapsed)
|
|
{
|
|
return string.IsNullOrWhiteSpace(ExpandTitle) ? "Expand" : ExpandTitle;
|
|
}
|
|
return string.IsNullOrWhiteSpace(CollapseTitle) ? "Collapse" : CollapseTitle;
|
|
}
|
|
|
|
private string AriaLabelAttribute()
|
|
{
|
|
if (collapsed)
|
|
{
|
|
return string.IsNullOrWhiteSpace(ExpandAriaLabel) ? "Expand" : ExpandAriaLabel;
|
|
}
|
|
return string.IsNullOrWhiteSpace(CollapseAriaLabel) ? "Collapse" : CollapseAriaLabel;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override async Task SetParametersAsync(ParameterView parameters)
|
|
{
|
|
if (parameters.DidParameterChange(nameof(Collapsed), Collapsed))
|
|
{
|
|
collapsed = parameters.GetValueOrDefault<bool>(nameof(Collapsed));
|
|
}
|
|
|
|
await base.SetParametersAsync(parameters);
|
|
}
|
|
|
|
bool preventKeyPress;
|
|
async Task OnKeyPress(KeyboardEventArgs args, Task task)
|
|
{
|
|
var key = args.Code != null ? args.Code : args.Key;
|
|
|
|
if (key == "Space" || key == "Enter")
|
|
{
|
|
preventKeyPress = true;
|
|
|
|
await task;
|
|
}
|
|
else
|
|
{
|
|
preventKeyPress = false;
|
|
}
|
|
}
|
|
}
|
|
}
|