Prograss - Input field
This commit is contained in:
		
							parent
							
								
									c5e97f9600
								
							
						
					
					
						commit
						3ea88592ce
					
				@ -20,7 +20,7 @@
 | 
				
			|||||||
	@if (CloseGlyphVisible)
 | 
						@if (CloseGlyphVisible)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		<div class="alert-close">
 | 
							<div class="alert-close">
 | 
				
			||||||
			<GlyphButton ClassList="size-small" Glyph="@CloseGlyph" Clicked="OnCloseGlyphClick" />
 | 
								<IconButton ClassList="size-small" Icon="@CloseGlyph" Clicked="OnCloseGlyphClick" />
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
@ -19,7 +19,7 @@
 | 
				
			|||||||
                          TextChanged="OnTextChanged" OnBlur="OnInputBlurred"
 | 
					                          TextChanged="OnTextChanged" OnBlur="OnInputBlurred"
 | 
				
			||||||
                          OnKeyDown="@this.OnInputKeyDown"
 | 
					                          OnKeyDown="@this.OnInputKeyDown"
 | 
				
			||||||
                          OnKeyUp="@this.OnInputKeyUp" autocomplete=@("disabled-"+Guid.NewGuid()) KeyUpPreventDefault="KeyUpPreventDefault"
 | 
					                          OnKeyUp="@this.OnInputKeyUp" autocomplete=@("disabled-"+Guid.NewGuid()) KeyUpPreventDefault="KeyUpPreventDefault"
 | 
				
			||||||
                          Placeholder="@Placeholder" Immediate="true"
 | 
					                       Placeholder="@Placeholder" ChangeTextImmediately="true"
 | 
				
			||||||
                          InputMode="@InputMode" Pattern="@Pattern"
 | 
					                          InputMode="@InputMode" Pattern="@Pattern"
 | 
				
			||||||
                          T="string" />
 | 
					                          T="string" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,20 +2,20 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@inherits ButtonBase
 | 
					@inherits ButtonBase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@using Connected.Extensions;
 | 
					@using Connected.Components;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<Element disabled="@Disabled"
 | 
					<Element disabled="@Disabled"
 | 
				
			||||||
         title="@GlyphTitle"
 | 
					         title="@IconTitle"
 | 
				
			||||||
         type="@ButtonType.ToDescription()"
 | 
					         type="@ButtonType.ToString()"
 | 
				
			||||||
         ClassList="@CompiledClassList.ToString()"
 | 
					         ClassList="@CompiledClassList.ToString()"
 | 
				
			||||||
         HtmlTag="@HtmlTag"
 | 
					         HtmlTag="@HtmlTag"
 | 
				
			||||||
         PreventOnClickPropagation="PreventOnClickPropagation"
 | 
					         PreventOnClickPropagation="PreventOnClickPropagation"
 | 
				
			||||||
         @attributes="CustomAttributes"
 | 
					         @attributes="CustomAttributes"
 | 
				
			||||||
         @onclick="OnClick">
 | 
					         @onclick="OnClick">
 | 
				
			||||||
   @if (!String.IsNullOrEmpty(Glyph))
 | 
					   @if (!String.IsNullOrEmpty(Icon))
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      <span name="glyph-container" class="glyph-button-label">
 | 
					      <span name="glyph-container" class="glyph-button-label">
 | 
				
			||||||
         <Icon Glyph="@Glyph" />
 | 
					         <Icon Glyph="@Icon" />
 | 
				
			||||||
      </span>
 | 
					      </span>
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   else
 | 
					   else
 | 
				
			||||||
@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Connected.Components;
 | 
					namespace Connected.Components;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public partial class GlyphButton : ButtonBase
 | 
					public partial class IconButton : ButtonBase
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Contains the default container classlist and the user defined classes.
 | 
						/// Contains the default container classlist and the user defined classes.
 | 
				
			||||||
@ -28,16 +28,16 @@ public partial class GlyphButton : ButtonBase
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#region Content placeholders
 | 
						#region Content placeholders
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// The Glyph that will be used in the component.
 | 
						/// The Icon that will be used in the component.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	public string? Glyph { get; set; }
 | 
						public string? Icon { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// GlyphTitle of the icon used for accessibility.
 | 
						/// GlyphTitle of the icon used for accessibility.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	public string? GlyphTitle { get; set; }
 | 
						public string? IconTitle { get; set; }
 | 
				
			||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Styling properties
 | 
						#region Styling properties
 | 
				
			||||||
@ -2,12 +2,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@inherits UIComponent
 | 
					@inherits UIComponent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<GlyphButton aria-pressed="@Toggled.ToString()"
 | 
					<IconButton aria-pressed="@Toggled.ToString()"
 | 
				
			||||||
             ClassList="@ClassList"
 | 
					             ClassList="@ClassList"
 | 
				
			||||||
             Clicked="Toggle"
 | 
					             Clicked="Toggle"
 | 
				
			||||||
             Disabled="Disabled"
 | 
					             Disabled="Disabled"
 | 
				
			||||||
             Glyph="@(Toggled ? ToggledGlyph : Glyph)"
 | 
					             Icon="@(Toggled ? ToggledGlyph : Glyph)"
 | 
				
			||||||
             GlyphTitle="@(Toggled && ToggledGlyphTitle != null ? ToggledGlyphTitle : GlyphTitle)"
 | 
					             IconTitle="@(Toggled && ToggledGlyphTitle != null ? ToggledGlyphTitle : GlyphTitle)"
 | 
				
			||||||
             Variant="Variant"
 | 
					             Variant="Variant"
 | 
				
			||||||
             @attributes="CustomAttributes" 
 | 
					             @attributes="CustomAttributes" 
 | 
				
			||||||
/>
 | 
					/>
 | 
				
			||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Connected.Components;
 | 
					namespace Connected.Components;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public partial class ToggleGlyphButton : UIComponent
 | 
					public partial class ToggleIconButton : UIComponent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	#region EventCallbacks
 | 
						#region EventCallbacks
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
@ -31,7 +31,7 @@
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                @if (PreviousButtonTemplate == null)
 | 
					                @if (PreviousButtonTemplate == null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton tabindex="1" aria-label="Go to previous" Class="@NavigationButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@PreviousIcon" OnClick="Previous" Color="ThemeColor.Inherit" />
 | 
					                    <IconButton tabindex="1" aria-label="Go to previous" Class="@NavigationButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@PreviousIcon" Clicked="Previous" Color="ThemeColor.Inherit" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -51,7 +51,7 @@
 | 
				
			|||||||
                            int current = i;
 | 
					                            int current = i;
 | 
				
			||||||
                            if (BulletTemplate == null)
 | 
					                            if (BulletTemplate == null)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                <IconButton tabindex="@(i+3)" aria-label="@(i+1)" Class="@BulletsButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@(current == SelectedIndex ? CheckedIcon : UncheckedIcon)" OnClick="(() => MoveTo(current))" Color="ThemeColor.Inherit" />
 | 
					                                <IconButton tabindex="@(i+3)" aria-label="@(i+1)" Class="@BulletsButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@(current == SelectedIndex ? CheckedIcon : UncheckedIcon)" Clicked="(() => MoveTo(current))" Color="ThemeColor.Inherit" />
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            else
 | 
					                            else
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
@ -69,7 +69,7 @@
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                @if (NextButtonTemplate == null)
 | 
					                @if (NextButtonTemplate == null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton tabindex="2" aria-label="Go to next" Class="@NavigationButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@NextIcon" OnClick="Next" Color="ThemeColor.Inherit" />
 | 
					                    <IconButton tabindex="2" aria-label="Go to next" Class="@NavigationButtonsClassName" Style="z-index:3;opacity:0.75" Icon="@NextIcon" Clicked="Next" Color="ThemeColor.Inherit" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        @if (OnClose.HasDelegate || ChipSet?.AllClosable==true)
 | 
					        @if (OnClose.HasDelegate || ChipSet?.AllClosable==true)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            <IconButton Class="chip-close-button" Icon="@(String.IsNullOrEmpty(CloseIcon) ? $"{Icons.Material.Filled.Cancel}" : $"{CloseIcon}")" OnClick="OnCloseHandler" Size="Size.Small"/>
 | 
					            <IconButton Class="chip-close-button" Icon="@(String.IsNullOrEmpty(CloseIcon) ? $"{Icons.Material.Filled.Cancel}" : $"{CloseIcon}")" Clicked="OnCloseHandler" Size="Size.Small"/>
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    </span>
 | 
					    </span>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -12,12 +12,12 @@
 | 
				
			|||||||
		<PickerToolbar DisableToolbar="@DisableToolbar" Class="picker-color-toolbar">
 | 
							<PickerToolbar DisableToolbar="@DisableToolbar" Class="picker-color-toolbar">
 | 
				
			||||||
			@if (PickerVariant != PickerVariant.Static)
 | 
								@if (PickerVariant != PickerVariant.Static)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						<IconButton Class="pa-1 mud-close-picker-button" Size="Size.Small" Color="ThemeColor.Inherit" Icon="@CloseIcon" OnClick="@GetEventCallback()" />
 | 
											<IconButton Class="pa-1 mud-close-picker-button" Size="Size.Small" Color="ThemeColor.Inherit" Icon="@CloseIcon" Clicked="@GetEventCallback()" />
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					<Spacer />
 | 
										<Spacer />
 | 
				
			||||||
					<IconButton Class="pa-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Spectrum)" Icon="@SpectrumIcon" OnClick="(() => ChangeView(ColorPickerView.Spectrum))" />
 | 
								<IconButton Class="pa-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Spectrum)" Icon="@SpectrumIcon" Clicked="(() => ChangeView(ColorPickerView.Spectrum))" />
 | 
				
			||||||
					<IconButton Class="pa-1 mx-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Grid)" Icon="@GridIcon" OnClick="(() => ChangeView(ColorPickerView.Grid))" />
 | 
								<IconButton Class="pa-1 mx-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Grid)" Icon="@GridIcon" Clicked="(() => ChangeView(ColorPickerView.Grid))" />
 | 
				
			||||||
					<IconButton Class="pa-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Palette)" Icon="@PaletteIcon" OnClick="(() => ChangeView(ColorPickerView.Palette))" />
 | 
								<IconButton Class="pa-1" Size="Size.Small" Color="GetButtonColor(ColorPickerView.Palette)" Icon="@PaletteIcon" Clicked="(() => ChangeView(ColorPickerView.Palette))" />
 | 
				
			||||||
				</PickerToolbar>
 | 
									</PickerToolbar>
 | 
				
			||||||
				<PickerContent Class="picker-color-content">
 | 
									<PickerContent Class="picker-color-content">
 | 
				
			||||||
					@if (!DisableColorField)
 | 
										@if (!DisableColorField)
 | 
				
			||||||
@ -126,7 +126,7 @@
 | 
				
			|||||||
										@if (!DisableModeSwitch)
 | 
															@if (!DisableModeSwitch)
 | 
				
			||||||
										{
 | 
															{
 | 
				
			||||||
											<div class="picker-control-switch">
 | 
																<div class="picker-control-switch">
 | 
				
			||||||
												<IconButton OnClick="ChangeMode" Icon="@ImportExportIcon" Class="pa-1 me-n1"></IconButton>
 | 
															<IconButton Clicked="ChangeMode" Icon="@ImportExportIcon" Class="pa-1 me-n1"></IconButton>
 | 
				
			||||||
											</div>
 | 
																</div>
 | 
				
			||||||
										}
 | 
															}
 | 
				
			||||||
									</div>
 | 
														</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,7 +129,7 @@
 | 
				
			|||||||
                                            <IconButton 
 | 
					                                            <IconButton 
 | 
				
			||||||
                                                Class="table-row-expander" 
 | 
					                                                Class="table-row-expander" 
 | 
				
			||||||
                                                Icon="@(g.IsExpanded ? Icons.Material.Filled.ExpandMore : Icons.Material.Filled.ChevronRight)"
 | 
					                                                Icon="@(g.IsExpanded ? Icons.Material.Filled.ExpandMore : Icons.Material.Filled.ChevronRight)"
 | 
				
			||||||
                                                OnClick="@(() => ToggleGroupExpansion(g))" />
 | 
					                                        Clicked="@(() => ToggleGroupExpansion(g))" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                            @if (GroupedColumn.GroupTemplate == null)
 | 
					                                            @if (GroupedColumn.GroupTemplate == null)
 | 
				
			||||||
                                            {
 | 
					                                            {
 | 
				
			||||||
@ -377,7 +377,7 @@
 | 
				
			|||||||
        @if (column == null)
 | 
					        @if (column == null)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            <Item xs="1" Class="d-flex">
 | 
					            <Item xs="1" Class="d-flex">
 | 
				
			||||||
                <IconButton Class="remove-filter-button" Icon="@Icons.Material.Filled.Close" OnClick="@filter.RemoveFilter" Size="@Size.Small" Style="align-self:flex-end"></IconButton>
 | 
					                <IconButton Class="remove-filter-button" Icon="@Icons.Material.Filled.Close" Clicked="@filter.RemoveFilter" Size="@Size.Small" Style="align-self:flex-end"></IconButton>
 | 
				
			||||||
            </Item>
 | 
					            </Item>
 | 
				
			||||||
            <Item xs="4">
 | 
					            <Item xs="4">
 | 
				
			||||||
                <Select T="string" Value="@f.Field" ValueChanged="@filter.FieldChanged" FullWidth="true" Label="Column" Dense="true" Margin="@Margin.Dense"
 | 
					                <Select T="string" Value="@f.Field" ValueChanged="@filter.FieldChanged" FullWidth="true" Label="Column" Dense="true" Margin="@Margin.Dense"
 | 
				
			||||||
@ -401,12 +401,12 @@
 | 
				
			|||||||
                @if (filter.dataType == typeof(string) && !(f.Operator ?? "").EndsWith("empty"))
 | 
					                @if (filter.dataType == typeof(string) && !(f.Operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
					                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
				
			||||||
                        Immediate="true" Class="filter-input" />
 | 
					                        ChangeTextImmediately="true" Class="filter-input" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (filter.isNumber && !(f.Operator ?? "").EndsWith("empty"))
 | 
					                else if (filter.isNumber && !(f.Operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <NumericField T="double?" Value="@filter._valueNumber" ValueChanged="@filter.NumberValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
					                    <NumericField T="double?" Value="@filter._valueNumber" ValueChanged="@filter.NumberValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
				
			||||||
                    Immediate="true" Class="filter-input" Culture="@filter.filterColumn?.Culture" />
 | 
					                      ChangeTextImmediately="true" Class="filter-input" Culture="@filter.filterColumn?.Culture" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (filter.isEnum)
 | 
					                else if (filter.isEnum)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -442,7 +442,7 @@
 | 
				
			|||||||
                else if (filter.dataType == typeof(Guid))
 | 
					                else if (filter.dataType == typeof(Guid))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
					                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
				
			||||||
                        Immediate="true" Class="filter-input" />
 | 
					                        ChangeTextImmediately="true" Class="filter-input" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            </Item>
 | 
					            </Item>
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -461,12 +461,12 @@
 | 
				
			|||||||
                @if (filter.dataType == typeof(string) && !(f.Operator ?? "").EndsWith("empty"))
 | 
					                @if (filter.dataType == typeof(string) && !(f.Operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
					                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" 
 | 
				
			||||||
                    Immediate="true" Class="filter-input" />
 | 
					                    ChangeTextImmediately="true" Class="filter-input" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (filter.isNumber && !(f.Operator ?? "").EndsWith("empty"))
 | 
					                else if (filter.isNumber && !(f.Operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <NumericField T="double?" Value="@filter._valueNumber" ValueChanged="@filter.NumberValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
					                    <NumericField T="double?" Value="@filter._valueNumber" ValueChanged="@filter.NumberValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
				
			||||||
                        Immediate="true" Class="filter-input" Culture="@filter.filterColumn?.Culture" />
 | 
					                      ChangeTextImmediately="true" Class="filter-input" Culture="@filter.filterColumn?.Culture" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (filter.isEnum)
 | 
					                else if (filter.isEnum)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -502,7 +502,7 @@
 | 
				
			|||||||
                else if (filter.dataType == typeof(Guid))
 | 
					                else if (filter.dataType == typeof(Guid))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
					                    <TextField T="string" Value="@filter._valueString" ValueChanged="@filter.StringValueChanged" FullWidth="true" Label="Value" Placeholder="Filter value" Margin="@Margin.Dense"
 | 
				
			||||||
                        Immediate="true" Class="filter-input" />
 | 
					                   ChangeTextImmediately="true" Class="filter-input" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            </Item>
 | 
					            </Item>
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -20,10 +20,10 @@
 | 
				
			|||||||
        @Info
 | 
					        @Info
 | 
				
			||||||
    </TextContent>
 | 
					    </TextContent>
 | 
				
			||||||
    <div class="table-pagination-actions">
 | 
					    <div class="table-pagination-actions">
 | 
				
			||||||
        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.FirstPage" Disabled="@BackButtonsDisabled" @onclick="@(() => DataGrid.NavigateTo(Page.First))"/>
 | 
					        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.FirstPage" Disabled="@BackButtonsDisabled" Clicked="@(() => DataGrid.NavigateTo(Page.First))" />
 | 
				
			||||||
        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.NavigateBefore" Disabled="@BackButtonsDisabled" @onclick="@(() => DataGrid.NavigateTo(Page.Previous))"/>
 | 
					        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.NavigateBefore" Disabled="@BackButtonsDisabled" Clicked="@(() => DataGrid.NavigateTo(Page.Previous))" />
 | 
				
			||||||
        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.NavigateNext" Disabled="@ForwardButtonsDisabled" @onclick="@(() => DataGrid.NavigateTo(Page.Next))"/>
 | 
					        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.NavigateNext" Disabled="@ForwardButtonsDisabled" Clicked="@(() => DataGrid.NavigateTo(Page.Next))" />
 | 
				
			||||||
        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.LastPage" Disabled="@ForwardButtonsDisabled" @onclick="@(() => DataGrid.NavigateTo(Page.Last))"/>
 | 
					        <IconButton Class="flip-x-rtl" Icon="@Icons.Material.Filled.LastPage" Disabled="@ForwardButtonsDisabled" Clicked="@(() => DataGrid.NavigateTo(Page.Last))" />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</ToolBar>
 | 
					</ToolBar>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -14,11 +14,11 @@
 | 
				
			|||||||
            <Stack Row="true">
 | 
					            <Stack Row="true">
 | 
				
			||||||
                @if (dataType == typeof(string) && !(_operator ?? "").EndsWith("empty"))
 | 
					                @if (dataType == typeof(string) && !(_operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <TextField T="string" Value="@_valueString" ValueChanged="@StringValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" Immediate="true" />
 | 
					                    <TextField T="string" Value="@_valueString" ValueChanged="@StringValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" ChangeTextImmediately="true" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (isNumber && !(_operator ?? "").EndsWith("empty"))
 | 
					                else if (isNumber && !(_operator ?? "").EndsWith("empty"))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <NumericField T="double?" Culture="@Column.Culture" Value="@_valueNumber" ValueChanged="@NumberValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" Immediate="true"></NumericField>
 | 
					                    <NumericField T="double?" Culture="@Column.Culture" Value="@_valueNumber" ValueChanged="@NumberValueChanged" FullWidth="true" Placeholder="Filter value" Margin="@Margin.Dense" ChangeTextImmediately="true"></NumericField>
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (isEnum)
 | 
					                else if (isEnum)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -58,7 +58,7 @@
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                </Menu>
 | 
					                </Menu>
 | 
				
			||||||
            <GlyphButton Class="align-self-center" Icon="@Icons.Material.Filled.FilterAltOff" Size="@Size.Small" Clicked="@ClearFilter"></GlyphButton>
 | 
					            <IconButton Class="align-self-center" Icon="@Icons.Material.Filled.FilterAltOff" Size="@Size.Small" Clicked="@ClearFilter"></IconButton>
 | 
				
			||||||
            </Stack>
 | 
					            </Stack>
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -41,11 +41,11 @@ else if (Column != null && !Column.Hidden)
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (_initialDirection == SortDirection.None)
 | 
					                    if (_initialDirection == SortDirection.None)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <IconButton Icon="@Column.SortIcon" Class="@sortIconClass" Size="@Size.Small" OnClick="@SortChangedAsync"></IconButton>
 | 
					                        <IconButton Icon="@Column.SortIcon" Class="@sortIconClass" Size="@Size.Small" Clicked="@SortChangedAsync"></IconButton>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <IconButton Icon="@Column.SortIcon" Class="@sortIconClass" Size="@Size.Small" OnClick="@SortChangedAsync"></IconButton>
 | 
					                        <IconButton Icon="@Column.SortIcon" Class="@sortIconClass" Size="@Size.Small" Clicked="@SortChangedAsync"></IconButton>
 | 
				
			||||||
                        if(DataGrid.SortMode == SortMode.Multiple)
 | 
					                        if(DataGrid.SortMode == SortMode.Multiple)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            <span class="sort-index mud-text-disabled">@(Column.SortIndex + 1)</span>
 | 
					                            <span class="sort-index mud-text-disabled">@(Column.SortIndex + 1)</span>
 | 
				
			||||||
@ -57,11 +57,11 @@ else if (Column != null && !Column.Hidden)
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (hasFilter)
 | 
					                    if (hasFilter)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <IconButton Class="filter-button filtered" Icon="@Icons.Material.Filled.FilterAlt" Size="@Size.Small" OnClick="@OpenFilters"></IconButton>
 | 
					                        <IconButton Class="filter-button filtered" Icon="@Icons.Material.Filled.FilterAlt" Size="@Size.Small" Clicked="@OpenFilters"></IconButton>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else if (showFilterIcon)
 | 
					                    else if (showFilterIcon)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <IconButton Class="filter-button" Icon="@Icons.Material.Outlined.FilterAlt" Size="@Size.Small" OnClick="@AddFilter"></IconButton>
 | 
					                        <IconButton Class="filter-button" Icon="@Icons.Material.Outlined.FilterAlt" Size="@Size.Small" Clicked="@AddFilter"></IconButton>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -47,11 +47,11 @@
 | 
				
			|||||||
									<div class="picker-calendar-header-switch">
 | 
														<div class="picker-calendar-header-switch">
 | 
				
			||||||
										@if (!FixYear.HasValue)
 | 
															@if (!FixYear.HasValue)
 | 
				
			||||||
										{
 | 
															{
 | 
				
			||||||
											<IconButton aria-label="@prevLabel" Icon="@PreviousIcon" OnClick="OnPreviousYearClick" Class="flip-x-rtl" />
 | 
																<IconButton aria-label="@prevLabel" Icon="@PreviousIcon" Clicked="OnPreviousYearClick" Class="flip-x-rtl" />
 | 
				
			||||||
											<button type="button" class="picker-slide-transition mud-picker-calendar-header-transition" @onclick="OnYearClick" @onclick:stopPropagation="true">
 | 
																<button type="button" class="picker-slide-transition mud-picker-calendar-header-transition" @onclick="OnYearClick" @onclick:stopPropagation="true">
 | 
				
			||||||
												<TextContent Typo="Typo.body1" Align="Align.Center">@calendarYear</TextContent>
 | 
																	<TextContent Typo="Typo.body1" Align="Align.Center">@calendarYear</TextContent>
 | 
				
			||||||
											</button>
 | 
																</button>
 | 
				
			||||||
											<IconButton aria-label="@nextLabel" Icon="@NextIcon" OnClick="OnNextYearClick" Class="flip-x-rtl" />
 | 
															<IconButton aria-label="@nextLabel" Icon="@NextIcon" Clicked="OnNextYearClick" Class="flip-x-rtl" />
 | 
				
			||||||
										}
 | 
															}
 | 
				
			||||||
										else
 | 
															else
 | 
				
			||||||
										{
 | 
															{
 | 
				
			||||||
@ -77,11 +77,11 @@
 | 
				
			|||||||
									<div class="picker-calendar-header-switch">
 | 
														<div class="picker-calendar-header-switch">
 | 
				
			||||||
										@if (!FixMonth.HasValue)
 | 
															@if (!FixMonth.HasValue)
 | 
				
			||||||
										{
 | 
															{
 | 
				
			||||||
											<IconButton aria-label="@prevLabel" Class="picker-nav-button-prev mud-flip-x-rtl" Icon="@PreviousIcon" OnClick="OnPreviousMonthClick" />
 | 
															<IconButton aria-label="@prevLabel" Class="picker-nav-button-prev mud-flip-x-rtl" Icon="@PreviousIcon" Clicked="OnPreviousMonthClick" />
 | 
				
			||||||
											<button type="button" class="picker-slide-transition mud-picker-calendar-header-transition mud-button-month" @onclick="(() => OnMonthClicked(tempMonth))" @onclick:stopPropagation="true">
 | 
																<button type="button" class="picker-slide-transition mud-picker-calendar-header-transition mud-button-month" @onclick="(() => OnMonthClicked(tempMonth))" @onclick:stopPropagation="true">
 | 
				
			||||||
												<TextContent Typo="Typo.body1" Align="Align.Center">@GetMonthName(tempMonth)</TextContent>
 | 
																	<TextContent Typo="Typo.body1" Align="Align.Center">@GetMonthName(tempMonth)</TextContent>
 | 
				
			||||||
											</button>
 | 
																</button>
 | 
				
			||||||
											<IconButton aria-label="@nextLabel" Class="picker-nav-button-next mud-flip-x-rtl" Icon="@NextIcon" OnClick="OnNextMonthClick" />
 | 
															<IconButton aria-label="@nextLabel" Class="picker-nav-button-next mud-flip-x-rtl" Icon="@NextIcon" Clicked="OnNextMonthClick" />
 | 
				
			||||||
										}
 | 
															}
 | 
				
			||||||
										else
 | 
															else
 | 
				
			||||||
										{
 | 
															{
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                @if (CloseButton)
 | 
					                @if (CloseButton)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton aria-label="close" Icon="@CloseIcon" @onclick="Cancel"/>
 | 
					                    <IconButton aria-label="close" Icon="@CloseIcon" Clicked="Cancel" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 | 
				
			|||||||
@ -60,7 +60,7 @@ public partial class Form : UIComponent, IDisposable, IForm
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Validation debounce delay in milliseconds. This can help improve rendering performance of forms with real-time validation of inputs
 | 
						/// Validation debounce delay in milliseconds. This can help improve rendering performance of forms with real-time validation of inputs
 | 
				
			||||||
	/// i.e. when textfields have Immediate="true".
 | 
						/// i.e. when textfields have ChangeTextImmediately="true".
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Form.Behavior)]
 | 
						[Category(CategoryTypes.Form.Behavior)]
 | 
				
			||||||
 | 
				
			|||||||
@ -73,9 +73,9 @@ public abstract class DebouncedInput<T> : InputBase<T>
 | 
				
			|||||||
   {
 | 
					   {
 | 
				
			||||||
      base.OnParametersSet();
 | 
					      base.OnParametersSet();
 | 
				
			||||||
		// if input is to be debounced, makes sense to bind the change of the text to oninput
 | 
							// if input is to be debounced, makes sense to bind the change of the text to oninput
 | 
				
			||||||
      // so we set Immediate to true
 | 
							// so we set ChangeTextImmediately to true
 | 
				
			||||||
		if (DebounceInterval > 0)
 | 
							if (DebounceInterval > 0)
 | 
				
			||||||
         Immediate = true;
 | 
								ChangeTextImmediately = true;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   private void SetTimer()
 | 
					   private void SetTimer()
 | 
				
			||||||
 | 
				
			|||||||
@ -2,26 +2,10 @@
 | 
				
			|||||||
@typeparam T
 | 
					@typeparam T
 | 
				
			||||||
@inherits InputBase<T>
 | 
					@inherits InputBase<T>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<InputControl Label="@Label"
 | 
					<div class="@CompiledWrapperClass.Build()">
 | 
				
			||||||
                  Variant="@Variant"
 | 
					 | 
				
			||||||
                  HelperText="@HelperText"
 | 
					 | 
				
			||||||
                  HelperTextOnFocus="@HelperTextOnFocus"
 | 
					 | 
				
			||||||
                  CounterText="@GetCounterText()"
 | 
					 | 
				
			||||||
                  FullWidth="@FullWidth"
 | 
					 | 
				
			||||||
                  Class="@CompiledClassList.Build()"
 | 
					 | 
				
			||||||
                  Error="@HasErrors"
 | 
					 | 
				
			||||||
                  ErrorText="@ErrorText"
 | 
					 | 
				
			||||||
                  ErrorId="@ErrorId"
 | 
					 | 
				
			||||||
                  Disabled="@Disabled"
 | 
					 | 
				
			||||||
                  Margin="@Margin"
 | 
					 | 
				
			||||||
                  Required="@Required"
 | 
					 | 
				
			||||||
                  ForId="@FieldId">
 | 
					 | 
				
			||||||
    <CascadingValue Name="SubscribeToParentForm" Value="@base.SubscribeToParentForm" IsFixed="true">
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@if (Adornment == Adornment.Start)
 | 
						@if (Adornment == Adornment.Start)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	    <InputAdornment Class="@AdornmentClassname" 
 | 
					        <InputAdornment Class="@CompiledAdornmentClass.Build()"
 | 
				
			||||||
            Icon="@AdornmentIcon"
 | 
					            Icon="@AdornmentIcon"
 | 
				
			||||||
            Color="@AdornmentColor"
 | 
					            Color="@AdornmentColor"
 | 
				
			||||||
            Size="@IconSize"
 | 
					            Size="@IconSize"
 | 
				
			||||||
@ -31,13 +15,14 @@
 | 
				
			|||||||
            AriaLabel="@AdornmentAriaLabel"
 | 
					            AriaLabel="@AdornmentAriaLabel"
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
    <InputContent>
 | 
					
 | 
				
			||||||
	    @if (Lines > 1)
 | 
					    @if (NumberOfLines > 1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	        <textarea class="@InputClassname"
 | 
					        <textarea class="@CompiledInputClass.Build()"
 | 
				
			||||||
                @ref="ElementReference"
 | 
					                @ref="ElementReference"
 | 
				
			||||||
                    rows="@Lines" 
 | 
					              rows="@NumberOfLines"
 | 
				
			||||||
                    @attributes="CustomAttributes"
 | 
					                style="@Style"
 | 
				
			||||||
 | 
					                @attributes="@Attributes"
 | 
				
			||||||
                type="@InputTypeString"                  
 | 
					                type="@InputTypeString"                  
 | 
				
			||||||
                placeholder="@Placeholder" 
 | 
					                placeholder="@Placeholder" 
 | 
				
			||||||
                disabled=@Disabled 
 | 
					                disabled=@Disabled 
 | 
				
			||||||
@ -58,18 +43,20 @@
 | 
				
			|||||||
                @onmousewheel="@OnMouseWheel" 
 | 
					                @onmousewheel="@OnMouseWheel" 
 | 
				
			||||||
                @onwheel="@OnMouseWheel"
 | 
					                @onwheel="@OnMouseWheel"
 | 
				
			||||||
                aria-invalid="@HasError.ToString().ToLower()"
 | 
					                aria-invalid="@HasError.ToString().ToLower()"
 | 
				
			||||||
                    aria-describedby="@ErrorId"> 
 | 
					                aria-describedby="@ErrorId"
 | 
				
			||||||
 | 
					        > 
 | 
				
			||||||
            @Text
 | 
					            @Text
 | 
				
			||||||
        </textarea>
 | 
					        </textarea>
 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        @*Note: double mouse wheel handlers needed for Firefox because it doesn't know onmousewheel*@
 | 
					        @*Note: double mouse wheel handlers needed for Firefox because it doesn't know onmousewheel*@
 | 
				
			||||||
        @*note: the value="@_internalText" is absolutely essential here. the inner html @Text is needed by tests checking it*@
 | 
					        @*note: the value="@_internalText" is absolutely essential here. the inner html @Text is needed by tests checking it*@
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	        <input class="@InputClassname"
 | 
					        <input class="@CompiledInputClass.Build()"
 | 
				
			||||||
 | 
					                style="@Style"
 | 
				
			||||||
                @ref="ElementReference"
 | 
					                @ref="ElementReference"
 | 
				
			||||||
                    @attributes="CustomAttributes" 
 | 
					                @attributes="@Attributes"
 | 
				
			||||||
 | 
					                step="@Step"
 | 
				
			||||||
                type="@InputTypeString"                  
 | 
					                type="@InputTypeString"                  
 | 
				
			||||||
                value="@_internalText" 
 | 
					                value="@_internalText" 
 | 
				
			||||||
                @oninput="OnInput" 
 | 
					                @oninput="OnInput" 
 | 
				
			||||||
@ -98,7 +85,7 @@
 | 
				
			|||||||
             @*Note: this div must always be there to avoid crashes in WASM, but it is hidden most of the time except if ChildContent should be shown.
 | 
					             @*Note: this div must always be there to avoid crashes in WASM, but it is hidden most of the time except if ChildContent should be shown.
 | 
				
			||||||
                           In Disabled state the tabindex attribute must NOT be set at all or else it will get focus on click
 | 
					                           In Disabled state the tabindex attribute must NOT be set at all or else it will get focus on click
 | 
				
			||||||
             *@
 | 
					             *@
 | 
				
			||||||
	            <div class="@InputClassname"
 | 
					            <div class="@CompiledInputClass.Build()"
 | 
				
			||||||
                style="@("display:"+(InputType == InputType.Hidden && ChildContent != null ? "inline" : "none"))"                  
 | 
					                style="@("display:"+(InputType == InputType.Hidden && ChildContent != null ? "inline" : "none"))"                  
 | 
				
			||||||
                @onblur="@OnBlurred" @ref="@_elementReference1" 
 | 
					                @onblur="@OnBlurred" @ref="@_elementReference1" 
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
@ -108,7 +95,7 @@
 | 
				
			|||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
             @*Note: this div must always be there to avoid crashes in WASM, but it is hidden most of the time except if ChildContent should be shown.*@
 | 
					             @*Note: this div must always be there to avoid crashes in WASM, but it is hidden most of the time except if ChildContent should be shown.*@
 | 
				
			||||||
                <div class="@InputClassname"
 | 
					            <div class="@CompiledInputClass.Build()"
 | 
				
			||||||
                 style="@("display:"+(InputType == InputType.Hidden && ChildContent != null ? "inline" : "none"))"  
 | 
					                 style="@("display:"+(InputType == InputType.Hidden && ChildContent != null ? "inline" : "none"))"  
 | 
				
			||||||
                 tabindex="@(InputType == InputType.Hidden && ChildContent != null ? 0 : -1)" 
 | 
					                 tabindex="@(InputType == InputType.Hidden && ChildContent != null ? 0 : -1)" 
 | 
				
			||||||
                 @onblur="@OnBlurred" @ref="@_elementReference1" 
 | 
					                 @onblur="@OnBlurred" @ref="@_elementReference1" 
 | 
				
			||||||
@ -120,13 +107,16 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@if (_showClearable && !Disabled)
 | 
						@if (_showClearable && !Disabled)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        <IconButton ClassList="@CompiledClearButtonClassList.Build()"
 | 
				
			||||||
 | 
					                    Icon="@ClearIcon" 
 | 
				
			||||||
 | 
					                    Clicked="@ClearButtonClickHandlerAsync"
 | 
				
			||||||
 | 
					                    tabindex="-1"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	@if (Adornment == Adornment.End)
 | 
						@if (Adornment == Adornment.End)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	        <InputAdornment Class="@AdornmentClassname" 
 | 
					        <InputAdornment Class="@CompiledAdornmentClass.Build()"
 | 
				
			||||||
                    Icon="@AdornmentIcon" 
 | 
					                    Icon="@AdornmentIcon" 
 | 
				
			||||||
                Color="@AdornmentColor" 
 | 
					                Color="@AdornmentColor" 
 | 
				
			||||||
                Size="@IconSize" 
 | 
					                Size="@IconSize" 
 | 
				
			||||||
@ -145,19 +135,14 @@
 | 
				
			|||||||
	@if (!HideSpinButtons)
 | 
						@if (!HideSpinButtons)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	    <div class="input-numeric-spin">
 | 
						    <div class="input-numeric-spin">
 | 
				
			||||||
                <Button Variant="Variant.Text" @onclick="OnIncrement" Disabled="@(Disabled || ReadOnly)" tabindex="-1">
 | 
					            <Button Variant="Variant.Text" Clicked="OnIncrement" Disabled="@(Disabled || ReadOnly)" tabindex="-1">
 | 
				
			||||||
                <Icon Icon="@NumericUpIcon" Size="@GetButtonSize()" />
 | 
					                <Icon Icon="@NumericUpIcon" Size="@GetButtonSize()" />
 | 
				
			||||||
            </Button>
 | 
					            </Button>
 | 
				
			||||||
                <Button Variant="Variant.Text" @onclick="OnDecrement" Disabled="@(Disabled || ReadOnly)" tabindex="-1">
 | 
					            <Button Variant="Variant.Text" Clicked="OnDecrement" Disabled="@(Disabled || ReadOnly)" tabindex="-1">
 | 
				
			||||||
                <Icon Icon="@NumericDownIcon" Size="@GetButtonSize()" />
 | 
					                <Icon Icon="@NumericDownIcon" Size="@GetButtonSize()" />
 | 
				
			||||||
            </Button>
 | 
					            </Button>
 | 
				
			||||||
	    </div>
 | 
						    </div>
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
        </InputContent>
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
    </CascadingValue>  
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
</InputControl>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -9,39 +9,18 @@ namespace Connected.Components;
 | 
				
			|||||||
public partial class Input<T> : InputBase<T>
 | 
					public partial class Input<T> : InputBase<T>
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						#region Event Callbacks
 | 
				
			||||||
	 * Debounce
 | 
					 | 
				
			||||||
	 * 
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// The current character counter, displayed below the text field.
 | 
						/// Paste hook for descendants.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter] public string CounterText { get; set; }
 | 
					#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private System.Timers.Timer _timer;
 | 
						protected virtual async Task OnPaste(ClipboardEventArgs args)
 | 
				
			||||||
	private double _debounceInterval;
 | 
					#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Interval to be awaited in MILLISECONDS before changing the Text value
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	[Parameter]
 | 
					 | 
				
			||||||
	public double TextChangeDelay
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		get => _debounceInterval;
 | 
							// do nothing
 | 
				
			||||||
		set
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if (NumericConverter<double>.AreEqual(_debounceInterval, value))
 | 
					 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
			_debounceInterval = value;
 | 
					 | 
				
			||||||
			if (_debounceInterval == 0)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				// not debounced, dispose timer if any
 | 
					 | 
				
			||||||
				ClearTimer(suppressTick: false);
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			SetTimer();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
@ -81,26 +60,6 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
		return Task.CompletedTask;
 | 
							return Task.CompletedTask;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected override void OnParametersSet()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		base.OnParametersSet();
 | 
					 | 
				
			||||||
		// if input is to be debounced, makes sense to bind the change of the text to oninput
 | 
					 | 
				
			||||||
		// so we set Immediate to true
 | 
					 | 
				
			||||||
		if (TextChangeDelay > 0)
 | 
					 | 
				
			||||||
			Immediate = true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void SetTimer()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (_timer == null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			_timer = new System.Timers.Timer();
 | 
					 | 
				
			||||||
			_timer.Elapsed += OnTimerTick;
 | 
					 | 
				
			||||||
			_timer.AutoReset = false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_timer.Interval = TextChangeDelay;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void OnTimerTick(object sender, ElapsedEventArgs e)
 | 
						private void OnTimerTick(object sender, ElapsedEventArgs e)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		InvokeAsync(OnTimerTickGuiThread).AndForget();
 | 
							InvokeAsync(OnTimerTickGuiThread).AndForget();
 | 
				
			||||||
@ -111,181 +70,9 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
		await base.UpdateValuePropertyAsync(false);
 | 
							await base.UpdateValuePropertyAsync(false);
 | 
				
			||||||
		await OnDebounceIntervalElapsed.InvokeAsync(Text);
 | 
							await OnDebounceIntervalElapsed.InvokeAsync(Text);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void ClearTimer(bool suppressTick = false)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (_timer == null)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		var wasEnabled = _timer.Enabled;
 | 
					 | 
				
			||||||
		_timer.Stop();
 | 
					 | 
				
			||||||
		_timer.Elapsed -= OnTimerTick;
 | 
					 | 
				
			||||||
		_timer.Dispose();
 | 
					 | 
				
			||||||
		_timer = null;
 | 
					 | 
				
			||||||
		if (wasEnabled && !suppressTick)
 | 
					 | 
				
			||||||
			OnTimerTickGuiThread().AndForget();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	*  Debounce end
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected CssBuilder CompiledHelperContainerClassList
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		get
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return new CssBuilder("input-control-helper-container")
 | 
					 | 
				
			||||||
			.AddClass($"px-1", Variant == Variant.Filled)
 | 
					 | 
				
			||||||
			.AddClass($"px-2", Variant == Variant.Outlined)
 | 
					 | 
				
			||||||
			.AddClass($"px-1", Variant == Variant.Text)
 | 
					 | 
				
			||||||
			.AddClass(CompiledClearButtonClassList.Build())
 | 
					 | 
				
			||||||
			.AddClass(CompiledHelperClassList.Build());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected CssBuilder CompiledClearButtonClassList
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		get
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return new CssBuilder()
 | 
					 | 
				
			||||||
				.AddClass("me-n1", Adornment == Adornment.End && HideSpinButtons == false)
 | 
					 | 
				
			||||||
				.AddClass("icon-button-edge-end", Adornment == Adornment.End && HideSpinButtons == true)
 | 
					 | 
				
			||||||
				.AddClass("me-6", Adornment != Adornment.End && HideSpinButtons == false)
 | 
					 | 
				
			||||||
				.AddClass("icon-button-edge-margin-end", Adornment != Adornment.End && HideSpinButtons == true);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// A space separated list of class names, added on top of the default helper container class list.
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	[Parameter]
 | 
					 | 
				
			||||||
	public string? HelperContainerClassList { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected CssBuilder CompiledHelperClassList
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		get
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return new CssBuilder("input-helper-text")
 | 
					 | 
				
			||||||
			.AddClass("input-helper-onfocus", HelperTextOnFocus)
 | 
					 | 
				
			||||||
			.AddClass(HelperClassList);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// A space separated list of class names, added on top of the default helper class list.
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	[Parameter]
 | 
					 | 
				
			||||||
	public string? HelperClassList { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*protected string HelperContainer =>
 | 
					 | 
				
			||||||
		new CssBuilder("input-control-helper-container")
 | 
					 | 
				
			||||||
		.AddClass($"px-1", Variant == Variant.Filled)
 | 
					 | 
				
			||||||
		.AddClass($"px-2", Variant == Variant.Outlined)
 | 
					 | 
				
			||||||
		.Build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected string HelperClass =>
 | 
					 | 
				
			||||||
		new CssBuilder("input-helper-text")
 | 
					 | 
				
			||||||
		 .AddClass("input-helper-onfocus", HelperTextOnFocus)
 | 
					 | 
				
			||||||
		.Build();*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private string GetCounterText()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		string result = Text.Length.ToString();
 | 
					 | 
				
			||||||
		if (string.IsNullOrEmpty(Text)) result = "0";
 | 
					 | 
				
			||||||
		return result;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected string Classname => InputCssHelper.GetClassname(this,
 | 
					 | 
				
			||||||
      () => HasNativeHtmlPlaceholder() || !string.IsNullOrEmpty(Text) || Adornment == Adornment.Start || !string.IsNullOrWhiteSpace(Placeholder));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected CssBuilder CompiledClassList
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		get
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return new CssBuilder("input-control-helper-container")
 | 
					 | 
				
			||||||
			.AddClass($"px-1", Variant == Variant.Filled)
 | 
					 | 
				
			||||||
			.AddClass($"px-2", Variant == Variant.Outlined)
 | 
					 | 
				
			||||||
			.AddClass($"px-1", Variant == Variant.Text)
 | 
					 | 
				
			||||||
			.AddClass(CompiledClearButtonClassList.Build())
 | 
					 | 
				
			||||||
			.AddClass(CompiledHelperClassList.Build());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected string InputClassname => InputCssHelper.GetInputClassname(this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected string AdornmentClassname => InputCssHelper.GetAdornmentClassname(this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Type of the input element. It should be a valid HTML5 input type.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public InputType InputType { get; set; } = InputType.Text;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   internal override InputType GetInputType() => InputType;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected string InputTypeString => InputType.ToDescription();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool IsDecimalNumber(string type)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		switch (type.ToLower())
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			case "double":
 | 
					 | 
				
			||||||
			case "float":
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			default:
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool IsNumber(string s)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		bool result = false;
 | 
					 | 
				
			||||||
		try
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			double d;
 | 
					 | 
				
			||||||
			result= double.TryParse(s, out d);
 | 
					 | 
				
			||||||
		} catch
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			result = false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return result;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private string ValidateInput(string value)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		string result = value;
 | 
					 | 
				
			||||||
		if (value is not null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			var expectedType = typeof(T).Name;
 | 
					 | 
				
			||||||
			if (IsNumericType(expectedType))
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				if (IsNumber(value.ToString()))
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					result = value.ToString();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					if (IsDecimalNumber(value.ToString()))
 | 
					 | 
				
			||||||
						result = Regex.Replace(value.ToString(), "[^0-9.]", "");
 | 
					 | 
				
			||||||
					else result = Regex.Replace(value.ToString(), "[^0-9]", "");
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				result = value;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return result;
 | 
					 | 
				
			||||||
	}*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected Task OnInput(ChangeEventArgs args)
 | 
						protected Task OnInput(ChangeEventArgs args)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
      if (!Immediate)
 | 
							if (!ChangeTextImmediately)
 | 
				
			||||||
			return Task.CompletedTask;
 | 
								return Task.CompletedTask;
 | 
				
			||||||
		_isFocused = true;
 | 
							_isFocused = true;
 | 
				
			||||||
		return SetTextAsync(args?.Value as string);
 | 
							return SetTextAsync(args?.Value as string);
 | 
				
			||||||
@ -303,7 +90,7 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			_internalText = args?.Value as string;
 | 
								_internalText = args?.Value as string;
 | 
				
			||||||
			await OnInternalInputChanged.InvokeAsync(args);
 | 
								await OnInternalInputChanged.InvokeAsync(args);
 | 
				
			||||||
			if (!Immediate)
 | 
								if (!ChangeTextImmediately)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				await SetTextAsync(args?.Value as string);
 | 
									await SetTextAsync(args?.Value as string);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -312,24 +99,26 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
   /// Paste hook for descendants.
 | 
						/// Invokes the callback when the Up arrow button is clicked when the input is set to <see cref="InputType.Number"/>.
 | 
				
			||||||
 | 
						/// Note: use the optimized control <see cref="NumericField{T}"/> if you need to deal with numbers.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
 | 
						[Parameter] public EventCallback OnIncrement { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected virtual async Task OnPaste(ClipboardEventArgs args)
 | 
					 | 
				
			||||||
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      // do nothing
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
   /// ChildContent of the MudInput will only be displayed if InputType.Hidden and if its not null.
 | 
						/// Invokes the callback when the Down arrow button is clicked when the input is set to <see cref="InputType.Number"/>.
 | 
				
			||||||
 | 
						/// Note: use the optimized control <see cref="NumericField{T}"/> if you need to deal with numbers.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
   [Parameter] public RenderFragment ChildContent { get; set; }
 | 
						[Parameter] public EventCallback OnDecrement { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   public ElementReference ElementReference { get; private set; }
 | 
						/// <summary>
 | 
				
			||||||
   private ElementReference _elementReference1;
 | 
						/// Button click event for clear button. Called after text and value has been cleared.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public EventCallback<MouseEventArgs> OnClearButtonClick { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Mouse wheel event for input.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public EventCallback<WheelEventArgs> OnMouseWheel { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public override async ValueTask FocusAsync()
 | 
						public override async ValueTask FocusAsync()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -361,57 +150,6 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
		return ElementReference.SelectRangeAsync(pos1, pos2);
 | 
							return ElementReference.SelectRangeAsync(pos1, pos2);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Invokes the callback when the Up arrow button is clicked when the input is set to <see cref="InputType.Number"/>.
 | 
					 | 
				
			||||||
   /// Note: use the optimized control <see cref="NumericField{T}"/> if you need to deal with numbers.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public EventCallback OnIncrement { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Invokes the callback when the Down arrow button is clicked when the input is set to <see cref="InputType.Number"/>.
 | 
					 | 
				
			||||||
   /// Note: use the optimized control <see cref="MudNumericField{T}"/> if you need to deal with numbers.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public EventCallback OnDecrement { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Hides the spin buttons for <see cref="MudNumericField{T}"/>
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public bool HideSpinButtons { get; set; } = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Show clear button.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public bool Clearable { get; set; } = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Button click event for clear button. Called after text and value has been cleared.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public EventCallback<MouseEventArgs> OnClearButtonClick { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Mouse wheel event for input.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public EventCallback<WheelEventArgs> OnMouseWheel { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Custom clear icon.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public string ClearIcon { get; set; } = Icons.Material.Filled.Clear;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Custom numeric up icon.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public string NumericUpIcon { get; set; } = Icons.Material.Filled.KeyboardArrowUp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Custom numeric down icon.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter] public string NumericDownIcon { get; set; } = Icons.Material.Filled.KeyboardArrowDown;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private Size GetButtonSize() => Margin == Margin.Dense ? Size.Small : Size.Medium;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private bool _showClearable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void UpdateClearable(object value)
 | 
						private void UpdateClearable(object value)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		var showClearable = Clearable && ((value is string stringValue && !string.IsNullOrWhiteSpace(stringValue)) || (value is not string && value is not null));
 | 
							var showClearable = Clearable && ((value is string stringValue && !string.IsNullOrWhiteSpace(stringValue)) || (value is not string && value is not null));
 | 
				
			||||||
@ -426,13 +164,6 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
			UpdateClearable(Text);
 | 
								UpdateClearable(Text);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /*protected override async Task UpdateValuePropertyAsync(bool updateText)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      await base.UpdateValuePropertyAsync(updateText);
 | 
					 | 
				
			||||||
      if (Clearable)
 | 
					 | 
				
			||||||
         UpdateClearable(Value);
 | 
					 | 
				
			||||||
   }*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected virtual async Task ClearButtonClickHandlerAsync(MouseEventArgs e)
 | 
						protected virtual async Task ClearButtonClickHandlerAsync(MouseEventArgs e)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		await SetTextAsync(string.Empty, updateValue: true);
 | 
							await SetTextAsync(string.Empty, updateValue: true);
 | 
				
			||||||
@ -440,8 +171,230 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
		await OnClearButtonClick.InvokeAsync(e);
 | 
							await OnClearButtonClick.InvokeAsync(e);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Custom input Attributes
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public Dictionary<string, object>? Attributes { get; set; } = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Style properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Type of the input element. It should be a valid HTML5 input type.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public InputType InputType { get; set; } = InputType.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private string ClearIcon = Icons.Material.Filled.Clear;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private string NumericUpIcon = Icons.Material.Filled.KeyboardArrowUp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private string NumericDownIcon = Icons.Material.Filled.KeyboardArrowDown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Hides the spin buttons"/>
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public bool HideSpinButtons { get; set; } = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Show clear button.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public bool Clearable { get; set; } = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Wrapper class
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public string WrapperClass { get; set; } = string.Empty;
 | 
				
			||||||
 | 
						protected CssBuilder CompiledWrapperClass
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return new CssBuilder("input")
 | 
				
			||||||
 | 
								.AddClass($"input-{Variant.ToDescription()}")
 | 
				
			||||||
 | 
								.AddClass($"input-adorned-{Adornment.ToDescription()}", Adornment != Adornment.None)
 | 
				
			||||||
 | 
								.AddClass($"input-margin-{Margin.ToDescription()}", when: () => Margin != Margin.None)
 | 
				
			||||||
 | 
								.AddClass("input-underline", when: () => DisableUnderLine == false && Variant != Variant.Outlined)
 | 
				
			||||||
 | 
								.AddClass("shrink", when: HasNativeHtmlPlaceholder() || !string.IsNullOrEmpty(Text) || Adornment == Adornment.Start || !string.IsNullOrWhiteSpace(Placeholder))
 | 
				
			||||||
 | 
								.AddClass("disabled", Disabled)
 | 
				
			||||||
 | 
								.AddClass("input-error", HasErrors)
 | 
				
			||||||
 | 
								.AddClass("ltr", GetInputType() == InputType.Email || GetInputType() == InputType.Telephone)
 | 
				
			||||||
 | 
								.AddClass(WrapperClass);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Input field class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public string InputClass { get; set; } = string.Empty;
 | 
				
			||||||
 | 
						protected CssBuilder CompiledInputClass
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return new CssBuilder("input-slot")
 | 
				
			||||||
 | 
								.AddClass("input-root")
 | 
				
			||||||
 | 
								.AddClass($"input-root-{Variant.ToDescription()}")
 | 
				
			||||||
 | 
								.AddClass($"input-root-adorned-{Adornment.ToDescription()}", Adornment != Adornment.None)
 | 
				
			||||||
 | 
								.AddClass($"input-root-margin-{Margin.ToDescription()}", when: () => Margin != Margin.None)
 | 
				
			||||||
 | 
								.AddClass(InputClass);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Adornment class
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public string AdornmentClass { get; set; } = string.Empty;
 | 
				
			||||||
 | 
						protected CssBuilder CompiledAdornmentClass
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return new CssBuilder("input-adornment")
 | 
				
			||||||
 | 
								.AddClass($"input-adornment-{Adornment.ToDescription()}", Adornment != Adornment.None)
 | 
				
			||||||
 | 
								.AddClass($"text", !string.IsNullOrEmpty(AdornmentText))
 | 
				
			||||||
 | 
								.AddClass($"input-root-filled-shrink", Variant == Variant.Filled)
 | 
				
			||||||
 | 
								.AddClass(AdornmentClass);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Clear icon class
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public string ClearButtonClass { get; set; } = string.Empty;
 | 
				
			||||||
 | 
						protected CssBuilder CompiledClearButtonClassList
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return new CssBuilder()
 | 
				
			||||||
 | 
									.AddClass("me-n1", Adornment == Adornment.End && HideSpinButtons == false)
 | 
				
			||||||
 | 
									.AddClass("icon-button-edge-end", Adornment == Adornment.End && HideSpinButtons == true)
 | 
				
			||||||
 | 
									.AddClass("me-6", Adornment != Adornment.End && HideSpinButtons == false)
 | 
				
			||||||
 | 
									.AddClass("icon-button-edge-margin-end", Adornment != Adornment.End && HideSpinButtons == true)
 | 
				
			||||||
 | 
									.AddClass(ClearButtonClass);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Helper container class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// A space separated list of class names, added on top of the default helper container class list.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public string? HelperContainerClass { get; set; }
 | 
				
			||||||
 | 
						protected CssBuilder CompiledHelperContainerClassList
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return new CssBuilder("input-control-helper-container")
 | 
				
			||||||
 | 
								.AddClass($"px-1", Variant == Variant.Filled)
 | 
				
			||||||
 | 
								.AddClass($"px-2", Variant == Variant.Outlined)
 | 
				
			||||||
 | 
								.AddClass($"px-1", Variant == Variant.Text)
 | 
				
			||||||
 | 
								.AddClass(HelperContainerClass);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Error container class -- still needs implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Counter container class -- still needs implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Content placeholders
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// The current character counter, displayed below the text field.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public string CounterText { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private System.Timers.Timer _timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private double _textChangeInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Interval to be awaited in MILLISECONDS before changing the Text value
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public double TextChangeDelay
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							get => _textChangeInterval;
 | 
				
			||||||
 | 
							set
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (NumericConverter<double>.AreEqual(_textChangeInterval, value))
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								_textChangeInterval = value;
 | 
				
			||||||
 | 
								if (_textChangeInterval == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// not debounced, dispose timer if any
 | 
				
			||||||
 | 
									ClearTimer(suppressTick: false);
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								SetTimer();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void SetTimer()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (_timer == null)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								_timer = new System.Timers.Timer();
 | 
				
			||||||
 | 
								_timer.Elapsed += OnTimerTick;
 | 
				
			||||||
 | 
								_timer.AutoReset = false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_timer.Interval = TextChangeDelay;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void ClearTimer(bool suppressTick = false)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (_timer == null)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							var wasEnabled = _timer.Enabled;
 | 
				
			||||||
 | 
							_timer.Stop();
 | 
				
			||||||
 | 
							_timer.Elapsed -= OnTimerTick;
 | 
				
			||||||
 | 
							_timer.Dispose();
 | 
				
			||||||
 | 
							_timer = null;
 | 
				
			||||||
 | 
							if (wasEnabled && !suppressTick)
 | 
				
			||||||
 | 
								OnTimerTickGuiThread().AndForget();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// ChildContent of the MudInput will only be displayed if InputType.Hidden and if its not null.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public RenderFragment ChildContent { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private string TextCounter()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (string.IsNullOrEmpty(Text)) return "0";
 | 
				
			||||||
 | 
							return Text.Length.ToString();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						public double Step { get; set; } = 1;
 | 
				
			||||||
 | 
						internal override InputType GetInputType() => InputType;
 | 
				
			||||||
 | 
						protected string InputTypeString => InputType.ToDescription();
 | 
				
			||||||
 | 
						public ElementReference ElementReference { get; private set; }
 | 
				
			||||||
 | 
						private ElementReference _elementReference1;
 | 
				
			||||||
 | 
						private Size GetButtonSize() => Margin == Margin.Dense ? Size.Small : Size.Medium;
 | 
				
			||||||
 | 
						private bool _showClearable;
 | 
				
			||||||
	private string _internalText;
 | 
						private string _internalText;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Lifecycle events
 | 
				
			||||||
	public override async Task SetParametersAsync(ParameterView parameters)
 | 
						public override async Task SetParametersAsync(ParameterView parameters)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		await base.SetParametersAsync(parameters);
 | 
							await base.SetParametersAsync(parameters);
 | 
				
			||||||
@ -460,52 +413,29 @@ public partial class Input<T> : InputBase<T>
 | 
				
			|||||||
			_internalText = Text;
 | 
								_internalText = Text;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		string baseTypeName = typeof(T).Name;
 | 
							if (Helper.IsNumericType(typeof(T).Name) && InputType != InputType.Number)
 | 
				
			||||||
		if (IsNumericType(baseTypeName) && InputType !=InputType.Number)
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			InputType = InputType.Number;
 | 
								InputType = InputType.Number;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private bool IsNumericType(string type)
 | 
						protected override void OnParametersSet()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch (type.ToLower())
 | 
							base.OnParametersSet();
 | 
				
			||||||
		{
 | 
							// if input is to be debounced, makes sense to bind the change of the text to oninput
 | 
				
			||||||
			case "uint16":
 | 
							// so we set ChangeTextImmediately to true
 | 
				
			||||||
			case "uint32":
 | 
							if (TextChangeDelay > 0)
 | 
				
			||||||
			case "uint64":
 | 
								ChangeTextImmediately = true;
 | 
				
			||||||
			case "int16":
 | 
					 | 
				
			||||||
			case "int32":
 | 
					 | 
				
			||||||
			case "int64":
 | 
					 | 
				
			||||||
			case "int":
 | 
					 | 
				
			||||||
			case "double":
 | 
					 | 
				
			||||||
			case "decimal":
 | 
					 | 
				
			||||||
			case "float":
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			default:
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Sets the input text from outside programmatically
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	/// <param name="text"></param>
 | 
					 | 
				
			||||||
	/// <returns></returns>
 | 
					 | 
				
			||||||
	public Task SetText(string text)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      _internalText = text;
 | 
					 | 
				
			||||||
      return SetTextAsync(text);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // Certain HTML5 inputs (dates and color) have a native placeholder
 | 
					 | 
				
			||||||
   private bool HasNativeHtmlPlaceholder()
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      return GetInputType() is InputType.Color or InputType.Date or InputType.DateTimeLocal or InputType.Month
 | 
					 | 
				
			||||||
         or InputType.Time or InputType.Week;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
public class InputString : Input<string> { }
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        @if (AdornmentClick.HasDelegate)
 | 
					        @if (AdornmentClick.HasDelegate)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            <IconButton Icon="@Icon" OnClick="@AdornmentClick" Edge="@Edge" Size="@Size" Color="@Color" aria-label="@(!string.IsNullOrEmpty(AriaLabel) ? AriaLabel : "Icon Button")" tabindex="-1"/>
 | 
					            <IconButton Icon="@Icon" Clicked="@AdornmentClick" Edge="@Edge" Size="@Size" Color="@Color" aria-label="@(!string.IsNullOrEmpty(AriaLabel) ? AriaLabel : "Icon Button")" tabindex="-1" />
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ public abstract class InputBase<T> : FormComponent<T, string>
 | 
				
			|||||||
   /// </summary>
 | 
					   /// </summary>
 | 
				
			||||||
   [Parameter]
 | 
					   [Parameter]
 | 
				
			||||||
   [Category(CategoryTypes.FormComponent.Behavior)]
 | 
					   [Category(CategoryTypes.FormComponent.Behavior)]
 | 
				
			||||||
   public bool Immediate { get; set; }
 | 
					   public bool ChangeTextImmediately { get; set; } = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /// <summary>
 | 
					   /// <summary>
 | 
				
			||||||
   /// If true, the input will not have an underline.
 | 
					   /// If true, the input will not have an underline.
 | 
				
			||||||
@ -170,7 +170,7 @@ public abstract class InputBase<T> : FormComponent<T, string>
 | 
				
			|||||||
   /// </summary>
 | 
					   /// </summary>
 | 
				
			||||||
   [Parameter]
 | 
					   [Parameter]
 | 
				
			||||||
   [Category(CategoryTypes.FormComponent.Behavior)]
 | 
					   [Category(CategoryTypes.FormComponent.Behavior)]
 | 
				
			||||||
   public int Lines { get; set; } = 1;
 | 
					   public int NumberOfLines { get; set; } = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /// <summary>
 | 
					   /// <summary>
 | 
				
			||||||
   ///  The text to be displayed.
 | 
					   ///  The text to be displayed.
 | 
				
			||||||
 | 
				
			|||||||
@ -15,10 +15,10 @@
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <input @ref="_elementReferenceStart" @attributes="CustomAttributes" type="@InputTypeString" class="@InputClassname" @bind-value="@TextStart" @bind-value:event="@((Immediate ? "oninput" : "onchange"))"
 | 
					    <input @ref="_elementReferenceStart" @attributes="CustomAttributes" type="@InputTypeString" class="@InputClassname" @bind-value="@TextStart" @bind-value:event="@((ChangeTextImmediately ? "oninput" : "onchange"))"
 | 
				
			||||||
           placeholder="@PlaceholderStart" disabled=@Disabled readonly="@ReadOnly" @onblur="@OnBlurred" @onkeydown="@InvokeKeyDown" @onkeypress="@InvokeKeyPress" @onkeyup="@InvokeKeyUp" inputmode="@InputMode.ToString()" pattern="@Pattern" />
 | 
					           placeholder="@PlaceholderStart" disabled=@Disabled readonly="@ReadOnly" @onblur="@OnBlurred" @onkeydown="@InvokeKeyDown" @onkeypress="@InvokeKeyPress" @onkeyup="@InvokeKeyUp" inputmode="@InputMode.ToString()" pattern="@Pattern" />
 | 
				
			||||||
    <Icon Class="range-input-separator mud-flip-x-rtl" Icon="@SeparatorIcon" Color="@ThemeColor.Default" />
 | 
					    <Icon Class="range-input-separator mud-flip-x-rtl" Icon="@SeparatorIcon" Color="@ThemeColor.Default" />
 | 
				
			||||||
    <input @ref="_elementReferenceEnd" @attributes="CustomAttributes" type="@InputTypeString" class="@InputClassname" @bind-value="@TextEnd" @bind-value:event="@((Immediate ? "oninput" : "onchange"))" inputmode="@InputMode.ToString()" pattern="@Pattern"
 | 
					    <input @ref="_elementReferenceEnd" @attributes="CustomAttributes" type="@InputTypeString" class="@InputClassname" @bind-value="@TextEnd" @bind-value:event="@((ChangeTextImmediately ? "oninput" : "onchange"))" inputmode="@InputMode.ToString()" pattern="@Pattern"
 | 
				
			||||||
           placeholder="@PlaceholderEnd" disabled=@Disabled readonly="@ReadOnly" @onblur="@OnBlurred" @onkeydown="@InvokeKeyDown" @onkeypress="@InvokeKeyPress" @onkeyup="@InvokeKeyUp" />
 | 
					           placeholder="@PlaceholderEnd" disabled=@Disabled readonly="@ReadOnly" @onblur="@OnBlurred" @onkeydown="@InvokeKeyDown" @onkeypress="@InvokeKeyPress" @onkeyup="@InvokeKeyUp" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @if (Adornment == Adornment.End)
 | 
					    @if (Adornment == Adornment.End)
 | 
				
			||||||
 | 
				
			|||||||
@ -58,7 +58,7 @@
 | 
				
			|||||||
                       Color="@ThemeColor.Default"
 | 
					                       Color="@ThemeColor.Default"
 | 
				
			||||||
                       Icon="@ClearIcon"
 | 
					                       Icon="@ClearIcon"
 | 
				
			||||||
                       Size="@Size.Small"
 | 
					                       Size="@Size.Small"
 | 
				
			||||||
                       OnClick="@HandleClearButton"/>
 | 
					                Clicked="@HandleClearButton" />
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @if (Adornment == Adornment.End)
 | 
					    @if (Adornment == Adornment.End)
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <IconButton Variant="@Variant" Icon="@Icon" Color="@Color" Size="@Size" Disabled="@Disabled" DisableRipple="@DisableRipple" DisableElevation="@DisableElevation" @onclick="@ToggleMenu" @ontouchend="@(ActivationEvent == MouseEvent.RightClick ? ToggleMenuTouch : null)" @oncontextmenu="@(ActivationEvent==MouseEvent.RightClick ? ToggleMenu : null)" />
 | 
					        <IconButton Variant="@Variant" Icon="@Icon" Color="@Color" Size="@Size" Disabled="@Disabled" DisableRipple="@DisableRipple" DisableElevation="@DisableElevation" Clicked="@ToggleMenu" @ontouchend="@(ActivationEvent == MouseEvent.RightClick ? ToggleMenuTouch : null)" @oncontextmenu="@(ActivationEvent==MouseEvent.RightClick ? ToggleMenu : null)" />
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @* The portal has to include  the cascading values inside, because it's not able to teletransport the cascade *@
 | 
					    @* The portal has to include  the cascading values inside, because it's not able to teletransport the cascade *@
 | 
				
			||||||
    <Popover Open="@_isOpen" Class="@PopoverClass" MaxHeight="@MaxHeight" AnchorOrigin="@AnchorOrigin" TransformOrigin="@TransformOrigin" RelativeWidth="@FullWidth" Style="@PopoverStyle">
 | 
					    <Popover Open="@_isOpen" Class="@PopoverClass" MaxHeight="@MaxHeight" AnchorOrigin="@AnchorOrigin" TransformOrigin="@TransformOrigin" RelativeWidth="@FullWidth" Style="@PopoverStyle">
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@
 | 
				
			|||||||
                          AdornmentColor="@AdornmentColor"
 | 
					                          AdornmentColor="@AdornmentColor"
 | 
				
			||||||
                          IconSize="@IconSize"
 | 
					                          IconSize="@IconSize"
 | 
				
			||||||
                          Error="@HasError"
 | 
					                          Error="@HasError"
 | 
				
			||||||
                          Immediate="@(Immediate)"
 | 
					                       ChangeTextImmediately="@(ChangeTextImmediately)"
 | 
				
			||||||
                          Margin="@Margin"
 | 
					                          Margin="@Margin"
 | 
				
			||||||
                          MaxLength="@MaxLength"
 | 
					                          MaxLength="@MaxLength"
 | 
				
			||||||
                          HideSpinButtons="@HideSpinButtons"
 | 
					                          HideSpinButtons="@HideSpinButtons"
 | 
				
			||||||
 | 
				
			|||||||
@ -6,13 +6,13 @@
 | 
				
			|||||||
    @if (ShowFirstButton)
 | 
					    @if (ShowFirstButton)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <li class="@ItemClassname">
 | 
					        <li class="@ItemClassname">
 | 
				
			||||||
            <IconButton Icon="@FirstIcon" Size="@Size" Variant="@Variant" Disabled="@(Selected == 1 || Disabled)" OnClick="@(() => OnClickControlButton(Page.First))" aria-label="First page"></IconButton>
 | 
					            <IconButton Icon="@FirstIcon" Size="@Size" Variant="@Variant" Disabled="@(Selected == 1 || Disabled)" Clicked="@(() => OnClickControlButton(Page.First))" aria-label="First page"></IconButton>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @if (ShowPreviousButton)
 | 
					    @if (ShowPreviousButton)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <li class="@ItemClassname">
 | 
					        <li class="@ItemClassname">
 | 
				
			||||||
            <IconButton Icon="@BeforeIcon" Size="@Size" Variant="@Variant" Disabled="@(Selected == 1 || Disabled)" OnClick="@(() => OnClickControlButton(Page.Previous))" aria-label="Previous page"></IconButton>
 | 
					            <IconButton Icon="@BeforeIcon" Size="@Size" Variant="@Variant" Disabled="@(Selected == 1 || Disabled)" Clicked="@(() => OnClickControlButton(Page.Previous))" aria-label="Previous page"></IconButton>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @foreach (var state in GeneratePagination())
 | 
					    @foreach (var state in GeneratePagination())
 | 
				
			||||||
@ -32,20 +32,20 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            <li class="@ItemClassname">
 | 
					            <li class="@ItemClassname">
 | 
				
			||||||
                <Button OnClick="@(() => Selected = currentPage)" Variant="@Variant" Size="@Size" DisableRipple="true" Disabled="@Disabled" aria-label="@($"Page {currentPage}")">@currentPage</Button>
 | 
					                <Button Clicked="@(() => Selected = currentPage)" Variant="@Variant" Size="@Size" DisableRipple="true" Disabled="@Disabled" aria-label="@($"Page {currentPage}")">@currentPage</Button>
 | 
				
			||||||
            </li>
 | 
					            </li>
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @if (ShowNextButton)
 | 
					    @if (ShowNextButton)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <li class="@ItemClassname">
 | 
					        <li class="@ItemClassname">
 | 
				
			||||||
            <IconButton Icon="@NextIcon" Variant="@Variant" Size="@Size" Disabled="@(Selected == Count || Disabled)" OnClick="@(() => OnClickControlButton(Page.Next))" aria-label="Next page"></IconButton>
 | 
					            <IconButton Icon="@NextIcon" Variant="@Variant" Size="@Size" Disabled="@(Selected == Count || Disabled)" Clicked="@(() => OnClickControlButton(Page.Next))" aria-label="Next page"></IconButton>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @if (ShowLastButton)
 | 
					    @if (ShowLastButton)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <li class="@ItemClassname">
 | 
					        <li class="@ItemClassname">
 | 
				
			||||||
            <IconButton Icon="@LastIcon" Variant="@Variant" Size="@Size" Disabled="@(Selected == Count || Disabled)" OnClick="@(() => OnClickControlButton(Page.Last))" aria-label="Last page"></IconButton>
 | 
					            <IconButton Icon="@LastIcon" Variant="@Variant" Size="@Size" Disabled="@(Selected == Count || Disabled)" Clicked="@(() => OnClickControlButton(Page.Last))" aria-label="Last page"></IconButton>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
</Element>
 | 
					</Element>
 | 
				
			||||||
@ -39,7 +39,7 @@
 | 
				
			|||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		<input class="slider-input" aria-valuenow="@Value" aria-valuemin="@_min" aria-valuemax="@_max" role="slider" @attributes="CustomAttributes" type="range" min="@_min" max="@_max" step="@_step" disabled="@Disabled"
 | 
							<input class="slider-input" aria-valuenow="@Value" aria-valuemin="@_min" aria-valuemax="@_max" role="slider" @attributes="CustomAttributes" type="range" min="@_min" max="@_max" step="@_step" disabled="@Disabled"
 | 
				
			||||||
			   @bind-value="@Text" @bind-value:event="@((Immediate == true ? "oninput" : "onchange"))" />
 | 
								   @bind-value="@Text" @bind-value:event="@((ChangeImmediately == true ? "oninput" : "onchange"))" />
 | 
				
			||||||
        @if (ValueLabel)
 | 
					        @if (ValueLabel)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            <div class="slider-value-label" style="@($"left:{width}%;")">
 | 
					            <div class="slider-value-label" style="@($"left:{width}%;")">
 | 
				
			||||||
 | 
				
			|||||||
@ -117,7 +117,7 @@ public partial class Slider<T> : UIComponent
 | 
				
			|||||||
   /// </summary>
 | 
					   /// </summary>
 | 
				
			||||||
   [Parameter]
 | 
					   [Parameter]
 | 
				
			||||||
   [Category(CategoryTypes.Slider.Behavior)]
 | 
					   [Category(CategoryTypes.Slider.Behavior)]
 | 
				
			||||||
   public bool Immediate { get; set; } = true;
 | 
					   public bool ChangeImmediately { get; set; } = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /// <summary>
 | 
					   /// <summary>
 | 
				
			||||||
   /// If true, displays the slider vertical.
 | 
					   /// If true, displays the slider vertical.
 | 
				
			||||||
 | 
				
			|||||||
@ -23,12 +23,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            @if (ShowActionButton)
 | 
					            @if (ShowActionButton)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                <Button Variant="@ActionVariant" Color="@ActionColor" OnClick="ActionClicked" DisableElevation>@Action</Button>
 | 
					                <Button Variant="@ActionVariant" Color="@ActionColor" Clicked="ActionClicked" DisableElevation>@Action</Button>
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            @if (ShowCloseIcon)
 | 
					            @if (ShowCloseIcon)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                <IconButton Icon="@CloseIcon" Size="Size.Small" Class="ms-2" OnClick="CloseIconClicked" />
 | 
					                <IconButton Icon="@CloseIcon" Size="Size.Small" Class="ms-2" Clicked="CloseIconClicked" />
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@
 | 
				
			|||||||
            <div class="d-flex">
 | 
					            <div class="d-flex">
 | 
				
			||||||
                @if (GroupDefinition.Expandable)
 | 
					                @if (GroupDefinition.Expandable)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton Class="table-row-expander" Icon="@(IsExpanded ? ExpandIcon : CollapseIcon)" OnClick="@(() => IsExpanded = !IsExpanded)"/>
 | 
					                        <IconButton Class="table-row-expander" Icon="@(IsExpanded ? ExpandIcon : CollapseIcon)" Clicked="@(() => IsExpanded = !IsExpanded)" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
				
			|||||||
@ -34,10 +34,10 @@
 | 
				
			|||||||
    @if (!HidePagination)
 | 
					    @if (!HidePagination)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <div class="table-pagination-actions">
 | 
					        <div class="table-pagination-actions">
 | 
				
			||||||
            <IconButton Class="flip-x-rtl" Icon="@FirstIcon" Disabled="@BackButtonsDisabled" @onclick="@(() => Table.NavigateTo(Page.First))" aria-label="First page" />
 | 
					            <IconButton Class="flip-x-rtl" Icon="@FirstIcon" Disabled="@BackButtonsDisabled" Clicked="@(() => Table.NavigateTo(Page.First))" aria-label="First page" />
 | 
				
			||||||
            <IconButton Class="flip-x-rtl" Icon="@BeforeIcon" Disabled="@BackButtonsDisabled" @onclick="@(() => Table.NavigateTo(Page.Previous))" aria-label="Previous page" />
 | 
					            <IconButton Class="flip-x-rtl" Icon="@BeforeIcon" Disabled="@BackButtonsDisabled" Clicked="@(() => Table.NavigateTo(Page.Previous))" aria-label="Previous page" />
 | 
				
			||||||
            <IconButton Class="flip-x-rtl" Icon="@NextIcon" Disabled="@ForwardButtonsDisabled" @onclick="@(() => Table.NavigateTo(Page.Next))" aria-label="Next page" />
 | 
					            <IconButton Class="flip-x-rtl" Icon="@NextIcon" Disabled="@ForwardButtonsDisabled" Clicked="@(() => Table.NavigateTo(Page.Next))" aria-label="Next page" />
 | 
				
			||||||
            <IconButton Class="flip-x-rtl" Icon="@LastIcon" Disabled="@ForwardButtonsDisabled" @onclick="@(() => Table.NavigateTo(Page.Last))" aria-label="Last page" />
 | 
					            <IconButton Class="flip-x-rtl" Icon="@LastIcon" Disabled="@ForwardButtonsDisabled" Clicked="@(() => Table.NavigateTo(Page.Last))" aria-label="Last page" />
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    @if (HorizontalAlignment == HorizontalAlignment.Start ||
 | 
					    @if (HorizontalAlignment == HorizontalAlignment.Start ||
 | 
				
			||||||
 | 
				
			|||||||
@ -15,19 +15,19 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton Size="@Size.Small" Icon="@Icons.Outlined.Edit" Class="pa-0" OnClick="StartEditingItem" Disabled="Context.EditButtonDisabled(Item)" />
 | 
					                    <IconButton Size="@Size.Small" Icon="@Icons.Outlined.Edit" Class="pa-0" Clicked="StartEditingItem" Disabled="Context.EditButtonDisabled(Item)" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else if (object.ReferenceEquals(Context?.Table._editingItem, Item) && (!Context?.Table.ReadOnly ?? false) && Context?.Table.ApplyButtonPosition.DisplayApplyButtonAtStart() == true)
 | 
					            else if (object.ReferenceEquals(Context?.Table._editingItem, Item) && (!Context?.Table.ReadOnly ?? false) && Context?.Table.ApplyButtonPosition.DisplayApplyButtonAtStart() == true)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                <div style="display: flex;">
 | 
					                <div style="display: flex;">
 | 
				
			||||||
                    <Tooltip Text="@Context.Table.CommitEditTooltip">
 | 
					                    <Tooltip Text="@Context.Table.CommitEditTooltip">
 | 
				
			||||||
                        <IconButton Class="pa-0" Icon="@Context.Table.CommitEditIcon" OnClick="FinishEdit" Size="@Size.Small" Disabled="@(!(Context?.Table.Validator?.IsValid ?? false))" />
 | 
					                        <IconButton Class="pa-0" Icon="@Context.Table.CommitEditIcon" Clicked="FinishEdit" Size="@Size.Small" Disabled="@(!(Context?.Table.Validator?.IsValid ?? false))" />
 | 
				
			||||||
                    </Tooltip>
 | 
					                    </Tooltip>
 | 
				
			||||||
                    @if (Context.Table.CanCancelEdit)
 | 
					                    @if (Context.Table.CanCancelEdit)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <Tooltip Text="@Context.Table.CancelEditTooltip">
 | 
					                        <Tooltip Text="@Context.Table.CancelEditTooltip">
 | 
				
			||||||
                            <IconButton Class="pa-0 ml-4" Icon="@Context.Table.CancelEditIcon" OnClick="CancelEdit" Size="@Size.Small" />
 | 
					                            <IconButton Class="pa-0 ml-4" Icon="@Context.Table.CancelEditIcon" Clicked="CancelEdit" Size="@Size.Small" />
 | 
				
			||||||
                        </Tooltip>
 | 
					                        </Tooltip>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
@ -58,19 +58,19 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <IconButton Size="@Size.Small" Icon="@Icons.Outlined.Edit" Class="pa-0" OnClick="StartEditingItem" Disabled="Context.EditButtonDisabled(Item)" />
 | 
					                    <IconButton Size="@Size.Small" Icon="@Icons.Outlined.Edit" Class="pa-0" Clicked="StartEditingItem" Disabled="Context.EditButtonDisabled(Item)" />
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else if (object.ReferenceEquals(Context?.Table._editingItem, Item) && (!Context?.Table.ReadOnly ?? false) && Context?.Table.ApplyButtonPosition.DisplayApplyButtonAtEnd() == true)
 | 
					            else if (object.ReferenceEquals(Context?.Table._editingItem, Item) && (!Context?.Table.ReadOnly ?? false) && Context?.Table.ApplyButtonPosition.DisplayApplyButtonAtEnd() == true)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                <div style="display: flex;">
 | 
					                <div style="display: flex;">
 | 
				
			||||||
                    <Tooltip Text="@Context.Table.CommitEditTooltip">
 | 
					                    <Tooltip Text="@Context.Table.CommitEditTooltip">
 | 
				
			||||||
                        <IconButton Class="pa-0" Icon="@Context.Table.CommitEditIcon" OnClick="FinishEdit" Size="@Size.Small" Disabled="@(!(Context?.Table.Validator?.IsValid ?? false))" />
 | 
					                        <IconButton Class="pa-0" Icon="@Context.Table.CommitEditIcon" Clicked="FinishEdit" Size="@Size.Small" Disabled="@(!(Context?.Table.Validator?.IsValid ?? false))" />
 | 
				
			||||||
                    </Tooltip>
 | 
					                    </Tooltip>
 | 
				
			||||||
                    @if (Context.Table.CanCancelEdit)
 | 
					                    @if (Context.Table.CanCancelEdit)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <Tooltip Text="@Context.Table.CancelEditTooltip">
 | 
					                        <Tooltip Text="@Context.Table.CancelEditTooltip">
 | 
				
			||||||
                            <MudIconButton Class="pa-0 ml-4" Icon="@Context.Table.CancelEditIcon" OnClick="CancelEdit" Size="@Size.Small" />
 | 
					                            <IconButton Class="pa-0 ml-4" Icon="@Context.Table.CancelEditIcon" Clicked="CancelEdit" Size="@Size.Small" />
 | 
				
			||||||
                        </Tooltip>
 | 
					                        </Tooltip>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -15,12 +15,12 @@
 | 
				
			|||||||
			if (string.IsNullOrEmpty(AddIconToolTip) == false)
 | 
								if (string.IsNullOrEmpty(AddIconToolTip) == false)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				<Tooltip Text="@AddIconToolTip">
 | 
									<Tooltip Text="@AddIconToolTip">
 | 
				
			||||||
					<IconButton Icon="@AddTabIcon" Class="@AddIconClass" Style="@AddIconStyle" OnClick="@AddTab" />
 | 
									<IconButton Icon="@AddTabIcon" Class="@AddIconClass" Style="@AddIconStyle" Clicked="@AddTab" />
 | 
				
			||||||
				</Tooltip>
 | 
									</Tooltip>
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				<IconButton Icon="@AddTabIcon" Class="@AddIconClass" Style="@AddIconStyle" OnClick="@AddTab" />
 | 
								<IconButton Icon="@AddTabIcon" Class="@AddIconClass" Style="@AddIconStyle" Clicked="@AddTab" />
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		;
 | 
							;
 | 
				
			||||||
@ -30,12 +30,12 @@
 | 
				
			|||||||
			if (string.IsNullOrEmpty(CloseIconToolTip) == false)
 | 
								if (string.IsNullOrEmpty(CloseIconToolTip) == false)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				<Tooltip Text="@CloseIconToolTip">
 | 
									<Tooltip Text="@CloseIconToolTip">
 | 
				
			||||||
					<IconButton Icon="@CloseTabIcon" Class="@CloseIconClass" Style="@CloseIconStyle" OnClick="EventCallback.Factory.Create<MouseEventArgs>(this, () => CloseTab.InvokeAsync(context))" />
 | 
									<IconButton Icon="@CloseTabIcon" Class="@CloseIconClass" Style="@CloseIconStyle" Clicked="EventCallback.Factory.Create<MouseEventArgs>(this, () => CloseTab.InvokeAsync(context))" />
 | 
				
			||||||
				</Tooltip>
 | 
									</Tooltip>
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				<IconButton Icon="@CloseTabIcon" Class="@CloseIconClass" Style="@CloseIconStyle"  OnClick="EventCallback.Factory.Create<MouseEventArgs>(this, () => CloseTab.InvokeAsync(context))" />
 | 
								<IconButton Icon="@CloseTabIcon" Class="@CloseIconClass" Style="@CloseIconStyle" Clicked="EventCallback.Factory.Create<MouseEventArgs>(this, () => CloseTab.InvokeAsync(context))" />
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		;
 | 
							;
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@
 | 
				
			|||||||
                @if (_showScrollButtons)
 | 
					                @if (_showScrollButtons)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <div class="tabs-scroll-button">
 | 
					                    <div class="tabs-scroll-button">
 | 
				
			||||||
                  <GlyphButton Icon="@_prevIcon" Color="@ScrollIconColor" Clicked="@((e) => ScrollPrev())" Disabled="@_prevButtonDisabled" />
 | 
					                  <IconButton Icon="@_prevIcon" Color="@ScrollIconColor" Clicked="@((e) => ScrollPrev())" Disabled="@_prevButtonDisabled" />
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                <div @ref="@_tabsContentSize" class="tabs-toolbar-content">
 | 
					                <div @ref="@_tabsContentSize" class="tabs-toolbar-content">
 | 
				
			||||||
@ -52,7 +52,7 @@
 | 
				
			|||||||
                @if (_showScrollButtons)
 | 
					                @if (_showScrollButtons)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    <div class="tabs-scroll-button">
 | 
					                    <div class="tabs-scroll-button">
 | 
				
			||||||
                        <GlyphButton Icon="@_nextIcon" Color="@ScrollIconColor" Clicked="@((e) => ScrollNext())" Disabled="@_nextButtonDisabled" />
 | 
					                        <IconButton Icon="@_nextIcon" Color="@ScrollIconColor" Clicked="@((e) => ScrollNext())" Disabled="@_nextButtonDisabled" />
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                @if (HeaderPosition == TabHeaderPosition.After && Header != null)
 | 
					                @if (HeaderPosition == TabHeaderPosition.After && Header != null)
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@
 | 
				
			|||||||
                              @ref="InputReference"
 | 
					                              @ref="InputReference"
 | 
				
			||||||
                              @attributes="CustomAttributes"
 | 
					                              @attributes="CustomAttributes"
 | 
				
			||||||
                              InputType="@InputType"
 | 
					                              InputType="@InputType"
 | 
				
			||||||
                              Lines="@Lines"
 | 
					                              NumberOfLines="@NumberOfLines"
 | 
				
			||||||
                              Variant="@Variant"
 | 
					                              Variant="@Variant"
 | 
				
			||||||
                              TextUpdateSuppression="@TextUpdateSuppression"
 | 
					                              TextUpdateSuppression="@TextUpdateSuppression"
 | 
				
			||||||
                              Value="@Text"
 | 
					                              Value="@Text"
 | 
				
			||||||
@ -44,7 +44,7 @@
 | 
				
			|||||||
                              OnAdornmentClick="@OnAdornmentClick"
 | 
					                              OnAdornmentClick="@OnAdornmentClick"
 | 
				
			||||||
                              Error="@HasError"
 | 
					                              Error="@HasError"
 | 
				
			||||||
                              ErrorId="@ErrorId"
 | 
					                              ErrorId="@ErrorId"
 | 
				
			||||||
                              Immediate="@Immediate"
 | 
					                       ChangeTextImmediately="@ChangeTextImmediately"
 | 
				
			||||||
                              Margin="@Margin"
 | 
					                              Margin="@Margin"
 | 
				
			||||||
                              OnBlur="@OnBlurred"
 | 
					                              OnBlur="@OnBlurred"
 | 
				
			||||||
                              OnKeyDown="@InvokeKeyDown"
 | 
					                              OnKeyDown="@InvokeKeyDown"
 | 
				
			||||||
@ -65,7 +65,7 @@
 | 
				
			|||||||
                             @attributes="CustomAttributes"
 | 
					                             @attributes="CustomAttributes"
 | 
				
			||||||
                             Mask="@_mask"
 | 
					                             Mask="@_mask"
 | 
				
			||||||
                             InputType="@InputType"
 | 
					                             InputType="@InputType"
 | 
				
			||||||
                             Lines="@Lines"
 | 
					                             NumberOfLines="@NumberOfLines"
 | 
				
			||||||
                             Variant="@Variant"
 | 
					                             Variant="@Variant"
 | 
				
			||||||
                             TextUpdateSuppression="@TextUpdateSuppression"
 | 
					                             TextUpdateSuppression="@TextUpdateSuppression"
 | 
				
			||||||
                             Value="@Text"
 | 
					                             Value="@Text"
 | 
				
			||||||
@ -82,7 +82,7 @@
 | 
				
			|||||||
                             IconSize="@IconSize"
 | 
					                             IconSize="@IconSize"
 | 
				
			||||||
                             OnAdornmentClick="@OnAdornmentClick"
 | 
					                             OnAdornmentClick="@OnAdornmentClick"
 | 
				
			||||||
                             Error="@HasError"
 | 
					                             Error="@HasError"
 | 
				
			||||||
                             Immediate="@Immediate"
 | 
					                      ChangeTextImmediately="@ChangeTextImmediately"
 | 
				
			||||||
                             Margin="@Margin" 
 | 
					                             Margin="@Margin" 
 | 
				
			||||||
                             OnBlur="@OnBlurred"
 | 
					                             OnBlur="@OnBlurred"
 | 
				
			||||||
                             Clearable="@Clearable"
 | 
					                             Clearable="@Clearable"
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
<div class="treeview-item-arrow">
 | 
					<div class="treeview-item-arrow">
 | 
				
			||||||
    @if (Visible)
 | 
					    @if (Visible)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        <IconButton OnClick="@ToggleAsync" Icon="@(Loading ? LoadingIcon : ExpandedIcon)" Color="@(Loading ? LoadingIconColor : ExpandedIconColor)" Class="@Classname"></IconButton>
 | 
					        <IconButton Clicked="@ToggleAsync" Icon="@(Loading ? LoadingIcon : ExpandedIcon)" Color="@(Loading ? LoadingIconColor : ExpandedIconColor)" Class="@Classname"></IconButton>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										23
									
								
								src/Connected.Components/Utilities/Helper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/Connected.Components/Utilities/Helper.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					namespace Connected.Utilities;
 | 
				
			||||||
 | 
					public static class Helper
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						public static bool IsNumericType(string type)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							switch (type.ToLower())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								case "uint16":
 | 
				
			||||||
 | 
								case "uint32":
 | 
				
			||||||
 | 
								case "uint64":
 | 
				
			||||||
 | 
								case "int16":
 | 
				
			||||||
 | 
								case "int32":
 | 
				
			||||||
 | 
								case "int64":
 | 
				
			||||||
 | 
								case "int":
 | 
				
			||||||
 | 
								case "double":
 | 
				
			||||||
 | 
								case "decimal":
 | 
				
			||||||
 | 
								case "float":
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user