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);
}
}