using Connected.Annotations; using Connected.Middleware; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Logging; namespace Connected.Components; public abstract class UIComponent : ComponentBase { [Inject] private ILoggerFactory LoggerFactory { get; set; } [Inject] private IComponentMiddlewareService? MiddlewareService { get; set; } private ILogger _logger; protected ILogger Logger => _logger ??= LoggerFactory.CreateLogger(GetType()); /// /// User class names, separated by space. /// [Parameter] [Category(CategoryTypes.ComponentBase.Common)] public string Class { get; set; } /// /// User styles, applied on top of the component's own classes and styles. /// [Parameter] [Category(CategoryTypes.ComponentBase.Common)] public string Style { get; set; } /// /// Use Tag to attach any user data object to the component for your convenience. /// [Parameter] [Category(CategoryTypes.ComponentBase.Common)] public object Tag { get; set; } /// /// UserAttributes carries all attributes you add to the component that don't match any of its parameters. /// They will be splatted onto the underlying HTML tag. /// [Parameter(CaptureUnmatchedValues = true)] [Category(CategoryTypes.ComponentBase.Common)] public Dictionary UserAttributes { get; set; } = new Dictionary(); /// /// If the UserAttributes contain an ID make it accessible for WCAG labelling of input fields /// public string FieldId => (UserAttributes?.ContainsKey("id") == true ? UserAttributes["id"].ToString() : $"mudinput-{Guid.NewGuid()}"); protected Type ResolveComponent() { if (MiddlewareService is null) return typeof(TComponent); if (MiddlewareService.Select() is Type type) return type; return typeof(TComponent); } }