diff --git a/BTCPayServer/Controllers/AppsController.Crowdfund.cs b/BTCPayServer/Controllers/AppsController.Crowdfund.cs index 29b4f0bcc..503e37c91 100644 --- a/BTCPayServer/Controllers/AppsController.Crowdfund.cs +++ b/BTCPayServer/Controllers/AppsController.Crowdfund.cs @@ -22,8 +22,8 @@ namespace BTCPayServer.Controllers return String.Empty; } } - - + + [HttpGet] [Route("{appId}/settings/crowdfund")] public async Task UpdateCrowdfund(string appId) @@ -61,8 +61,8 @@ namespace BTCPayServer.Controllers SearchTerm = app.TagAllInvoices ? $"storeid:{app.StoreDataId}" : $"orderid:{AppService.GetCrowdfundOrderId(appId)}", DisplayPerksRanking = settings.DisplayPerksRanking, SortPerksByPopularity = settings.SortPerksByPopularity, - Sounds = string.Join(Environment.NewLine, settings.Sounds), - AnimationColors = string.Join(Environment.NewLine, settings.AnimationColors) + Sounds = string.Join(Environment.NewLine, settings.Sounds), + AnimationColors = string.Join(Environment.NewLine, settings.AnimationColors) }; return View(vm); } @@ -70,9 +70,9 @@ namespace BTCPayServer.Controllers [Route("{appId}/settings/crowdfund")] public async Task UpdateCrowdfund(string appId, UpdateCrowdfundViewModel vm, string command) { - if (!string.IsNullOrEmpty( vm.TargetCurrency) && _currencies.GetCurrencyData(vm.TargetCurrency, false) == null) + if (!string.IsNullOrEmpty(vm.TargetCurrency) && _currencies.GetCurrencyData(vm.TargetCurrency, false) == null) ModelState.AddModelError(nameof(vm.TargetCurrency), "Invalid currency"); - + try { _AppService.Parse(vm.PerksTemplate, vm.TargetCurrency).ToString(); @@ -98,14 +98,14 @@ namespace BTCPayServer.Controllers } var parsedSounds = vm.Sounds.Split( - new[] {"\r\n", "\r", "\n"}, + new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None ).Select(s => s.Trim()).ToArray(); if (vm.SoundsEnabled && !parsedSounds.Any()) { ModelState.AddModelError(nameof(vm.Sounds), "You must have at least one sound if you enable sounds"); } - + var parsedAnimationColors = vm.AnimationColors.Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None @@ -114,13 +114,13 @@ namespace BTCPayServer.Controllers { ModelState.AddModelError(nameof(vm.AnimationColors), "You must have at least one animation color if you enable animations"); } - + if (!ModelState.IsValid) { return View(vm); } - - + + var app = await GetOwnedApp(appId, AppType.Crowdfund); if (app == null) return NotFound(); diff --git a/BTCPayServer/Controllers/AppsController.PointOfSale.cs b/BTCPayServer/Controllers/AppsController.PointOfSale.cs index 51032b52f..53c6eadff 100644 --- a/BTCPayServer/Controllers/AppsController.PointOfSale.cs +++ b/BTCPayServer/Controllers/AppsController.PointOfSale.cs @@ -79,9 +79,9 @@ namespace BTCPayServer.Controllers public string CustomCSSLink { get; set; } - + public string EmbeddedCSS { get; set; } - + public string Description { get; set; } public string NotificationEmail { get; set; } public string NotificationUrl { get; set; } @@ -96,7 +96,7 @@ namespace BTCPayServer.Controllers if (app == null) return NotFound(); var settings = app.GetSettings(); - + var vm = new UpdatePointOfSaleViewModel() { NotificationEmailWarning = !await IsEmailConfigured(app.StoreDataId), @@ -119,7 +119,7 @@ namespace BTCPayServer.Controllers NotificationEmail = settings.NotificationEmail, NotificationUrl = settings.NotificationUrl, SearchTerm = $"storeid:{app.StoreDataId}", - RedirectAutomatically = settings.RedirectAutomatically.HasValue? settings.RedirectAutomatically.Value? "true": "false" : "" + RedirectAutomatically = settings.RedirectAutomatically.HasValue ? settings.RedirectAutomatically.Value ? "true" : "false" : "" }; if (HttpContext?.Request != null) { @@ -197,8 +197,8 @@ namespace BTCPayServer.Controllers NotificationEmail = vm.NotificationEmail, Description = vm.Description, EmbeddedCSS = vm.EmbeddedCSS, - RedirectAutomatically = string.IsNullOrEmpty(vm.RedirectAutomatically)? (bool?) null: bool.Parse(vm.RedirectAutomatically) - + RedirectAutomatically = string.IsNullOrEmpty(vm.RedirectAutomatically) ? (bool?)null : bool.Parse(vm.RedirectAutomatically) + }); await _AppService.UpdateOrCreateApp(app); TempData[WellKnownTempData.SuccessMessage] = "App updated"; @@ -211,8 +211,8 @@ namespace BTCPayServer.Controllers if (string.IsNullOrEmpty(list)) { return Array.Empty(); - } - else + } + else { // Remove all characters except numeric and comma Regex charsToDestroy = new Regex(@"[^\d|\" + separator + "]"); diff --git a/BTCPayServer/Models/AppViewModels/UpdateCrowdfundViewModel.cs b/BTCPayServer/Models/AppViewModels/UpdateCrowdfundViewModel.cs index f3fe5ae50..7cf676689 100644 --- a/BTCPayServer/Models/AppViewModels/UpdateCrowdfundViewModel.cs +++ b/BTCPayServer/Models/AppViewModels/UpdateCrowdfundViewModel.cs @@ -10,16 +10,20 @@ namespace BTCPayServer.Models.AppViewModels public class UpdateCrowdfundViewModel { public string StoreId { get; set; } - [Required] [MaxLength(30)] public string Title { get; set; } + [Required] + [MaxLength(30)] + public string Title { get; set; } - [MaxLength(50)] public string Tagline { get; set; } + [MaxLength(50)] + public string Tagline { get; set; } + + [Required] + public string Description { get; set; } - [Required] public string Description { get; set; } - [Display(Name = "Featured Image")] public string MainImageUrl { get; set; } - - [Display(Name = "Callback Notification Url")] + + [Display(Name = "Callback Notification Url")] [Uri] public string NotificationUrl { get; set; } [Display(Name = "Invoice IPN Notification")] @@ -59,7 +63,8 @@ namespace BTCPayServer.Models.AppViewModels public IEnumerable ResetEveryValues = Enum.GetNames(typeof(CrowdfundResetEvery)); - [Display(Name = "Reset goal every")] public string ResetEvery { get; set; } = nameof(CrowdfundResetEvery.Never); + [Display(Name = "Reset goal every")] + public string ResetEvery { get; set; } = nameof(CrowdfundResetEvery.Never); public int ResetEveryAmount { get; set; } = 1; @@ -78,7 +83,7 @@ namespace BTCPayServer.Models.AppViewModels public string EmbeddedCSS { get; set; } [Display(Name = "Count all invoices created on the store as part of the crowdfunding goal")] - public bool UseAllStoreInvoices { get; set; } + public bool UseAllStoreInvoices { get; set; } public string AppId { get; set; } public string SearchTerm { get; set; } @@ -90,10 +95,18 @@ namespace BTCPayServer.Models.AppViewModels [Display(Name = "Sounds to play when a payment is made. One sound per line")] - public string Sounds{ get; set; } + public string Sounds { get; set; } [Display(Name = "Colors to rotate between with animation when a payment is made. First color is the default background. One color per line. Can be any valid css color value.")] - public string AnimationColors{ get; set; } + public string AnimationColors { get; set; } public bool NotificationEmailWarning { get; set; } + + + // NOTE: Improve validation if needed + public bool ModelWithMinimumData + { + get { return Description != null && Title != null && TargetCurrency != null; } + } + } } diff --git a/BTCPayServer/Views/Apps/UpdateCrowdfund.cshtml b/BTCPayServer/Views/Apps/UpdateCrowdfund.cshtml index 8b27fe0de..d4f416aa2 100644 --- a/BTCPayServer/Views/Apps/UpdateCrowdfund.cshtml +++ b/BTCPayServer/Views/Apps/UpdateCrowdfund.cshtml @@ -263,13 +263,12 @@
* - +
@@ -293,7 +292,7 @@
- +
diff --git a/BTCPayServer/Views/Apps/UpdatePointOfSale.cshtml b/BTCPayServer/Views/Apps/UpdatePointOfSale.cshtml index dcd2281aa..4649a1cc9 100644 --- a/BTCPayServer/Views/Apps/UpdatePointOfSale.cshtml +++ b/BTCPayServer/Views/Apps/UpdatePointOfSale.cshtml @@ -261,12 +261,11 @@
* - +
@@ -290,7 +289,7 @@
- +
diff --git a/BTCPayServer/Views/AppsPublic/ViewCrowdfund.cshtml b/BTCPayServer/Views/AppsPublic/ViewCrowdfund.cshtml index 98fada78c..9ab010371 100644 --- a/BTCPayServer/Views/AppsPublic/ViewCrowdfund.cshtml +++ b/BTCPayServer/Views/AppsPublic/ViewCrowdfund.cshtml @@ -33,27 +33,27 @@ @if (!string.IsNullOrEmpty(Model.EmbeddedCSS)) { - @Safe.Raw($""); + @Safe.Raw($""); } -@if (Context.Request.Query.ContainsKey("simple")) -{ - @await Html.PartialAsync("/Views/AppsPublic/Crowdfund/MinimalCrowdfund.cshtml", Model) -} -else -{ - - - if (Model.AnimationsEnabled) + @if (Context.Request.Query.ContainsKey("simple")) { - + @await Html.PartialAsync("/Views/AppsPublic/Crowdfund/MinimalCrowdfund.cshtml", Model) + } + else + { + + + if (Model.AnimationsEnabled) + { + + } + @await Html.PartialAsync("/Views/AppsPublic/Crowdfund/VueCrowdfund.cshtml", Model) } - @await Html.PartialAsync("/Views/AppsPublic/Crowdfund/VueCrowdfund.cshtml", Model) -}