mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
Add a new Pay Button Type : Custom amount
This commit is contained in:
@@ -891,7 +891,8 @@ namespace BTCPayServer.Controllers
|
|||||||
ButtonSize = 2,
|
ButtonSize = 2,
|
||||||
UrlRoot = appUrl,
|
UrlRoot = appUrl,
|
||||||
PayButtonImageUrl = appUrl + "img/paybutton/pay.png",
|
PayButtonImageUrl = appUrl + "img/paybutton/pay.png",
|
||||||
StoreId = store.Id
|
StoreId = store.Id,
|
||||||
|
ButtonType = 0
|
||||||
};
|
};
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using BTCPayServer.ModelBinders;
|
using BTCPayServer.ModelBinders;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
@@ -18,6 +15,7 @@ namespace BTCPayServer.Models.StoreViewModels
|
|||||||
public string CheckoutDesc { get; set; }
|
public string CheckoutDesc { get; set; }
|
||||||
public string OrderId { get; set; }
|
public string OrderId { get; set; }
|
||||||
public int ButtonSize { get; set; }
|
public int ButtonSize { get; set; }
|
||||||
|
public int ButtonType { get; set; }
|
||||||
[Url]
|
[Url]
|
||||||
public string ServerIpn { get; set; }
|
public string ServerIpn { get; set; }
|
||||||
[Url]
|
[Url]
|
||||||
|
|||||||
@@ -57,6 +57,17 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Button Type</label>
|
||||||
|
<div>
|
||||||
|
<input type="radio" name="button-type" id="btn-fixed" value="0" v-model="srvModel.buttonType" v-on:change="inputChanges" checked />
|
||||||
|
<label for="btn-fixed">Fixed amount</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="radio" name="button-type" id="btn-custom" value="1" v-model="srvModel.buttonType" v-on:change="inputChanges" />
|
||||||
|
<label for="btn-custom">Custom amount</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-5">
|
<div class="col-lg-5">
|
||||||
<br />
|
<br />
|
||||||
@@ -123,20 +134,20 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@section HeadScripts {
|
@section HeadScripts {
|
||||||
<link rel="stylesheet" href="~/vendor/highlightjs/default.min.css">
|
<link rel="stylesheet" href="~/vendor/highlightjs/default.min.css">
|
||||||
<script src="~/vendor/highlightjs/highlight.min.js"></script>
|
<script src="~/vendor/highlightjs/highlight.min.js"></script>
|
||||||
|
|
||||||
<script src="~/vendor/vuejs/vue.js"></script>
|
<script src="~/vendor/vuejs/vue.js"></script>
|
||||||
<script src="~/vendor/vuejs-vee-validate/vee-validate.js"></script>
|
<script src="~/vendor/vuejs-vee-validate/vee-validate.js"></script>
|
||||||
|
|
||||||
<script src="~/vendor/clipboard.js/clipboard.js"></script>
|
<script src="~/vendor/clipboard.js/clipboard.js"></script>
|
||||||
|
|
||||||
<script src="~/paybutton/paybutton.js"></script>
|
<script src="~/paybutton/paybutton.js"></script>
|
||||||
}
|
}
|
||||||
|
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var srvModel = @Html.Raw(Json.Serialize(Model));
|
var srvModel = @Html.Raw(Json.Serialize(Model));
|
||||||
|
|
||||||
var payButtonCtrl = new Vue({
|
var payButtonCtrl = new Vue({
|
||||||
@@ -150,5 +161,5 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ function esc(input) {
|
|||||||
(but it's not necessary).
|
(but it's not necessary).
|
||||||
Or for XML, only if the named entities are defined in its DTD.
|
Or for XML, only if the named entities are defined in its DTD.
|
||||||
*/
|
*/
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vue.use(VeeValidate);
|
Vue.use(VeeValidate);
|
||||||
@@ -42,9 +42,35 @@ function inputChanges(event, buttonSize) {
|
|||||||
srvModel.buttonSize = buttonSize;
|
srvModel.buttonSize = buttonSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var width = "209px";
|
||||||
|
var widthInput = "3em";
|
||||||
|
if (srvModel.buttonSize === 0) {
|
||||||
|
width = "146px";
|
||||||
|
widthInput = "2em";
|
||||||
|
} else if (srvModel.buttonSize === 1) {
|
||||||
|
width = "168px";
|
||||||
|
} else if (srvModel.buttonSize === 2) {
|
||||||
|
width = "209px";
|
||||||
|
}
|
||||||
|
|
||||||
var html = '<form method="POST" action="' + esc(srvModel.urlRoot) + 'api/v1/invoices">';
|
var html = '<form method="POST" action="' + esc(srvModel.urlRoot) + 'api/v1/invoices">';
|
||||||
html += addinput("storeId", srvModel.storeId);
|
html += addinput("storeId", srvModel.storeId);
|
||||||
html += addinput("price", srvModel.price);
|
|
||||||
|
// Add price as hidden only if it's a fixed amount
|
||||||
|
if (srvModel.buttonType == 0) {
|
||||||
|
html += addinput("price", srvModel.price);
|
||||||
|
}
|
||||||
|
else if (srvModel.buttonType == 1) {
|
||||||
|
html += '\n <div style="text-align:center;width:' + width + '">';
|
||||||
|
html += addPlusMinusButton("-");
|
||||||
|
html += '<input type="text" id="btcpay-input-price" name="price" value="' + srvModel.price + '" style="' +
|
||||||
|
'border:none;background-image:none;background-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;-webkit-appearance: none;' + // Reset css
|
||||||
|
'width:' + widthInput + ';text-align:center;font-size:25px;margin:auto;border-radius:5px;line-height:50px;background:#fff;"' + // Custom css
|
||||||
|
'oninput="event.preventDefault();isNaN(event.target.value) ? document.querySelector(\'#btcpay-input-price\').value = ' + srvModel.price + ' : event.target.value" />'; // Method to try if it's a number
|
||||||
|
html += addPlusMinusButton("+");
|
||||||
|
html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
if (srvModel.currency) {
|
if (srvModel.currency) {
|
||||||
html += addinput("currency", srvModel.currency);
|
html += addinput("currency", srvModel.currency);
|
||||||
}
|
}
|
||||||
@@ -65,14 +91,6 @@ function inputChanges(event, buttonSize) {
|
|||||||
html += addinput("notifyEmail", srvModel.notifyEmail);
|
html += addinput("notifyEmail", srvModel.notifyEmail);
|
||||||
}
|
}
|
||||||
|
|
||||||
var width = "209px";
|
|
||||||
if (srvModel.buttonSize === 0) {
|
|
||||||
width = "146px";
|
|
||||||
} else if (srvModel.buttonSize === 1) {
|
|
||||||
width = "168px";
|
|
||||||
} else if (srvModel.buttonSize === 2) {
|
|
||||||
width = "209px";
|
|
||||||
}
|
|
||||||
html += '\n <input type="image" src="' + esc(srvModel.payButtonImageUrl) + '" name="submit" style="width:' + width +
|
html += '\n <input type="image" src="' + esc(srvModel.payButtonImageUrl) + '" name="submit" style="width:' + width +
|
||||||
'" alt="Pay with BtcPay, Self-Hosted Bitcoin Payment Processor">';
|
'" alt="Pay with BtcPay, Self-Hosted Bitcoin Payment Processor">';
|
||||||
|
|
||||||
@@ -93,3 +111,11 @@ function addinput(name, value) {
|
|||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addPlusMinusButton(type) {
|
||||||
|
var button = '<button style="cursor:pointer; font-size:25px; line-height: 25px; background: rgba(0,0,0,.1); height: 30px; width: 45px; border:none; border-radius: 60px; margin: auto;" onclick="event.preventDefault();document.querySelector(\'#btcpay-input-price\').value = parseInt(document.querySelector(\'#btcpay-input-price\').value) TYPE 1;">TYPE</button>';
|
||||||
|
if (type === "+") {
|
||||||
|
return button.replace(/TYPE/g, '+');
|
||||||
|
} else {
|
||||||
|
return button.replace(/TYPE/g, '-');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user