diff --git a/NHSUKViewComponents.Web/ViewComponents/CheckboxesViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/CheckboxesViewComponent.cs index 705a305..f25667d 100644 --- a/NHSUKViewComponents.Web/ViewComponents/CheckboxesViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/CheckboxesViewComponent.cs @@ -13,7 +13,8 @@ public IViewComponentResult Invoke( bool populateWithCurrentValues, string? errormessage, string? hintText, - bool required + bool required, + string cssClass = default ) { var checkboxList = checkboxes.Select( @@ -32,7 +33,8 @@ bool required string.IsNullOrEmpty(hintText) ? null : hintText, errormessage, checkboxList, - required + required, + string.IsNullOrEmpty(cssClass) ? null : cssClass ); return View(viewModel); diff --git a/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs index d47533b..2f021f1 100644 --- a/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs @@ -15,9 +15,15 @@ public IViewComponentResult Invoke( bool populateWithCurrentValues, string hintText, bool required, - string? requiredClientSideErrorMessage = default + string? requiredClientSideErrorMessage = default, + string cssClass = default ) { + var model = ViewData.Model; + var property = model.GetType().GetProperty(aspFor); + var errorMessages = ViewData.ModelState[property?.Name]?.Errors.Select(e => e.ErrorMessage) ?? + new string[] { }; + var radiosList = radios.Select( r => new RadiosItemViewModel( r.Value, @@ -32,8 +38,10 @@ public IViewComponentResult Invoke( label, string.IsNullOrEmpty(hintText) ? null : hintText, radiosList, + errorMessages, required, - string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage + string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage, + string.IsNullOrEmpty(cssClass) ? null : cssClass ); return View(viewModel); diff --git a/NHSUKViewComponents.Web/ViewModels/CheckboxesViewModel.cs b/NHSUKViewComponents.Web/ViewModels/CheckboxesViewModel.cs index 79f7aad..ed0d535 100644 --- a/NHSUKViewComponents.Web/ViewModels/CheckboxesViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/CheckboxesViewModel.cs @@ -9,7 +9,8 @@ public CheckboxesViewModel( string? hintText, string? errormessage, IEnumerable checkboxes, - bool required = false + bool required = false, + string? cssClass = default ) { Label = label; @@ -17,12 +18,15 @@ public CheckboxesViewModel( Checkboxes = checkboxes; ErrorMessage = errormessage; Required = required; + Class = cssClass; } public string Label { get; set; } public string? HintText { get; set; } + public string? Class { get; set; } + public string? ErrorMessage { get; set; } public IEnumerable Checkboxes { get; set; } diff --git a/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs b/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs index 4b73ca1..2e30914 100644 --- a/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs @@ -1,6 +1,7 @@ namespace NHSUKViewComponents.Web.ViewModels { using System.Collections.Generic; + using System.Linq; public class RadiosViewModel { @@ -9,16 +10,22 @@ public RadiosViewModel( string label, string hintText, IEnumerable radios, + IEnumerable errorMessages, bool required, - string? requiredClientSideErrorMessage = default + string? requiredClientSideErrorMessage = default, + string? cssClass = default ) { + var errorMessageList = errorMessages.ToList(); AspFor = aspFor; Label = !required && !label.EndsWith("(optional)") ? label + " (optional)" : label; HintText = hintText; Radios = radios; + ErrorMessages = errorMessageList; + HasError = errorMessageList.Any(); Required = required; RequiredClientSideErrorMessage = requiredClientSideErrorMessage; + Class = cssClass; } public string AspFor { get; set; } @@ -26,6 +33,9 @@ public RadiosViewModel( public string Label { get; set; } public string HintText { get; set; } + public string? Class { get; set; } + public IEnumerable ErrorMessages { get; set; } + public readonly bool HasError; public IEnumerable Radios { get; set; } public bool Required { get; set; } diff --git a/NHSUKViewComponents.Web/Views/Shared/Components/Checkboxes/Default.cshtml b/NHSUKViewComponents.Web/Views/Shared/Components/Checkboxes/Default.cshtml index 835b762..5c445d7 100644 --- a/NHSUKViewComponents.Web/Views/Shared/Components/Checkboxes/Default.cshtml +++ b/NHSUKViewComponents.Web/Views/Shared/Components/Checkboxes/Default.cshtml @@ -31,7 +31,17 @@
@foreach (var checkbox in Model.Checkboxes) { - + if (!string.IsNullOrWhiteSpace(Model.Class)) + { +
+ +
+ } + else + { + + } + }
diff --git a/NHSUKViewComponents.Web/Views/Shared/Components/RadioList/Default.cshtml b/NHSUKViewComponents.Web/Views/Shared/Components/RadioList/Default.cshtml index e6f1bc7..00f3e6d 100644 --- a/NHSUKViewComponents.Web/Views/Shared/Components/RadioList/Default.cshtml +++ b/NHSUKViewComponents.Web/Views/Shared/Components/RadioList/Default.cshtml @@ -3,55 +3,96 @@ @model RadiosViewModel -
- -
- - - - - @if (Model.HintText != null) - { -
- @Html.Raw(Model.HintText) -
- } - - @if (Model.Required) - { +
+ +
+ + + + + @if (Model.HintText != null) + { +
+ @Html.Raw(Model.HintText) +
+ } + + @if (Model.HasError) + { +
+ @foreach (var errorMessage in Model.ErrorMessages) + { + + Error: @errorMessage + + } +
+ } + + @if (Model.Required && !Model.HasError) + {
-
- } - -
- @foreach (var (radio, index) in Model.Radios.Select((r, i) => (r, i))) - { - var radioId = $"{radio.Value}-{index}"; -
- - - @if (radio.HintText != null) - { -
- @radio.HintText
- } -
- } + } + +
+ @foreach (var (radio, index) in Model.Radios.Select((r, i) => (r, i))) + { + var radioId = $"{radio.Value}-{index}"; + if (!string.IsNullOrWhiteSpace(Model.Class)) + { +
+
+ + + @if (radio.HintText != null) + { +
+ @radio.HintText +
+ } +
+
+ } + else + { +
+ + + @if (radio.HintText != null) + { +
+ @radio.HintText +
+ } +
+ } -
-
+ } + +
+