From 00e22569d17394d5e3b4d12957a46b6126718b6e Mon Sep 17 00:00:00 2001 From: "jignesh.jethwani@hee.nhs.uk" Date: Thu, 20 Apr 2023 13:38:21 +0100 Subject: [PATCH 1/2] TD-1278 - added jquery unobtrusive required field, max characters, numeric type and error summary validation to view components --- .../NumericInputViewComponent.cs | 8 +- .../ViewComponents/RadioListViewComponent.cs | 9 +- .../ViewComponents/SelectListViewComponent.cs | 6 +- .../ViewComponents/TextAreaViewComponent.cs | 9 +- .../ViewComponents/TextInputViewComponent.cs | 9 +- .../ViewModels/NumericInputViewModel.cs | 8 +- .../ViewModels/RadiosViewModel.cs | 5 +- .../ViewModels/SelectListViewModel.cs | 5 +- .../ViewModels/TextAreaViewModel.cs | 5 +- .../ViewModels/TextInputViewModel.cs | 5 +- .../Components/ErrorSummary/Default.cshtml | 40 ++++++--- .../Components/NumericInput/Default.cshtml | 71 ++++++++------- .../Components/RadioList/Default.cshtml | 8 ++ .../Components/SelectList/Default.cshtml | 59 ++++++------ .../Shared/Components/TextArea/Default.cshtml | 90 ++++++++++--------- .../Components/TextInput/Default.cshtml | 68 +++++++------- 16 files changed, 248 insertions(+), 157 deletions(-) diff --git a/NHSUKViewComponents.Web/ViewComponents/NumericInputViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/NumericInputViewComponent.cs index 214af9e..60a3ccb 100644 --- a/NHSUKViewComponents.Web/ViewComponents/NumericInputViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/NumericInputViewComponent.cs @@ -13,7 +13,9 @@ public IViewComponentResult Invoke( string type, string hintText, string cssClass, - bool required + bool required, + string? requiredClientSideErrorMessage = default, + string? regularExClientSideErrorMessage = default ) { var model = ViewData.Model; @@ -33,7 +35,9 @@ bool required errorMessages, string.IsNullOrEmpty(cssClass) ? null : cssClass, string.IsNullOrEmpty(hintText) ? null : hintText, - required + required, + string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage, + string.IsNullOrEmpty(regularExClientSideErrorMessage) ? null : regularExClientSideErrorMessage ); return View(numericInputViewModel); } diff --git a/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs index 8e079da..d47533b 100644 --- a/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/RadioListViewComponent.cs @@ -14,7 +14,8 @@ public IViewComponentResult Invoke( IEnumerable radios, bool populateWithCurrentValues, string hintText, - bool required + bool required, + string? requiredClientSideErrorMessage = default ) { var radiosList = radios.Select( @@ -31,7 +32,8 @@ bool required label, string.IsNullOrEmpty(hintText) ? null : hintText, radiosList, - required + required, + string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage ); return View(viewModel); @@ -42,7 +44,8 @@ private bool IsSelectedRadio(string aspFor, RadiosItemViewModel radioItem, bool var model = ViewData.Model; var property = model.GetType().GetProperty(aspFor); var value = property?.GetValue(model); - return populateWithCurrentValue && value.Equals(radioItem.Value); + + return populateWithCurrentValue && value != null && value.Equals(radioItem.Value); } } } diff --git a/NHSUKViewComponents.Web/ViewComponents/SelectListViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/SelectListViewComponent.cs index 75b5392..5f202a0 100644 --- a/NHSUKViewComponents.Web/ViewComponents/SelectListViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/SelectListViewComponent.cs @@ -15,7 +15,8 @@ public IViewComponentResult Invoke( IEnumerable selectListOptions, string? hintText, string? cssClass, - bool required + bool required, + string? requiredClientSideErrorMessage = default ) { var model = ViewData.Model; @@ -36,7 +37,8 @@ bool required string.IsNullOrEmpty(hintText) ? null : hintText, errorMessage, hasError, - required + required, + string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage ); return View(selectListViewModel); } diff --git a/NHSUKViewComponents.Web/ViewComponents/TextAreaViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/TextAreaViewComponent.cs index 2fa6071..2ff86ba 100644 --- a/NHSUKViewComponents.Web/ViewComponents/TextAreaViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/TextAreaViewComponent.cs @@ -17,6 +17,7 @@ public class TextAreaViewComponent : ViewComponent /// Leave blank for no hint. /// /// + /// /// public IViewComponentResult Invoke( string aspFor, @@ -26,7 +27,9 @@ public IViewComponentResult Invoke( bool spellCheck, string hintText, string cssClass, - int? characterCount) + int? characterCount, + string? maxLengthClientSideErrorMessage = default + ) { var model = ViewData.Model; @@ -42,7 +45,9 @@ public IViewComponentResult Invoke( errorMessages, string.IsNullOrEmpty(cssClass) ? null : cssClass, string.IsNullOrEmpty(hintText) ? null : hintText, - characterCount); + characterCount, + maxLengthClientSideErrorMessage + ); return View(textBoxViewModel); } } diff --git a/NHSUKViewComponents.Web/ViewComponents/TextInputViewComponent.cs b/NHSUKViewComponents.Web/ViewComponents/TextInputViewComponent.cs index 5fb7d1b..8d42b32 100644 --- a/NHSUKViewComponents.Web/ViewComponents/TextInputViewComponent.cs +++ b/NHSUKViewComponents.Web/ViewComponents/TextInputViewComponent.cs @@ -19,6 +19,7 @@ public class TextInputViewComponent : ViewComponent /// /// /// + /// /// public IViewComponentResult Invoke( string aspFor, @@ -29,8 +30,9 @@ public IViewComponentResult Invoke( string hintText, string autocomplete, string cssClass, - bool required, - string? placeholderText = null + bool required, + string? placeholderText = null, + string? requiredClientSideErrorMessage = default ) { var model = ViewData.Model; @@ -53,7 +55,8 @@ public IViewComponentResult Invoke( string.IsNullOrEmpty(cssClass) ? null : cssClass, string.IsNullOrEmpty(hintText) ? null : hintText, required, - string.IsNullOrEmpty(placeholderText) ? null : placeholderText + string.IsNullOrEmpty(placeholderText) ? null : placeholderText, + string.IsNullOrEmpty(requiredClientSideErrorMessage) ? null : requiredClientSideErrorMessage ); return View(textBoxViewModel); } diff --git a/NHSUKViewComponents.Web/ViewModels/NumericInputViewModel.cs b/NHSUKViewComponents.Web/ViewModels/NumericInputViewModel.cs index 45fed8a..aef6023 100644 --- a/NHSUKViewComponents.Web/ViewModels/NumericInputViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/NumericInputViewModel.cs @@ -16,7 +16,9 @@ public NumericInputViewModel( IEnumerable errorMessages, string? cssClass = null, string? hintText = null, - bool required = false + bool required = false, + string? requiredClientSideErrorMessage = default, + string? regularExClientSideErrorMessage = default ) { var errorMessageList = errorMessages.ToList(); @@ -31,6 +33,8 @@ public NumericInputViewModel( ErrorMessages = errorMessageList; HasError = errorMessageList.Any(); Required = required; + RequiredClientSideErrorMessage = requiredClientSideErrorMessage; + RegularExClientSideErrorMessage = regularExClientSideErrorMessage; } public string Id { get; set; } @@ -42,5 +46,7 @@ public NumericInputViewModel( public string? HintText { get; set; } public IEnumerable ErrorMessages { get; set; } public bool Required { get; set; } + public string? RequiredClientSideErrorMessage { get; set; } + public string? RegularExClientSideErrorMessage { get; set; } } } diff --git a/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs b/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs index ffc6e20..4b73ca1 100644 --- a/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/RadiosViewModel.cs @@ -9,7 +9,8 @@ public RadiosViewModel( string label, string hintText, IEnumerable radios, - bool required + bool required, + string? requiredClientSideErrorMessage = default ) { AspFor = aspFor; @@ -17,6 +18,7 @@ bool required HintText = hintText; Radios = radios; Required = required; + RequiredClientSideErrorMessage = requiredClientSideErrorMessage; } public string AspFor { get; set; } @@ -27,5 +29,6 @@ bool required public IEnumerable Radios { get; set; } public bool Required { get; set; } + public string RequiredClientSideErrorMessage { get; set; } } } diff --git a/NHSUKViewComponents.Web/ViewModels/SelectListViewModel.cs b/NHSUKViewComponents.Web/ViewModels/SelectListViewModel.cs index 8d5d11d..2e98942 100644 --- a/NHSUKViewComponents.Web/ViewModels/SelectListViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/SelectListViewModel.cs @@ -17,7 +17,8 @@ public SelectListViewModel string? hintText = null, string? errorMessage = null, bool hasError = false, - bool required = false + bool required = false, + string? requiredClientErrorMessage = default ) { Id = id; @@ -31,6 +32,7 @@ public SelectListViewModel ErrorMessage = errorMessage; HasError = hasError; Required = required; + RequiredClientSideErrorMessage = requiredClientErrorMessage; } public string Id { get; set; } @@ -44,5 +46,6 @@ public SelectListViewModel public string? ErrorMessage { get; set; } public bool HasError { get; set; } public bool Required { get; set; } + public string? RequiredClientSideErrorMessage { get; set; } } } diff --git a/NHSUKViewComponents.Web/ViewModels/TextAreaViewModel.cs b/NHSUKViewComponents.Web/ViewModels/TextAreaViewModel.cs index 9447356..fc4d974 100644 --- a/NHSUKViewComponents.Web/ViewModels/TextAreaViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/TextAreaViewModel.cs @@ -16,7 +16,8 @@ public TextAreaViewModel IEnumerable errorMessages, string? cssClass = null, string? hintText = null, - int? characterCount = null + int? characterCount = null, + string? maxLengthClientSideErrorMessage = default ) { var errorMessageList = errorMessages.ToList(); @@ -32,6 +33,7 @@ public TextAreaViewModel CharacterCount = characterCount; ErrorMessages = errorMessageList; HasError = errorMessageList.Any(); + MaxLengthClientSideErrorMessage = maxLengthClientSideErrorMessage; } public string Id { get; set; } @@ -45,5 +47,6 @@ public TextAreaViewModel public int? CharacterCount { get; set; } public IEnumerable ErrorMessages { get; set; } public bool HasError { get; set; } + public string MaxLengthClientSideErrorMessage { get; set; } } } diff --git a/NHSUKViewComponents.Web/ViewModels/TextInputViewModel.cs b/NHSUKViewComponents.Web/ViewModels/TextInputViewModel.cs index cc7b534..b1972ad 100644 --- a/NHSUKViewComponents.Web/ViewModels/TextInputViewModel.cs +++ b/NHSUKViewComponents.Web/ViewModels/TextInputViewModel.cs @@ -17,7 +17,8 @@ public TextInputViewModel( string? cssClass = null, string? hintText = null, bool required = false, - string? placeholder = null + string? placeholder = null, + string? requiredSideClientErrorMessage = default ) { var errorMessageList = errorMessages.ToList(); @@ -35,6 +36,7 @@ public TextInputViewModel( ErrorMessages = errorMessageList; HasError = errorMessageList.Any(); PlaceHolder = placeholder; + RequiredClientSideErrorMessage = requiredSideClientErrorMessage; } public string Id { get; set; } @@ -50,6 +52,7 @@ public TextInputViewModel( public IEnumerable ErrorMessages { get; set; } public readonly bool HasError; public string? PlaceHolder { get; set; } + public string? RequiredClientSideErrorMessage { get; set; } } } diff --git a/NHSUKViewComponents.Web/Views/Shared/Components/ErrorSummary/Default.cshtml b/NHSUKViewComponents.Web/Views/Shared/Components/ErrorSummary/Default.cshtml index abb6ae0..1f9e607 100644 --- a/NHSUKViewComponents.Web/Views/Shared/Components/ErrorSummary/Default.cshtml +++ b/NHSUKViewComponents.Web/Views/Shared/Components/ErrorSummary/Default.cshtml @@ -1,18 +1,30 @@ @using NHSUKViewComponents.Web.ViewModels @model ErrorSummaryViewModel -