Browse Source

Abınput andabpselect improvements

pull/279/head
yekalkan 9 years ago
parent
commit
52be5cc196
  1. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs
  2. 9
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs
  3. 1
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs
  4. 22
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  5. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs
  6. 30
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  7. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs
  8. 29
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs
  9. 34
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectItems.cs
  10. 1637
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
  11. 15
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml
  12. 15
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml.cs

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs

@ -6,7 +6,7 @@ using Volo.Abp.Threading;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
{ {
public abstract class AbpTagHelper : TagHelper //, ITransientDependency public abstract class AbpTagHelper : TagHelper, ITransientDependency
{ {
} }

9
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs

@ -79,12 +79,15 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName)?.GetCustomAttribute<T>(); return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName)?.GetCustomAttribute<T>();
} }
protected virtual List<FormGroupItem> GetFormGroupContentsList(TagHelperContext context) protected virtual List<FormGroupItem> GetFormGroupContentsList(TagHelperContext context, out bool surpress)
{ {
if (!context.Items.ContainsKey(FormGroupContents)) if (!context.Items.ContainsKey(FormGroupContents))
{ {
surpress = false;
return new List<FormGroupItem>(); return new List<FormGroupItem>();
} }
surpress = true;
return context.Items[FormGroupContents] as List<FormGroupItem>; return context.Items[FormGroupContents] as List<FormGroupItem>;
} }
@ -100,9 +103,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
return GetAttribute<DisplayOrder>(explorer)?.Number ?? DisplayOrder.Default; return GetAttribute<DisplayOrder>(explorer)?.Number ?? DisplayOrder.Default;
} }
protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order) protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order, out bool surpress)
{ {
var list = GetFormGroupContentsList(context); var list = GetFormGroupContentsList(context, out surpress);
if (list != null && !list.Any(igc => igc.HtmlContent.Contains("id=\"" + propertyName.Replace('.', '_') + "\""))) if (list != null && !list.Any(igc => igc.HtmlContent.Contains("id=\"" + propertyName.Replace('.', '_') + "\"")))
{ {

1
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button
{ {

22
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs

@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
@ -45,6 +46,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
SetContent(output,list); SetContent(output,list);
SetFormAttributes(output); SetFormAttributes(output);
SetSubmitButton(context, output);
} }
protected virtual async Task ConvertToMvcForm(TagHelperContext context, TagHelperOutput output) protected virtual async Task ConvertToMvcForm(TagHelperContext context, TagHelperOutput output)
@ -95,6 +98,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
output.PreContent.SetHtmlContent(preContentBuilder.ToString()); output.PreContent.SetHtmlContent(preContentBuilder.ToString());
} }
protected virtual void SetSubmitButton(TagHelperContext context, TagHelperOutput output)
{
var buttonHtml = ProcessSubmitButtonAndGetContent(context, output);
output.PostContent.SetHtmlContent(output.PostContent.GetContent() + buttonHtml);
}
protected virtual List<FormGroupItem> InitilizeFormGroupContentsContext(TagHelperContext context) protected virtual List<FormGroupItem> InitilizeFormGroupContentsContext(TagHelperContext context)
{ {
var items = new List<FormGroupItem>(); var items = new List<FormGroupItem>();
@ -129,6 +139,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
RenderTagHelper(new TagHelperAttributeList(), context, abpSelectTagHelper, _htmlEncoder, "div", TagMode.StartTagAndEndTag); RenderTagHelper(new TagHelperAttributeList(), context, abpSelectTagHelper, _htmlEncoder, "div", TagMode.StartTagAndEndTag);
} }
protected virtual string ProcessSubmitButtonAndGetContent(TagHelperContext context, TagHelperOutput output)
{
var abpButtonTagHelper = _serviceProvider.GetRequiredService<AbpButtonTagHelper>();
var attributes = new TagHelperAttributeList { new TagHelperAttribute("type", "submit") };
abpButtonTagHelper.Text = "Submit";
abpButtonTagHelper.ButtonType = AbpButtonType.Primary;
return RenderTagHelper(attributes, context, abpButtonTagHelper, _htmlEncoder, "button", TagMode.StartTagAndEndTag);
}
protected virtual void ProcessInputGroup(TagHelperContext context, ModelExpression model) protected virtual void ProcessInputGroup(TagHelperContext context, ModelExpression model)
{ {
var abpInputTagHelper = _serviceProvider.GetRequiredService<AbpInputTagHelper>(); var abpInputTagHelper = _serviceProvider.GetRequiredService<AbpInputTagHelper>();
@ -224,7 +244,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
protected virtual bool AreSelectItemsProvided(ModelExplorer explorer, out IEnumerable<SelectListItem> selectItems) protected virtual bool AreSelectItemsProvided(ModelExplorer explorer, out IEnumerable<SelectListItem> selectItems)
{ {
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer); selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer, explorer.Model.ToString());
return selectItems != null; return selectItems != null;
} }

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs

@ -5,7 +5,7 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
public class AbpInputTagHelper : AbpTagHelper<AbpInputTagHelper, AbpInputTagHelperService>, ITransientDependency public class AbpInputTagHelper : AbpTagHelper<AbpInputTagHelper, AbpInputTagHelperService>
{ {
public ModelExpression AspFor { get; set; } public ModelExpression AspFor { get; set; }

30
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.TagHelpers;
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 Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
@ -25,18 +26,28 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
var html = GetFormInputGroupAsHtml(context, output); var innerHtml = GetFormInputGroupAsHtml(context, output, out var isCheckbox);
var order = GetInputOrder(TagHelper.AspFor.ModelExplorer); var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order); AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, SurroundInnerHtmlAndGet(innerHtml, isCheckbox), order, out var surpress);
output.SuppressOutput(); if (surpress)
{
output.SuppressOutput();
}
else
{
output.TagMode = TagMode.StartTagAndEndTag;
output.TagName = "div";
output.Attributes.AddClass(isCheckbox ? "form-check" : "form-group");
output.Content.SetHtmlContent(output.Content.GetContent() + innerHtml);
}
} }
protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output) protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output, out bool isCheckbox)
{ {
var inputTag = GetInputTag(context, out var isCheckbox); var inputTag = GetInputTag(context, out isCheckbox);
var inputHtml = RenderTagHelperOutput(inputTag, _encoder); var inputHtml = RenderTagHelperOutput(inputTag, _encoder);
var label = GetLabelAsHtml(inputTag, isCheckbox); var label = GetLabelAsHtml(inputTag, isCheckbox);
@ -63,9 +74,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
inputHtml + Environment.NewLine + label : inputHtml + Environment.NewLine + label :
label + Environment.NewLine + inputHtml; label + Environment.NewLine + inputHtml;
return Environment.NewLine + innerContent + Environment.NewLine +
Environment.NewLine + validation + Environment.NewLine;
}
protected virtual string SurroundInnerHtmlAndGet(string innerHtml, bool isCheckbox)
{
return "<div class=\"" + (isCheckbox ? "form-check" : "form-group") + "\">" + return "<div class=\"" + (isCheckbox ? "form-check" : "form-group") + "\">" +
Environment.NewLine + innerContent + Environment.NewLine + Environment.NewLine + innerHtml + Environment.NewLine +
Environment.NewLine + validation + Environment.NewLine +
"</div>"; "</div>";
} }

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs

@ -6,7 +6,7 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
public class AbpSelectTagHelper : AbpTagHelper<AbpSelectTagHelper, AbpSelectTagHelperService>, ITransientDependency public class AbpSelectTagHelper : AbpTagHelper<AbpSelectTagHelper, AbpSelectTagHelperService>
{ {
public ModelExpression AspFor { get; set; } public ModelExpression AspFor { get; set; }

29
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc.TagHelpers;
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 Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
@ -25,13 +26,23 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
var html = GetFormInputGroupAsHtml(context, output); var innerHtml = GetFormInputGroupAsHtml(context, output);
var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order); var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
output.SuppressOutput(); AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, SurroundInnerHtmlAndGet(innerHtml), order, out var surpress);
if (surpress)
{
output.SuppressOutput();
}
else
{
output.TagName = "div";
output.Attributes.AddClass("form-group");
output.TagMode = TagMode.StartTagAndEndTag;
output.Content.SetHtmlContent(innerHtml);
}
} }
protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output) protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output)
@ -40,14 +51,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var selectAsHtml = RenderTagHelperOutput(selectTag, _encoder); var selectAsHtml = RenderTagHelperOutput(selectTag, _encoder);
var label = GetLabelAsHtml(selectTag); var label = GetLabelAsHtml(selectTag);
return GetContent(label, selectAsHtml); return label + Environment.NewLine + selectAsHtml;
} }
protected virtual string GetContent(string label, string inputHtml) protected virtual string SurroundInnerHtmlAndGet(string innerHtml)
{ {
var innerContent = label + Environment.NewLine + inputHtml; return "<div class=\"form-group\">" + Environment.NewLine + innerHtml + Environment.NewLine + "</div>";
return "<div class=\"form-group\">" + Environment.NewLine + innerContent + Environment.NewLine + "</div>";
} }
protected virtual TagHelperOutput GetSelectTag(TagHelperContext context) protected virtual TagHelperOutput GetSelectTag(TagHelperContext context)

34
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectItems.cs

@ -15,13 +15,39 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public SelectType SelectType { get; set; } = SelectType.Dropdown; public SelectType SelectType { get; set; } = SelectType.Dropdown;
public IEnumerable<SelectListItem> GetItems(ModelExplorer explorer) public IEnumerable<SelectListItem> GetItems(ModelExplorer explorer, string selectedValue)
{ {
var properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName.Equals(ItemsListPropertyName)).ToList(); var properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName.Equals(ItemsListPropertyName)).ToList();
return properties.Count > 0 while (properties.Count == 0)
? properties.First().Model as IEnumerable<SelectListItem> {
: null; explorer = explorer.Container;
properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName.Equals(ItemsListPropertyName)).ToList();
if (explorer.Container == null)
{
return null;
}
}
var selectItems = (properties.First().Model as IEnumerable<SelectListItem>).ToList();
SetSelectedValue(selectedValue, selectItems);
return selectItems;
}
private static void SetSelectedValue(string selectedValue, List<SelectListItem> selectItems)
{
if (!selectItems.Any(si => si.Selected))
{
var itemToBeSelected = selectItems.FirstOrDefault(si => si.Value.ToString() == selectedValue);
if (itemToBeSelected != null)
{
itemToBeSelected.Selected = true;
}
}
} }
} }
} }

1637
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt

File diff suppressed because it is too large

15
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml

@ -12,12 +12,9 @@
<div class="demo-with-code"> <div class="demo-with-code">
<div class="demo-area"> <div class="demo-area">
<abp-dynamic-form abp-model="@Model.PersonInput" asp-antiforgery="true" asp-controller="Demo" asp-action="Register"> @*<abp-dynamic-form abp-model="@Model.PersonInput" asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-button type="submit" button-type="Primary" text="Submit" /> <abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number" />
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number"/>
</abp-dynamic-form> </abp-dynamic-form>
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
</form>
<hr /> <hr />
<h5>Posted Values:</h5> <h5>Posted Values:</h5>
<div> <div>
@ -28,7 +25,13 @@
Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br /> Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br />
Country: @Model.PersonInput.Country <br /> Country: @Model.PersonInput.Country <br />
IsActive: @Model.PersonInput.IsActive <br /> IsActive: @Model.PersonInput.IsActive <br />
</div> </div>*@
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number NO ABP-DYNAMİC-FORM" />
<abp-input asp-for="@Model.PersonInput.Name" label="Name NO ABP-DYNAMİC-FORM" />
</form>
</div> </div>
<div class="code-area"> <div class="code-area">
<pre> <pre>

15
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml.cs

@ -13,6 +13,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
{ {
[BindProperty] [BindProperty]
public PersonModel PersonInput { get; set; } public PersonModel PersonInput { get; set; }
public List<SelectListItem> Countries { get; set; } = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico"},
new SelectListItem { Value = "CA", Text = "Canada"},
new SelectListItem { Value = "US", Text = "USA" },
};
public void OnGet() public void OnGet()
{ {
@ -24,6 +31,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
Age = 65, Age = 65,
Country = "CA", Country = "CA",
Day = DateTime.Now, Day = DateTime.Now,
City = Cities.NewJersey,
Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" } Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" }
}; };
} }
@ -62,13 +70,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
[DisplayName("Country")] [DisplayName("Country")]
[SelectItems(ItemsListPropertyName = nameof(Countries))] [SelectItems(ItemsListPropertyName = nameof(Countries))]
public string Country { get; set; } public string Country { get; set; }
public List<SelectListItem> Countries { get; set; } = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico"},
new SelectListItem { Value = "CA", Text = "Canada" },
new SelectListItem { Value = "US", Text = "USA" },
};
} }
public class PhoneModel public class PhoneModel

Loading…
Cancel
Save