diff --git a/BTCPayServer.Tests/SeleniumTests.cs b/BTCPayServer.Tests/SeleniumTests.cs index 7fb42e173..5cf19d7e4 100644 --- a/BTCPayServer.Tests/SeleniumTests.cs +++ b/BTCPayServer.Tests/SeleniumTests.cs @@ -301,11 +301,12 @@ namespace BTCPayServer.Tests await s.StartAsync(); var alice = s.RegisterNewUser(); var storeData = s.CreateNewStore(); + var onchainHint = "A store requires a wallet to receive payments. Set up your wallet."; + var offchainHint = "A connection to a Lightning node is required to receive Lightning payments."; + // verify that hints are displayed on the store page - Assert.True(s.Driver.PageSource.Contains("Wallet not setup for the store, please provide Derviation Scheme"), - "Wallet hint not present"); - Assert.True(s.Driver.PageSource.Contains("Review settings if you want to receive Lightning payments"), - "Lightning hint not present"); + Assert.True(s.Driver.PageSource.Contains(onchainHint), "Wallet hint not present"); + Assert.True(s.Driver.PageSource.Contains(offchainHint), "Lightning hint not present"); s.GoToStores(); Assert.True(s.Driver.PageSource.Contains("warninghint_" + storeData.storeId), @@ -314,7 +315,7 @@ namespace BTCPayServer.Tests s.GoToStore(storeData.storeId); s.AddDerivationScheme(); // wallet hint should be dismissed s.Driver.AssertNoError(); - Assert.False(s.Driver.PageSource.Contains("Wallet not setup for the store, please provide Derviation Scheme"), + Assert.False(s.Driver.PageSource.Contains(onchainHint), "Wallet hint not dismissed on derivation scheme add"); s.Driver.FindElement(By.Id("dismissLightningHint")).Click(); // dismiss lightning hint @@ -380,8 +381,7 @@ namespace BTCPayServer.Tests s.Driver.FindElement(By.Id("Stores")).Click(); // there shouldn't be any hints now - Assert.False(s.Driver.PageSource.Contains("Review settings if you want to receive Lightning payments"), - "Lightning hint should be dismissed at this point"); + Assert.False(s.Driver.PageSource.Contains(offchainHint), "Lightning hint should be dismissed at this point"); s.Driver.FindElement(By.LinkText("Remove")).Click(); s.Driver.FindElement(By.Id("continue")).Click(); diff --git a/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs b/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs index ebe87c67f..93d2d1a5c 100644 --- a/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs @@ -30,6 +30,7 @@ namespace BTCPayServer.Models.StoreViewModels } public bool CanDelete { get; set; } + [Display(Name = "Store ID")] public string Id { get; set; } [Display(Name = "Store Name")] [Required] diff --git a/BTCPayServer/Views/Stores/AddDerivationScheme.cshtml b/BTCPayServer/Views/Stores/AddDerivationScheme.cshtml index 6b1b0943d..2c847a420 100644 --- a/BTCPayServer/Views/Stores/AddDerivationScheme.cshtml +++ b/BTCPayServer/Views/Stores/AddDerivationScheme.cshtml @@ -73,10 +73,12 @@
-
Derivation scheme
+
+ Derivation scheme + +

- The derivation scheme represents the destination of the funds received by your invoice. - It is generated by your wallet software. + A derivation scheme facilitates generation of the destination addresses for your invoices so funds can be received on-chain.

diff --git a/BTCPayServer/Views/Stores/UpdateStore.cshtml b/BTCPayServer/Views/Stores/UpdateStore.cshtml index cc160cfab..2dd9ff0d0 100644 --- a/BTCPayServer/Views/Stores/UpdateStore.cshtml +++ b/BTCPayServer/Views/Stores/UpdateStore.cshtml @@ -1,4 +1,4 @@ -@using System.Text.RegularExpressions +@using System.Text.RegularExpressions @model StoreViewModel @{ Layout = "../Shared/_NavLayout.cshtml"; @@ -10,268 +10,277 @@ @if (!ViewContext.ModelState.IsValid) {
-
+
}
-
-
-

Wallet On-chain payments

+
+
+

+ Wallet + On-chain payments +

@if (Model.HintWallet) { -

- - Wallet not setup for the store, please provide Derviation Scheme - -

+
} -

- The Derivation Scheme - facilitates generation of the destination addresses for your invoices so funds can be received on-chain. -

-

- Until wallet is defined, no invoices can be created for this store. - Optionally, you can have a store that only receives Lightning payments, see the next section for more details. -

- - - - - - - - - - - - @foreach (var scheme in Model.DerivationSchemes.OrderBy(scheme => scheme.Collapsed)) - { - - - - - - - } + + @(scheme.Enabled ? "Modify" : "Setup") + + + + + } + + @if (Model.DerivationSchemes.Any(scheme => scheme.Collapsed)) + { + + + } + - @if (Model.DerivationSchemes.Any(scheme => scheme.Collapsed)) - { - - - - } - -
CryptoDerivation SchemeEnabledActions
@scheme.Crypto - @if (string.IsNullOrEmpty(scheme.Value)) +
    + @foreach (var scheme in Model.DerivationSchemes.OrderBy(scheme => scheme.Collapsed)) + { +
  • +
    + + @scheme.Crypto + @if (!string.IsNullOrWhiteSpace(scheme.Value)) { - Not set + | + + + @scheme.Value + + + @if (scheme.Value.Length > 20) + { + var match = Regex.Match(scheme.Value, @"((?:-\[(?:[^\]])+\])+|\S{6})$"); + @match.Value; + } + + + @if (scheme.WalletSupported) + { + | + Wallet + } } - else - { - - @scheme.Value - - - @if (scheme.Value.Length > 20) - { - var match = Regex.Match(scheme.Value, @"((?:-\[(?:[^\]])+\])+|\S{6})$"); - @match.Value; - } - - } -
+ + @if (scheme.Enabled) { - + + + Enabled + } else { - + + + Disabled + } - - @if (!string.IsNullOrWhiteSpace(scheme.Value) && scheme.WalletSupported) - { - Wallet - - } - Modify -
- -

Lightning Off-chain payments

+
+

+ Lightning + Off-chain payments +

@if (Model.HintLightning) { -

- - Review settings if you want to receive Lightning payments - -

+
} -

- A connection to a Lightning Node is required to generate Lightning Network enabled invoices. -

- - - - - - - - - - - - @foreach (var scheme in Model.LightningNodes) - { - - - - - - + + @(scheme.Enabled ? "Modify" : "Setup") + + + + + } + + + + +

General

+
+ + +
+
+ + + +
+
+ + + +
+ +

Payment

+
+
+ + + +
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + +
+
+ +
+ minutes +
+
+ +
+
+
+ + +
+
+ +
+ minutes +
+
+ +
+
+
+ + +
+
+ +
+ percent +
+
+ +
+
+
+ + + + +
+ + + + +
+
+ + + +

+ Available placeholders: + {StoreName} {ItemDescription} {OrderId} +

+
- -
- - - -

- Available placeholders: - {StoreName} {ItemDescription} {OrderId} -

-
+ + -

Store settings

-
- - -
-
- - - -
-
- - - -
- -
-
- - - -
-
-
-
- - - - -
-
-
- - - -
-
-
- - -
-
- -
- minutes -
-
- -
-
-
- - -
-
- -
- minutes -
-
- -
-
-
- - -
-
- -
- percent -
-
- -
-
-
- - - - -
- - - - - -
- - -

Additional Payment methods

-
CryptoAddressEnabledActions
@scheme.CryptoCode@scheme.Address +
    + @foreach (var scheme in Model.LightningNodes) + { +
  • +
    + + @scheme.CryptoCode + @if (!string.IsNullOrWhiteSpace(scheme.Address)) + { + | + @scheme.Address + } + + @if (scheme.Enabled) { - + + + Enabled + } else { - + + + Disabled + } -
Modify
+

Additional payment methods

+
+
- - + + @@ -289,52 +298,54 @@ } - + }
ProviderEnabledActionsEnabledActions
Modify + + @(scheme.Enabled ? "Modify" : "Setup") + +
+
-

Services

- +

Services

+
+
- - - - + + + + - - - - + + + +
ServiceActions
ServiceActions
- Email - Modify
+ Email + + + Setup + +
- - @if (Model.CanDelete) - { -

Other actions

-

Click here to see more actions

- - }
+ + @if (Model.CanDelete) + { +

Other actions

+ + + }
@section Scripts { @await Html.PartialAsync("_ValidationScriptsPartial") - - } diff --git a/BTCPayServer/wwwroot/main/bootstrap/bootstrap.css b/BTCPayServer/wwwroot/main/bootstrap/bootstrap.css index 78b941c4f..adeb6a4ae 100644 --- a/BTCPayServer/wwwroot/main/bootstrap/bootstrap.css +++ b/BTCPayServer/wwwroot/main/bootstrap/bootstrap.css @@ -3769,11 +3769,10 @@ input[type="button"].btn-block { font-size: 1.5rem; font-weight: 700; line-height: 1; - color: var(--btcpay-color-dark-accent); + color: inherit; text-shadow: 0 1px 0 var(--btcpay-color-white); opacity: .5; } .close:hover { - color: var(--btcpay-color-dark-accent); text-decoration: none; } .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { opacity: .75; } diff --git a/BTCPayServer/wwwroot/main/site.css b/BTCPayServer/wwwroot/main/site.css index 91e0d36ac..0655b58e0 100644 --- a/BTCPayServer/wwwroot/main/site.css +++ b/BTCPayServer/wwwroot/main/site.css @@ -3,6 +3,8 @@ html { position: relative; min-height: 100%; font-size: var(--btcpay-font-size-base); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } .logo { @@ -189,7 +191,7 @@ pre { cursor: pointer; } -.list-group-item a { +.list-group-item a:not(.btn) { color: inherit; } @@ -318,3 +320,32 @@ html[data-devenv]:before { .note-editor .table.table-sm td { border: 1px dotted var(--btcpay-color-neutral-400); } + +/* Custom */ +.btcpay-status { + display: inline-flex; + align-items: center; + justify-content: center; + border: .25em solid transparent; + border-radius: 50%; + width: 19px; + height: 19px; +} +.btcpay-status:before { + content: ''; + border-radius: 50%; + width: 9px; + height: 9px; +} +.btcpay-status--enabled { + background-color: rgba(0, 182, 52, .3); +} +.btcpay-status--enabled:before { + background-color: #00B634; +} +.btcpay-status--disabled { + background-color: rgba(251, 56, 61, .3); +} +.btcpay-status--disabled:before { + background-color: #FB383D; +}