Abınput andabpselect improvements

pull/279/head
yekalkan 8 years ago
parent 175239a479
commit 52be5cc196

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

@ -79,12 +79,15 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
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))
{
surpress = false;
return new List<FormGroupItem>();
}
surpress = true;
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;
}
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('.', '_') + "\"")))
{

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

@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection;
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
{
@ -45,6 +46,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
SetContent(output,list);
SetFormAttributes(output);
SetSubmitButton(context, 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());
}
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)
{
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);
}
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)
{
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)
{
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer);
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer, explorer.Model.ToString());
return selectItems != null;
}

@ -5,7 +5,7 @@ using Volo.Abp.DependencyInjection;
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; }

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
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.Form
{
@ -25,18 +26,28 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
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);
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 label = GetLabelAsHtml(inputTag, isCheckbox);
@ -63,9 +74,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
inputHtml + Environment.NewLine + label :
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") + "\">" +
Environment.NewLine + innerContent + Environment.NewLine +
Environment.NewLine + validation + Environment.NewLine +
Environment.NewLine + innerHtml + Environment.NewLine +
"</div>";
}

@ -6,7 +6,7 @@ using Volo.Abp.DependencyInjection;
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; }

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
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.Form
{
@ -25,13 +26,23 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var html = GetFormInputGroupAsHtml(context, output);
var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
var innerHtml = GetFormInputGroupAsHtml(context, output);
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)
@ -40,14 +51,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var selectAsHtml = RenderTagHelperOutput(selectTag, _encoder);
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 + innerContent + Environment.NewLine + "</div>";
return "<div class=\"form-group\">" + Environment.NewLine + innerHtml + Environment.NewLine + "</div>";
}
protected virtual TagHelperOutput GetSelectTag(TagHelperContext context)

@ -15,13 +15,39 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
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();
return properties.Count > 0
? properties.First().Model as IEnumerable<SelectListItem>
: null;
while (properties.Count == 0)
{
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;
}
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -12,12 +12,9 @@
<div class="demo-with-code">
<div class="demo-area">
<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-dynamic-form abp-model="@Model.PersonInput" asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number" />
</abp-dynamic-form>
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
</form>
<hr />
<h5>Posted Values:</h5>
<div>
@ -28,7 +25,13 @@
Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br />
Country: @Model.PersonInput.Country <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 class="code-area">
<pre>

@ -13,6 +13,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
{
[BindProperty]
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()
{
@ -24,6 +31,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
Age = 65,
Country = "CA",
Day = DateTime.Now,
City = Cities.NewJersey,
Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" }
};
}
@ -62,13 +70,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
[DisplayName("Country")]
[SelectItems(ItemsListPropertyName = nameof(Countries))]
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

Loading…
Cancel
Save