mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-02-22 22:25:28 +01:00
* Store Selector: Create first store button * Add setup guide to homepage * Policy update for stores list * Fix test * Initial create store button as primary * Add notifications list to homepage * Remove back to list from store create view * Adapt content padding on desktop * Add store home view with setup guide * Fix active page nav highlighting * Test fix * Remove What's Next section * Rename Store Home to Dashboard * Fix Lightning setup link * Add tests for store setup guide * Update BTCPayServer/Views/Home/Home.cshtml Co-authored-by: Pavlenex <pavle@pavle.org> * Update BTCPayServer/Views/Stores/Dashboard.cshtml Co-authored-by: Pavlenex <pavle@pavle.org> * Remove setup guide on global homepage * Remove Shopify setup link from nav * Fix content container max-width on desktop Co-authored-by: Pavlenex <pavle@pavle.org>
269 lines
18 KiB
Text
269 lines
18 KiB
Text
@using BTCPayServer.Views.Server
|
|
@using BTCPayServer.Views.Stores
|
|
@using BTCPayServer.Views.Apps
|
|
@using BTCPayServer.Views.Invoice
|
|
@using BTCPayServer.Views.Manage
|
|
@using BTCPayServer.Views.PaymentRequest
|
|
@using BTCPayServer.Views.Wallets
|
|
@using BTCPayServer.Abstractions.Extensions
|
|
@using BTCPayServer.Abstractions.Contracts
|
|
@using BTCPayServer.Client
|
|
@inject BTCPayServer.Services.BTCPayServerEnvironment Env
|
|
@inject SignInManager<ApplicationUser> SignInManager
|
|
@inject ISettingsRepository SettingsRepository
|
|
|
|
@model BTCPayServer.Components.MainNav.MainNavViewModel
|
|
@addTagHelper *, BundlerMinifier.TagHelpers
|
|
|
|
@{
|
|
var theme = await SettingsRepository.GetTheme();
|
|
}
|
|
|
|
<nav id="mainNav" class="d-flex flex-column justify-content-between">
|
|
<div class="accordion px-3 px-lg-4">
|
|
@if (SignInManager.IsSignedIn(User))
|
|
{
|
|
@if (Model.Store != null)
|
|
{
|
|
<div class="accordion-item" permission="@Policies.CanModifyStoreSettings">
|
|
<div class="accordion-body">
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Stores" asp-action="Dashboard" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActivePage(StoreNavPages.Dashboard)" id="StoreNav-Dashboard">
|
|
<vc:icon symbol="home"/>
|
|
<span>Dashboard</span>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Stores" 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">
|
|
<vc:icon symbol="settings"/>
|
|
<span>Settings</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="accordion-item" permission="@Policies.CanModifyStoreSettings">
|
|
<header class="accordion-header" id="Nav-Wallets-Header">
|
|
<div class="accordion-button">
|
|
Wallets
|
|
</div>
|
|
</header>
|
|
<div id="Nav-Wallets" class="accordion-collapse" aria-labelledby="Nav-Wallets-Header">
|
|
<div class="accordion-body">
|
|
<ul class="navbar-nav">
|
|
@foreach (var scheme in Model.DerivationSchemes.OrderBy(scheme => scheme.Collapsed))
|
|
{
|
|
var isSetUp = !string.IsNullOrWhiteSpace(scheme.Value);
|
|
<li class="nav-item">
|
|
@if (isSetUp && scheme.WalletSupported)
|
|
{
|
|
<a asp-area="" asp-controller="Wallets" asp-action="WalletTransactions" asp-route-walletId="@scheme.WalletId" class="nav-link js-scroll-trigger @ViewData.IsActiveCategory(typeof(WalletsNavPages), scheme.WalletId.ToString()) @ViewData.IsActivePage(StoreNavPages.OnchainSettings)" id="@($"StoreNav-Wallet{scheme.Crypto}")">
|
|
<span class="me-2 btcpay-status btcpay-status--@(scheme.Enabled ? "enabled" : "disabled")"></span>
|
|
<span>@(Model.AltcoinsBuild ? $"{scheme.Crypto} " : "")Wallet</span>
|
|
</a>
|
|
}
|
|
else
|
|
{
|
|
<a asp-area="" asp-controller="Stores" asp-action="SetupWallet" asp-route-cryptoCode="@scheme.Crypto" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.OnchainSettings)" id="@($"StoreNav-Modify{scheme.Crypto}")">
|
|
<span class="me-2 btcpay-status btcpay-status--@(scheme.Enabled ? "enabled" : "disabled")"></span>
|
|
<span>@(Model.AltcoinsBuild ? $"{scheme.Crypto} " : "")Wallet</span>
|
|
</a>
|
|
}
|
|
</li>
|
|
}
|
|
@foreach (var scheme in Model.LightningNodes)
|
|
{
|
|
var isSetUp = !string.IsNullOrWhiteSpace(scheme.Address);
|
|
<li class="nav-item">
|
|
@if (isSetUp)
|
|
{
|
|
<a asp-area="" asp-controller="Stores" asp-action="LightningSettings" asp-route-cryptoCode="@scheme.CryptoCode" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.LightningSettings)" id="@($"StoreNav-Lightning{scheme.CryptoCode}")">
|
|
<span class="me-2 btcpay-status btcpay-status--@(scheme.Enabled ? "enabled" : "disabled")"></span>
|
|
<span>@(Model.AltcoinsBuild ? $"{scheme.CryptoCode} " : "")Lightning</span>
|
|
</a>
|
|
}
|
|
else
|
|
{
|
|
<a asp-area="" asp-controller="Stores" asp-action="SetupLightningNode" asp-route-cryptoCode="@scheme.CryptoCode" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.LightningSettings)" id="@($"StoreNav-Lightning{scheme.CryptoCode}")">
|
|
<span class="me-2 btcpay-status btcpay-status--disabled"></span>
|
|
<span>@(Model.AltcoinsBuild ? $"{scheme.CryptoCode} " : "")Lightning</span>
|
|
</a>
|
|
}
|
|
|
|
</li>
|
|
}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="accordion-item">
|
|
<header class="accordion-header" id="Nav-Payments-Header">
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#Nav-Payments" aria-expanded="true" aria-controls="Nav-Payments">
|
|
Payments
|
|
<vc:icon symbol="caret-down"/>
|
|
</button>
|
|
</header>
|
|
<div id="Nav-Payments" class="accordion-collapse collapse show" aria-labelledby="Nav-Payments-Header">
|
|
<div class="accordion-body">
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item" permission="@Policies.CanModifyStoreSettings">
|
|
<a asp-area="" asp-controller="Invoice" asp-action="ListInvoices" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActiveCategory(typeof(InvoiceNavPages))" id="StoreNav-Invoices">
|
|
<vc:icon symbol="invoice"/>
|
|
<span>Invoices</span>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item" permission="@Policies.CanModifyStoreSettings">
|
|
<a asp-area="" asp-controller="PaymentRequest" asp-action="GetPaymentRequests" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActiveCategory(typeof(PaymentRequestsNavPages))" id="StoreNav-PaymentRequests">
|
|
<vc:icon symbol="payment-1"/>
|
|
<span>Requests</span>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="StorePullPayments" asp-action="PullPayments" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.PullPayments)" id="StoreNav-PullPayments">
|
|
<vc:icon symbol="payment-2"/>
|
|
<span>Pull Payments</span>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="StorePullPayments" asp-action="Payouts" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.Payouts)" id="StoreNav-Payouts">
|
|
<vc:icon symbol="payment-2"/>
|
|
<span>Payouts</span>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item" permission="@Policies.CanModifyStoreSettings">
|
|
<a asp-area="" asp-controller="Stores" asp-action="PayButton" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(StoreNavPages.PayButton)" id="StoreNav-PayButton">
|
|
<vc:icon symbol="payment-2"/>
|
|
<span>Pay Button</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="accordion-item" permission="@Policies.CanModifyStoreSettings">
|
|
<header class="accordion-header" id="Nav-Apps-Header">
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#Nav-Apps" aria-expanded="true" aria-controls="Nav-Apps">
|
|
Apps
|
|
<vc:icon symbol="caret-down"/>
|
|
</button>
|
|
</header>
|
|
<div id="Nav-Apps" class="accordion-collapse collapse show" aria-labelledby="Nav-Apps-Header">
|
|
<div class="accordion-body">
|
|
<ul class="navbar-nav">
|
|
@foreach (var app in Model.Apps)
|
|
{
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Apps" asp-action="@app.Action" asp-route-appId="@app.Id" class="nav-link js-scroll-trigger @ViewData.IsActivePage(AppsNavPages.Update, app.Id)" id="@($"StoreNav-App-{app.Id}")">
|
|
<vc:icon symbol="@app.AppType.ToLower()"/>
|
|
<span>@app.AppName</span>
|
|
</a>
|
|
</li>
|
|
}
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Apps" asp-action="CreateApp" asp-route-storeId="@Model.Store.Id" class="nav-link js-scroll-trigger @ViewData.IsActivePage(AppsNavPages.Create)" id="StoreNav-CreateApp">
|
|
<vc:icon symbol="new"/>
|
|
<span>New App</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="accordion-item">
|
|
<header class="accordion-header" id="Nav-Plugins-Header">
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#Nav-Plugins" aria-expanded="true" aria-controls="Nav-Plugins">
|
|
Plugins
|
|
<vc:icon symbol="caret-down"/>
|
|
</button>
|
|
</header>
|
|
<div id="Nav-Plugins" class="accordion-collapse collapse show" aria-labelledby="Nav-Plugins-Header">
|
|
<div class="accordion-body">
|
|
<ul class="navbar-nav">
|
|
<vc:ui-extension-point location="header-nav" model="@Model"/>
|
|
<vc:ui-extension-point location="store-integrations-nav" model="@Model" />
|
|
<li class="nav-item" permission="@Policies.CanModifyServerSettings">
|
|
<a asp-area="" asp-controller="Server" asp-action="ListPlugins" class="nav-link js-scroll-trigger @ViewData.IsActivePage(ServerNavPages.Plugins)" id="Nav-AddPlugin">
|
|
<vc:icon symbol="new"/>
|
|
<span>Add Plugin</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
<script>
|
|
const navCollapsed = window.localStorage.getItem('btcpay-nav-collapsed')
|
|
const collapsed = navCollapsed ? JSON.parse(navCollapsed) : []
|
|
collapsed.forEach(id => {
|
|
const el = document.getElementById(id)
|
|
const btn = el && el.previousElementSibling.querySelector(`[aria-controls="${id}"]`)
|
|
if (el && btn) {
|
|
el.classList.remove('show')
|
|
btn.classList.add('collapsed')
|
|
btn.setAttribute('aria-expanded', 'false')
|
|
}
|
|
})
|
|
</script>
|
|
}
|
|
else if (Env.IsSecure)
|
|
{
|
|
<ul class="navbar-nav">
|
|
@if (!(await SettingsRepository.GetPolicies()).LockSubscription)
|
|
{
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Account" asp-action="Register" class="nav-link js-scroll-trigger" id="Nav-Register">Register</a>
|
|
</li>
|
|
}
|
|
<li class="nav-item">
|
|
<a asp-area="" asp-controller="Account" asp-action="Login" class="nav-link js-scroll-trigger" id="Nav-Login">Log in</a>
|
|
</li>
|
|
</ul>
|
|
}
|
|
</div>
|
|
@if (SignInManager.IsSignedIn(User))
|
|
{
|
|
<ul id="mainNavSettings" class="navbar-nav border-top p-3 px-lg-4">
|
|
<li class="nav-item" permission="@Policies.CanModifyServerSettings">
|
|
<a asp-area="" asp-controller="Server" asp-action="ListUsers" class="nav-link js-scroll-trigger @ViewData.IsActivePage(ServerNavPages.Users) @ViewData.IsActivePage(ServerNavPages.Emails) @ViewData.IsActivePage(ServerNavPages.Policies) @ViewData.IsActivePage(ServerNavPages.Services) @ViewData.IsActivePage(ServerNavPages.Theme) @ViewData.IsActivePage(ServerNavPages.Maintenance) @ViewData.IsActivePage(ServerNavPages.Logs) @ViewData.IsActivePage(ServerNavPages.Files)" id="Nav-ServerSettings">
|
|
<vc:icon symbol="server-settings"/>
|
|
<span>Server Settings</span>
|
|
</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">
|
|
<vc:icon symbol="account"/>
|
|
<span>Account</span>
|
|
</a>
|
|
<ul class="dropdown-menu py-0 w-100" aria-labelledby="Nav-Account">
|
|
<li class="p-3">
|
|
<strong class="d-block text-truncate" style="max-width:195px">@User.Identity.Name</strong>
|
|
@if (User.IsInRole(Roles.ServerAdmin))
|
|
{
|
|
<div class="text-secondary">Administrator</div>
|
|
}
|
|
</li>
|
|
@if (!theme.CustomTheme)
|
|
{
|
|
<li class="border-top py-1 px-3">
|
|
<vc:theme-switch css-class="nav-link"/>
|
|
</li>
|
|
}
|
|
<li class="border-top py-1 px-3">
|
|
<a asp-area="" asp-controller="Manage" asp-action="Index" class="nav-link @ViewData.IsActiveCategory(typeof(ManageNavPages))" id="Nav-ManageAccount">
|
|
<vc:icon symbol="account"/>
|
|
<span class="text-truncate" style="max-width:195px">Manage Account</span>
|
|
</a>
|
|
</li>
|
|
<li class="border-top py-1 px-3">
|
|
<a asp-area="" asp-controller="Account" asp-action="Logout" class="nav-link text-danger" id="Nav-Logout">
|
|
<i class="fa fa-sign-out"></i>
|
|
<span>Logout</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
}
|
|
</nav>
|