Skip to content

Commit 1dc17da

Browse files
Merge pull request #56 from IowaComputerGurus/copilot/fix-55
Add IsInline property support to FormCheckboxTagHelper
2 parents 6f4533a + 4194949 commit 1dc17da

File tree

8 files changed

+113
-0
lines changed

8 files changed

+113
-0
lines changed

src/AspNetCore.Utilities.Bootstrap5TagHelpers.Sample/Views/Home/StandardForm.cshtml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@
3737
<form-checkbox asp-for="Item3" container-class=""></form-checkbox>
3838
<form-checkbox asp-for="Item4" container-class=""></form-checkbox>
3939
</div>
40+
<div class="mb-3">
41+
<label>Inline Options</label>
42+
<form-checkbox asp-for="Item1" container-class="" is-inline="true"></form-checkbox>
43+
<form-checkbox asp-for="Item2" container-class="" is-inline="true"></form-checkbox>
44+
<form-checkbox asp-for="Item3" container-class="" is-inline="true"></form-checkbox>
45+
<form-checkbox asp-for="Item4" container-class="" is-inline="true"></form-checkbox>
46+
</div>
4047

4148
<bs-button type="Submit" value="Click Here To Test Validation">Click Here To Test Validation</bs-button>
4249
</form>
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using ICG.AspNetCore.Utilities.Bootstrap5TagHelpers.Form;
2+
using ICG.AspNetCore.Utilities.Bootstrap5TagHelpers.Tests.FromFramework;
3+
using Microsoft.AspNetCore.Mvc.Rendering;
4+
using Microsoft.AspNetCore.Mvc.ViewFeatures;
5+
using Xunit.Abstractions;
6+
7+
namespace ICG.AspNetCore.Utilities.Bootstrap5TagHelpers.Tests.Form;
8+
9+
[UsesVerify]
10+
public sealed class FormCheckboxTagHelperTests : ModelTagHelperTest<FormCheckboxTagHelper, TestModel>
11+
{
12+
public FormCheckboxTagHelperTests(ITestOutputHelper output) : base(output)
13+
{
14+
15+
}
16+
17+
[Fact]
18+
public async Task Renders()
19+
{
20+
var metadataProvider = new TestModelMetadataProvider();
21+
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
22+
23+
var tagHelper = GetTagHelper(htmlGenerator, model: false, propertyName: nameof(TestModel.CheckboxField));
24+
var output = await tagHelper.Render();
25+
await VerifyTagHelper(output);
26+
}
27+
28+
[Fact]
29+
public async Task Renders_Inline()
30+
{
31+
var metadataProvider = new TestModelMetadataProvider();
32+
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
33+
34+
var tagHelper = GetTagHelper(htmlGenerator, model: false, propertyName: nameof(TestModel.CheckboxField));
35+
tagHelper.IsInline = true;
36+
var output = await tagHelper.Render();
37+
await VerifyTagHelper(output);
38+
}
39+
40+
[Fact]
41+
public async Task Renders_Switch()
42+
{
43+
var metadataProvider = new TestModelMetadataProvider();
44+
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
45+
46+
var tagHelper = GetTagHelper(htmlGenerator, model: false, propertyName: nameof(TestModel.CheckboxField));
47+
tagHelper.IsSwitch = true;
48+
var output = await tagHelper.Render();
49+
await VerifyTagHelper(output);
50+
}
51+
52+
[Fact]
53+
public async Task Renders_InlineSwitch()
54+
{
55+
var metadataProvider = new TestModelMetadataProvider();
56+
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
57+
58+
var tagHelper = GetTagHelper(htmlGenerator, model: false, propertyName: nameof(TestModel.CheckboxField));
59+
tagHelper.IsInline = true;
60+
tagHelper.IsSwitch = true;
61+
var output = await tagHelper.Render();
62+
await VerifyTagHelper(output);
63+
}
64+
65+
internal override FormCheckboxTagHelper TagHelperFactory(IHtmlGenerator htmlGenerator, ModelExpression modelExpression, ViewContext viewContext)
66+
=> new(htmlGenerator) { For = modelExpression, ViewContext = viewContext };
67+
}

src/AspNetCore.Utilities.Bootstrap5TagHelpers.Tests/Form/TestModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ public class TestModel
77

88
[Required]
99
public int? RequiredIntField { get; set; }
10+
11+
public bool CheckboxField { get; set; }
1012
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+

2+
<div class="form-check mb-3">
3+
<label class="HtmlEncode[[form-check-label]]" for="HtmlEncode[[CheckboxField]]">HtmlEncode[[CheckboxField]]</label>
4+
<input type="HtmlEncode[[checkbox]]" id="HtmlEncode[[CheckboxField]]" name="HtmlEncode[[CheckboxField]]" value="HtmlEncode[[true]]" class="HtmlEncode[[form-check-input]]">
5+
<input name="HtmlEncode[[CheckboxField]]" type="HtmlEncode[[hidden]]" value="HtmlEncode[[false]]">
6+
<span class="HtmlEncode[[text-danger field-validation-valid]]" data-valmsg-for="HtmlEncode[[CheckboxField]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
7+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+

2+
<div class="form-check mb-3 form-check-inline">
3+
<label class="HtmlEncode[[form-check-label]]" for="HtmlEncode[[CheckboxField]]">HtmlEncode[[CheckboxField]]</label>
4+
<input type="HtmlEncode[[checkbox]]" id="HtmlEncode[[CheckboxField]]" name="HtmlEncode[[CheckboxField]]" value="HtmlEncode[[true]]" class="HtmlEncode[[form-check-input]]">
5+
<input name="HtmlEncode[[CheckboxField]]" type="HtmlEncode[[hidden]]" value="HtmlEncode[[false]]">
6+
<span class="HtmlEncode[[text-danger field-validation-valid]]" data-valmsg-for="HtmlEncode[[CheckboxField]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
7+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+

2+
<div class="form-check mb-3 form-switch form-check-inline">
3+
<label class="HtmlEncode[[form-check-label]]" for="HtmlEncode[[CheckboxField]]">HtmlEncode[[CheckboxField]]</label>
4+
<input type="HtmlEncode[[checkbox]]" id="HtmlEncode[[CheckboxField]]" name="HtmlEncode[[CheckboxField]]" value="HtmlEncode[[true]]" class="HtmlEncode[[form-check-input]]" role="HtmlEncode[[switch]]">
5+
<input name="HtmlEncode[[CheckboxField]]" type="HtmlEncode[[hidden]]" value="HtmlEncode[[false]]">
6+
<span class="HtmlEncode[[text-danger field-validation-valid]]" data-valmsg-for="HtmlEncode[[CheckboxField]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
7+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+

2+
<div class="form-check mb-3 form-switch">
3+
<label class="HtmlEncode[[form-check-label]]" for="HtmlEncode[[CheckboxField]]">HtmlEncode[[CheckboxField]]</label>
4+
<input type="HtmlEncode[[checkbox]]" id="HtmlEncode[[CheckboxField]]" name="HtmlEncode[[CheckboxField]]" value="HtmlEncode[[true]]" class="HtmlEncode[[form-check-input]]" role="HtmlEncode[[switch]]">
5+
<input name="HtmlEncode[[CheckboxField]]" type="HtmlEncode[[hidden]]" value="HtmlEncode[[false]]">
6+
<span class="HtmlEncode[[text-danger field-validation-valid]]" data-valmsg-for="HtmlEncode[[CheckboxField]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
7+
</div>

src/AspNetCore.Utilities.Bootstrap5TagHelpers/Form/FormCheckboxTagHelper.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public class FormCheckboxTagHelper : InputTagHelper, IFormElementMixin
3232
/// </summary>
3333
public bool IsSwitch { get; set; } = false;
3434

35+
/// <summary>
36+
/// Controls if this should be rendered inline
37+
/// </summary>
38+
public bool IsInline { get; set; } = false;
39+
3540

3641
/// <summary>
3742
/// Public constructor that will receive the incoming generator to leverage existing Microsoft Tag Helpers
@@ -70,6 +75,10 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
7075
groupClass += " form-switch";
7176
output.Attributes.Add("role", "switch");
7277
}
78+
if (IsInline)
79+
{
80+
groupClass += " form-check-inline";
81+
}
7382
this.StartFormGroup(output, groupClass);
7483

7584
//Generate our label if not inline

0 commit comments

Comments
 (0)