What changed, and why it matters
This commit is a routine user-interface cleanup. It replaces many copies of hand-written breadcrumb navigation HTML across the application with a single shared 'Breadcrumb' view component. There is no security-relevant change here—only the way page headers and navigation links are rendered.
No security action required. Treat as normal refactoring/UX maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change introduces a reusable ViewComponent (BTCPayServer.Components.Breadcrumb.Breadcrumb), extension methods on ViewDataDictionary (SetBreadcrumbs/GetBreadcrumbs), and a Default.cshtml view. It then removes duplicated
Changed components
BTCPayServer/Components/BreadcrumbBTCPayServer/ViewDataDictionaryExtensions.csVarious Razor views under BTCPayServer/Views and BTCPayServer/PluginsInspect captured patch +229 / −485
diff --git a/BTCPayServer/Components/Breadcrumb/Breadcrumb.cs b/BTCPayServer/Components/Breadcrumb/Breadcrumb.cs
new file mode 100644
index 0000000..297b0fa
--- /dev/null
+++ b/BTCPayServer/Components/Breadcrumb/Breadcrumb.cs
@@ -0,0 +1,39 @@
+#nullable enable
+using System.Collections.Generic;
+using System.Linq;
+using BTCPayServer;
+using Microsoft.AspNetCore.Mvc;
+
+namespace BTCPayServer.Components.Breadcrumb;
+
+public class Breadcrumb : ViewComponent
+{
+ public IViewComponentResult Invoke(string? title = null, string? documentationUrl = null)
+ {
+ title ??= ViewData["Title"] as string;
+ var resolvedItems = ViewData.GetBreadcrumbs()
+ .Select(item => item.Url is null && item.Action is not null
+ ? item with { Url = Url.Action(item.Action, GetControllerName(item.Controller), item.RouteValues) }
+ : item)
+ .ToList();
+
+ if (!resolvedItems.Any(item => item.Active))
+ resolvedItems.Add(new BreadcrumbItem(title, Active: true));
+
+ return View(new BreadcrumbViewModel(resolvedItems, title, documentationUrl));
+ }
+
+ private static string? GetControllerName(string? controller)
+ => controller?.EndsWith("Controller") is true ? controller[..^"Controller".Length] : controller;
+}
+
+public record BreadcrumbItem(
+ object? Text,
+ string? Url = null,
+ string? Action = null,
+ string? Controller = null,
+ object? RouteValues = null,
+ bool Active = false,
+ string? TestId = null);
+
+public record BreadcrumbViewModel(IReadOnlyList<BreadcrumbItem> Items, object? Title, string? DocumentationUrl);
diff --git a/BTCPayServer/Components/Breadcrumb/Default.cshtml b/BTCPayServer/Components/Breadcrumb/Default.cshtml
new file mode 100644
index 0000000..20e617b
--- /dev/null
+++ b/BTCPayServer/Components/Breadcrumb/Default.cshtml
@@ -0,0 +1,33 @@
+@model BTCPayServer.Components.Breadcrumb.BreadcrumbViewModel
+
+<nav aria-label="breadcrumb" class="breadcrumb-nav">
+ <ol class="breadcrumb breadcrumb-nav__items">
+ @foreach (var item in Model.Items)
+ {
+ if (item.Active)
+ {
+ <li class="breadcrumb-item breadcrumb-nav__item active" aria-current="page">@item.Text</li>
+ }
+ else
+ {
+ <li class="breadcrumb-item breadcrumb-nav__item">
+ <a href="@item.Url" data-testid="@item.TestId">@item.Text</a>
+ </li>
+ }
+ }
+ </ol>
+ @if (Model.Title is not null)
+ {
+ <h2 class="breadcrumb-nav__title">
+ <span>@Model.Title</span>
+ @if (Model.DocumentationUrl is not null)
+ {
+ <small>
+ <a href="@Model.DocumentationUrl" target="_blank" rel="noreferrer noopener" title="@StringLocalizer["More information..."]">
+ <vc:icon symbol="info" />
+ </a>
+ </small>
+ }
+ </h2>
+ }
+</nav>
diff --git a/BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml b/BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml
index 1dcffa9..87856be 100644
--- a/BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml
+++ b/BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml
@@ -2,6 +2,8 @@
@{
var store = Context.GetStoreDataOrNull();
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Tokens), StringLocalizer["Create New Token"]).SetCategory(WellKnownCategories.Store));
+ if (store is not null)
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Access Tokens"], Action: nameof(BTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController.ListTokens), RouteValues: new { storeId = store.Id })]);
ViewBag.HidePublicKey ??= false;
ViewBag.ShowStores ??= false;
Layout = "_Layout";
@@ -11,15 +13,7 @@
<div class="sticky-header">
@if (store != null)
{
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListTokens" asp-route-storeId="@store.Id" text-translate="true">Access Tokens</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
}
else
{
diff --git a/BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml b/BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml
index db30f22..58c2931 100644
--- a/BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml
+++ b/BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml
@@ -4,6 +4,11 @@
var store = Context.GetStoreDataOrNull();
Layout = store is null ? "_LayoutWizard" : "_Layout";
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Tokens), StringLocalizer["Pairing Permission"]).SetCategory(WellKnownCategories.Store));
+ if (store is not null)
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Access Tokens"], Action: nameof(BTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController.ListTokens), RouteValues: new { storeId = store.Id }),
+ new(StringLocalizer["Create Token"], Action: nameof(BTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController.CreateToken), RouteValues: new { storeId = store.Id })
+ ]);
}
@if (store is null)
@@ -18,18 +23,7 @@
<div class="sticky-header">
@if (store != null)
{
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListTokens" asp-route-storeId="@store.Id" text-translate="true">Access Tokens</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="CreateToken" asp-route-storeId="@store.Id" text-translate="true">Create Token</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
}
else
{
diff --git a/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml b/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml
index b562c10..090a2e6 100644
--- a/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml
+++ b/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml
@@ -2,6 +2,10 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["Dynamic DNS Service"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services), Controller: nameof(BTCPayServer.Controllers.UIServerController), RouteValues: new { area = "" }),
+ new(StringLocalizer["Dynamic DNS Settings"], Action: nameof(BTCPayServer.Plugins.DynamicDNS.Controllers.UIDynamicDnsController.DynamicDnsService))
+ ]);
}
@section PageFootContent {
@@ -13,25 +17,7 @@
}
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-area="" asp-controller="UIServer" asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="DynamicDnsService" text-translate="true">Dynamic DNS Settings</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>
- <span>@ViewData["Title"]</span>
- <small>
- <a href="https://docs.btcpayserver.org/Apps/" target="_blank" rel="noreferrer noopener" title="@StringLocalizer["More information..."]">
- <vc:icon symbol="info" />
- </a>
- </small>
- </h2>
- </nav>
+ <vc:breadcrumb documentation-url="https://docs.btcpayserver.org/Apps/" />
<button id="page-primary" name="command" class="btn btn-primary" type="submit" value="Save" text-translate="true">Save</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsServices.cshtml b/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsServices.cshtml
index 4b2cb4a..4285568 100644
--- a/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsServices.cshtml
+++ b/BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsServices.cshtml
@@ -2,24 +2,10 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["Dynamic DNS Settings"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services), Controller: nameof(BTCPayServer.Controllers.UIServerController), RouteValues: new { area = "" })]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-area="" asp-controller="UIServer" asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>
- <span>@ViewData["Title"]</span>
- <small>
- <a href="https://docs.btcpayserver.org/Apps/" target="_blank" rel="noreferrer noopener" title="@StringLocalizer["More information..."]">
- <vc:icon symbol="info" />
- </a>
- </small>
- </h2>
- </nav>
+ <vc:breadcrumb documentation-url="https://docs.btcpayserver.org/Apps/" />
<div>
<form method="post" asp-action="DynamicDnsService">
<button id="page-primary" class="btn btn-primary mt-2" type="submit" text-translate="true">Add Service</button>
diff --git a/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesList.cshtml b/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesList.cshtml
index 07de9f0..4b4be68 100644
--- a/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesList.cshtml
+++ b/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesList.cshtml
@@ -8,30 +8,17 @@
{
ViewData.SetLayoutModel(new LayoutModel("Server-" + nameof(ServerNavPages.Emails), StringLocalizer["Email Rules"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Server Emails"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailController.ServerEmailSettings), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailController))]);
}
else
{
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Emails), StringLocalizer["Email Rules"])
.SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Emails"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoresEmailController.StoreEmailSettings), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoresEmailController), RouteValues: new { storeId })]);
}
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- @if (storeId is not null)
- {
- <a asp-controller="UIStoresEmail" asp-action="StoreEmailSettings" asp-route-storeId="@storeId" text-translate="true">Emails</a>
- }
- else
- {
- <a asp-controller="UIServerEmail" asp-action="ServerEmailSettings" text-translate="true">Server Emails</a>
- }
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData.GetTitle()</li>
- </ol>
- <h2>@ViewData.GetTitle()</h2>
- </nav>
+ <vc:breadcrumb />
@if (storeId is not null)
{
<a id="CreateEmailRule" permission="@Model.ModifyPermission" asp-action="StoreEmailRulesCreate" asp-route-storeId="@storeId"
diff --git a/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesManage.cshtml b/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesManage.cshtml
index 29dc960..a4e130c 100644
--- a/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesManage.cshtml
+++ b/BTCPayServer/Plugins/Emails/Views/Shared/EmailRulesManage.cshtml
@@ -8,11 +8,19 @@
{
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Emails), StringLocalizer[isEdit ? "Edit Email Rule" : "Create Email Rule"])
.SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Emails"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoresEmailController.StoreEmailSettings), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoresEmailController), RouteValues: new { storeId }),
+ new(StringLocalizer["Email Rules"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoreEmailRulesController.StoreEmailRulesList), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIStoreEmailRulesController), RouteValues: new { storeId })
+ ]);
}
else
{
ViewData.SetLayoutModel(new LayoutModel("Server-" + nameof(ServerNavPages.Emails), StringLocalizer[isEdit ? "Edit Email Rule" : "Create Email Rule"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Server Emails"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailController.ServerEmailSettings), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailController)),
+ new(StringLocalizer["Email Rules"], Action: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailRulesController.ServerEmailRulesList), Controller: nameof(BTCPayServer.Plugins.Emails.Controllers.UIServerEmailRulesController))
+ ]);
}
}
@@ -22,32 +30,7 @@
<form id="save-form" method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- @if (storeId is not null)
- {
- <a asp-controller="UIStoresEmail" asp-action="StoreEmailSettings" asp-route-storeId="@storeId" text-translate="true">Emails</a>
- }
- else
- {
- <a asp-controller="UIServerEmail" asp-action="ServerEmailSettings" text-translate="true">Server Emails</a>
- }
- </li>
- <li class="breadcrumb-item">
- @if (storeId is not null)
- {
- <a asp-action="StoreEmailRulesList" asp-route-storeId="@storeId" text-translate="true">Email Rules</a>
- }
- else
- {
- <a asp-action="ServerEmailRulesList" text-translate="true">Email Rules</a>
- }
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData.GetTitle()</li>
- </ol>
- <h2>@ViewData.GetTitle()</h2>
- </nav>
+ <vc:breadcrumb />
<div>
<button id="page-primary" type="submit" class="btn btn-primary" text-translate="true">Save</button>
<a asp-action="StoreEmailRulesList" asp-route-storeId="@storeId" class="btn btn-secondary" text-translate="true">Cancel</a>
diff --git a/BTCPayServer/Plugins/Forms/Views/Modify.cshtml b/BTCPayServer/Plugins/Forms/Views/Modify.cshtml
index 3a87400..2fdffab 100644
--- a/BTCPayServer/Plugins/Forms/Views/Modify.cshtml
+++ b/BTCPayServer/Plugins/Forms/Views/Modify.cshtml
@@ -7,6 +7,7 @@
var formId = Context.GetRouteValue("id");
var isNew = formId is null;
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Forms), isNew ? StringLocalizer["Create Form"] : StringLocalizer["Edit Form"]).SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Forms"], Action: nameof(BTCPayServer.Forms.UIFormsController.FormsList), Controller: nameof(BTCPayServer.Forms.UIFormsController), RouteValues: new { storeId })]);
Layout = "_Layout";
}
@@ -198,20 +199,7 @@
<form method="post" asp-action="Modify" asp-route-id="@formId" asp-route-storeId="@storeId">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UIForms" asp-action="FormsList" asp-route-storeId="@storeId" text-translate="true">Forms</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>
- @ViewData["Title"]
- <a href="https://docs.btcpayserver.org/Forms" target="_blank" rel="noreferrer noopener" title="@StringLocalizer["More information..."]">
- <vc:icon symbol="info" />
- </a>
- </h2>
- </nav>
+ <vc:breadcrumb documentation-url="https://docs.btcpayserver.org/Forms" />
<div>
<button id="page-primary" type="submit" class="btn btn-primary order-sm-1" text-translate="true">Save</button>
@if (!isNew)
diff --git a/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/AddPlan.cshtml b/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/AddPlan.cshtml
index 5bcdc08..97a2691 100644
--- a/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/AddPlan.cshtml
+++ b/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/AddPlan.cshtml
@@ -7,34 +7,15 @@
var title = Model.PlanId is null ? StringLocalizer["Add plan"] : StringLocalizer["Edit plan"];
var submitLabel = Model.PlanId is null ? StringLocalizer["Create"] : StringLocalizer["Save"];
ViewData.SetLayoutModel(new LayoutModel($"{nameof(SubscriptionsPlugin)}-{offeringId}", title));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Offering ({0})", Model.OfferingName], Action: nameof(BTCPayServer.Plugins.Subscriptions.Controllers.UIOfferingController.Offering), RouteValues: new { storeId, offeringId = Model.OfferingId, section = "Plans" }, TestId: "offering-link"),
+ new(Model.PlanId is null ? StringLocalizer["Add plan"] : StringLocalizer["Edit plan ({0})", Model.Name], Active: true)
+ ]);
}
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Offering"
- asp-route-storeId="@storeId"
- asp-route-offeringId="@Model.OfferingId"
- asp-route-section="Plans"
- data-testid="offering-link"
- >@StringLocalizer["Offering ({0})", Model.OfferingName]</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">
- @if (Model.PlanId is null)
- {
- <span>@StringLocalizer["Add plan"]</span>
- }
- else
- {
- <span>@StringLocalizer["Edit plan ({0})", Model.Name]</span>
- }
-
- </li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<input id="page-primary" type="submit" name="command" value="@submitLabel" class="btn btn-primary" />
</div>
<partial name="_StatusMessage" />
@@ -178,4 +159,3 @@
</div>
</div>
</form>
-
diff --git a/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml b/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml
index fd9df08..584d44c 100644
--- a/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml
+++ b/BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml
@@ -8,6 +8,7 @@
string offeringId = (string)this.Context.GetRouteValue("offeringId");
ViewData.SetLayoutModel(new LayoutModel($"{nameof(SubscriptionsPlugin)}-{offeringId}", StringLocalizer["Configure offering"]));
string storeId = (string)this.Context.GetRouteValue("storeId");
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Offering ({0})", Model.Name], Action: nameof(BTCPayServer.Plugins.Subscriptions.Controllers.UIOfferingController.Offering), RouteValues: new { storeId, offeringId, section = "Plans" })]);
var deleteModal = new ConfirmModel(StringLocalizer["Delete offering"], StringLocalizer["This offering will be removed from this store."], StringLocalizer["Delete"])
{
ControllerName = "UIApps",
@@ -21,18 +22,7 @@
<form method="post">
<input type="hidden" asp-for="OriginalName" />
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Offering"
- asp-route-storeId="@storeId"
- asp-route-offeringId="@offeringId"
- asp-route-section="Plans">@StringLocalizer["Offering ({0})", Model.Name]</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<input id="page-primary" type="submit" value="Save" class="btn btn-primary" />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Plugins/Translations/Views/CreateTranslation.cshtml b/BTCPayServer/Plugins/Translations/Views/CreateTranslation.cshtml
index 1008304..56017a5 100644
--- a/BTCPayServer/Plugins/Translations/Views/CreateTranslation.cshtml
+++ b/BTCPayServer/Plugins/Translations/Views/CreateTranslation.cshtml
@@ -3,18 +3,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Translations), StringLocalizer["Create a new translation"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Translations"], Action: nameof(BTCPayServer.Plugins.Translations.Controllers.UITranslationController.ListTranslations))]);
}
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListTranslations" text-translate="true">Translations</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<input id="page-primary" type="submit" value="Create" class="btn btn-primary" />
</div>
diff --git a/BTCPayServer/Plugins/Translations/Views/EditTranslation.cshtml b/BTCPayServer/Plugins/Translations/Views/EditTranslation.cshtml
index 9d58d31..fc52169 100644
--- a/BTCPayServer/Plugins/Translations/Views/EditTranslation.cshtml
+++ b/BTCPayServer/Plugins/Translations/Views/EditTranslation.cshtml
@@ -3,19 +3,12 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Translations), Context.GetRouteValue("translation") as string)
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Translations"], Action: nameof(BTCPayServer.Plugins.Translations.Controllers.UITranslationController.ListTranslations))]);
}
<form method="post" class="d-flex flex-column">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListTranslations" text-translate="true">Translations</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<div>
<button cheat-mode="true" class="btn btn-outline-info" name="command" value="Fake" text-translate="true">Fill fake</button>
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="Save" text-translate="true">Save</button>
diff --git a/BTCPayServer/Plugins/Wallets/Views/UIWallets/WalletLabels.cshtml b/BTCPayServer/Plugins/Wallets/Views/UIWallets/WalletLabels.cshtml
index e934107..f6e29fe 100644
--- a/BTCPayServer/Plugins/Wallets/Views/UIWallets/WalletLabels.cshtml
+++ b/BTCPayServer/Plugins/Wallets/Views/UIWallets/WalletLabels.cshtml
@@ -4,6 +4,10 @@
var cryptoCode = Model.WalletId.CryptoCode;
ViewData.SetLayoutModel(new LayoutModel($"{nameof(WalletsNavPages.Settings)}-{cryptoCode}", StringLocalizer["{0} Wallet Labels", Model.WalletId.CryptoCode])
.SetCategory(WellKnownCategories.ForWallet(cryptoCode)));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Transactions"], Action: nameof(BTCPayServer.Controllers.UIWalletsController.WalletTransactions), Controller: nameof(BTCPayServer.Controllers.UIWalletsController), RouteValues: new { walletId }),
+ new(StringLocalizer["Labels"], Active: true)
+ ]);
}
@section PageFootContent {
@@ -31,15 +35,7 @@
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="WalletTransactions" asp-controller="UIWallets" asp-route-walletId="@walletId" text-translate="true">Transactions</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">Labels</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Plugins/Webhooks/Views/ModifyWebhook.cshtml b/BTCPayServer/Plugins/Webhooks/Views/ModifyWebhook.cshtml
index f5555e1..92c30fd 100644
--- a/BTCPayServer/Plugins/Webhooks/Views/ModifyWebhook.cshtml
+++ b/BTCPayServer/Plugins/Webhooks/Views/ModifyWebhook.cshtml
@@ -3,6 +3,7 @@
@{
var storeId = Context.GetStoreData().Id;
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Webhooks), StringLocalizer["Webhooks"]).SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Webhooks"], Action: nameof(BTCPayServer.Plugins.Webhooks.Controllers.UIStoreWebhooksController.Webhooks), RouteValues: new { storeId })]);
}
@section PageHeadContent {
@@ -14,15 +15,7 @@
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Webhooks" asp-route-storeId="@storeId" text-translate="true">Webhooks</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
@if (Model.IsNew)
{
<button id="page-primary" name="add" type="submit" class="btn btn-primary" value="New" text-translate="true">Add Webhook</button>
diff --git a/BTCPayServer/ViewDataDictionaryExtensions.cs b/BTCPayServer/ViewDataDictionaryExtensions.cs
index 8f2a43a..ae2bd60 100644
--- a/BTCPayServer/ViewDataDictionaryExtensions.cs
+++ b/BTCPayServer/ViewDataDictionaryExtensions.cs
@@ -1,10 +1,22 @@
#nullable enable
+using System.Collections.Generic;
+using BTCPayServer.Components.Breadcrumb;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
namespace BTCPayServer;
public static class ViewDataDictionaryExtensions
{
+ private const string BreadcrumbsKey = "Breadcrumbs";
+
+ public static void SetBreadcrumbs(this ViewDataDictionary viewData, params BreadcrumbItem[] breadcrumbs)
+ => viewData[BreadcrumbsKey] = breadcrumbs;
+
+ public static IReadOnlyList<BreadcrumbItem> GetBreadcrumbs(this ViewDataDictionary viewData)
+ => viewData.TryGetValue(BreadcrumbsKey, out var value) && value is IReadOnlyList<BreadcrumbItem> breadcrumbs
+ ? breadcrumbs
+ : [];
+
public static string? GetPageTimeZone(this ViewDataDictionary viewData)
=> viewData["timezone"] as string;
/// <summary>
diff --git a/BTCPayServer/Views/Shared/CreateOrEditRole.cshtml b/BTCPayServer/Views/Shared/CreateOrEditRole.cshtml
index 37b314b..2d38d48 100644
--- a/BTCPayServer/Views/Shared/CreateOrEditRole.cshtml
+++ b/BTCPayServer/Views/Shared/CreateOrEditRole.cshtml
@@ -13,20 +13,17 @@
var title = role is null ? StringLocalizer["Create role"] : StringLocalizer["Update Role"];
var category = storeId is null ? WellKnownCategories.Server : WellKnownCategories.Store;
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.Roles), title).SetCategory(category));
+ ViewData.SetBreadcrumbs([new(
+ StringLocalizer["Roles"],
+ Action: storeId is null ? nameof(BTCPayServer.Controllers.UIServerController.ListRoles) : nameof(BTCPayServer.Controllers.UIStoresController.ListRoles),
+ Controller: storeId is null ? nameof(BTCPayServer.Controllers.UIServerController) : nameof(BTCPayServer.Controllers.UIStoresController),
+ RouteValues: new { storeId })]);
var storePolicies = PermissionService.Definitions.Values.Where(p => p.Type is PolicyType.Store).Select(s => s.Policy.ToString()).ToArray();
}
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListRoles" asp-route-storeId="@storeId">Roles</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="Save" text-translate="true">Save</button>
</div>
diff --git a/BTCPayServer/Views/UIFido2/Create.cshtml b/BTCPayServer/Views/UIFido2/Create.cshtml
index e7be1a9..c7a6c3e 100644
--- a/BTCPayServer/Views/UIFido2/Create.cshtml
+++ b/BTCPayServer/Views/UIFido2/Create.cshtml
@@ -3,25 +3,16 @@
@{
var pageTitle = Model.IsPasskey ? StringLocalizer["Register your passkey"] : StringLocalizer["Register your security device"];
ViewData.SetLayoutModel(new(Model.IsPasskey ? nameof(ManageNavPages.Passkeys) : nameof(ManageNavPages.TwoFactorAuthentication), pageTitle));
+ ViewData.SetBreadcrumbs([
+ Model.IsPasskey
+ ? new(StringLocalizer["Passkeys"], Action: nameof(BTCPayServer.Controllers.UIManageController.Passkeys), Controller: nameof(BTCPayServer.Controllers.UIManageController))
+ : new(StringLocalizer["Two Factor Authentication"], Action: nameof(BTCPayServer.Controllers.UIManageController.TwoFactorAuthentication), Controller: nameof(BTCPayServer.Controllers.UIManageController)),
+ new(Model.IsPasskey ? StringLocalizer["Register Passkey"] : StringLocalizer["Register Device"], Active: true)
+ ]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- @if (Model.IsPasskey)
- {
- <a asp-controller="UIManage" asp-action="Passkeys" text-translate="true">Passkeys</a>
- }
- else
- {
- <a asp-controller="UIManage" asp-action="TwoFactorAuthentication" text-translate="true">Two Factor Authentication</a>
- }
- </li>
- <li class="breadcrumb-item active" aria-current="page">@(Model.IsPasskey ? StringLocalizer["Register Passkey"] : StringLocalizer["Register Device"])</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIInvoice/CreateInvoice.cshtml b/BTCPayServer/Views/UIInvoice/CreateInvoice.cshtml
index b722dc8..51e0748 100644
--- a/BTCPayServer/Views/UIInvoice/CreateInvoice.cshtml
+++ b/BTCPayServer/Views/UIInvoice/CreateInvoice.cshtml
@@ -1,6 +1,7 @@
@model BTCPayServer.Models.InvoicingModels.CreateInvoiceModel
@{
ViewData.SetLayoutModel(new("Invoices", StringLocalizer["Create Invoices"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Invoices"], Action: nameof(BTCPayServer.Controllers.UIInvoiceController.ListInvoices), RouteValues: new { Model.StoreId })]);
}
@section PageFootContent {
@@ -26,15 +27,7 @@
<form asp-action="CreateInvoice" method="post" id="create-invoice-form">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" text-translate="true">Invoices</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<input id="page-primary" type="submit" value="Create" class="btn btn-primary" />
</div>
diff --git a/BTCPayServer/Views/UIInvoice/Invoice.cshtml b/BTCPayServer/Views/UIInvoice/Invoice.cshtml
index d69763b..1828c16 100644
--- a/BTCPayServer/Views/UIInvoice/Invoice.cshtml
+++ b/BTCPayServer/Views/UIInvoice/Invoice.cshtml
@@ -2,6 +2,10 @@
@model InvoiceDetailsModel
@{
ViewData.SetLayoutModel(new("Invoices", StringLocalizer["Invoice {0}", Model.Id]));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Invoices"], Action: nameof(BTCPayServer.Controllers.UIInvoiceController.ListInvoices), RouteValues: new { Model.StoreId }),
+ new(Model.Id, Active: true)
+ ]);
}
@section PageHeadContent {
@@ -168,15 +172,7 @@
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId">Invoices</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">Invoice</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<div>
@if (Model.ShowCheckout)
{
@@ -321,7 +317,7 @@
{
<div>
<h3 class="mb-3">
- <span>Product Information</span>
+ <span text-translate="true">Product Information</span>
<a href="https://docs.btcpayserver.org/Development/InvoiceMetadata/" target="_blank" rel="noreferrer noopener">
<vc:icon symbol="info" />
</a>
diff --git a/BTCPayServer/Views/UILightningAutomatedPayoutProcessors/Configure.cshtml b/BTCPayServer/Views/UILightningAutomatedPayoutProcessors/Configure.cshtml
index 7c1bdcc..c9feb1a 100644
--- a/BTCPayServer/Views/UILightningAutomatedPayoutProcessors/Configure.cshtml
+++ b/BTCPayServer/Views/UILightningAutomatedPayoutProcessors/Configure.cshtml
@@ -4,19 +4,12 @@
@{
var storeId = Context.GetStoreData().Id;
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.PayoutProcessors), StringLocalizer["Lightning Payout Processor"]).SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Payout Processors"], Action: nameof(BTCPayServer.PayoutProcessors.UIPayoutProcessorsController.ConfigureStorePayoutProcessors), Controller: nameof(BTCPayServer.PayoutProcessors.UIPayoutProcessorsController), RouteValues: new { storeId })]);
}
<form method="post" permissioned="@Policies.CanModifyStoreSettings">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UIPayoutProcessors" asp-action="ConfigureStorePayoutProcessors" asp-route-storeId="@storeId" text-translate="true">Payout Processors</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" name="command" type="submit" class="btn btn-primary" value="Save" text-translate="true">Save</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIManage/APIKeyPermissionAnalysis.cshtml b/BTCPayServer/Views/UIManage/APIKeyPermissionAnalysis.cshtml
index c37d389..174d5d6 100644
--- a/BTCPayServer/Views/UIManage/APIKeyPermissionAnalysis.cshtml
+++ b/BTCPayServer/Views/UIManage/APIKeyPermissionAnalysis.cshtml
@@ -5,18 +5,11 @@
var usedPermissionsPercentage = Model.TotalPermissions > 0 ? (int)Math.Round((double)Model.UsedPermissions.Count / Model.TotalPermissions * 100) : 0;
ViewData.SetLayoutModel(new LayoutModel(nameof(ManageNavPages.APIKeys), StringLocalizer["API Key Analysis"])
.SetCategory(nameof(ManageNavPages)));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["API Keys"], Action: nameof(BTCPayServer.Controllers.UIManageController.APIKeys))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="APIKeys" text-translate="true">API Keys</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<div class="row g-3 mb-4">
diff --git a/BTCPayServer/Views/UIManage/AddApiKey.cshtml b/BTCPayServer/Views/UIManage/AddApiKey.cshtml
index 4f528f3..ee2fd96 100644
--- a/BTCPayServer/Views/UIManage/AddApiKey.cshtml
+++ b/BTCPayServer/Views/UIManage/AddApiKey.cshtml
@@ -4,6 +4,7 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ManageNavPages.APIKeys), StringLocalizer["Generate API Key"])
.SetCategory(nameof(ManageNavPages)));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["API Keys"], Action: nameof(UIManageController.APIKeys))]);
}
@section PageHeadContent {
@@ -27,15 +28,7 @@
<form method="post" asp-action="AddApiKey" id="Permissions">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="APIKeys" text-translate="true">API Keys</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" text-translate="true">Generate API Key</button>
</div>
<p text-translate="true">Generate a new api key to use BTCPay through its API.</p>
diff --git a/BTCPayServer/Views/UIManage/EnableAuthenticator.cshtml b/BTCPayServer/Views/UIManage/EnableAuthenticator.cshtml
index b008850..179c7d4 100644
--- a/BTCPayServer/Views/UIManage/EnableAuthenticator.cshtml
+++ b/BTCPayServer/Views/UIManage/EnableAuthenticator.cshtml
@@ -3,17 +3,10 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ManageNavPages.TwoFactorAuthentication), StringLocalizer["Enable Authenticator App"])
.SetCategory(nameof(ManageNavPages)));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Two Factor Authentication"], Action: nameof(BTCPayServer.Controllers.UIManageController.TwoFactorAuthentication), Controller: nameof(BTCPayServer.Controllers.UIManageController))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UIManage" asp-action="TwoFactorAuthentication" text-translate="true">Two Factor Authentication</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
<p class="my-3" text-translate="true">To use an authenticator app go through the following steps:</p>
diff --git a/BTCPayServer/Views/UIManage/NotificationSettings.cshtml b/BTCPayServer/Views/UIManage/NotificationSettings.cshtml
index a5f2057..78ac144 100644
--- a/BTCPayServer/Views/UIManage/NotificationSettings.cshtml
+++ b/BTCPayServer/Views/UIManage/NotificationSettings.cshtml
@@ -2,19 +2,12 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ManageNavPages.Notifications), StringLocalizer["Notification Settings"])
.SetCategory(nameof(ManageNavPages)));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Notifications"], Action: nameof(BTCPayServer.Controllers.UINotificationsController.Index), Controller: nameof(BTCPayServer.Controllers.UINotificationsController))]);
}
<form method="post" asp-action="NotificationSettings">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UINotifications" asp-action="Index" text-translate="true">Notifications</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="update" text-translate="true">Save</button>
</div>
<partial name="_StatusMessage" />
@@ -58,4 +51,3 @@
label.textContent = isChecked ? 'Disable All' : 'Enable All';
}
</script>
-
diff --git a/BTCPayServer/Views/UIOnChainAutomatedPayoutProcessors/Configure.cshtml b/BTCPayServer/Views/UIOnChainAutomatedPayoutProcessors/Configure.cshtml
index 23dc251..635a808 100644
--- a/BTCPayServer/Views/UIOnChainAutomatedPayoutProcessors/Configure.cshtml
+++ b/BTCPayServer/Views/UIOnChainAutomatedPayoutProcessors/Configure.cshtml
@@ -5,19 +5,12 @@
var storeId = Context.GetStoreData().Id;
var cryptoCode = Context.GetRouteValue("cryptocode")?.ToString();
ViewData.SetLayoutModel(new LayoutModel(nameof(StoreNavPages.PayoutProcessors), StringLocalizer["On-Chain Payout Processor"]).SetCategory(WellKnownCategories.Store));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Payout Processors"], Action: nameof(BTCPayServer.PayoutProcessors.UIPayoutProcessorsController.ConfigureStorePayoutProcessors), Controller: nameof(BTCPayServer.PayoutProcessors.UIPayoutProcessorsController), RouteValues: new { storeId })]);
}
<form method="post" permissioned="@Policies.CanModifyStoreSettings">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UIPayoutProcessors" asp-action="ConfigureStorePayoutProcessors" asp-route-storeId="@storeId" text-translate="true">Payout Processors</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" name="command" type="submit" class="btn btn-primary" value="Save" text-translate="true">Save</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIPaymentRequest/EditPaymentRequest.cshtml b/BTCPayServer/Views/UIPaymentRequest/EditPaymentRequest.cshtml
index c965a2a..dd32e51 100644
--- a/BTCPayServer/Views/UIPaymentRequest/EditPaymentRequest.cshtml
+++ b/BTCPayServer/Views/UIPaymentRequest/EditPaymentRequest.cshtml
@@ -11,6 +11,7 @@
var payreqId = payReq?.Id;
var checkoutFormOptions = await FormDataService.GetSelect(storeId, Model.FormId);
ViewData.SetLayoutModel(new LayoutModel("PaymentRequests", payreqId is null ? StringLocalizer["Create Payment Request"] : StringLocalizer["Edit Payment Request"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Payment Requests"], Action: nameof(BTCPayServer.Controllers.UIPaymentRequestController.GetPaymentRequests), RouteValues: new { storeId })]);
}
@section PageHeadContent {
@@ -26,15 +27,7 @@
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="GetPaymentRequests" asp-route-storeId="@storeId" text-translate="true">Payment Requests</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<div>
@if (payreqId is null)
{
diff --git a/BTCPayServer/Views/UIPaymentRequest/PaymentRequestLabels.cshtml b/BTCPayServer/Views/UIPaymentRequest/PaymentRequestLabels.cshtml
index e965276..6f186d4 100644
--- a/BTCPayServer/Views/UIPaymentRequest/PaymentRequestLabels.cshtml
+++ b/BTCPayServer/Views/UIPaymentRequest/PaymentRequestLabels.cshtml
@@ -1,6 +1,10 @@
@model BTCPayServer.Models.PaymentRequestViewModels.PaymentRequestLabelsViewModel
@{
ViewData.SetLayoutModel(new LayoutModel("PaymentRequests", StringLocalizer["Payment Request Labels"]));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Payment Requests"], Action: nameof(BTCPayServer.Controllers.UIPaymentRequestController.GetPaymentRequests), Controller: nameof(BTCPayServer.Controllers.UIPaymentRequestController), RouteValues: new { Model.StoreId }),
+ new(StringLocalizer["Labels"], Active: true)
+ ]);
}
@section PageFootContent {
@@ -28,15 +32,7 @@
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="GetPaymentRequests" asp-controller="UIPaymentRequest" asp-route-storeId="@Model.StoreId" text-translate="true">Payment Requests</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">Labels</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIPullPayment/EditPullPayment.cshtml b/BTCPayServer/Views/UIPullPayment/EditPullPayment.cshtml
index 37a7433..a699abc 100644
--- a/BTCPayServer/Views/UIPullPayment/EditPullPayment.cshtml
+++ b/BTCPayServer/Views/UIPullPayment/EditPullPayment.cshtml
@@ -3,6 +3,7 @@
@{
var storeId = Context.GetStoreData().Id;
ViewData.SetLayoutModel(new(nameof(StoreNavPages.Create), StringLocalizer["Edit Pull Payment"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Pull Payments"], Action: nameof(BTCPayServer.Controllers.UIStorePullPaymentsController.PullPayments), Controller: nameof(BTCPayServer.Controllers.UIStorePullPaymentsController), RouteValues: new { storeId })]);
}
@section PageHeadContent {
@@ -16,15 +17,7 @@
<form method="post" asp-action="EditPullPayment" asp-route-pullPaymentId="@Model.Id">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-controller="UIStorePullPayments" asp-action="PullPayments" asp-route-storeId="@storeId" text-translate="true">Pull Payments</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<div>
@if (string.IsNullOrEmpty(Model.Id))
{
diff --git a/BTCPayServer/Views/UIServer/CLightningRestServices.cshtml b/BTCPayServer/Views/UIServer/CLightningRestServices.cshtml
index 2d6b47f..a40a352 100644
--- a/BTCPayServer/Views/UIServer/CLightningRestServices.cshtml
+++ b/BTCPayServer/Views/UIServer/CLightningRestServices.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["Core Lightning {0}", Model.ConnectionType])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/ConfiguratorService.cshtml b/BTCPayServer/Views/UIServer/ConfiguratorService.cshtml
index 8694101..184aec2 100644
--- a/BTCPayServer/Views/UIServer/ConfiguratorService.cshtml
+++ b/BTCPayServer/Views/UIServer/ConfiguratorService.cshtml
@@ -1,19 +1,12 @@
@model LightningWalletServices
@{
ViewData.SetLayoutModel(new(nameof(ServerNavPages.Services), StringLocalizer["BTCPay Server Configurator"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/CreateUser.cshtml b/BTCPayServer/Views/UIServer/CreateUser.cshtml
index 0598be2..8b65dcc 100644
--- a/BTCPayServer/Views/UIServer/CreateUser.cshtml
+++ b/BTCPayServer/Views/UIServer/CreateUser.cshtml
@@ -1,20 +1,13 @@
@model BTCPayServer.Controllers.RegisterFromAdminViewModel
@{
ViewData.SetLayoutModel(new(nameof(ServerNavPages.Users), StringLocalizer["Create account"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Users"], Action: nameof(BTCPayServer.Controllers.UIServerController.ListUsers))]);
var canSendEmail = ViewData["CanSendEmail"] is true;
}
<form method="post" asp-action="CreateUser">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListUsers" text-translate="true">Users</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="Save" text-translate="true">Create Account</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/EditAmazonS3StorageProvider.cshtml b/BTCPayServer/Views/UIServer/EditAmazonS3StorageProvider.cshtml
index 7de4624..577c2b2 100644
--- a/BTCPayServer/Views/UIServer/EditAmazonS3StorageProvider.cshtml
+++ b/BTCPayServer/Views/UIServer/EditAmazonS3StorageProvider.cshtml
@@ -2,21 +2,15 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Files), StringLocalizer["Amazon S3 Storage"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Files"], Action: nameof(BTCPayServer.Controllers.UIServerController.Files)),
+ new(StringLocalizer["Storage Provider"], Action: nameof(BTCPayServer.Controllers.UIServerController.Storage)),
+ new(StringLocalizer["Provider"], Active: true)
+ ]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Files" text-translate="true">Files</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="Storage" text-translate="true">Storage Provider</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">Provider</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/EditAzureBlobStorageStorageProvider.cshtml b/BTCPayServer/Views/UIServer/EditAzureBlobStorageStorageProvider.cshtml
index b182f3f..b4970e4 100644
--- a/BTCPayServer/Views/UIServer/EditAzureBlobStorageStorageProvider.cshtml
+++ b/BTCPayServer/Views/UIServer/EditAzureBlobStorageStorageProvider.cshtml
@@ -2,21 +2,15 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Files), StringLocalizer["Azure Blob Storage"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Files"], Action: nameof(BTCPayServer.Controllers.UIServerController.Files)),
+ new(StringLocalizer["Storage Provider"], Action: nameof(BTCPayServer.Controllers.UIServerController.Storage)),
+ new(StringLocalizer["Provider"], Active: true)
+ ]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Files" text-translate="true">Files</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="Storage" text-translate="true">Storage Provider</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">Provider</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/EditFileSystemStorageProvider.cshtml b/BTCPayServer/Views/UIServer/EditFileSystemStorageProvider.cshtml
index 9191f84..b40834f 100644
--- a/BTCPayServer/Views/UIServer/EditFileSystemStorageProvider.cshtml
+++ b/BTCPayServer/Views/UIServer/EditFileSystemStorageProvider.cshtml
@@ -2,21 +2,15 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Files), StringLocalizer["Local Filesystem Storage"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Files"], Action: nameof(BTCPayServer.Controllers.UIServerController.Files)),
+ new(StringLocalizer["Storage Provider"], Action: nameof(BTCPayServer.Controllers.UIServerController.Storage)),
+ new(StringLocalizer["Provider"], Active: true)
+ ]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Files" text-translate="true">Files</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="Storage" text-translate="true">Storage Provider</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">Provider</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/EditGoogleCloudStorageStorageProvider.cshtml b/BTCPayServer/Views/UIServer/EditGoogleCloudStorageStorageProvider.cshtml
index 82fbb15..7f9c70b 100644
--- a/BTCPayServer/Views/UIServer/EditGoogleCloudStorageStorageProvider.cshtml
+++ b/BTCPayServer/Views/UIServer/EditGoogleCloudStorageStorageProvider.cshtml
@@ -2,21 +2,15 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Files), StringLocalizer["Google Cloud Storage"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Files"], Action: nameof(BTCPayServer.Controllers.UIServerController.Files)),
+ new(StringLocalizer["Storage Provider"], Action: nameof(BTCPayServer.Controllers.UIServerController.Storage)),
+ new(StringLocalizer["Provider"], Active: true)
+ ]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Files" text-translate="true">Files</a>
- </li>
- <li class="breadcrumb-item">
- <a asp-action="Storage" text-translate="true">Storage Provider</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">Provider</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/LightningChargeServices.cshtml b/BTCPayServer/Views/UIServer/LightningChargeServices.cshtml
index a900e33..579a08e 100644
--- a/BTCPayServer/Views/UIServer/LightningChargeServices.cshtml
+++ b/BTCPayServer/Views/UIServer/LightningChargeServices.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["Lightning Charge Service"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/LightningWalletServices.cshtml b/BTCPayServer/Views/UIServer/LightningWalletServices.cshtml
index 6b3371f..ca30258 100644
--- a/BTCPayServer/Views/UIServer/LightningWalletServices.cshtml
+++ b/BTCPayServer/Views/UIServer/LightningWalletServices.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), Model.WalletName)
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">@ViewData["Title"]</li>
- </ol>
- <h2 text-translate="true">@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/LndSeedBackup.cshtml b/BTCPayServer/Views/UIServer/LndSeedBackup.cshtml
index e906203..6815fc0 100644
--- a/BTCPayServer/Views/UIServer/LndSeedBackup.cshtml
+++ b/BTCPayServer/Views/UIServer/LndSeedBackup.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["LND Seed Backup"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/LndServices.cshtml b/BTCPayServer/Views/UIServer/LndServices.cshtml
index 760ebef..daad981 100644
--- a/BTCPayServer/Views/UIServer/LndServices.cshtml
+++ b/BTCPayServer/Views/UIServer/LndServices.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["LND {0}", Model.ConnectionType])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
<p>
diff --git a/BTCPayServer/Views/UIServer/P2PService.cshtml b/BTCPayServer/Views/UIServer/P2PService.cshtml
index d17c948..82a5b84 100644
--- a/BTCPayServer/Views/UIServer/P2PService.cshtml
+++ b/BTCPayServer/Views/UIServer/P2PService.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), Model.WalletName)
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">@ViewData["Title"]</li>
- </ol>
- <h2 text-translate="true">@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/RPCService.cshtml b/BTCPayServer/Views/UIServer/RPCService.cshtml
index 3424f2b..f2398db 100644
--- a/BTCPayServer/Views/UIServer/RPCService.cshtml
+++ b/BTCPayServer/Views/UIServer/RPCService.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), Model.WalletName)
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">@ViewData["Title"]</li>
- </ol>
- <h2 text-translate="true">@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/ResetUserPassword.cshtml b/BTCPayServer/Views/UIServer/ResetUserPassword.cshtml
index 0c49509..21c56d3 100644
--- a/BTCPayServer/Views/UIServer/ResetUserPassword.cshtml
+++ b/BTCPayServer/Views/UIServer/ResetUserPassword.cshtml
@@ -1,19 +1,12 @@
@model BTCPayServer.Controllers.ResetUserPasswordFromAdmin
@{
ViewData.SetLayoutModel(new(nameof(ServerNavPages.Users), StringLocalizer["Reset Password"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Users"], Action: nameof(BTCPayServer.Controllers.UIServerController.ListUsers))]);
}
<form method="post" asp-action="ResetUserPassword">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListUsers" text-translate="true">Users</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="Save" text-translate="true">Reset Password</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/SSHService.cshtml b/BTCPayServer/Views/UIServer/SSHService.cshtml
index 0cd268f..bc6aab6 100644
--- a/BTCPayServer/Views/UIServer/SSHService.cshtml
+++ b/BTCPayServer/Views/UIServer/SSHService.cshtml
@@ -2,18 +2,11 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Services), StringLocalizer["SSH settings"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Services"], Action: nameof(BTCPayServer.Controllers.UIServerController.Services))]);
}
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Services" text-translate="true">Services</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
</div>
<partial name="_StatusMessage" />
<p text-translate="true">SSH services are used by the maintenance operations.</p>
diff --git a/BTCPayServer/Views/UIServer/Storage.cshtml b/BTCPayServer/Views/UIServer/Storage.cshtml
index b18396f..bf40c8f 100644
--- a/BTCPayServer/Views/UIServer/Storage.cshtml
+++ b/BTCPayServer/Views/UIServer/Storage.cshtml
@@ -2,19 +2,12 @@
@{
ViewData.SetLayoutModel(new LayoutModel(nameof(ServerNavPages.Files), StringLocalizer["Storage Provider"])
.SetCategory(WellKnownCategories.Server));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Files"], Action: nameof(BTCPayServer.Controllers.UIServerController.Files))]);
}
<form method="post">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="Files" text-translate="true">Files</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" type="submit" class="btn btn-primary" name="command" value="Save" text-translate="true">Next</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIServer/User.cshtml b/BTCPayServer/Views/UIServer/User.cshtml
index 438d359..53854e9 100644
--- a/BTCPayServer/Views/UIServer/User.cshtml
+++ b/BTCPayServer/Views/UIServer/User.cshtml
@@ -3,20 +3,16 @@
@inject IFileService FileService
@{
ViewData.SetLayoutModel(new(nameof(ServerNavPages.Users), Model.Email));
+ ViewData.SetBreadcrumbs([
+ new(StringLocalizer["Users"], Action: nameof(BTCPayServer.Controllers.UIServerController.ListUsers)),
+ new(StringLocalizer["User"], Active: true)
+ ]);
var canUpload = await FileService.IsAvailable();
}
<form method="post" enctype="multipart/form-data">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="ListUsers" text-translate="true">Users</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page" text-translate="true">User</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<button id="page-primary" name="command" type="submit" class="btn btn-primary" value="Save" text-translate="true">Save</button>
</div>
<partial name="_StatusMessage" />
diff --git a/BTCPayServer/Views/UIStorePullPayments/NewPullPayment.cshtml b/BTCPayServer/Views/UIStorePullPayments/NewPullPayment.cshtml
index 5e661c6..110e1e3 100644
--- a/BTCPayServer/Views/UIStorePullPayments/NewPullPayment.cshtml
+++ b/BTCPayServer/Views/UIStorePullPayments/NewPullPayment.cshtml
@@ -4,6 +4,7 @@
@{
var storeId = Context.GetStoreData().Id;
ViewData.SetLayoutModel(new(nameof(StoreNavPages.PullPayments), StringLocalizer["Create Pull Payment"]));
+ ViewData.SetBreadcrumbs([new(StringLocalizer["Pull Payments"], Action: nameof(BTCPayServer.Controllers.UIStorePullPaymentsController.PullPayments), RouteValues: new { storeId })]);
}
@section PageHeadContent {
@@ -17,15 +18,7 @@
<form method="post" asp-route-walletId="@Context.GetRouteValue("walletId")" asp-action="NewPullPayment">
<div class="sticky-header">
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item">
- <a asp-action="PullPayments" asp-route-storeId="@storeId" text-translate="true">Pull Payments</a>
- </li>
- <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
- </ol>
- <h2>@ViewData["Title"]</h2>
- </nav>
+ <vc:breadcrumb />
<input id="page-primary" type="submit" value="Create" class="btn btn-primary"/>
</div>
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.