You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/Components/Input/RangeInput.razor.cs

132 lines
4.1 KiB

2 years ago
using Connected.Extensions;
using Microsoft.AspNetCore.Components;
namespace Connected.Components;
public partial class RangeInput<T> : InputBase<Range<T>>
{
private string _textStart, _textEnd;
public RangeInput()
{
Value = new Range<T>();
Converter = new RangeConverter<T>();
}
protected string Classname => InputCssHelper.GetClassname(this,
() => !string.IsNullOrEmpty(Text) || Adornment == Adornment.Start || !string.IsNullOrWhiteSpace(PlaceholderStart) || !string.IsNullOrWhiteSpace(PlaceholderEnd));
/// <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 InputClassname => InputCssHelper.GetInputClassname(this);
protected string AdornmentClassname => InputCssHelper.GetAdornmentClassname(this);
/// <summary>
/// The short hint displayed in the start input before the user enters a value.
/// </summary>
[Parameter] public string PlaceholderStart { get; set; }
/// <summary>
/// The short hint displayed in the end input before the user enters a value.
/// </summary>
[Parameter] public string PlaceholderEnd { get; set; }
protected string InputTypeString => InputType.ToDescriptionString();
/// <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 ElementReference _elementReferenceStart, _elementReferenceEnd;
/// <summary>
/// Custom separator icon, leave null for default.
/// </summary>
[Parameter] public string SeparatorIcon { get; set; } = Icons.Material.Filled.ArrowRightAlt;
/// <summary>
/// Focuses the start input of MudRangeInput
/// </summary>
/// <returns></returns>
public ValueTask FocusStartAsync() => _elementReferenceStart.FocusAsync();
/// <summary>
/// Selects the start text of MudRangeInput
/// </summary>
/// <returns></returns>
public ValueTask SelectStartAsync() => _elementReferenceStart.SelectAsync();
/// <summary>
/// Selects the specified range of the start text
/// </summary>
/// <param name="pos1">Start position of the selection</param>
/// <param name="pos2">End position of the selection</param>
/// <returns></returns>
public ValueTask SelectRangeStartAsync(int pos1, int pos2) => _elementReferenceStart.SelectRangeAsync(pos1, pos2);
/// <summary>
/// Focuses the end input of MudRangeInput
/// </summary>
/// <returns></returns>
public ValueTask FocusEndAsync() => _elementReferenceEnd.FocusAsync();
/// <summary>
/// Selects the end text of MudRangeInput
/// </summary>
/// <returns></returns>
public ValueTask SelectEndAsync() => _elementReferenceEnd.SelectAsync();
/// <summary>
/// Selects the specified range of the end text
/// </summary>
/// <param name="pos1">Start position of the selection</param>
/// <param name="pos2">End position of the selection</param>
/// <returns></returns>
public ValueTask SelectRangeEndAsync(int pos1, int pos2) => _elementReferenceEnd.SelectRangeAsync(pos1, pos2);
public string TextStart
{
get => _textStart;
set
{
if (_textStart == value)
return;
_textStart = value;
SetTextAsync(RangeConverter<T>.Join(_textStart, _textEnd)).AndForget();
}
}
public string TextEnd
{
get => _textEnd;
set
{
if (_textEnd == value)
return;
_textEnd = value;
SetTextAsync(RangeConverter<T>.Join(_textStart, _textEnd)).AndForget();
}
}
protected override async Task UpdateTextPropertyAsync(bool updateValue)
{
await base.UpdateTextPropertyAsync(updateValue);
RangeConverter<T>.Split(Text, out _textStart, out _textEnd);
}
protected override async Task UpdateValuePropertyAsync(bool updateText)
{
await base.UpdateValuePropertyAsync(updateText);
RangeConverter<T>.Split(Text, out _textStart, out _textEnd);
}
}