Make WalletSend match exactly the design of before without additional destination

This commit is contained in:
nicolas.dorier
2019-05-21 18:44:49 +09:00
parent 88c931ec13
commit 06a35787aa
4 changed files with 84 additions and 70 deletions

View File

@@ -226,12 +226,13 @@ namespace BTCPayServer.Controllers
if (command == "add-output") if (command == "add-output")
{ {
ModelState.Clear();
vm.Outputs.Add(new WalletSendModel.TransactionOutput()); vm.Outputs.Add(new WalletSendModel.TransactionOutput());
return View(vm); return View(vm);
} }
if (command.StartsWith("remove-output", StringComparison.InvariantCultureIgnoreCase)) if (command.StartsWith("remove-output", StringComparison.InvariantCultureIgnoreCase))
{ {
ModelState.Clear();
var index = int.Parse(command.Substring(command.IndexOf(":",StringComparison.InvariantCultureIgnoreCase) + 1), CultureInfo.InvariantCulture); var index = int.Parse(command.Substring(command.IndexOf(":",StringComparison.InvariantCultureIgnoreCase) + 1), CultureInfo.InvariantCulture);
vm.Outputs.RemoveAt(index); vm.Outputs.RemoveAt(index);
return View(vm); return View(vm);

View File

@@ -20,7 +20,7 @@ namespace BTCPayServer.Models.WalletViewModels
[Display(Name = "Amount")] [Required] [Range(0.0, double.MaxValue)]public decimal? Amount { get; set; } [Display(Name = "Amount")] [Required] [Range(0.0, double.MaxValue)]public decimal? Amount { get; set; }
[Display(Name = "Subtract fees from this output amount")] [Display(Name = "The destination pays mining fees")]
public bool SubtractFeesFromOutput { get; set; } public bool SubtractFeesFromOutput { get; set; }
} }
public decimal CurrentBalance { get; set; } public decimal CurrentBalance { get; set; }

View File

@@ -56,7 +56,7 @@ else if (!Model.Progress.HasValue)
<span>The previous scan completed and found <b>@Model.LastSuccess.Found</b> UTXOs in <b>@Model.TimeOfScan</b> (The total UTXO set size is @Model.LastSuccess.TotalSizeOfUTXOSet.Value)</span> <span>The previous scan completed and found <b>@Model.LastSuccess.Found</b> UTXOs in <b>@Model.TimeOfScan</b> (The total UTXO set size is @Model.LastSuccess.TotalSizeOfUTXOSet.Value)</span>
</div> </div>
} }
<div class="col-md-10"> <div class="col-md-8">
<p> <p>
Scanning the UTXO set allow you to restore the balance of your wallet, but not all the transaction history. Scanning the UTXO set allow you to restore the balance of your wallet, but not all the transaction history.
</p> </p>
@@ -69,7 +69,7 @@ else if (!Model.Progress.HasValue)
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-10"> <div class="col-md-8">
<form method="post"> <form method="post">
<div class="form-group"> <div class="form-group">
<label asp-for="StartingIndex"></label> <label asp-for="StartingIndex"></label>

View File

@@ -8,99 +8,113 @@
<h4>@ViewData["Title"]</h4> <h4>@ViewData["Title"]</h4>
<div class="row">
<div class="col-md-10">
<p>
Send funds to destinations
</p>
</div>
</div>
<div class="row no-gutters"> <div class="row no-gutters">
<div class="col-md-12"> <div class="@(Model.Outputs.Count==1? "col-lg-6 transaction-output-form": "col-lg-8")">
<form method="post"> <form method="post">
<input type="hidden" asp-for="Divisibility"/> <input type="hidden" asp-for="Divisibility" />
<input type="hidden" asp-for="Fiat"/> <input type="hidden" asp-for="Fiat" />
<input type="hidden" asp-for="Rate"/> <input type="hidden" asp-for="Rate" />
<input type="hidden" asp-for="CurrentBalance"/> <input type="hidden" asp-for="CurrentBalance" />
<input type="hidden" asp-for="RecommendedSatoshiPerByte"/> <input type="hidden" asp-for="RecommendedSatoshiPerByte" />
<input type="hidden" asp-for="CryptoCode"/> <input type="hidden" asp-for="CryptoCode" />
<ul class="text-danger"> <ul class="text-danger">
@foreach (var errors in ViewData.ModelState.Where(pair => pair.Key == string.Empty && pair.Value.ValidationState == ModelValidationState.Invalid)) @foreach (var errors in ViewData.ModelState.Where(pair => pair.Key == string.Empty && pair.Value.ValidationState == ModelValidationState.Invalid))
{ {
foreach (var error in foreach (var error in
errors.Value.Errors) errors.Value.Errors)
{ {
<li>@error.ErrorMessage</li> <li>@error.ErrorMessage</li>
} }
} }
</ul> </ul>
<div class="list-group mb-2"> @if (Model.Outputs.Count == 1)
@if (Model.Outputs.Count > 1) {
{ <div class="form-group">
<div class="list-group-item "> <label asp-for="Outputs[0].DestinationAddress"></label>
<h5 class="mb-1">Destinations</h5> <input asp-for="Outputs[0].DestinationAddress" class="form-control" />
<span asp-validation-for="Outputs[0].DestinationAddress" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Outputs[0].Amount"></label>
<div class="input-group">
<input asp-for="Outputs[0].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
<div class="input-group-prepend">
<span class="input-group-text text-muted" style="display:none;" id="fiatValue"></span>
</div>
</div> </div>
} <span asp-validation-for="Outputs[0].Amount" class="text-danger"></span>
@for (var index = 0; index < Model.Outputs.Count; index++) <p class="form-text text-muted crypto-info">
{ Your current balance is
<div class="list-group-item transaction-output-form p-0 pl-lg-2 @(Model.Outputs.Count==1? "border-0": "") "> <button type="button" class="crypto-balance-link btn btn-link p-0">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
<div class="row"> </p>
<div class="col-sm-12 col-md-12 @(Model.Outputs.Count==1? "col-lg-12": "col-lg-10") py-2 "> </div>
<div class="form-group"> }
<label asp-for="Outputs[index].Amount" class="control-label"></label> else
<div class="input-group"> {
<input asp-for="Outputs[index].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount"/> <div class="list-group-item ">
<div class="input-group-prepend"> <h5 class="mb-1">Destinations</h5>
<span class="input-group-text text-muted fiat-value" style="display:none;"></span> </div>
<div class="list-group mb-2">
@for (var index = 0; index < Model.Outputs.Count; index++)
{
<div class="list-group-item transaction-output-form p-0 pl-lg-2">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-10 py-2 ">
<div class="form-group">
<label asp-for="Outputs[index].Amount" class="control-label"></label>
<div class="input-group">
<input asp-for="Outputs[index].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
<div class="input-group-prepend">
<span class="input-group-text text-muted fiat-value" style="display:none;"></span>
</div>
</div> </div>
<p class="form-text text-muted crypto-info">
Your current balance is
<button type="button" class="crypto-balance-link btn btn-link p-0">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
</p>
<span asp-validation-for="Outputs[index].Amount" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Outputs[index].DestinationAddress" class="control-label"></label>
<input asp-for="Outputs[index].DestinationAddress" class="form-control" />
<span asp-validation-for="Outputs[index].DestinationAddress" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Outputs[index].SubtractFeesFromOutput" class="control-label"></label>
<input type="checkbox" asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check subtract-fees" />
<span asp-validation-for="Outputs[index].SubtractFeesFromOutput" class="text-danger"></span>
</div> </div>
<p class="form-text text-muted crypto-info">
Your current balance is
<button type="button" class="crypto-balance-link btn btn-link p-0">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
</p>
<span asp-validation-for="Outputs[index].Amount" class="text-danger"></span>
</div> </div>
<div class="form-group"> <div class="col-sm-12 col-md-12 col-lg-2 pull-right">
<label asp-for="Outputs[index].DestinationAddress" class="control-label"></label>
<input asp-for="Outputs[index].DestinationAddress" class="form-control"/>
<span asp-validation-for="Outputs[index].DestinationAddress" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Outputs[index].SubtractFeesFromOutput" class="control-label"></label>
<input type="checkbox" asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check subtract-fees"/>
<span asp-validation-for="Outputs[index].SubtractFeesFromOutput" class="text-danger"></span>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-2 pull-right">
@if (Model.Outputs.Count > 1)
{
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")" <button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
class="d-block d-lg-none d-xl-none btn btn-danger mb-2 ml-2"> class="d-block d-lg-none d-xl-none btn btn-danger mb-2 ml-2">
Remove Destination Remove Destination
</button> </button>
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")" <button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
class="d-none d-lg-block remove-destination-btn text-decoration-none h-100 align-middle btn text-danger btn-link fa fa-times rounded-0 pull-right"> class="d-none d-lg-block remove-destination-btn text-decoration-none h-100 align-middle btn text-danger btn-link fa fa-times rounded-0 pull-right"></button>
</button> </div>
}
</div> </div>
</div> </div>
</div> }
} </div>
}
</div>
<div class="form-group"> <div class="form-group">
<label asp-for="FeeSatoshiPerByte"></label> <label asp-for="FeeSatoshiPerByte"></label>
<input asp-for="FeeSatoshiPerByte" type="number" step="any" class="form-control"/> <input asp-for="FeeSatoshiPerByte" type="number" step="any" class="form-control" />
<span id="FeeRate-Error" class="text-danger"></span> <span id="FeeRate-Error" class="text-danger"></span>
<p class="form-text text-muted crypto-info"> <p class="form-text text-muted crypto-info">
The recommended value is The recommended value is
<button type="button" id="crypto-fee-link" class="btn btn-link p-0">@Model.RecommendedSatoshiPerByte</button> satoshi per byte. <button type="button" id="crypto-fee-link" class="btn btn-link p-0">@Model.RecommendedSatoshiPerByte</button> satoshi per byte.
</p> </p>
</div> </div>
@if (Model.Outputs.Count == 1)
{
<div class="form-group">
<label asp-for="Outputs[0].SubtractFeesFromOutput" class="control-label"></label>
<input type="checkbox" asp-for="Outputs[0].SubtractFeesFromOutput" class="form-check subtract-fees" />
<span asp-validation-for="Outputs[0].SubtractFeesFromOutput" class="text-danger"></span>
</div>
}
<div class="card"> <div class="card">
<div class="card-header" id="accordian-dev-info-notification-header"> <div class="card-header" id="accordian-dev-info-notification-header">
<h2 class="mb-0"> <h2 class="mb-0">
@@ -116,7 +130,7 @@
<a href="https://docs.btcpayserver.org/features/wallet#make-sure-no-change-utxo-is-created-expert-mode" target="_blank"> <a href="https://docs.btcpayserver.org/features/wallet#make-sure-no-change-utxo-is-created-expert-mode" target="_blank">
<span class="fa fa-question-circle-o" title="More information..."></span> <span class="fa fa-question-circle-o" title="More information..."></span>
</a> </a>
<input asp-for="NoChange" class="form-check"/> <input asp-for="NoChange" class="form-check" />
</div> </div>
@if (Model.SupportRBF) @if (Model.SupportRBF)
{ {
@@ -125,7 +139,7 @@
<a href="https://bitcoin.org/en/glossary/rbf" target="_blank"> <a href="https://bitcoin.org/en/glossary/rbf" target="_blank">
<span class="fa fa-question-circle-o" title="More information..."></span> <span class="fa fa-question-circle-o" title="More information..."></span>
</a> </a>
<input asp-for="DisableRBF" class="form-check"/> <input asp-for="DisableRBF" class="form-check" />
</div> </div>
} }
</div> </div>
@@ -142,7 +156,6 @@
<button name="command" type="submit" class="dropdown-item" value="analyze-psbt">... a wallet supporting PSBT</button> <button name="command" type="submit" class="dropdown-item" value="analyze-psbt">... a wallet supporting PSBT</button>
</div> </div>
</div> </div>
<button type="submit" name="command" value="add-output" class="ml-1 btn btn-secondary">Add another destination </button> <button type="submit" name="command" value="add-output" class="ml-1 btn btn-secondary">Add another destination </button>
</div> </div>
</form> </form>