Browse Source

Add label and info to AbpRadioInput

pull/23996/head
blackWinds 12 months ago
parent
commit
bf12f5bf5f
  1. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs
  2. 153
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelperService.cs

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs

@ -12,6 +12,11 @@ public class AbpRadioInputTagHelper : AbpTagHelper<AbpRadioInputTagHelper, AbpRa
public string? Label { get; set; } public string? Label { get; set; }
public bool SuppressLabel { get; set; } = false;
[HtmlAttributeName("info")]
public string? InfoText { get; set; }
public bool? Inline { get; set; } public bool? Inline { get; set; }
public bool? Disabled { get; set; } public bool? Disabled { get; set; }

153
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelperService.cs

@ -1,33 +1,51 @@
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions;
using Volo.Abp.Localization;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTagHelper> public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTagHelper>
{ {
private readonly IAbpTagHelperLocalizer _tagHelperLocalizer; private readonly IAbpTagHelperLocalizer _tagHelperLocalizer;
private readonly IHtmlGenerator _generator;
public AbpRadioInputTagHelperService(IAbpTagHelperLocalizer tagHelperLocalizer) private readonly HtmlEncoder _encoder;
private readonly IStringLocalizerFactory _stringLocalizerFactory;
private readonly IAbpEnumLocalizer _abpEnumLocalizer;
public AbpRadioInputTagHelperService(
IAbpTagHelperLocalizer tagHelperLocalizer,
IHtmlGenerator generator,
HtmlEncoder encoder,
IStringLocalizerFactory stringLocalizerFactory,
IAbpEnumLocalizer abpEnumLocalizer)
{ {
_tagHelperLocalizer = tagHelperLocalizer; _tagHelperLocalizer = tagHelperLocalizer;
_generator = generator;
_encoder = encoder;
_stringLocalizerFactory = stringLocalizerFactory;
_abpEnumLocalizer = abpEnumLocalizer;
} }
public override void Process(TagHelperContext context, TagHelperOutput output) public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{ {
var selectItems = GetSelectItems(context, output); var selectItems = GetSelectItems(context, output);
SetSelectedValue(context, output, selectItems); SetSelectedValue(context, output, selectItems);
var order = TagHelper.AspFor.ModelExplorer.GetDisplayOrder(); var order = TagHelper.AspFor.ModelExplorer.GetDisplayOrder();
var html = GetHtml(context, output, selectItems); var html = await GetRadioInputGroupAsHtmlAsync(context, output, selectItems);
AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order, out var suppress); AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order, out var suppress);
@ -44,6 +62,21 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTa
} }
} }
protected virtual async Task<string> GetRadioInputGroupAsHtmlAsync(TagHelperContext context, TagHelperOutput output, List<SelectListItem> selectItems)
{
var radioGroupHtml = GetHtml(context, output, selectItems);
var label = await GetLabelAsHtmlAsync(context, output);
var infoText = GetInfoAsHtml(context, output);
var tagBuilder = new TagBuilder("div");
tagBuilder.AddCssClass("mb-3");
tagBuilder.InnerHtml.AppendHtml(label);
tagBuilder.InnerHtml.AppendHtml(radioGroupHtml);
tagBuilder.InnerHtml.AppendHtml(infoText);
return tagBuilder.ToHtmlString();
}
protected virtual string GetHtml(TagHelperContext context, TagHelperOutput output, List<SelectListItem> selectItems) protected virtual string GetHtml(TagHelperContext context, TagHelperOutput output, List<SelectListItem> selectItems)
{ {
var html = new StringBuilder(""); var html = new StringBuilder("");
@ -77,14 +110,92 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTa
label.InnerHtml.AppendHtml(selectItem.Text); label.InnerHtml.AppendHtml(selectItem.Text);
var wrapper = new TagBuilder("div"); var wrapper = new TagBuilder("div");
wrapper.AddCssClass("form-check" + inlineClass); wrapper.AddCssClass("form-check mb-1" + inlineClass);
wrapper.InnerHtml.AppendHtml(input); wrapper.InnerHtml.AppendHtml(input);
wrapper.InnerHtml.AppendHtml(label); wrapper.InnerHtml.AppendHtml(label);
html.AppendLine(wrapper.ToHtmlString()); html.AppendLine(wrapper.ToHtmlString());
} }
return html.ToString(); var div = new TagBuilder("div");
div.AddCssClass("mb-1");
div.InnerHtml.AppendHtml(html.ToString());
return div.ToHtmlString();
}
protected virtual async Task<string> GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output)
{
if (TagHelper.SuppressLabel)
{
return string.Empty;
}
if (string.IsNullOrEmpty(TagHelper.Label))
{
return await GetLabelAsHtmlUsingTagHelperAsync(context, output);
}
var label = new TagBuilder("label");
label.AddCssClass("form-label");
label.InnerHtml.AppendHtml(TagHelper.Label);
label.InnerHtml.AppendHtml(GetRequiredSymbol(context, output));
return label.ToHtmlString();
}
protected virtual async Task<string> GetLabelAsHtmlUsingTagHelperAsync(TagHelperContext context, TagHelperOutput output)
{
var labelTagHelper = new LabelTagHelper(_generator)
{
For = TagHelper.AspFor,
ViewContext = TagHelper.ViewContext,
};
var innerOutput = await labelTagHelper.ProcessAndGetOutputAsync(
new TagHelperAttributeList { { "class", "form-label" } },
context,
"label",
TagMode.StartTagAndEndTag);
innerOutput.Content.AppendHtml(GetRequiredSymbol(context, output));
return innerOutput.Render(_encoder);
}
protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output)
{
var isHaveRequiredAttribute = context.AllAttributes.Any(a => a.Name == "required");
return TagHelper.AspFor.ModelExplorer.GetAttribute<RequiredAttribute>() != null || isHaveRequiredAttribute
? "<span> * </span>"
: "";
}
protected virtual string GetInfoAsHtml(TagHelperContext context, TagHelperOutput output)
{
var text = string.Empty;
var infoAttribute = TagHelper.AspFor.ModelExplorer.GetAttribute<InputInfoText>();
if (!string.IsNullOrEmpty(TagHelper.InfoText))
{
text = TagHelper.InfoText!;
}
else if (infoAttribute != null)
{
text = _tagHelperLocalizer.GetLocalizedText(infoAttribute.Text, TagHelper.AspFor.ModelExplorer);
}
else
{
return "";
}
var small = new TagBuilder("small");
small.Attributes.Add("id", TagHelper.AspFor.Name.Replace('.', '_') + "InfoText");
small.AddCssClass("form-text");
small.InnerHtml.Append(text);
return small.ToHtmlString();
} }
protected virtual List<SelectListItem> GetSelectItems(TagHelperContext context, TagHelperOutput output) protected virtual List<SelectListItem> GetSelectItems(TagHelperContext context, TagHelperOutput output)
@ -110,10 +221,32 @@ public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTa
protected virtual List<SelectListItem> GetSelectItemsFromEnum(TagHelperContext context, TagHelperOutput output, ModelExplorer explorer) protected virtual List<SelectListItem> GetSelectItemsFromEnum(TagHelperContext context, TagHelperOutput output, ModelExplorer explorer)
{ {
var localizer = _tagHelperLocalizer.GetLocalizerOrNull(explorer); var selectItems = new List<SelectListItem>();
var isNullableType = Nullable.GetUnderlyingType(explorer.ModelType) != null;
var enumType = explorer.ModelType;
if (isNullableType)
{
enumType = Nullable.GetUnderlyingType(explorer.ModelType)!;
selectItems.Add(new SelectListItem());
}
var containerLocalizer = _tagHelperLocalizer.GetLocalizerOrNull(explorer.Container.ModelType.Assembly);
var selectItems = explorer.Metadata.IsEnum ? explorer.ModelType.GetTypeInfo().GetMembers(BindingFlags.Public | BindingFlags.Static) foreach (var enumValue in enumType.GetEnumValuesAsUnderlyingType())
.Select((t, i) => new SelectListItem { Value = i.ToString(), Text = GetLocalizedPropertyName(localizer, explorer.ModelType, t.Name) }).ToList() : new List<SelectListItem>(); {
var localizedMemberName = _abpEnumLocalizer.GetString(enumType, enumValue,
new[]
{
containerLocalizer,
_stringLocalizerFactory.CreateDefaultOrNull()
}!);
selectItems.Add(new SelectListItem
{
Value = enumValue.ToString(),
Text = localizedMemberName
});
}
return selectItems; return selectItems;
} }

Loading…
Cancel
Save