Content Consistency Updates (1.4.0) (#3316)

* updates

* updates

* updates

* updates

* updates

* moves api key CTA to top right

* updates

* more updates

* more updates

* Fix active state when "Account" is selected

* Update wording in subnav: Profile becomes Account

* Fix email test

* Update Emails wording

* Try to fix email test

* Make General first tab in store settings

Co-authored-by: Dennis Reimann <mail@dennisreimann.de>
This commit is contained in:
dstrukt 2022-01-17 17:19:27 -08:00 committed by GitHub
parent 1fc2fc7a11
commit c3f73c0de3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
64 changed files with 220 additions and 214 deletions

View file

@ -16,6 +16,7 @@ using BTCPayServer.Payments.Lightning;
using BTCPayServer.Services.Apps;
using BTCPayServer.Services.Invoices;
using BTCPayServer.Tests.Logging;
using BTCPayServer.Views.Stores;
using Microsoft.AspNetCore.Mvc;
using NBitcoin;
using NBitcoin.Scripting.Parser;
@ -429,7 +430,7 @@ namespace BTCPayServer.Tests
s.GoToInvoiceCheckout(invoiceId);
s.Driver.FindElement(By.ClassName("payment__currencies_noborder"));
s.GoToHome();
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
s.AddDerivationScheme("LTC");
s.AddLightningNode(LightningConnectionType.CLightning);
//there should be three now

View file

@ -186,8 +186,7 @@ namespace BTCPayServer.Tests
s.RegisterNewUser(true);
s.CreateNewStore();
s.AddLightningNode();
s.GoToStore();
s.Driver.FindElement(By.Id("Modify-LightningBTC")).Click();
s.GoToLightningSettings();
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
s.Driver.FindElement(By.Id("save")).Click();
Assert.Contains("BTC Lightning settings successfully updated", s.FindAlertMessage().Text);
@ -205,7 +204,7 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
s.AddDerivationScheme();
var invoiceId = s.CreateInvoice(0.001m, "BTC", "a@x.com");
var invoice = await s.Server.PayTester.InvoiceRepository.GetInvoice(invoiceId);

View file

@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
@ -152,7 +153,7 @@ namespace BTCPayServer.Tests
Driver.WaitForElement(By.Id("Name")).SendKeys(name);
Driver.WaitForElement(By.Id("Create")).Click();
Driver.FindElement(By.Id("StoreNav-StoreSettings")).Click();
Driver.FindElement(By.Id($"SectionNav-{StoreNavPages.GeneralSettings.ToString()}")).Click();
Driver.FindElement(By.Id($"SectionNav-{StoreNavPages.General.ToString()}")).Click();
var storeId = Driver.WaitForElement(By.Id("Id")).GetAttribute("value");
Driver.FindElement(By.Id($"SectionNav-{StoreNavPages.PaymentMethods.ToString()}")).Click();
if (keepId)
@ -360,37 +361,40 @@ namespace BTCPayServer.Tests
Driver.FindElement(By.Id("LoginButton")).Click();
}
public void GoToStore(StoreNavPages storeNavPage = StoreNavPages.PaymentMethods)
public void GoToStore(StoreNavPages storeNavPage = StoreNavPages.General)
{
GoToStore(null, storeNavPage);
}
public void GoToStore(string storeId, StoreNavPages storeNavPage = StoreNavPages.PaymentMethods)
public void GoToStore(string storeId, StoreNavPages storeNavPage = StoreNavPages.General)
{
if (storeId is not null)
GoToUrl($"/stores/{storeId}/");
Driver.FindElement(By.Id("StoreNav-StoreSettings")).Click();
if (storeNavPage != StoreNavPages.PaymentMethods)
if (storeNavPage != StoreNavPages.General)
{
// FIXME: Review and optimize this once we decided on where which items belong
try
switch (storeNavPage)
{
Driver.FindElement(By.Id($"StoreNav-{storeNavPage.ToString()}")).Click();
}
catch (NoSuchElementException)
{
Driver.FindElement(By.Id($"SectionNav-{storeNavPage.ToString()}")).Click();
case StoreNavPages.Dashboard:
case StoreNavPages.Payouts:
case StoreNavPages.PayButton:
case StoreNavPages.PullPayments:
Driver.FindElement(By.Id($"StoreNav-{storeNavPage.ToString()}")).Click();
break;
default:
Driver.FindElement(By.Id($"SectionNav-{storeNavPage.ToString()}")).Click();
break;
}
}
}
public void GoToWalletSettings(string storeId, string cryptoCode = "BTC")
{
try
{
GoToStore(storeId);
GoToStore(storeId, StoreNavPages.PaymentMethods);
Driver.FindElement(By.Id($"Modify{cryptoCode}")).Click();
}
catch (NoSuchElementException)
@ -401,7 +405,7 @@ namespace BTCPayServer.Tests
public void GoToLightningSettings(string cryptoCode = "BTC")
{
GoToStore();
GoToStore(StoreNavPages.PaymentMethods);
Driver.FindElement(By.Id($"StoreNav-Lightning{cryptoCode}")).Click();
}

View file

@ -274,11 +274,11 @@ namespace BTCPayServer.Tests
{
using var s = CreateSeleniumTester();
await s.StartAsync();
s.RegisterNewUser(isAdmin: true);
s.RegisterNewUser(true);
s.Driver.Navigate().GoToUrl(s.Link("/server/emails"));
if (s.Driver.PageSource.Contains("Configured"))
{
s.Driver.FindElement(By.CssSelector("button[value=\"ResetPassword\"]")).Submit();
s.Driver.FindElement(By.Id("ResetPassword")).Submit();
s.FindAlertMessage();
}
CanSetupEmailCore(s);
@ -406,7 +406,7 @@ namespace BTCPayServer.Tests
Assert.True(s.Driver.PageSource.Contains(onchainHint), "Wallet hint not present");
Assert.True(s.Driver.PageSource.Contains(offchainHint), "Lightning hint not present");
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
Assert.Contains(storeName, s.Driver.PageSource);
Assert.True(s.Driver.PageSource.Contains(onchainHint), "Wallet hint should be present at this point");
Assert.True(s.Driver.PageSource.Contains(offchainHint),
@ -518,7 +518,7 @@ namespace BTCPayServer.Tests
// Alice should be able to delete the store
s.Logout();
s.LogIn(alice);
s.GoToStore(StoreNavPages.GeneralSettings);
s.GoToStore(StoreNavPages.General);
s.Driver.FindElement(By.Id("DeleteStore")).Click();
s.Driver.WaitForElement(By.Id("ConfirmInput")).SendKeys("DELETE");
s.Driver.FindElement(By.Id("ConfirmContinue")).Click();
@ -791,7 +791,7 @@ namespace BTCPayServer.Tests
Assert.Contains(server.ServerUri.AbsoluteUri, s.Driver.PageSource);
TestLogs.LogInformation("Let's see if we can generate an event");
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
s.AddDerivationScheme();
s.CreateInvoice();
var request = await server.GetNextRequest();
@ -840,7 +840,7 @@ namespace BTCPayServer.Tests
server.Done();
TestLogs.LogInformation("Let's see if we can delete store with some webhooks inside");
s.GoToStore(StoreNavPages.GeneralSettings);
s.GoToStore(StoreNavPages.General);
s.Driver.FindElement(By.Id("DeleteStore")).Click();
s.Driver.WaitForElement(By.Id("ConfirmInput")).SendKeys("DELETE");
s.Driver.FindElement(By.Id("ConfirmContinue")).Click();
@ -913,7 +913,7 @@ namespace BTCPayServer.Tests
receiveAddr = s.Driver.FindElement(By.Id("address")).GetAttribute("value");
//change the wallet and ensure old address is not there and generating a new one does not result in the prev one
s.GoToStore(storeId);
s.GoToStore(storeId, StoreNavPages.PaymentMethods);
s.GenerateWallet(cryptoCode, "", true);
s.Driver.FindElement(By.Id($"StoreNav-Wallet{cryptoCode}")).Click();
s.Driver.FindElement(By.Id("SectionNav-Receive")).Click();
@ -929,7 +929,7 @@ namespace BTCPayServer.Tests
var result =
await s.Server.ExplorerNode.GetAddressInfoAsync(BitcoinAddress.Create(address, Network.RegTest));
Assert.True(result.IsWatchOnly);
s.GoToStore(storeId);
s.GoToStore(storeId, StoreNavPages.PaymentMethods);
var mnemonic = s.GenerateWallet(cryptoCode, "", true, true);
//lets import and save private keys
@ -1302,7 +1302,7 @@ namespace BTCPayServer.Tests
s.RegisterNewUser(true);
s.CreateNewStore();
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
s.AddLightningNode(LightningConnectionType.CLightning, false);
s.GoToLightningSettings();
s.Driver.SetCheckbox(By.Id("LNURLEnabled"), true);
@ -1345,7 +1345,7 @@ namespace BTCPayServer.Tests
s.RegisterNewUser(true);
(_, string storeId) = s.CreateNewStore();
var network = s.Server.NetworkProvider.GetNetwork<BTCPayNetwork>(cryptoCode).NBitcoinNetwork;
s.GoToStore();
s.GoToStore(StoreNavPages.PaymentMethods);
s.AddLightningNode(LightningConnectionType.CLightning, false);
s.GoToLightningSettings();
// LNURL is false by default
@ -1539,7 +1539,7 @@ namespace BTCPayServer.Tests
//ensure ln address is not available as Lightning is not enable
s.Driver.AssertElementNotFound(By.Id("StoreNav-LightningAddress"));
s.GoToStore(s.StoreId);
s.GoToStore(s.StoreId, StoreNavPages.PaymentMethods);
s.AddLightningNode(LightningConnectionType.LndREST, false);
//ensure ln address is not available as lnurl is not configured
s.Driver.AssertElementNotFound(By.Id("StoreNav-LightningAddress"));
@ -1709,18 +1709,17 @@ retry:
{
s.Driver.FindElement(By.Id("QuickFillDropdownToggle")).Click();
s.Driver.FindElement(By.CssSelector("#quick-fill .dropdown-menu .dropdown-item:first-child")).Click();
s.Driver.FindElement(By.Id("Settings_Login")).SendKeys("test@gmail.com");
s.Driver.FindElement(By.CssSelector("button[value=\"Save\"]")).Submit();
s.FindAlertMessage();
s.Driver.FindElement(By.Id("Settings_Password")).SendKeys("mypassword");
s.Driver.FindElement(By.CssSelector("button[value=\"Save\"]")).Submit();
s.Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
Assert.Contains("Configured", s.Driver.PageSource);
s.Driver.FindElement(By.Id("Settings_Login")).SendKeys("test_fix@gmail.com");
s.Driver.FindElement(By.CssSelector("button[value=\"Save\"]")).Submit();
s.Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
Assert.Contains("Configured", s.Driver.PageSource);
Assert.Contains("test_fix", s.Driver.PageSource);
s.Driver.FindElement(By.CssSelector("button[value=\"ResetPassword\"]")).Submit();
s.Driver.FindElement(By.Id("ResetPassword")).SendKeys(Keys.Enter);
s.FindAlertMessage();
Assert.DoesNotContain("Configured", s.Driver.PageSource);
Assert.Contains("test_fix", s.Driver.PageSource);

View file

@ -35,7 +35,7 @@
</a>
</li>
<li class="nav-item">
<a asp-area="" asp-controller="UIStores" asp-action="PaymentMethods" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActivePage(StoreNavPages.PaymentMethods) @ViewData.IsActivePage(StoreNavPages.Rates) @ViewData.IsActivePage(StoreNavPages.CheckoutAppearance) @ViewData.IsActivePage(StoreNavPages.GeneralSettings) @ViewData.IsActivePage(StoreNavPages.Tokens) @ViewData.IsActivePage(StoreNavPages.Users) @ViewData.IsActivePage(StoreNavPages.Integrations) @ViewData.IsActivePage(StoreNavPages.Webhooks)" id="StoreNav-StoreSettings">
<a asp-area="" asp-controller="UIStores" asp-action="GeneralSettings" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActivePage(StoreNavPages.PaymentMethods) @ViewData.IsActivePage(StoreNavPages.Rates) @ViewData.IsActivePage(StoreNavPages.CheckoutAppearance) @ViewData.IsActivePage(StoreNavPages.General) @ViewData.IsActivePage(StoreNavPages.Tokens) @ViewData.IsActivePage(StoreNavPages.Users) @ViewData.IsActivePage(StoreNavPages.Integrations) @ViewData.IsActivePage(StoreNavPages.Webhooks)" id="StoreNav-StoreSettings">
<vc:icon symbol="settings"/>
<span>Settings</span>
</a>
@ -232,7 +232,7 @@
</a>
</li>
<li class="nav-item dropup">
<a class="nav-link js-scroll-trigger" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="Nav-Account">
<a class="nav-link js-scroll-trigger @ViewData.IsActiveCategory(typeof(ManageNavPages))" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="Nav-Account">
<vc:icon symbol="account"/>
<span>Account</span>
</a>

View file

@ -3,7 +3,7 @@
<div class="row">
<div class="col-lg-6">
<div class="d-flex align-items-center justify-content-between mb-4">
<h2 class="mb-0">@ViewData["Title"]</h2>
<h3 class="mb-0">@ViewData["Title"]</h3>
<div class="dropdown only-for-js" id="quick-fill">
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" id="QuickFillDropdownToggle">
Quick Fill
@ -71,18 +71,18 @@
<label asp-for="Settings.Password" class="form-label"></label>
<div class="input-group">
<input value="Configured" type="text" readonly class="form-control"/>
<button type="submit" class="btn btn-danger" name="command" value="ResetPassword">Reset</button>
<button type="submit" class="btn btn-danger" name="command" value="ResetPassword" id="ResetPassword">Reset</button>
</div>
}
</div>
<input asp-for="PasswordSet" type="hidden"/>
<button type="submit" class="btn btn-primary" name="command" value="Save">Save</button>
<button type="submit" class="btn btn-primary mt-2" name="command" value="Save" id="Save">Save</button>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<h4 class="mt-5 mb-3">Testing</h4>
<h3 class="mt-5 mb-3">Testing</h3>
<p>
To test your settings, enter an email address below.
</p>
@ -90,7 +90,7 @@
<input asp-for="TestEmail" class="form-control" />
<span asp-validation-for="TestEmail" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-secondary mt-2" name="command" value="Test">Send Test Email</button>
<button type="submit" class="btn btn-secondary mt-2" name="command" value="Test" id="Test">Send Test Email</button>
</div>
</div>
</form>

View file

@ -8,7 +8,7 @@
<div class="row justify-content-center">
<div class="col-md-6 section-heading">
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Title"]</h3>
<hr class="primary">
</div>
</div>

View file

@ -24,7 +24,7 @@
<div class="col account-form">
<div class="modal-content border-0 p-3">
<div class="modal-header align-items-center border-0 py-2">
<h4 class="modal-title">Set Password</h4>
<h3 class="modal-title">Set Password</h3>
</div>
<div class="modal-body">
<form method="post" asp-action="SetPassword">

View file

@ -2,7 +2,7 @@
<div id="template-editor-app" v-cloak>
<div class="form-group">
<h4 class="mt-5 mb-4">@Model.title </h4>
<h3 class="mt-5 mb-4">@Model.title </h3>
@if (ViewContext.ViewData.ModelState.TryGetValue(Model.templateId, out var errors))
{
foreach (var error in errors.Errors)

View file

@ -115,7 +115,7 @@
<textarea asp-for="PerksTemplate" rows="10" cols="40" class="js-product-template form-control"></textarea>
<span asp-validation-for="PerksTemplate" class="text-danger"></span>
</div>
<h4 class="mt-5 mb-4">Contributions</h4>
<h3 class="mt-5 mb-4">Contributions</h3>
<div class="form-check mb-3">
<input asp-for="SortPerksByPopularity" type="checkbox" class="form-check-input" />
<label asp-for="SortPerksByPopularity" class="form-check-label"></label>
@ -136,7 +136,7 @@
<label asp-for="EnforceTargetAmount" class="form-check-label"></label>
<span asp-validation-for="EnforceTargetAmount" class="text-danger"></span>
</div>
<h4 class="mt-5 mb-4">Crowdfund Behavior</h4>
<h3 class="mt-5 mb-4">Crowdfund Behavior</h3>
<div class="form-group">
<label asp-for="NotificationUrl" class="form-label"></label>
<input asp-for="NotificationUrl" class="form-control" />
@ -147,7 +147,7 @@
<label asp-for="UseAllStoreInvoices" class="form-check-label"></label>
<span asp-validation-for="UseAllStoreInvoices" class="text-danger"></span>
</div>
<h4 class="mt-5 mb-4">Sound</h4>
<h3 class="mt-5 mb-4">Sound</h3>
<div class="form-group mb-3">
<div class="d-flex align-items-center mb-3">
<input asp-for="SoundsEnabled" type="checkbox" class="btcpay-toggle me-2" data-bs-toggle="collapse" data-bs-target="#SoundsEnabledSettings" aria-expanded="@Model.SoundsEnabled" aria-controls="SoundsEnabledSettings"/>
@ -162,7 +162,7 @@
<span asp-validation-for="Sounds" class="text-danger"></span>
</div>
</div>
<h4 class="mt-5 mb-4">Animation</h4>
<h3 class="mt-5 mb-4">Animation</h3>
<div class="form-group mb-3">
<div class="d-flex align-items-center mb-3">
<input asp-for="AnimationsEnabled" type="checkbox" class="btcpay-toggle me-2" data-bs-toggle="collapse" data-bs-target="#AnimationsEnabledSettings" aria-expanded="@Model.AnimationsEnabled" aria-controls="AnimationsEnabledSettings"/>
@ -177,7 +177,7 @@
<span asp-validation-for="AnimationColors" class="text-danger"></span>
</div>
</div>
<h4 class="mt-5 mb-4">Discussion</h4>
<h3 class="mt-5 mb-4">Discussion</h3>
<div class="form-group mb-3">
<div class="d-flex align-items-center mb-3">
<input asp-for="DisqusEnabled" type="checkbox" class="btcpay-toggle me-2" data-bs-toggle="collapse" data-bs-target="#DisqusEnabledSettings" aria-expanded="@Model.DisqusEnabled" aria-controls="DisqusEnabledSettings"/>
@ -193,7 +193,7 @@
</div>
</div>
<h4 class="mt-5 mb-2">Additional Options</h4>
<h3 class="mt-5 mb-2">Additional Options</h3>
<div class="form-group">
<div class="accordion" id="additional">
<div class="accordion-item">
@ -251,7 +251,7 @@
</div>
</form>
<h4 class="mt-5 mb-3">Other actions</h4>
<h3 class="mt-5 mb-4">Other Actions</h3>
<div id="danger-zone">
<a id="DeleteApp" class="btn btn-outline-danger mb-5" asp-action="DeleteApp" asp-route-appId="@Model.AppId" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-description="The app <strong>@Model.AppName</strong> and its settings will be permanently deleted." data-confirm-input="DELETE">Delete this app</a>
</div>

View file

@ -47,7 +47,7 @@
</div>
</div>
<div class="col-lg-6">
<h4 class="mt-5 mb-4">Appearance</h4>
<h3 class="mt-5 mb-4">Appearance</h3>
<div class="form-group">
<label asp-for="DefaultView" class="form-label" data-required></label>
<select asp-for="DefaultView" asp-items="@Html.GetEnumSelectList<PosViewType>()" class="form-select" required></select>
@ -67,7 +67,7 @@
<span asp-validation-for="RequiresRefundEmail" class="text-danger"></span>
</div>
<section id="discounts" class="p-0">
<h4 class="mt-5 mb-4">Discounts</h4>
<h3 class="mt-5 mb-4">Discounts</h3>
<div class="form-check mb-4">
<input asp-for="ShowDiscount" type="checkbox" class="form-check-input" />
<label asp-for="ShowDiscount" class="form-check-label"></label>
@ -78,7 +78,7 @@
</div>
</section>
<section id="custom-payments" class="p-0">
<h4 class="mt-5 mb-4">Custom Payments</h4>
<h3 class="mt-5 mb-4">Custom Payments</h3>
<div class="form-group mb-4 d-flex align-items-center">
<input asp-for="ShowCustomAmount" type="checkbox" class="btcpay-toggle me-2" data-bs-toggle="collapse" data-bs-target="#CustomAmountSettings" aria-expanded="@Model.ShowCustomAmount" aria-controls="CustomAmountSettings"/>
<label asp-for="ShowCustomAmount" class="form-label mb-0"></label>
@ -93,7 +93,7 @@
</div>
</section>
<section id="tips" class="p-0">
<h4 class="mt-5 mb-4">Tips</h4>
<h3 class="mt-5 mb-4">Tips</h3>
<div class="form-group mb-4 d-flex align-items-center">
<input asp-for="EnableTips" type="checkbox" class="btcpay-toggle me-2" data-bs-toggle="collapse" data-bs-target="#CustomTipsSettings" aria-expanded="@Model.EnableTips" aria-controls="CustomTipsSettings" />
<label asp-for="EnableTips" class="form-label mb-0"></label>
@ -114,7 +114,7 @@
</section>
</div>
<div class="col-lg-9">
<h4 class="mt-5 mb-2">Additional Options</h4>
<h3 class="mt-5 mb-2">Additional Options</h3>
<div class="form-group">
<div class="accordion" id="additional">
<div class="accordion-item">
@ -252,7 +252,7 @@
</div>
</form>
<h4 class="mt-5 mb-3">Other actions</h4>
<h3 class="mt-5 mb-4">Other Actions</h3>
<div id="danger-zone">
<a id="DeleteApp" class="btn btn-outline-danger mb-5" asp-action="DeleteApp" asp-route-appId="@Model.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-description="The app <strong>@Model.AppName</strong> and its settings will be permanently deleted." data-confirm-input="DELETE">Delete this app</a>
</div>

View file

@ -3,16 +3,19 @@
@{
ViewData.SetActivePage(ManageNavPages.APIKeys, "API Keys");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<div class="d-flex align-items-center justify-content-between mb-3">
<h3 class="mb-0">@ViewData["Title"]</h3>
<a class="btn btn-primary" asp-action="AddApiKey" id="AddApiKey">
<span class="fa fa-plus"></span>
Generate Key
</a>
</div>
<p>
The <a asp-controller="UIHome" asp-action="SwaggerDocs" target="_blank">BTCPay Server Greenfield API</a> offers programmatic access to your instance. You can manage your BTCPay
Server (e.g. stores, invoices, users) as well as automate workflows and integrations (see <a href="https://docs.btcpayserver.org/Development/GreenFieldExample/" rel="noreferrer noopener">use case examples</a>).
For that you need the API keys, which can be generated here. Find more information in the <a href="@Url.Action("SwaggerDocs", "UIHome")#section/Authentication" target="_blank" rel="noreferrer noopener">API authentication docs</a>.
</p>
<a class="btn btn-primary" asp-action="AddApiKey" id="AddApiKey">
<span class="fa fa-plus"></span>
Generate Key
</a>
@if (Model.ApiKeyDatas.Any())
{
<table class="table table-lg">

View file

@ -26,7 +26,7 @@
</script>
}
<h2 class="mb-3">@ViewData["Title"]</h2>
<h3 class="mb-3">@ViewData["Title"]</h3>
<p>Generate a new api key to use BTCPay through its API.</p>

View file

@ -21,7 +21,7 @@
<
<div class="row">
<div class="col-lg-12 section-heading">
<h2>Authorization Request</h2>
<h3>Authorization Request</h3>
<p class="my-3">@(Model.ApplicationName ?? "An application") is requesting access to your account.</p>
@if (Model.RedirectUrl != null)
{

View file

@ -2,7 +2,7 @@
@{
ViewData.SetActivePage(ManageNavPages.ChangePassword, "Change your password");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-6">
@if (!ViewContext.ModelState.IsValid)
@ -20,12 +20,12 @@
<input asp-for="NewPassword" class="form-control"/>
<span asp-validation-for="NewPassword" class="text-danger"></span>
</div>
<div class="form-group mb-4">
<div class="form-group">
<label asp-for="ConfirmPassword" class="form-label" data-required></label>
<input asp-for="ConfirmPassword" class="form-control"/>
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary" id="UpdatePassword">Update Password</button>
<button type="submit" class="btn btn-primary mt-2" id="UpdatePassword">Update Password</button>
</form>
</div>
</div>

View file

@ -15,7 +15,7 @@
<div class="modal-dialog modal-dialog-centered min-vh-100">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title w-100 text-center">@ViewData["Title"]</h4>
<h3 class="modal-title w-100 text-center">@ViewData["Title"]</h3>
</div>
<div class="modal-body text-center">

View file

@ -4,7 +4,8 @@
}
<div>
<p>To use an authenticator app go through the following steps:</p>
<h3>Enable Authenticator</h3>
<p class="my-3">To use an authenticator app go through the following steps:</p>
<ol class="list">
<li class="mb-5">
<div class="mb-2">Download a two-factor authenticator app like …</div>
@ -46,7 +47,7 @@
<input asp-for="Code" class="form-control" autocomplete="off" />
<span asp-validation-for="Code" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Verify</button>
<button type="submit" class="btn btn-primary mt-2">Verify</button>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</form>
</div>

View file

@ -2,7 +2,7 @@
@{
ViewData.SetActivePage(ManageNavPages.Index, "Update your account");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<form method="post">
@if (!ViewContext.ModelState.IsValid)
{
@ -35,7 +35,7 @@
</div>
</div>
<button type="submit" id="save" class="btn btn-primary">Save</button>
<h4 class="mt-5 mb-3">Delete Account</h4>
<h3 class="mt-5 mb-4">Delete Account</h3>
<div id="danger-zone">
<a id="delete-user" class="btn btn-outline-danger mb-5" data-confirm-input="DELETE" data-bs-toggle="modal" data-bs-target="#ConfirmModal" asp-action="DeleteUserPost" data-description="This action will also delete all stores, invoices, apps and data associated with the user.">Delete Account</a>
</div>

View file

@ -1,8 +1,8 @@
@model string
@{
ViewData.SetActivePage(ManageNavPages.LoginCodes, "Login codes");
ViewData.SetActivePage(ManageNavPages.LoginCodes, "Login Codes");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-3">@ViewData["Title"]</h3>
<p>Easily log into BTCPay Server on another device using a simple login code from an already authenticated device.</p>
<div class="d-inline-flex flex-column qr-container" style="width:256px">
<vc:qr-code data="@Model" />

View file

@ -4,7 +4,7 @@
@{
ViewData.SetActivePage(ManageNavPages.Notifications, "Notification Settings");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-3">@ViewData["Title"]</h3>
<form method="post" asp-action="NotificationSettings">
@if (Model.All)

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ManageNavPages.ChangePassword, "Set password");
}
<h4>Set your password</h4>
<h3>Set your password</h3>
<p class="text-info">
You do not have a local username/password for this site. Add a local

View file

@ -3,7 +3,7 @@
@{
ViewData.SetActivePage(ManageNavPages.TwoFactorAuthentication, "Two-Factor Authentication");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-3">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-10 col-xl-8">

View file

@ -1,6 +1,6 @@
@inject SignInManager<ApplicationUser> SignInManager
<nav id="SectionNav" class="nav">
<a id="SectionNav-@ManageNavPages.Index.ToString()" class="nav-link @ViewData.IsActivePage(ManageNavPages.Index)" asp-controller="UIManage" asp-action="Index">Profile</a>
<a id="SectionNav-@ManageNavPages.Index.ToString()" class="nav-link @ViewData.IsActivePage(ManageNavPages.Index)" asp-controller="UIManage" asp-action="Index">Account</a>
<a id="SectionNav-@ManageNavPages.ChangePassword.ToString()" class="nav-link @ViewData.IsActivePage(ManageNavPages.ChangePassword)" asp-controller="UIManage" asp-action="ChangePassword">Password</a>
<a id="SectionNav-@ManageNavPages.TwoFactorAuthentication.ToString()" class="nav-link @ViewData.IsActivePage(ManageNavPages.TwoFactorAuthentication)" asp-controller="UIManage" asp-action="TwoFactorAuthentication">Two-Factor Authentication</a>
<a id="SectionNav-@ManageNavPages.APIKeys.ToString()" class="nav-link @ViewData.IsActivePage(ManageNavPages.APIKeys)" asp-controller="UIManage" asp-action="APIKeys">API Keys</a>

View file

@ -38,7 +38,7 @@
{
<div class="form-group">
<form method="post">
<button type="submit" class="btn btn-primary">Show QR Code</button>
<button type="submit" class="btn btn-primary mt-2">Show QR Code</button>
</form>
</div>
}

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "BTCPay Server Configurator");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-6">

View file

@ -4,7 +4,7 @@
ViewData.SetActivePage(ServerNavPages.Services, $"Create temporary file link");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-6">
@ -28,7 +28,7 @@
<span asp-validation-for="TimeAmount" class="text-danger"></span>
<span asp-validation-for="TimeType" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary" name="command" value="Generate">Generate</button>
<button type="submit" class="btn btn-primary mt-2" name="command" value="Generate">Generate</button>
</form>
</div>
</div>

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Users, "Create account");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-6">

View file

@ -11,7 +11,7 @@
</script>
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-8">
@ -68,7 +68,7 @@
<input asp-for="Settings.Enabled" disabled type="checkbox" class="btcpay-toggle ms-2" />
</div>
}
<button name="command" class="btn btn-primary" type="submit" value="Save">Save</button>
<button name="command" class="btn btn-primary mt-2" type="submit" value="Save">Save</button>
</div>
</form>
</div>

View file

@ -6,16 +6,16 @@
<div class="row">
<div class="col-md-8">
<div class="d-sm-flex align-items-center justify-content-between mb-3">
<h2 class="mb-0">
<h3 class="mb-0">
@ViewData["Title"]
<small>
<a href="https://docs.btcpayserver.org/Apps/" target="_blank" rel="noreferrer noopener">
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
</a>
</small>
</h2>
</h3>
<form method="post" asp-action="DynamicDnsService">
<button id="AddDynamicDNS" class="btn btn-primary" type="submit"><span class="fa fa-plus"></span> Add service</button>
<button id="AddDynamicDNS" class="btn btn-primary mt-2" type="submit"><span class="fa fa-plus"></span> Add service</button>
</form>
</div>

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Amazon S3 Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-6">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Azure Blob Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-6">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, $"Local Filesystem Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<p>Any uploaded files are being saved on the same machine that hosts BTCPay; please pay attention to your storage space.</p>
<div class="row">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Google Cloud Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-6">

View file

@ -1,6 +1,6 @@
@model EmailsViewModel
@{
ViewData.SetActivePage(ServerNavPages.Emails);
ViewData.SetActivePage(ServerNavPages.Emails, "Email Server");
}
<partial name="EmailsBody" model="Model" />

View file

@ -3,15 +3,13 @@
ViewData.SetActivePage(ServerNavPages.Files, "File Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (!Model.StorageConfigured)
{
<p>
Before being able to upload you first need to
<a asp-action="storage" asp-route-forceChoice="true" asp-route-returnurl="@ViewData["ReturnUrl"]">
choose your file storage service provider
</a>.
<a asp-action="storage" asp-route-forceChoice="true" asp-route-returnurl="@ViewData["ReturnUrl"]">choose your file storage service provider</a>.
<a href="https://docs.btcpayserver.org/FAQ/ServerSettings/#how-to-upload-files-to-btcpay" target="_blank" rel="noreferrer noopener">
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
</a>

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Lightning charge service");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-8">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, Model.WalletName);
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (Model.ShowQR)
{

View file

@ -121,7 +121,7 @@
@if (Model.Installed.Any())
{
<h2 class="mb-4">Installed Plugins</h2>
<h3 class="mb-4">Installed Plugins</h3>
<div class="row mb-4">
@foreach (var plugin in Model.Installed)
{
@ -241,7 +241,7 @@
@if (availableAndNotInstalled.Any())
{
<h2 class="mb-4">Available Plugins</h2>
<h3 class="mb-4">Available Plugins</h3>
<div class="row mb-4">
@foreach (var plugin in availableAndNotInstalled)
{

View file

@ -23,6 +23,8 @@
var sortByAsc = "Sort by ascending...";
}
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="d-flex flex-wrap align-items-center justify-content-between mb-2">
<form asp-action="ListUsers" asp-route-sortOrder="@(userEmailSortOrder)">
<div class="input-group mb-2">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "LND Seed Backup");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (Model.IsWalletUnlockPresent)
{

View file

@ -5,7 +5,7 @@
<div class="row">
<div class="col-md-8">
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<p>
BTCPay exposes LND's @Model.ConnectionType service for outside consumption, you will find connection information here.
</p>

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Logs, "Logs");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<ul class="list-unstyled">
@foreach (var file in Model.LogFiles)

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Maintenance, "Maintenance");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<form method="post">
<div class="row mb-5">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, Model.WalletName);
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (Model.ShowQR)
{

View file

@ -6,7 +6,7 @@
ViewData.SetActivePage(ServerNavPages.Policies);
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (!ViewContext.ModelState.IsValid)
{

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, Model.WalletName);
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (Model.ShowQR)
{

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "SSH settings");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-8">
<div class="form-group">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Services");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="mb-5">
<h4 class="mb-3">Crypto services exposed by your server</h4>

View file

@ -4,7 +4,7 @@
ViewData.SetActivePage(ServerNavPages.Services, "Storage");
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
@if (Model.ShowChangeWarning)
{
@ -24,7 +24,7 @@
<label asp-for="Provider" class="form-label"></label>
<select asp-for="Provider" asp-items="@Model.ProvidersList" class="form-select"></select>
</div>
<button type="submit" class="btn btn-primary" name="command" value="Save">Next</button>
<button type="submit" class="btn btn-primary mt-2" name="command" value="Save">Next</button>
</form>
</div>
</div>

View file

@ -7,7 +7,7 @@
<partial name="_ValidationScriptsPartial" />
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-lg-6">

View file

@ -3,7 +3,7 @@
ViewData.SetActivePage(ServerNavPages.Users, Model.Email);
}
<h2 class="mb-4">@ViewData["Title"]</h2>
<h3 class="mb-4">@ViewData["Title"]</h3>
<div class="row">
<div class="col-md-8">

View file

@ -3,7 +3,7 @@
<nav id="SectionNav" class="nav">
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Users" class="nav-link @ViewData.IsActivePage(ServerNavPages.Users)" asp-action="ListUsers">Users</a>
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Emails" class="nav-link @ViewData.IsActivePage(ServerNavPages.Emails)" asp-action="Emails">Email Server</a>
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Emails" class="nav-link @ViewData.IsActivePage(ServerNavPages.Emails)" asp-action="Emails">Email</a>
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Policies" class="nav-link @ViewData.IsActivePage(ServerNavPages.Policies)" asp-action="Policies">Policies</a>
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Services" class="nav-link @ViewData.IsActivePage(ServerNavPages.Services)" asp-action="Services">Services</a>
<a asp-controller="UIServer" id="SectionNav-@ServerNavPages.Theme" class="nav-link @ViewData.IsActivePage(ServerNavPages.Theme)" asp-action="Theme">Theme</a>

View file

@ -28,7 +28,7 @@
<input class="form-control" id="exampleUrl" name="exampleUrl">
</div>
<button name="command" type="submit" class="btn btn-primary" value="ShopifySaveCredentials">Connect to Shopify</button>
<button name="command" type="submit" class="btn btn-primary mt-3" value="ShopifySaveCredentials">Connect to Shopify</button>
}
else
{
@ -77,7 +77,7 @@
Started: @Model.IntegratedAt.Value.ToBrowserDate()
</p>
<button name="command" type="submit" class="btn btn-danger" value="ShopifyClearCredentials">
<button name="command" type="submit" class="btn btn-danger mt-3" value="ShopifyClearCredentials">
Stop Shopify calls and clear credentials
</button>
}

View file

@ -12,7 +12,7 @@
{
<div asp-validation-summary="All" class="text-danger"></div>
}
<h4 class="mb-3">Invoice Settings</h4>
<h3 class="mb-3">Invoice Settings</h3>
@if (Model.PaymentMethods.Any())
{
<div class="form-group mb-4">
@ -27,7 +27,7 @@
var criteria = Model.PaymentMethodCriteria[index];
<tr>
<td class="border-0 ps-0 align-middle">
<input type="hidden" asp-for="PaymentMethodCriteria[index].PaymentMethod"/>
<input type="hidden" asp-for="PaymentMethodCriteria[index].PaymentMethod" />
@PaymentMethodId.Parse(criteria.PaymentMethod).ToPrettyString()
</td>
<td class="border-0">
@ -36,7 +36,7 @@
</select>
</td>
<td class="border-0">
<input placeholder="6.15 USD" asp-for="PaymentMethodCriteria[index].Value" class="form-control my-0" style="max-width: 20ch;"/>
<input placeholder="6.15 USD" asp-for="PaymentMethodCriteria[index].Value" class="form-control my-0" style="max-width: 20ch;" />
</td>
</tr>
}
@ -44,7 +44,7 @@
</div>
}
<div class="form-check my-1">
<input asp-for="RequiresRefundEmail" type="checkbox" class="form-check-input"/>
<input asp-for="RequiresRefundEmail" type="checkbox" class="form-check-input" />
<label asp-for="RequiresRefundEmail" class="form-check-label"></label>
</div>
<div class="form-check my-1">
@ -56,10 +56,11 @@
<label asp-for="RedirectAutomatically" class="form-check-label"></label>
</div>
<h4 class="mt-5 mb-3">Appearance</h4>
<h3 class="mt-5 mb-3">Language</h3>
<div class="form-group">
<div class="form-check">
<input asp-for="AutoDetectLanguage" type="checkbox" class="form-check-input"/>
<input asp-for="AutoDetectLanguage" type="checkbox" class="form-check-input" />
<label asp-for="AutoDetectLanguage" class="form-check-label"></label>
<p class="form-text text-muted">Detects the language of the customer's browser with 99.9% accuracy.</p>
</div>
@ -68,9 +69,11 @@
<label asp-for="DefaultLang" class="form-label"></label>
<select asp-for="DefaultLang" asp-items="Model.Languages" class="form-select w-auto"></select>
</div>
<h3 class="mt-5 mb-3">Appearance</h3>
<div class="form-group">
<label asp-for="HtmlTitle" class="form-label"></label>
<input asp-for="HtmlTitle" class="form-control"/>
<input asp-for="HtmlTitle" class="form-control" />
<span asp-validation-for="HtmlTitle" class="text-danger"></span>
</div>
<div class="form-group">
@ -78,7 +81,7 @@
<a href="https://docs.btcpayserver.org/Development/Theme/#checkout-page-themes" target="_blank" rel="noreferrer noopener">
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
</a>
<input asp-for="CustomLogo" class="form-control"/>
<input asp-for="CustomLogo" class="form-control" />
<span asp-validation-for="CustomLogo" class="text-danger"></span>
</div>
<div class="form-group">
@ -86,7 +89,7 @@
<a href="https://docs.btcpayserver.org/Development/Theme/#checkout-page-themes" target="_blank" rel="noreferrer noopener">
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
</a>
<input asp-for="CustomCSS" class="form-control"/>
<input asp-for="CustomCSS" class="form-control" />
<span asp-validation-for="CustomCSS" class="text-danger"></span>
<p class="form-text text-muted">
Bundled Themes:

View file

@ -1,7 +1,7 @@
@model BTCPayServer.Models.ServerViewModels.EmailsViewModel
@model BTCPayServer.Models.ServerViewModels.EmailsViewModel
@{
Layout = "../Shared/_NavLayout.cshtml";
ViewData.SetActivePage(StoreNavPages.GeneralSettings, "Email Settings", Context.GetStoreData().Id);
ViewData.SetActivePage(StoreNavPages.General, "Email Server", Context.GetStoreData().Id);
}
<partial name="EmailsBody" model="Model" />

View file

@ -1,7 +1,7 @@
@model GeneralSettingsViewModel
@{
Layout = "../Shared/_NavLayout.cshtml";
ViewData.SetActivePage(StoreNavPages.GeneralSettings, "General Settings", Context.GetStoreData().Id);
ViewData.SetActivePage(StoreNavPages.General, "General", Context.GetStoreData().Id);
}
<div class="row">
@ -11,7 +11,7 @@
<div asp-validation-summary="All" class="text-danger"></div>
}
<form method="post">
<h4 class="mb-3">General</h4>
<h3 class="mb-3">General</h3>
<div class="form-group">
<label asp-for="Id" class="form-label"></label>
<input asp-for="Id" readonly class="form-control" />
@ -27,10 +27,9 @@
<span asp-validation-for="StoreWebsite" class="text-danger"></span>
</div>
<button name="command" type="submit" class="btn btn-primary" value="Save" id="Save">Save Store Settings</button>
<button name="command" type="submit" class="btn btn-primary mt-2" value="Save" id="Save">Save</button>
</form>
<h4 class="mt-5 mb-3">Services</h4>
<h3 class="mt-5 mb-3">Services</h3>
<div class="table-responsive-md">
<table class="table table-hover mt-1 mb-5">
<thead>
@ -53,12 +52,11 @@
</tbody>
</table>
</div>
@if (Model.CanDelete)
{
<h4 class="mt-5 mb-3">Other actions</h4>
<h3 class="mt-5 mb-3">Additional Actions</h3>
<div id="danger-zone">
<a id="DeleteStore" class="btn btn-outline-danger mb-5" asp-action="DeleteStore" asp-route-storeId="@Model.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-description="The store <strong>@Model.StoreName</strong> will be permanently deleted. This action will also delete all invoices, apps and data associated with the store." data-confirm-input="DELETE">Delete this store</a>
<a id="DeleteStore" class="btn btn-outline-danger mb-5 mt-2" asp-action="DeleteStore" asp-route-storeId="@Model.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-description="The store <strong>@Model.StoreName</strong> will be permanently deleted. This action will also delete all invoices, apps and data associated with the store." data-confirm-input="DELETE">Delete this store</a>
</div>
}
</div>

View file

@ -6,6 +6,7 @@
<div class="row">
<div class="col-lg-8">
<h3 class="mb-0 mb-4">@ViewData["Title"]</h3>
@if (!ViewContext.ModelState.IsValid)
{
<div asp-validation-summary="All" class="text-danger"></div>
@ -15,7 +16,7 @@
<vc:ui-extension-point location="store-integrations-list" model="@Model" />
</ul>
<h4 class="mt-5 mb-3">Other Integrations</h4>
<h3 class="mt-5 mb-3">Other Integrations</h3>
<p>Take a look at documentation for the list of other integrations we support and the directions on how to enable them:</p>
<ul>
<li><a href="https://docs.btcpayserver.org/WooCommerce/" target="_blank" rel="noreferrer noopener">WooCommerce</a></li>

View file

@ -15,7 +15,7 @@
<div class="row">
<div class="col-lg-8">
<form method="post">
<h4 class="mb-3">@ViewData["Title"]</h4>
<h3 class="mb-3">@ViewData["Title"]</h3>
<div class="form-group">
<label asp-for="PayloadUrl" class="form-label">Payload URL</label>
<input asp-for="PayloadUrl" class="form-control" />
@ -41,7 +41,7 @@
<input asp-for="Active" type="checkbox" class="btcpay-toggle ms-2" />
</div>
<h4 class="mb-3">Events</h4>
<h3 class="mb-3">Events</h3>
<label asp-for="Everything" class="form-label">Which events would you like to trigger this webhook?</label>
<select asp-for="Everything" class="form-select w-auto mb-3">
<option value="true">Send me everything</option>
@ -69,11 +69,11 @@
</div>
@if (Model.IsNew)
{
<button name="add" type="submit" class="btn btn-primary mb-5" value="New" id="New">Add webhook</button>
<button name="add" type="submit" class="btn btn-primary mb-5 mt-2" value="New" id="New">Add webhook</button>
}
else
{
<button name="update" type="submit" class="btn btn-primary mb-5" value="Save" id="Save">Update webhook</button>
<button name="update" type="submit" class="btn btn-primary mb-5 mt-2" value="Save" id="Save">Update webhook</button>
}
</form>
@if (!Model.IsNew && Model.Deliveries.Count > 0)

View file

@ -13,7 +13,7 @@
<div asp-validation-summary="All" class="text-danger"></div>
}
<div class="mb-5">
<h4 class="mb-3">Wallet</h4>
<h3 class="mb-3">Wallet</h3>
@if (Model.HintWallet)
{
<p>Set up your wallet to receive payments at your store.</p>
@ -105,7 +105,7 @@
</div>
<div class="mb-5">
<h4 class="mb-3">Lightning</h4>
<h3 class="mb-3">Lightning</h3>
@if (Model.HintLightning)
{
<p>A connection to a Lightning node is required to receive Lightning payments.</p>
@ -184,7 +184,7 @@
</div>
<form method="post">
<h4 class="mb-3">Payment</h4>
<h3 class="mb-3">Payment</h3>
<div class="form-group">
<label asp-for="DefaultCurrency" class="form-label"></label>
<input asp-for="DefaultCurrency" class="form-control" style="max-width:10ch;" />
@ -231,7 +231,7 @@
<span asp-validation-for="PaymentTolerance" class="text-danger"></span>
</div>
<button name="command" type="submit" class="btn btn-primary px-4" value="Save" id="Save">Save</button>
<button name="command" type="submit" class="btn btn-primary px-4 mt-3" value="Save" id="Save">Save</button>
</form>
</div>
</div>

View file

@ -6,7 +6,7 @@
<div class="row">
<div class="col-lg-8">
<h4 class="mb-3">@ViewData["Title"]</h4>
<h3 class="mb-3">@ViewData["Title"]</h3>
@if (!ViewContext.ModelState.IsValid)
{
<div asp-validation-summary="All" class="text-danger"></div>
@ -175,7 +175,7 @@
</div>
<span asp-validation-for="Spread" class="text-danger"></span>
</div>
<h4 class="mt-5 mb-3">Testing</h4>
<h3 class="mt-5 mb-3">Testing</h3>
<div class="form-group">
<label asp-for="ScriptTest" class="form-label">Currency pairs to test against your rule (e.g. <code>DOGE_USD,DOGE_CAD,BTC_CAD,BTC_USD</code>)</label>
@ -184,16 +184,15 @@
<button name="command" value="Test" type="submit" class="btn btn-secondary ms-3" title="Test">Test</button>
</div>
<span asp-validation-for="ScriptTest" class="text-danger"></span>
</div>
</div>
<h4 class="mt-5 mb-3">Default Currency Pairs</h4>
<h3 class="mt-5 mb-3">Default Currency Pairs</h3>
<div class="form-group">
<label asp-for="DefaultCurrencyPairs" class="form-label">Query pairs via REST by querying <a asp-controller="BitpayRate" asp-action="GetRates2" asp-route-storeId="@Model.StoreId" target="_blank">this link</a> without the need to specify currencyPairs.</label>
<input asp-for="DefaultCurrencyPairs" class="form-control" placeholder="BTC_USD, BTC_CAD" />
<span asp-validation-for="DefaultCurrencyPairs" class="text-danger"></span>
</div>
<button name="command" type="submit" class="btn btn-primary mt-3" value="Save">Save</button>
<button name="command" type="submit" class="btn btn-primary mt-2" value="Save">Save</button>
</form>
</div>
</div>

View file

@ -2,6 +2,6 @@ namespace BTCPayServer.Views.Stores
{
public enum StoreNavPages
{
Index, Create, Dashboard, Rates, PaymentMethods, OnchainSettings, LightningSettings, CheckoutAppearance, GeneralSettings, Tokens, Users, PayButton, Integrations, Webhooks, PullPayments, Payouts
Create, Dashboard, Rates, PaymentMethods, OnchainSettings, LightningSettings, CheckoutAppearance, General, Tokens, Users, PayButton, Integrations, Webhooks, PullPayments, Payouts
}
}

View file

@ -8,8 +8,7 @@
<div class="row">
<div class="col-lg-8">
<form method="post">
<h4 class="mb-3">@ViewData["Title"]</h4>
<h3 class="mb-3">@ViewData["Title"]</h3>
<div class="form-group">
<label for="Type" class="form-label">Event type</label>
<select
@ -19,8 +18,7 @@
class="form-select w-auto"
></select>
</div>
<button type="submit" class="btn btn-primary">Send test webhook</button>
<button type="submit" class="btn btn-primary mt-3">Send test webhook</button>
</form>
</div>
</div>

View file

@ -3,70 +3,70 @@
Layout = "../Shared/_NavLayout.cshtml";
ViewData.SetActivePage(StoreNavPages.Webhooks, "Webhooks", Context.GetStoreData().Id);
}
<div class="row">
<div class="col-lg-8">
<div class="d-flex align-items-center justify-content-between mb-3">
<h3 class="mb-0">@ViewData["Title"]</h3>
<a id="CreateWebhook" asp-action="NewWebhook" class="btn btn-primary" role="button" asp-route-storeId="@Context.GetRouteValue("storeId")">
<span class="fa fa-plus"></span>
Create Webhook
</a>
</div>
<p>Webhooks allow BTCPay Server to send HTTP events related to your store to another server.</p>
<div class="d-flex align-items-center justify-content-between mb-3">
<h4 class="mb-0">@ViewData["Title"]</h4>
<a id="CreateWebhook" asp-action="NewWebhook" class="btn btn-primary" role="button" asp-route-storeId="@Context.GetRouteValue("storeId")">
<span class="fa fa-plus"></span>
Create Webhook
</a>
</div>
<p>Webhooks allow BTCPay Server to send HTTP events related to your store to another server.</p>
@if (Model.Webhooks.Any())
{
<table class="table table-hover table-responsive-md">
<thead>
<tr>
<th>Status</th>
<th>Url</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
@foreach (var wh in Model.Webhooks)
@if (Model.Webhooks.Any())
{
<tr>
<td class="align-baseline">
@if (wh.LastDeliverySuccessful)
<table class="table table-hover table-responsive-md">
<thead>
<tr>
<th>Status</th>
<th>Url</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
@foreach (var wh in Model.Webhooks)
{
<span
class="fa fa-check text-success"
id="delivery-status-icon"
data-bs-toggle="tooltip"
title="@(wh.LastDeliveryTimeStamp == null ? "No deliveries for this webhook yet" : "Last delivery " + @wh.LastDeliveryTimeStamp?.ToTimeAgo())"></span>
<tr>
<td class="align-baseline">
@if (wh.LastDeliverySuccessful)
{
<span class="fa fa-check text-success"
id="delivery-status-icon"
data-bs-toggle="tooltip"
title="@(wh.LastDeliveryTimeStamp == null ? "No deliveries for this webhook yet" : "Last delivery " + @wh.LastDeliveryTimeStamp?.ToTimeAgo())"></span>
}
else
{
<span class="fa fa-times text-danger"
id="delivery-status-icon"
data-bs-toggle="tooltip"
data-bs-html="true"
title="Error: @wh.LastDeliveryErrorMessage. <br/> Delivery last attempted <span id='last-delivery-time'>@wh.LastDeliveryTimeStamp?.ToTimeAgo()</span>"></span>
}
</td>
<td class="d-block text-break">@wh.Url</td>
<td class="text-end text-md-nowrap">
<a asp-action="TestWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id">Test</a> -
<a asp-action="ModifyWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id">Modify</a> -
<a asp-action="DeleteWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-confirm-input="DELETE">Delete</a>
</td>
</tr>
}
else
{
<span
class="fa fa-times text-danger"
id="delivery-status-icon"
data-bs-toggle="tooltip"
data-bs-html="true"
title="Error: @wh.LastDeliveryErrorMessage. <br/> Delivery last attempted <span id='last-delivery-time'>@wh.LastDeliveryTimeStamp?.ToTimeAgo()</span>"></span>
}
</td>
<td class="d-block text-break">@wh.Url</td>
<td class="text-end text-md-nowrap">
<a asp-action="TestWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id">Test</a> -
<a asp-action="ModifyWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id">Modify</a> -
<a asp-action="DeleteWebhook" asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-webhookId="@wh.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-confirm-input="DELETE">Delete</a>
</td>
</tr>
</tbody>
</table>
<partial name="_Confirm" model="@(new ConfirmModel("Delete Webhook", "This webhook will be removed from this store.", "Delete"))" />
}
</tbody>
</table>
<partial name="_Confirm" model="@(new ConfirmModel("Delete webhook", "This webhook will be removed from this store.", "Delete"))" />
}
else
{
<p class="text-secondary mt-3">
There are no webhooks yet.
</p>
}
else
{
<p class="text-secondary mt-3">
There are no webhooks yet.
</p>
}
</div>
</div>
@section PageFootContent {
<partial name="_ValidationScriptsPartial" />
}

View file

@ -1,9 +1,9 @@
@using BTCPayServer.Client
<nav id="SectionNav" class="nav">
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.General))" class="nav-link @ViewData.IsActivePage(StoreNavPages.General)" asp-controller="UIStores" asp-action="GeneralSettings" asp-route-storeId="@Context.GetRouteValue("storeId")">General</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.PaymentMethods))" class="nav-link @ViewData.IsActivePage(StoreNavPages.PaymentMethods)" asp-controller="UIStores" asp-action="PaymentMethods" asp-route-storeId="@Context.GetRouteValue("storeId")">Payment Methods</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.Rates))" class="nav-link @ViewData.IsActivePage(StoreNavPages.Rates)" asp-controller="UIStores" asp-action="Rates" asp-route-storeId="@Context.GetRouteValue("storeId")">Rates</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.CheckoutAppearance))" class="nav-link @ViewData.IsActivePage(StoreNavPages.CheckoutAppearance)" asp-controller="UIStores" asp-action="CheckoutAppearance" asp-route-storeId="@Context.GetRouteValue("storeId")">Checkout Appearance</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.GeneralSettings))" class="nav-link @ViewData.IsActivePage(StoreNavPages.GeneralSettings)" asp-controller="UIStores" asp-action="GeneralSettings" asp-route-storeId="@Context.GetRouteValue("storeId")">General Settings</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.Tokens))" class="nav-link @ViewData.IsActivePage(StoreNavPages.Tokens)" asp-controller="UIStores" asp-action="ListTokens" asp-route-storeId="@Context.GetRouteValue("storeId")">Access Tokens</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.Users))" class="nav-link @ViewData.IsActivePage(StoreNavPages.Users)" asp-controller="UIStores" asp-action="StoreUsers" asp-route-storeId="@Context.GetRouteValue("storeId")">Users</a>
<a permission="@Policies.CanModifyStoreSettings" id="SectionNav-@(nameof(StoreNavPages.Integrations))" class="nav-link @ViewData.IsActivePage(StoreNavPages.Integrations)" asp-controller="UIStores" asp-action="Integrations" asp-route-storeId="@Context.GetRouteValue("storeId")">Integrations</a>