using System.Globalization; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; namespace decePubClient.Components.Daisy; /// /// Base of the daisyUI form fields. It is Blazor's , so @bind-Value and /// EditForm validation work as with InputText; it also works outside an EditForm, as long as the value is bound. /// A consumer's class stays in AdditionalAttributes, and adds the /// EditContext's valid/invalid/modified markers to it. /// public abstract class DInputBase : InputBase { /// Whether the bound field currently has validation messages. protected bool IsInvalid => EditContext != null && EditContext.GetValidationMessages(FieldIdentifier).Any(); /// The attributes for the inner input element, without class (that goes on the styled element). protected IReadOnlyDictionary InputAttributes => AdditionalAttributes?.Where(a => a.Key != "class").ToDictionary(a => a.Key, a => a.Value); /// /// The name attribute, or null so none is rendered. InputBase.NameAttributeValue is "" outside a form that maps /// field names, which would group every radio and checkbox on the page. /// protected string NameAttribute => string.IsNullOrEmpty(NameAttributeValue) ? null : NameAttributeValue; protected static string Cx(params string[] classes) => DCx.Join(classes); protected override string FormatValueAsString(TValue value) => BindConverter.FormatValue(value, CultureInfo.InvariantCulture)?.ToString(); protected override bool TryParseValueFromString(string value, out TValue result, out string validationErrorMessage) { if (BindConverter.TryConvertTo(value, CultureInfo.InvariantCulture, out result)) { validationErrorMessage = null; return true; } validationErrorMessage = $"The {DisplayName ?? FieldIdentifier.FieldName} field is not valid."; return false; } }