Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/MudBlazor.UnitTests/Extensions/EnumExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,18 @@ public void ToDescriptionStringNew()
Align.Inherit.ToDescriptionString().Should().Be("inherit");
Breakpoint.Sm.ToDescriptionString().Should().Be("sm");
}

[TestCase(Adornment.Start, Edge.Start)]
[TestCase(Adornment.End, Edge.End)]
[TestCase(Adornment.None, Edge.False)]
[TestCase((Adornment)999, Edge.False)] // Invalid adornment value
public void Adornment_ToEdge_Should_ReturnExpectedValue(Adornment adornment, Edge expectedEdge)
{
// Act
var result = adornment.ToEdge();

// Assert
result.Should().Be(expectedEdge);
}
}
}
16 changes: 14 additions & 2 deletions src/MudBlazor/Components/Field/MudField.razor
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,26 @@
<div class="@Classname">
@if (Adornment == Adornment.Start)
{
<MudInputAdornment Class="@AdornmentClassname" Icon="@AdornmentIcon" Size="@IconSize" Text="@AdornmentText" Edge="@Edge.Start" AdornmentClick="@OnAdornmentClick" Color="@AdornmentColor" />
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.Start"
AdornmentClick="@OnAdornmentClick" />
}
<div class="@InnerClassname">
@ChildContent
</div>
@if (Adornment == Adornment.End)
{
<MudInputAdornment Class="@AdornmentClassname" Icon="@AdornmentIcon" Size="@IconSize" Text="@AdornmentText" Edge="@Edge.End" AdornmentClick="@OnAdornmentClick" Color="@AdornmentColor" />
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.End"
AdornmentClick="@OnAdornmentClick" />
}
@if (Variant == Variant.Outlined)
{
Expand Down
15 changes: 7 additions & 8 deletions src/MudBlazor/Components/Field/MudField.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
namespace MudBlazor
{
#nullable enable
//TODO Maybe can inherit from MudBaseInput?

// TODO: Maybe can inherit from MudBaseInput?
/// <summary>
/// A component similar to <see cref="MudTextField{T}"/> which supports custom content.
/// </summary>
Expand All @@ -17,9 +16,9 @@ public partial class MudField : MudComponentBase
.AddClass($"mud-input-{Variant.ToDescriptionString()}")
.AddClass($"mud-input-{Variant.ToDescriptionString()}-with-label", !string.IsNullOrEmpty(Label))
.AddClass($"mud-input-adorned-{Adornment.ToDescriptionString()}", Adornment != Adornment.None)
.AddClass($"mud-input-margin-{Margin.ToDescriptionString()}", when: () => Margin != Margin.None)
.AddClass("mud-input-underline", when: () => Underline && Variant != Variant.Outlined)
.AddClass("mud-shrink", when: () => !string.IsNullOrWhiteSpace(ChildContent?.ToString()) || Adornment == Adornment.Start)
.AddClass($"mud-input-margin-{Margin.ToDescriptionString()}", () => Margin != Margin.None)
.AddClass("mud-input-underline", () => Underline && Variant != Variant.Outlined)
.AddClass("mud-shrink", () => !string.IsNullOrWhiteSpace(ChildContent?.ToString()) || Adornment == Adornment.Start)
.AddClass("mud-disabled", Disabled)
.AddClass("mud-input-error", Error && !string.IsNullOrEmpty(ErrorText))
.AddClass($"mud-typography-{Typo.ToDescriptionString()}")
Expand All @@ -28,14 +27,14 @@ public partial class MudField : MudComponentBase
protected string InnerClassname =>
new CssBuilder("mud-input-slot")
.AddClass("mud-input-root")
.AddClass("mud-input-slot-nopadding", when: () => InnerPadding == false)
.AddClass("mud-input-slot-nopadding", () => InnerPadding == false)
.AddClass($"mud-input-root-{Variant.ToDescriptionString()}")
.AddClass($"mud-input-adorned-{Adornment.ToDescriptionString()}", Adornment != Adornment.None)
.AddClass($"mud-input-root-margin-{Margin.ToDescriptionString()}", when: () => Margin != Margin.None)
.AddClass($"mud-input-root-margin-{Margin.ToDescriptionString()}", () => Margin != Margin.None)
.Build();

protected string AdornmentClassname =>
new CssBuilder("mud-input-adornment")
new CssBuilder()
.AddClass($"mud-input-adornment-{Adornment.ToDescriptionString()}", Adornment != Adornment.None)
.AddClass($"mud-text", !string.IsNullOrEmpty(AdornmentText))
.AddClass($"mud-input-root-filled-shrink", Variant == Variant.Filled)
Expand Down
43 changes: 20 additions & 23 deletions src/MudBlazor/Components/Input/MudInput.razor
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@
@if (Adornment == Adornment.Start)
{
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Edge="@Edge.Start"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel"
/>
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.Start"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}

@if (AutoGrow || Lines > 1)
Expand Down Expand Up @@ -109,26 +108,24 @@
@if (GetClearable() && !GetDisabledState())
{
<MudIconButton Class="@ClearButtonClassname"
Color="@Color.Default"
Icon="@ClearIcon"
Size="@Size.Small"
OnClick="@ClearButtonClickHandlerAsync"
aria-label="@Localizer[LanguageResource.MudInput_Clear]"
tabindex="-1"
/>
Color="@Color.Default"
Icon="@ClearIcon"
Size="@Size.Small"
OnClick="@HandleClearButtonAsync"
aria-label="@Localizer[LanguageResource.MudInput_Clear]"
tabindex="-1" />
}

@if (Adornment == Adornment.End)
{
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Edge="@Edge.End"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel"
/>
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.End"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}

@if (Variant == Variant.Outlined)
Expand Down
30 changes: 16 additions & 14 deletions src/MudBlazor/Components/Input/MudInput.razor.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.JSInterop;
using MudBlazor.Utilities;
Expand All @@ -14,23 +12,27 @@ namespace MudBlazor
public partial class MudInput<T> : MudBaseInput<T>
{
protected string Classname =>
new CssBuilder(
MudInputCssHelper.GetClassname(this,
() => HasNativeHtmlPlaceholder() || !string.IsNullOrEmpty(Text) || Adornment == Adornment.Start || !string.IsNullOrWhiteSpace(Placeholder) || ShrinkLabel))
.AddClass("mud-input-auto-grow", when: () => AutoGrow)
new CssBuilder(
MudInputCssHelper.GetClassname(this,
() => HasNativeHtmlPlaceholder() ||
!string.IsNullOrEmpty(Text) ||
Adornment == Adornment.Start ||
!string.IsNullOrWhiteSpace(Placeholder) ||
ShrinkLabel))
.AddClass("mud-input-auto-grow", () => AutoGrow)
.Build();

protected string InputClassname => MudInputCssHelper.GetInputClassname(this);

protected string AdornmentClassname => MudInputCssHelper.GetAdornmentClassname(this);

protected string ClearButtonClassname =>
new CssBuilder("mud-input-clear-button")
.AddClass("me-n1", Adornment == Adornment.End && HideSpinButtons == false)
.AddClass("mud-icon-button-edge-end", Adornment == Adornment.End && HideSpinButtons)
.AddClass("me-6", Adornment != Adornment.End && HideSpinButtons == false)
.AddClass("mud-icon-button-edge-margin-end", Adornment != Adornment.End && HideSpinButtons)
.Build();
new CssBuilder("mud-input-clear-button")
.AddClass("me-n1", Adornment == Adornment.End && HideSpinButtons == false)
.AddClass("mud-icon-button-edge-end", Adornment == Adornment.End && HideSpinButtons)
.AddClass("me-6", Adornment != Adornment.End && HideSpinButtons == false)
.AddClass("mud-icon-button-edge-margin-end", Adornment != Adornment.End && HideSpinButtons)
.Build();

/// <summary>
/// The type of input collected by this component.
Expand Down Expand Up @@ -224,7 +226,7 @@ public override ValueTask SelectRangeAsync(int pos1, int pos2)
/// </summary>
private bool GetClearable() => Clearable && ((Value is string stringValue && !string.IsNullOrWhiteSpace(stringValue)) || (Value is not string && Value is not null));

protected virtual async Task ClearButtonClickHandlerAsync(MouseEventArgs e)
protected virtual async Task HandleClearButtonAsync(MouseEventArgs e)
{
await SetTextAsync(string.Empty, updateValue: true);
await ElementReference.FocusAsync();
Expand Down
25 changes: 21 additions & 4 deletions src/MudBlazor/Components/Input/MudInputAdornment.razor
Original file line number Diff line number Diff line change
@@ -1,19 +1,36 @@
@namespace MudBlazor.Internal
@using MudBlazor.Extensions

<div class="@Class">
<div class="@Classname">
@if (!string.IsNullOrWhiteSpace(Text))
{
<MudText Color="@Color" tabindex="-1">@Text</MudText>
<MudText Class="mud-input-adornment-text"
Color="@Color"
tabindex="-1">
@Text
</MudText>
}
else if (!string.IsNullOrWhiteSpace(Icon))
{
@if (AdornmentClick.HasDelegate)
{
<MudIconButton Class="mud-input-adornment-icon-button" Icon="@Icon" OnClick="@AdornmentClick" Edge="@Edge" Size="@Size" Color="@Color" aria-label="@AriaLabel" tabindex="-1" />
<MudIconButton Class="mud-input-adornment-icon-button"
Icon="@Icon"
OnClick="@AdornmentClick"
Edge="@(Placement.ToEdge())"
Size="@Size"
Color="@Color"
aria-label="@AriaLabel"
tabindex="-1" />
}
else
{
<MudIcon Class="mud-input-adornment-icon" Icon="@Icon" Size="@Size" Color="@Color" aria-label="@AriaLabel" tabindex="-1" />
<MudIcon Class="mud-input-adornment-icon"
Icon="@Icon"
Size="@Size"
Color="@Color"
aria-label="@AriaLabel"
tabindex="-1" />
}
}
</div>
12 changes: 9 additions & 3 deletions src/MudBlazor/Components/Input/MudInputAdornment.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using MudBlazor.Utilities;

namespace MudBlazor.Internal;

Expand All @@ -12,6 +13,11 @@ namespace MudBlazor.Internal;
/// </summary>
public partial class MudInputAdornment
{
protected string Classname =>
new CssBuilder("mud-input-adornment")
.AddClass(Class)
.Build();

/// <summary>
/// The CSS classes for this adornment.
/// </summary>
Expand All @@ -34,13 +40,13 @@ public partial class MudInputAdornment
public string Icon { get; set; }

/// <summary>
/// The amount of negative margin applied to the icon.
/// Specifies the position of the adornment within the field.
/// </summary>
/// <remarks>
/// Defaults to <see cref="Edge.False"/>. Other values are <see cref="Edge.Start"/> and <see cref="Edge.End"/>.
/// Defaults to <see cref="Adornment.None"/>.
/// </remarks>
[Parameter]
public Edge Edge { get; set; }
public Adornment Placement { get; set; }

/// <summary>
/// The size of the icon.
Expand Down
10 changes: 5 additions & 5 deletions src/MudBlazor/Components/Input/MudInputCssHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ public static string GetClassname<T>(MudBaseInput<T> baseInput, Func<bool> shrin
.AddClass($"mud-input-{baseInput.Variant.ToDescriptionString()}")
.AddClass($"mud-input-{baseInput.Variant.ToDescriptionString()}-with-label", !string.IsNullOrEmpty(baseInput.Label))
.AddClass($"mud-input-adorned-{baseInput.Adornment.ToDescriptionString()}", baseInput.Adornment != Adornment.None)
.AddClass($"mud-input-margin-{baseInput.Margin.ToDescriptionString()}", when: () => baseInput.Margin != Margin.None)
.AddClass("mud-input-underline", when: () => baseInput.Underline && baseInput.Variant != Variant.Outlined)
.AddClass("mud-shrink", when: shrinkWhen)
.AddClass($"mud-input-margin-{baseInput.Margin.ToDescriptionString()}", () => baseInput.Margin != Margin.None)
.AddClass("mud-input-underline", () => baseInput.Underline && baseInput.Variant != Variant.Outlined)
.AddClass("mud-shrink", shrinkWhen)
.AddClass("mud-disabled", baseInput.Disabled)
.AddClass("mud-input-error", baseInput.HasErrors)
.AddClass("mud-ltr", baseInput.GetInputType() == InputType.Email || baseInput.GetInputType() == InputType.Telephone)
Expand All @@ -41,7 +41,7 @@ public static string GetInputClassname<T>(MudBaseInput<T> baseInput) =>
.AddClass("mud-input-root")
.AddClass($"mud-input-root-{baseInput.Variant.ToDescriptionString()}")
.AddClass($"mud-input-root-adorned-{baseInput.Adornment.ToDescriptionString()}", baseInput.Adornment != Adornment.None)
.AddClass($"mud-input-root-margin-{baseInput.Margin.ToDescriptionString()}", when: () => baseInput.Margin != Margin.None)
.AddClass($"mud-input-root-margin-{baseInput.Margin.ToDescriptionString()}", () => baseInput.Margin != Margin.None)
.AddClass(baseInput.Class)
.Build();

Expand All @@ -52,7 +52,7 @@ public static string GetInputClassname<T>(MudBaseInput<T> baseInput) =>
/// <param name="baseInput">The input control to use.</param>
/// <returns>A set of CSS classes.</returns>
public static string GetAdornmentClassname<T>(MudBaseInput<T> baseInput) =>
new CssBuilder("mud-input-adornment")
new CssBuilder()
.AddClass($"mud-input-adornment-{baseInput.Adornment.ToDescriptionString()}", baseInput.Adornment != Adornment.None)
.AddClass($"mud-text", !string.IsNullOrEmpty(baseInput.AdornmentText))
.AddClass($"mud-input-root-filled-shrink", baseInput.Variant == Variant.Filled)
Expand Down
18 changes: 16 additions & 2 deletions src/MudBlazor/Components/Input/MudRangeInput.razor
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,14 @@
<div class="@Classname" style="@Style">
@if (Adornment == Adornment.Start)
{
<MudInputAdornment Class="@AdornmentClassname" Icon="@AdornmentIcon" Color="@AdornmentColor" Size="@IconSize" Text="@AdornmentText" Edge="@Edge.Start" AdornmentClick="@OnAdornmentClick" AriaLabel="@AdornmentAriaLabel" />
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.Start"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}

@if (InputType == InputType.Hidden && ChildContent != null)
Expand Down Expand Up @@ -65,7 +72,14 @@

@if (Adornment == Adornment.End)
{
<MudInputAdornment Class="@AdornmentClassname" Icon="@AdornmentIcon" Color="@AdornmentColor" Size="@IconSize" Text="@AdornmentText" Edge="@Edge.End" AdornmentClick="@OnAdornmentClick" AriaLabel="@AdornmentAriaLabel" />
<MudInputAdornment Class="@AdornmentClassname"
Icon="@AdornmentIcon"
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Placement="@Adornment.End"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}

@if (Variant == Variant.Outlined)
Expand Down
7 changes: 4 additions & 3 deletions src/MudBlazor/Components/Mask/MudMask.razor
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Edge="@Edge.Start"
Placement="@Adornment.Start"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}
Expand Down Expand Up @@ -92,7 +92,8 @@
Icon="@ClearIcon"
Size="@Size.Small"
OnClick="@HandleClearButtonAsync"
aria-label="@Localizer[LanguageResource.MudInput_Clear]" />
aria-label="@Localizer[LanguageResource.MudInput_Clear]"
tabindex="-1" />
}

@if (Adornment == Adornment.End)
Expand All @@ -102,7 +103,7 @@
Color="@AdornmentColor"
Size="@IconSize"
Text="@AdornmentText"
Edge="@Edge.End"
Placement="@Adornment.End"
AdornmentClick="@OnAdornmentClick"
AriaLabel="@AdornmentAriaLabel" />
}
Expand Down
Loading