diff --git a/BTCPayServer/Forms/FieldValueMirror.cs b/BTCPayServer/Forms/FieldValueMirror.cs new file mode 100644 index 0000000000..cbcd5ef686 --- /dev/null +++ b/BTCPayServer/Forms/FieldValueMirror.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using BTCPayServer.Abstractions.Form; + +namespace BTCPayServer.Forms; + +public class FieldValueMirror : IFormComponentProvider +{ + public string View { get; } = null; + public void Validate(Form form, Field field) + { + if (form.GetFieldByFullName(field.Value) is null) + { + field.ValidationErrors = new List { $"{field.Name} requires {field.Value} to be present" }; + } + } + + public void Register(Dictionary typeToComponentProvider) + { + typeToComponentProvider.Add("mirror", this); + } + + public string GetValue(Form form, Field field) + { + return form.GetFieldByFullName(field.Value)?.Value; + } +} diff --git a/BTCPayServer/Forms/FormDataExtensions.cs b/BTCPayServer/Forms/FormDataExtensions.cs index 013ee14c53..f20b09f408 100644 --- a/BTCPayServer/Forms/FormDataExtensions.cs +++ b/BTCPayServer/Forms/FormDataExtensions.cs @@ -12,6 +12,7 @@ public static void AddForms(this IServiceCollection serviceCollection) serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/BTCPayServer/Forms/HtmlInputFormProvider.cs b/BTCPayServer/Forms/HtmlInputFormProvider.cs index abe6603494..9709e17916 100644 --- a/BTCPayServer/Forms/HtmlInputFormProvider.cs +++ b/BTCPayServer/Forms/HtmlInputFormProvider.cs @@ -5,27 +5,6 @@ namespace BTCPayServer.Forms; -public class FieldValueMirror : IFormComponentProvider -{ - public string View { get; } = null; - public void Validate(Form form, Field field) - { - if (form.GetFieldByFullName(field.Value) is null) - { - field.ValidationErrors = new List() { $"{field.Name} requires {field.Value} to be present" }; - } - } - - public void Register(Dictionary typeToComponentProvider) - { - typeToComponentProvider.Add("mirror", this); - } - - public string GetValue(Form form, Field field) - { - return form.GetFieldByFullName(field.Value)?.Value; - } -} public class HtmlInputFormProvider : FormComponentProviderBase { public override void Register(Dictionary typeToComponentProvider) diff --git a/BTCPayServer/Forms/HtmlSelectFormProvider.cs b/BTCPayServer/Forms/HtmlSelectFormProvider.cs index 558040d012..592422302a 100644 --- a/BTCPayServer/Forms/HtmlSelectFormProvider.cs +++ b/BTCPayServer/Forms/HtmlSelectFormProvider.cs @@ -9,10 +9,9 @@ public class HtmlSelectFormProvider : FormComponentProviderBase { public override void Register(Dictionary typeToComponentProvider) { - foreach (var t in new[] { - "select"}) - typeToComponentProvider.Add(t, this); + typeToComponentProvider.Add("select", this); } + public override string View => "Forms/SelectElement"; public override void Validate(Form form, Field field) diff --git a/BTCPayServer/Forms/HtmlTextareaFormProvider.cs b/BTCPayServer/Forms/HtmlTextareaFormProvider.cs new file mode 100644 index 0000000000..c209af15ee --- /dev/null +++ b/BTCPayServer/Forms/HtmlTextareaFormProvider.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using BTCPayServer.Abstractions.Form; + +namespace BTCPayServer.Forms; + +public class HtmlTextareaFormProvider : FormComponentProviderBase +{ + public override void Register(Dictionary typeToComponentProvider) + { + typeToComponentProvider.Add("textarea", this); + } + + public override string View => "Forms/TextareaElement"; + + public override void Validate(Form form, Field field) + { + if (field.Required) + { + ValidateField(field); + } + } +} diff --git a/BTCPayServer/Views/Shared/Forms/TextareaElement.cshtml b/BTCPayServer/Views/Shared/Forms/TextareaElement.cshtml new file mode 100644 index 0000000000..f33a356528 --- /dev/null +++ b/BTCPayServer/Views/Shared/Forms/TextareaElement.cshtml @@ -0,0 +1,28 @@ +@model BTCPayServer.Abstractions.Form.Field +@{ + var isInvalid = ViewContext.ModelState[Model.Name]?.ValidationState is Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Invalid; + var errors = isInvalid ? ViewContext.ModelState[Model.Name].Errors : null; +} +
+ + + @(isInvalid && errors.Any() ? errors.First().ErrorMessage : string.Empty) + @if (!string.IsNullOrEmpty(Model.HelpText)) + { +
+ @Safe.Raw(Model.HelpText) +
+ } +
diff --git a/BTCPayServer/Views/Shared/PosData.cshtml b/BTCPayServer/Views/Shared/PosData.cshtml index 7399a95bcb..acf62cab9d 100644 --- a/BTCPayServer/Views/Shared/PosData.cshtml +++ b/BTCPayServer/Views/Shared/PosData.cshtml @@ -1,3 +1,5 @@ +@using System.Text.RegularExpressions +@using Microsoft.AspNetCore.Mvc.TagHelpers @model (Dictionary Items, int Level) @functions { @@ -22,14 +24,14 @@ { @key } - + @if (IsValidURL(str)) { @str } else { - @value?.ToString() + @str.Trim() } } diff --git a/BTCPayServer/Views/UIForms/Modify.cshtml b/BTCPayServer/Views/UIForms/Modify.cshtml index a82312f55e..731337ed82 100644 --- a/BTCPayServer/Views/UIForms/Modify.cshtml +++ b/BTCPayServer/Views/UIForms/Modify.cshtml @@ -39,7 +39,12 @@
-

@ViewData["Title"]

+

+ @ViewData["Title"] + + + +

@if (!isNew)