mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
Crowdfund finetuning (#3488)
* Update crowdfund defaults * Crowdfund: Move sound, animation and discussion into additional options * Update sound URLs Fixes #3745. * Update featured image URL label * Improve the recurring goal section * Crowdfund: Goal section finetuning
This commit is contained in:
@@ -15,7 +15,6 @@ namespace BTCPayServer.Data
|
|||||||
public bool TagAllInvoices { get; set; }
|
public bool TagAllInvoices { get; set; }
|
||||||
public string Settings { get; set; }
|
public string Settings { get; set; }
|
||||||
|
|
||||||
|
|
||||||
internal static void OnModelCreating(ModelBuilder builder)
|
internal static void OnModelCreating(ModelBuilder builder)
|
||||||
{
|
{
|
||||||
builder.Entity<AppData>()
|
builder.Entity<AppData>()
|
||||||
@@ -28,9 +27,7 @@ namespace BTCPayServer.Data
|
|||||||
// utility methods
|
// utility methods
|
||||||
public T GetSettings<T>() where T : class, new()
|
public T GetSettings<T>() where T : class, new()
|
||||||
{
|
{
|
||||||
if (String.IsNullOrEmpty(Settings))
|
return string.IsNullOrEmpty(Settings) ? new T() : JsonConvert.DeserializeObject<T>(Settings);
|
||||||
return new T();
|
|
||||||
return JsonConvert.DeserializeObject<T>(Settings);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSettings(object value)
|
public void SetSettings(object value)
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ namespace BTCPayServer.Controllers
|
|||||||
return NotFound();
|
return NotFound();
|
||||||
|
|
||||||
var settings = app.GetSettings<CrowdfundSettings>();
|
var settings = app.GetSettings<CrowdfundSettings>();
|
||||||
|
var resetEvery = Enum.GetName(typeof(CrowdfundResetEvery), settings.ResetEvery);
|
||||||
var vm = new UpdateCrowdfundViewModel
|
var vm = new UpdateCrowdfundViewModel
|
||||||
{
|
{
|
||||||
Title = settings.Title,
|
Title = settings.Title,
|
||||||
@@ -57,7 +58,8 @@ namespace BTCPayServer.Controllers
|
|||||||
DisqusShortname = settings.DisqusShortname,
|
DisqusShortname = settings.DisqusShortname,
|
||||||
AnimationsEnabled = settings.AnimationsEnabled,
|
AnimationsEnabled = settings.AnimationsEnabled,
|
||||||
ResetEveryAmount = settings.ResetEveryAmount,
|
ResetEveryAmount = settings.ResetEveryAmount,
|
||||||
ResetEvery = Enum.GetName(typeof(CrowdfundResetEvery), settings.ResetEvery),
|
ResetEvery = resetEvery,
|
||||||
|
IsRecurring = resetEvery != nameof(CrowdfundResetEvery.Never),
|
||||||
UseAllStoreInvoices = app.TagAllInvoices,
|
UseAllStoreInvoices = app.TagAllInvoices,
|
||||||
AppId = appId,
|
AppId = appId,
|
||||||
SearchTerm = app.TagAllInvoices ? $"storeid:{app.StoreDataId}" : $"orderid:{AppService.GetCrowdfundOrderId(appId)}",
|
SearchTerm = app.TagAllInvoices ? $"storeid:{app.StoreDataId}" : $"orderid:{AppService.GetCrowdfundOrderId(appId)}",
|
||||||
@@ -94,6 +96,11 @@ namespace BTCPayServer.Controllers
|
|||||||
vm.TargetAmount = null;
|
vm.TargetAmount = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!vm.IsRecurring)
|
||||||
|
{
|
||||||
|
vm.ResetEvery = nameof(CrowdfundResetEvery.Never);
|
||||||
|
}
|
||||||
|
|
||||||
if (Enum.Parse<CrowdfundResetEvery>(vm.ResetEvery) != CrowdfundResetEvery.Never && !vm.StartDate.HasValue)
|
if (Enum.Parse<CrowdfundResetEvery>(vm.ResetEvery) != CrowdfundResetEvery.Never && !vm.StartDate.HasValue)
|
||||||
{
|
{
|
||||||
ModelState.AddModelError(nameof(vm.StartDate), "A start date is needed when the goal resets every X amount of time.");
|
ModelState.AddModelError(nameof(vm.StartDate), "A start date is needed when the goal resets every X amount of time.");
|
||||||
|
|||||||
@@ -128,21 +128,20 @@ namespace BTCPayServer.Controllers
|
|||||||
var empty = new PointOfSaleSettings { Currency = defaultCurrency };
|
var empty = new PointOfSaleSettings { Currency = defaultCurrency };
|
||||||
appData.SetSettings(empty);
|
appData.SetSettings(empty);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
await _appService.UpdateOrCreateApp(appData);
|
await _appService.UpdateOrCreateApp(appData);
|
||||||
TempData[WellKnownTempData.SuccessMessage] = "App successfully created";
|
TempData[WellKnownTempData.SuccessMessage] = "App successfully created";
|
||||||
CreatedAppId = appData.Id;
|
CreatedAppId = appData.Id;
|
||||||
|
|
||||||
switch (appType)
|
return appType switch
|
||||||
{
|
{
|
||||||
case AppType.PointOfSale:
|
AppType.PointOfSale => RedirectToAction(nameof(UpdatePointOfSale), new { appId = appData.Id }),
|
||||||
return RedirectToAction(nameof(UpdatePointOfSale), new { appId = appData.Id });
|
AppType.Crowdfund => RedirectToAction(nameof(UpdateCrowdfund), new { appId = appData.Id }),
|
||||||
case AppType.Crowdfund:
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
return RedirectToAction(nameof(UpdateCrowdfund), new { appId = appData.Id });
|
};
|
||||||
default:
|
|
||||||
return RedirectToAction(nameof(ListApps), new { storeId = appData.StoreDataId });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{appId}/delete")]
|
[HttpGet("{appId}/delete")]
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
using BTCPayServer.Services.Apps;
|
using BTCPayServer.Services.Apps;
|
||||||
using BTCPayServer.Validation;
|
using BTCPayServer.Validation;
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ namespace BTCPayServer.Models.AppViewModels
|
|||||||
[Required]
|
[Required]
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
|
|
||||||
[Display(Name = "Featured Image")]
|
[Display(Name = "Featured Image URL")]
|
||||||
public string MainImageUrl { get; set; }
|
public string MainImageUrl { get; set; }
|
||||||
|
|
||||||
[Display(Name = "Callback Notification URL")]
|
[Display(Name = "Callback Notification URL")]
|
||||||
@@ -68,11 +69,15 @@ namespace BTCPayServer.Models.AppViewModels
|
|||||||
[Range(0, double.PositiveInfinity)]
|
[Range(0, double.PositiveInfinity)]
|
||||||
public decimal? TargetAmount { get; set; }
|
public decimal? TargetAmount { get; set; }
|
||||||
|
|
||||||
public IEnumerable<string> ResetEveryValues = Enum.GetNames(typeof(CrowdfundResetEvery));
|
public IEnumerable<string> ResetEveryValues = Enum.GetNames(typeof(CrowdfundResetEvery))
|
||||||
|
.Where(i => i != nameof(CrowdfundResetEvery.Never));
|
||||||
|
|
||||||
|
public bool IsRecurring { get; set; }
|
||||||
|
|
||||||
[Display(Name = "Reset goal every")]
|
[Display(Name = "Reset goal every")]
|
||||||
public string ResetEvery { get; set; } = nameof(CrowdfundResetEvery.Never);
|
public string ResetEvery { get; set; } = nameof(CrowdfundResetEvery.Never);
|
||||||
|
|
||||||
|
[Display(Name = "Reset goal every")]
|
||||||
public int ResetEveryAmount { get; set; } = 1;
|
public int ResetEveryAmount { get; set; } = 1;
|
||||||
|
|
||||||
[Display(Name = "Do not allow additional contributions after target has been reached")]
|
[Display(Name = "Do not allow additional contributions after target has been reached")]
|
||||||
|
|||||||
@@ -6,12 +6,11 @@ namespace BTCPayServer.Services.Apps
|
|||||||
{
|
{
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public bool Enabled { get; set; }
|
public bool Enabled { get; set; } = true;
|
||||||
|
|
||||||
public DateTime? StartDate { get; set; }
|
public DateTime? StartDate { get; set; }
|
||||||
public DateTime? EndDate { get; set; }
|
public DateTime? EndDate { get; set; }
|
||||||
|
|
||||||
public string TargetCurrency { get; set; }
|
public string TargetCurrency { get; set; }
|
||||||
|
|
||||||
decimal? _TargetAmount;
|
decimal? _TargetAmount;
|
||||||
public decimal? TargetAmount
|
public decimal? TargetAmount
|
||||||
{
|
{
|
||||||
@@ -38,7 +37,7 @@ namespace BTCPayServer.Services.Apps
|
|||||||
public bool DisqusEnabled { get; set; }
|
public bool DisqusEnabled { get; set; }
|
||||||
public bool SoundsEnabled { get; set; }
|
public bool SoundsEnabled { get; set; }
|
||||||
public string DisqusShortname { get; set; }
|
public string DisqusShortname { get; set; }
|
||||||
public bool AnimationsEnabled { get; set; } = true;
|
public bool AnimationsEnabled { get; set; }
|
||||||
public int ResetEveryAmount { get; set; } = 1;
|
public int ResetEveryAmount { get; set; } = 1;
|
||||||
public CrowdfundResetEvery ResetEvery { get; set; } = CrowdfundResetEvery.Never;
|
public CrowdfundResetEvery ResetEvery { get; set; } = CrowdfundResetEvery.Never;
|
||||||
[Obsolete("Use AppData.TagAllInvoices instead")]
|
[Obsolete("Use AppData.TagAllInvoices instead")]
|
||||||
@@ -53,46 +52,33 @@ namespace BTCPayServer.Services.Apps
|
|||||||
|
|
||||||
public string[] Sounds { get; set; } =
|
public string[] Sounds { get; set; } =
|
||||||
{
|
{
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/dominating.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/dominating.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/doublekill.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/doublekill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/doublekill2.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/doublekill2.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/eagleeye.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/eagleeye.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/firstblood.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/firstblood.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/firstblood2.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/firstblood2.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/firstblood3.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/firstblood3.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/flawless.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/godlike.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/godlike.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/hattrick.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/hattrick.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/headhunter.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/headhunter.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/headshot.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/headshot.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/headshot2.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/headshot2.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/headshot3.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/headshot3.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/holyshit.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/holyshit.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/killingspree.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/killingspree.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/ludicrouskill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/knife.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/megakill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/knife2.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/monsterkill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/knife3.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/multikill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/ludicrouskill.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/ownage.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/megakill.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/payback.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/monsterkill.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/rampage.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/multikill.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/teamkiller.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/nade.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/triplekill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/ownage.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/ultrakill.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/payback.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/unstoppable.wav",
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/prepare.wav",
|
"https://github.com/ClaudiuHKS/AdvancedQuakeSounds/tree/master/sound/AQS/whickedsick.wav"
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/prepare2.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/prepare3.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/prepare4.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/rampage.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/suicide.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/suicide2.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/suicide3.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/suicide4.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/teamkiller.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/triplekill.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/ultrakill.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/unstoppable.wav",
|
|
||||||
"//github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/QuakeSounds/whickedsick.wav"
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
public enum CrowdfundResetEvery
|
public enum CrowdfundResetEvery
|
||||||
|
|||||||
@@ -63,22 +63,24 @@
|
|||||||
<textarea asp-for="Description" rows="20" cols="40" class="form-control richtext"></textarea>
|
<textarea asp-for="Description" rows="20" cols="40" class="form-control richtext"></textarea>
|
||||||
<span asp-validation-for="Description" class="text-danger"></span>
|
<span asp-validation-for="Description" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-0">
|
<div class="form-group">
|
||||||
<div class="d-flex align-items-center mb-3">
|
<div class="d-flex align-items-center">
|
||||||
<input asp-for="Enabled" type="checkbox" class="btcpay-toggle me-3"/>
|
<input asp-for="Enabled" type="checkbox" class="btcpay-toggle me-3"/>
|
||||||
|
<div>
|
||||||
<label asp-for="Enabled" class="form-label mb-0"></label>
|
<label asp-for="Enabled" class="form-label mb-0"></label>
|
||||||
</div>
|
|
||||||
<span asp-validation-for="Enabled" class="text-danger"></span>
|
<span asp-validation-for="Enabled" class="text-danger"></span>
|
||||||
<div class="text-muted" hidden="@Model.Enabled">The crowdfund is only visible to you. To make it visible to anyone else, enable this.</div>
|
<div class="text-muted" hidden="@Model.Enabled">The crowdfund is only visible to you. To make it visible to anyone else, enable this.</div>
|
||||||
<div class="text-muted" hidden="@(!Model.Enabled)">The crowdfund is visible to anyone. To make it only visible to you, disable this.</div>
|
<div class="text-muted" hidden="@(!Model.Enabled)">The crowdfund is visible to anyone. To make it only visible to you, disable this.</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xl-8 col-xxl-constrain">
|
<div class="col-xl-10 col-xxl-constrain">
|
||||||
<h3 class="mt-5 mb-4">Goal</h3>
|
<h3 class="mt-5 mb-4">Goal</h3>
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex flex-wrap gap-3 mb-3">
|
||||||
<div class="form-group flex-fill me-4">
|
<div class="form-group w-250px mb-0">
|
||||||
<label asp-for="TargetAmount" class="form-label"></label>
|
<label asp-for="TargetAmount" class="form-label"></label>
|
||||||
<input inputmode="decimal" asp-for="TargetAmount" class="form-control" />
|
<input inputmode="decimal" asp-for="TargetAmount" class="form-control" />
|
||||||
<span asp-validation-for="TargetAmount" class="text-danger"></span>
|
<span asp-validation-for="TargetAmount" class="text-danger"></span>
|
||||||
@@ -90,43 +92,51 @@
|
|||||||
<span asp-validation-for="TargetCurrency" class="text-danger"></span>
|
<span asp-validation-for="TargetCurrency" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row g-3">
|
<div class="d-flex flex-wrap gap-3 align-items-center mb-4">
|
||||||
<div class="col col-12 col-sm-6">
|
<div class="form-group mb-0 w-250px">
|
||||||
<div class="form-group">
|
|
||||||
<label asp-for="StartDate" class="form-label"></label>
|
<label asp-for="StartDate" class="form-label"></label>
|
||||||
<div class="input-group flex-nowrap">
|
<div class="input-group flex-nowrap">
|
||||||
<input type="datetime-local" asp-for="StartDate"
|
<input type="datetime-local" asp-for="StartDate"
|
||||||
value="@(Model.StartDate?.ToString("u", CultureInfo.InvariantCulture))"
|
value="@(Model.StartDate?.ToString("u", CultureInfo.InvariantCulture))"
|
||||||
class="form-control flatdtpicker"
|
class="form-control flatdtpicker"
|
||||||
placeholder="No start date has been set" />
|
placeholder="No start date has been set" />
|
||||||
<button class="btn btn-secondary input-group-clear" type="button" title="Clear">
|
<button class="btn btn-secondary input-group-clear px-3" type="button" title="Clear">
|
||||||
<span class="fa fa-times"></span>
|
<vc:icon symbol="close"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<span asp-validation-for="StartDate" class="text-danger"></span>
|
<span asp-validation-for="StartDate" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="form-group mb-0 w-250px">
|
||||||
<div class="col col-12 col-sm-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label asp-for="EndDate" class="form-label"></label>
|
<label asp-for="EndDate" class="form-label"></label>
|
||||||
<div class="input-group flex-nowrap">
|
<div class="input-group flex-nowrap">
|
||||||
<input type="datetime-local" asp-for="EndDate"
|
<input type="datetime-local" asp-for="EndDate"
|
||||||
value="@(Model.EndDate?.ToString("u", CultureInfo.InvariantCulture))"
|
value="@(Model.EndDate?.ToString("u", CultureInfo.InvariantCulture))"
|
||||||
class="form-control flatdtpicker"
|
class="form-control flatdtpicker"
|
||||||
placeholder="No end date has been set" />
|
placeholder="No end date has been set" />
|
||||||
<button class="btn btn-secondary input-group-clear input-group-text" type="button" title="Clear">
|
<button class="btn btn-secondary input-group-clear px-3" type="button" title="Clear">
|
||||||
<span class="fa fa-times"></span>
|
<vc:icon symbol="close"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<span asp-validation-for="EndDate" class="text-danger"></span>
|
<span asp-validation-for="EndDate" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group mt-4" id="ResetRow" hidden="@(Model.StartDate == null)">
|
||||||
|
<div class="d-flex align-items-center mb-3">
|
||||||
|
<input asp-for="IsRecurring" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#ResetEverySettings" aria-expanded="@(Model.IsRecurring)" aria-controls="ResetEverySettings" />
|
||||||
|
<div>
|
||||||
|
<label asp-for="IsRecurring" class="form-label mb-0">Recurring Goal</label>
|
||||||
|
<span asp-validation-for="IsRecurring" class="text-danger"></span>
|
||||||
|
<div class="text-muted">Reset goal after a specific period of time, based on your crowdfund's start date.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mb-0" id="ResetRow" hidden="@(Model.StartDate == null)">
|
</div>
|
||||||
<label asp-for="ResetEvery" class="form-label"></label>
|
|
||||||
<div class="input-group">
|
<div class="collapse @(Model.IsRecurring ? "show" : "")" id="ResetEverySettings">
|
||||||
<input type="number" inputmode="numeric" asp-for="ResetEveryAmount" placeholder="Amount" class="form-control" min="0">
|
<div class="form-group mb-0 pt-2 w-250px">
|
||||||
<select class="form-select" asp-for="ResetEvery">
|
<label asp-for="ResetEveryAmount" class="form-label"></label>
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<input type="number" inputmode="numeric" asp-for="ResetEveryAmount" placeholder="Amount" class="form-control me-3" min="0">
|
||||||
|
<select class="form-select w-auto" asp-for="ResetEvery">
|
||||||
@foreach (var opt in Model.ResetEveryValues)
|
@foreach (var opt in Model.ResetEveryValues)
|
||||||
{
|
{
|
||||||
<option value="@opt">@opt</option>
|
<option value="@opt">@opt</option>
|
||||||
@@ -137,6 +147,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xl-10 col-xxl-constrain">
|
<div class="col-xl-10 col-xxl-constrain">
|
||||||
<partial name="TemplateEditor" model="@(nameof(Model.PerksTemplate), "Perks", Model.TargetCurrency ?? Model.StoreDefaultCurrency)" />
|
<partial name="TemplateEditor" model="@(nameof(Model.PerksTemplate), "Perks", Model.TargetCurrency ?? Model.StoreDefaultCurrency)" />
|
||||||
@@ -182,7 +194,18 @@
|
|||||||
<span asp-validation-for="UseAllStoreInvoices" class="text-danger"></span>
|
<span asp-validation-for="UseAllStoreInvoices" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 class="mt-5 mb-4">Sound</h3>
|
<h3 class="mt-5 mb-2">Additional Options</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="accordion" id="additional">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="additional-sound-header">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#additional-sound" aria-expanded="false" aria-controls="additional-sound">
|
||||||
|
Sound
|
||||||
|
<vc:icon symbol="caret-down" />
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="additional-sound" class="accordion-collapse collapse" aria-labelledby="additional-sound-header">
|
||||||
|
<div class="accordion-body">
|
||||||
<div class="form-group mb-0">
|
<div class="form-group mb-0">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<input asp-for="SoundsEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#SoundsEnabledSettings" aria-expanded="@Model.SoundsEnabled" aria-controls="SoundsEnabledSettings"/>
|
<input asp-for="SoundsEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#SoundsEnabledSettings" aria-expanded="@Model.SoundsEnabled" aria-controls="SoundsEnabledSettings"/>
|
||||||
@@ -193,13 +216,23 @@
|
|||||||
<div class="collapse @(Model.SoundsEnabled ? "show" : "")" id="SoundsEnabledSettings">
|
<div class="collapse @(Model.SoundsEnabled ? "show" : "")" id="SoundsEnabledSettings">
|
||||||
<div class="form-group mb-0 pt-3">
|
<div class="form-group mb-0 pt-3">
|
||||||
<label asp-for="Sounds" class="form-label"></label>
|
<label asp-for="Sounds" class="form-label"></label>
|
||||||
<textarea asp-for="Sounds" class="form-control"></textarea>
|
<textarea asp-for="Sounds" class="form-control" rows="5"></textarea>
|
||||||
<span asp-validation-for="Sounds" class="text-danger"></span>
|
<span asp-validation-for="Sounds" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<h3 class="mt-5 mb-4">Animation</h3>
|
</div>
|
||||||
<div class="form-group mb-3">
|
</div>
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="additional-animation-header">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#additional-animation" aria-expanded="false" aria-controls="additional-animation">
|
||||||
|
Animation
|
||||||
|
<vc:icon symbol="caret-down" />
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="additional-animation" class="accordion-collapse collapse" aria-labelledby="additional-animation-header">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<div class="form-group mb-0">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<input asp-for="AnimationsEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#AnimationsEnabledSettings" aria-expanded="@Model.AnimationsEnabled" aria-controls="AnimationsEnabledSettings"/>
|
<input asp-for="AnimationsEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#AnimationsEnabledSettings" aria-expanded="@Model.AnimationsEnabled" aria-controls="AnimationsEnabledSettings"/>
|
||||||
<label asp-for="AnimationsEnabled" class="form-label mb-0"></label>
|
<label asp-for="AnimationsEnabled" class="form-label mb-0"></label>
|
||||||
@@ -209,13 +242,23 @@
|
|||||||
<div class="collapse @(Model.AnimationsEnabled ? "show" : "")" id="AnimationsEnabledSettings">
|
<div class="collapse @(Model.AnimationsEnabled ? "show" : "")" id="AnimationsEnabledSettings">
|
||||||
<div class="form-group mb-0 pt-3">
|
<div class="form-group mb-0 pt-3">
|
||||||
<label asp-for="AnimationColors" class="form-label"></label>
|
<label asp-for="AnimationColors" class="form-label"></label>
|
||||||
<textarea asp-for="AnimationColors" class="form-control"></textarea>
|
<textarea asp-for="AnimationColors" class="form-control" rows="5"></textarea>
|
||||||
<span asp-validation-for="AnimationColors" class="text-danger"></span>
|
<span asp-validation-for="AnimationColors" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<h3 class="mt-5 mb-4">Discussion</h3>
|
</div>
|
||||||
<div class="form-group mb-3">
|
</div>
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="additional-discussion-header">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#additional-discussion" aria-expanded="false" aria-controls="additional-discussion">
|
||||||
|
Discussion
|
||||||
|
<vc:icon symbol="caret-down" />
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="additional-discussion" class="accordion-collapse collapse" aria-labelledby="additional-discussion-header">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<div class="form-group mb-0">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<input asp-for="DisqusEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#DisqusEnabledSettings" aria-expanded="@Model.DisqusEnabled" aria-controls="DisqusEnabledSettings"/>
|
<input asp-for="DisqusEnabled" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target="#DisqusEnabledSettings" aria-expanded="@Model.DisqusEnabled" aria-controls="DisqusEnabledSettings"/>
|
||||||
<label asp-for="DisqusEnabled" class="form-label mb-0"></label>
|
<label asp-for="DisqusEnabled" class="form-label mb-0"></label>
|
||||||
@@ -229,10 +272,9 @@
|
|||||||
<span asp-validation-for="DisqusShortname" class="text-danger"></span>
|
<span asp-validation-for="DisqusShortname" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<h3 class="mt-5 mb-2">Additional Options</h3>
|
</div>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<div class="accordion" id="additional">
|
|
||||||
<div class="accordion-item">
|
<div class="accordion-item">
|
||||||
<h2 class="accordion-header" id="additional-custom-css-header">
|
<h2 class="accordion-header" id="additional-custom-css-header">
|
||||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#additional-custom-css" aria-expanded="false" aria-controls="additional-custom-css">
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#additional-custom-css" aria-expanded="false" aria-controls="additional-custom-css">
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ hr.primary {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.input-group-clear .icon {
|
||||||
|
--btn-icon-size: .65rem;
|
||||||
|
}
|
||||||
|
|
||||||
.note-editable {
|
.note-editable {
|
||||||
color: var(--btcpay-form-text);
|
color: var(--btcpay-form-text);
|
||||||
background-color: var(--btcpay-form-bg);
|
background-color: var(--btcpay-form-bg);
|
||||||
@@ -219,6 +223,7 @@ h2 small .fa-question-circle-o {
|
|||||||
border: 1px dotted var(--btcpay-neutral-400);
|
border: 1px dotted var(--btcpay-neutral-400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Icons */
|
||||||
svg.icon {
|
svg.icon {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 1rem;
|
width: 1rem;
|
||||||
|
|||||||
@@ -96,12 +96,12 @@
|
|||||||
right: 50%;
|
right: 50%;
|
||||||
}
|
}
|
||||||
.flatpickr-calendar:before {
|
.flatpickr-calendar:before {
|
||||||
border-width: 5px;
|
border-width: 8px;
|
||||||
margin: 0 -5px;
|
margin: 0 -8px;
|
||||||
}
|
}
|
||||||
.flatpickr-calendar:after {
|
.flatpickr-calendar:after {
|
||||||
border-width: 4px;
|
border-width: 7px;
|
||||||
margin: 0 -4px;
|
margin: 0 -7px;
|
||||||
}
|
}
|
||||||
.flatpickr-calendar.arrowTop:before,
|
.flatpickr-calendar.arrowTop:before,
|
||||||
.flatpickr-calendar.arrowTop:after {
|
.flatpickr-calendar.arrowTop:after {
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
border-bottom-color: var(--btcpay-body-border-medium);
|
border-bottom-color: var(--btcpay-body-border-medium);
|
||||||
}
|
}
|
||||||
.flatpickr-calendar.arrowTop:after {
|
.flatpickr-calendar.arrowTop:after {
|
||||||
border-bottom-color: #fff;
|
border-bottom-color: var(--btcpay-body-border-medium);
|
||||||
}
|
}
|
||||||
.flatpickr-calendar.arrowBottom:before,
|
.flatpickr-calendar.arrowBottom:before,
|
||||||
.flatpickr-calendar.arrowBottom:after {
|
.flatpickr-calendar.arrowBottom:after {
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
border-top-color: var(--btcpay-body-border-medium);
|
border-top-color: var(--btcpay-body-border-medium);
|
||||||
}
|
}
|
||||||
.flatpickr-calendar.arrowBottom:after {
|
.flatpickr-calendar.arrowBottom:after {
|
||||||
border-top-color: #fff;
|
border-top-color: var(--btcpay-body-border-medium);
|
||||||
}
|
}
|
||||||
.flatpickr-calendar:focus {
|
.flatpickr-calendar:focus {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
@@ -754,6 +754,9 @@ span.flatpickr-weekday {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
.flatdtpicker[readonly] {
|
||||||
|
background-color: var(--btcpay-form-bg);
|
||||||
|
}
|
||||||
.flatpickr-input[readonly] {
|
.flatpickr-input[readonly] {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user