diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs index 59b94abb1a..37101f7342 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs @@ -7,6 +7,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHel { public static void AddClass(this TagHelperAttributeList attributes, string className) { + if (string.IsNullOrWhiteSpace(className)) + { + return; + } + var classAttribute = attributes["class"]; if (classAttribute == null) { @@ -21,6 +26,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHel public static void RemoveClass(this TagHelperAttributeList attributes, string className) { + if (string.IsNullOrWhiteSpace(className)) + { + return; + } + var classAttribute = attributes["class"]; if (classAttribute == null) { diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSize.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSize.cs new file mode 100644 index 0000000000..40a1b4ea26 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSize.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button +{ + public enum AbpButtonSize + { + Default, + Small, + Large + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSizeExtensions.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSizeExtensions.cs new file mode 100644 index 0000000000..f4ad7c7acd --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonSizeExtensions.cs @@ -0,0 +1,20 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button +{ + public static class AbpButtonSizeExtensions + { + public static string ToClassName(this AbpButtonSize size) + { + switch (size) + { + case AbpButtonSize.Small: + return "btn-sm"; + case AbpButtonSize.Large: + return "btn-lg"; + case AbpButtonSize.Default: + return ""; + default: + throw new AbpException("Unknown AbpButtonSize: " + size); + } + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs index ef6232b30f..ba13dff54e 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs @@ -3,10 +3,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button { [HtmlTargetElement("abp-button", TagStructure = TagStructure.NormalOrSelfClosing)] - public class AbpButtonTagHelper : AbpTagHelper + public class AbpButtonTagHelper : AbpTagHelper, IButtonTagHelperBase { public AbpButtonType ButtonType { get; set; } = AbpButtonType.Default; + public AbpButtonSize Size { get; set; } = AbpButtonSize.Default; + public string BusyText { get; set; } public string Text { get; set; } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperService.cs index 053de384b4..63a61fd1f2 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperService.cs @@ -2,11 +2,10 @@ using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.Extensions.Localization; -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button { - public class AbpButtonTagHelperService : AbpTagHelperService + public class AbpButtonTagHelperService : AbpButtonTagHelperServiceBase { protected const string DataBusyTextAttributeName = "data-busy-text"; @@ -19,20 +18,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button public override void Process(TagHelperContext context, TagHelperOutput output) { + base.Process(context, output); output.TagName = "button"; - NormalizeTagStyle(context, output); AddType(context, output); - AddClasses(context, output); - AddIcon(context, output); - AddText(context, output); AddBusyText(context, output); } - protected virtual void NormalizeTagStyle(TagHelperContext context, TagHelperOutput output) - { - output.TagMode = TagMode.StartTagAndEndTag; - } - protected virtual void AddType(TagHelperContext context, TagHelperOutput output) { if (output.Attributes.ContainsName("type")) @@ -43,36 +34,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button output.Attributes.Add("type", "button"); } - protected virtual void AddClasses(TagHelperContext context, TagHelperOutput output) - { - output.Attributes.AddClass("btn"); - - if (TagHelper.ButtonType != AbpButtonType.Default) - { - output.Attributes.AddClass("btn-" + TagHelper.ButtonType.ToString().ToLowerInvariant()); - } - } - - protected virtual void AddIcon(TagHelperContext context, TagHelperOutput output) - { - if (TagHelper.Icon.IsNullOrWhiteSpace()) - { - return; - } - - output.Content.AppendHtml($" "); - } - - protected virtual void AddText(TagHelperContext context, TagHelperOutput output) - { - if (TagHelper.Text.IsNullOrWhiteSpace()) - { - return; - } - - output.Content.AppendHtml($"{TagHelper.Text}"); - } - protected virtual void AddBusyText(TagHelperContext context, TagHelperOutput output) { var busyText = TagHelper.BusyText ?? L["ProcessingWithThreeDot"]; diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperServiceBase.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperServiceBase.cs new file mode 100644 index 0000000000..b293b36c78 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelperServiceBase.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Razor.TagHelpers; +using System; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button +{ + public abstract class AbpButtonTagHelperServiceBase : AbpTagHelperService + where TTagHelper : TagHelper, IButtonTagHelperBase + { + public override void Process(TagHelperContext context, TagHelperOutput output) + { + NormalizeTagStyle(context, output); + AddClasses(context, output); + AddIcon(context, output); + AddText(context, output); + } + + protected virtual void NormalizeTagStyle(TagHelperContext context, TagHelperOutput output) + { + output.TagMode = TagMode.StartTagAndEndTag; + } + + protected virtual void AddClasses(TagHelperContext context, TagHelperOutput output) + { + output.Attributes.AddClass("btn"); + + if (TagHelper.ButtonType != AbpButtonType.Default) + { + output.Attributes.AddClass("btn-" + TagHelper.ButtonType.ToString().ToLowerInvariant()); + } + + if (TagHelper.Size != AbpButtonSize.Default) + { + output.Attributes.AddClass(TagHelper.Size.ToClassName()); + } + } + + protected virtual void AddIcon(TagHelperContext context, TagHelperOutput output) + { + if (TagHelper.Icon.IsNullOrWhiteSpace()) + { + return; + } + + output.Content.AppendHtml($" "); + } + + protected virtual void AddText(TagHelperContext context, TagHelperOutput output) + { + if (TagHelper.Text.IsNullOrWhiteSpace()) + { + return; + } + + output.Content.AppendHtml($"{TagHelper.Text}"); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs index a91ba0f093..08b2ecd41c 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs @@ -4,15 +4,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button { [HtmlTargetElement("a", Attributes = "abp-button", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("input", Attributes = "abp-button", TagStructure = TagStructure.WithoutEndTag)] - public class AbpLinkButtonTagHelper : AbpTagHelper + public class AbpLinkButtonTagHelper : AbpTagHelper, IButtonTagHelperBase { [HtmlAttributeName("abp-button")] public AbpButtonType ButtonType { get; set; } + public AbpButtonSize Size { get; set; } = AbpButtonSize.Default; + public string Text { get; set; } public string Icon { get; set; } + public FontIconType IconType { get; } = FontIconType.FontAwesome; + public AbpLinkButtonTagHelper(AbpLinkButtonTagHelperService service) : base(service) { diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelperService.cs index 51ec084f50..f92e2d5137 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelperService.cs @@ -1,34 +1,15 @@ using System; using Microsoft.AspNetCore.Razor.TagHelpers; -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button { - public class AbpLinkButtonTagHelperService : AbpTagHelperService + public class AbpLinkButtonTagHelperService : AbpButtonTagHelperServiceBase { public override void Process(TagHelperContext context, TagHelperOutput output) { - NormalizeTagStyle(context, output); - AddClasses(context, output); - AddRole(context, output); + base.Process(context, output); AddType(context, output); - AddIcon(context, output); - AddText(context, output); - } - - protected virtual void NormalizeTagStyle(TagHelperContext context, TagHelperOutput output) - { - output.TagMode = TagMode.StartTagAndEndTag; - } - - protected virtual void AddClasses(TagHelperContext context, TagHelperOutput output) - { - output.Attributes.AddClass("btn"); - - if (TagHelper.ButtonType != AbpButtonType.Default) - { - output.Attributes.AddClass("btn-" + TagHelper.ButtonType.ToString().ToLowerInvariant()); - } + AddRole(context, output); } protected virtual void AddType(TagHelperContext context, TagHelperOutput output) @@ -47,25 +28,5 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button output.Attributes.Add("role", "button"); } } - - protected virtual void AddIcon(TagHelperContext context, TagHelperOutput output) - { - if (TagHelper.Icon.IsNullOrWhiteSpace()) - { - return; - } - - output.Content.AppendHtml($" "); - } - - protected virtual void AddText(TagHelperContext context, TagHelperOutput output) - { - if (TagHelper.Text.IsNullOrWhiteSpace()) - { - return; - } - - output.Content.AppendHtml($"{TagHelper.Text}"); - } } } \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/IButtonTagHelperBase.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/IButtonTagHelperBase.cs new file mode 100644 index 0000000000..a0e34b039c --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/IButtonTagHelperBase.cs @@ -0,0 +1,15 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button +{ + public interface IButtonTagHelperBase + { + AbpButtonType ButtonType { get; } + + AbpButtonSize Size { get; } + + string Text { get; } + + string Icon { get; } + + FontIconType IconType { get; } + } +} \ No newline at end of file