Tweak breadcrumb UX to include full folder paths for more usecases (#1695)

This commit is contained in:
Leendert de Borst
2026-04-01 09:26:05 +02:00
parent ec7fc4d0c8
commit 2cdbfb1c28
3 changed files with 24 additions and 13 deletions

View File

@@ -469,11 +469,8 @@ else
await base.OnInitializedAsync();
// In edit mode, we'll build breadcrumbs after loading the item in LoadExistingCredential
// so we can include folder breadcrumbs
if (!EditMode)
{
BreadcrumbItems.Add(new BreadcrumbItem { DisplayName = Localizer["AddNewItemBreadcrumb"] });
}
// In create mode, we'll build breadcrumbs after applying QuickCreateState
// Both are done in OnAfterRenderAsync
}
/// <inheritdoc />
@@ -537,6 +534,9 @@ else
ManuallyAddedFields = [];
InitiallyVisibleFields = [];
// Clear existing breadcrumbs (keep only Home)
BreadcrumbItems.RemoveAll(b => !b.ShowHomeIcon);
// Use the state service to pre-fill form data
if (!string.IsNullOrEmpty(QuickCreateStateService.ServiceName))
{
@@ -560,6 +560,14 @@ else
// Clear the state after using it
QuickCreateStateService.ClearState();
// Build breadcrumbs with folder hierarchy if creating in a folder
if (Obj.FolderId.HasValue)
{
await BuildFolderBreadcrumbsAsync(Obj.FolderId.Value);
}
BreadcrumbItems.Add(new BreadcrumbItem { DisplayName = Localizer["AddNewItemBreadcrumb"] });
}
/// <summary>

View File

@@ -945,8 +945,9 @@ else
CurrentFolderName = folder?.Name ?? string.Empty;
// Build breadcrumbs for folder hierarchy using shared helper
// Make last folder non-clickable since we're on that folder page
BreadcrumbItems.RemoveAll(b => !b.ShowHomeIcon);
AddFolderBreadcrumbs(FolderId, AllFolders, Localizer["Items"], includeCurrentFolder: true);
await BuildFolderBreadcrumbsAsync(FolderId.Value, makeLastClickable: false);
}
else
{

View File

@@ -209,8 +209,9 @@ public abstract class MainBase : OwningComponentBase
/// This helper method recursively builds folder breadcrumbs from the given folder up to the root.
/// </summary>
/// <param name="folderId">The folder ID to build breadcrumbs for.</param>
/// <param name="makeLastClickable">Whether the last folder (current page) should be clickable. Default is true for navigation to items within folders, false when on the folder page itself.</param>
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
protected async Task BuildFolderBreadcrumbsAsync(Guid folderId)
protected async Task BuildFolderBreadcrumbsAsync(Guid folderId, bool makeLastClickable = true)
{
// Load all folders to build the path
var foldersWithCounts = await FolderService.GetAllWithCountsAsync();
@@ -232,19 +233,20 @@ public abstract class MainBase : OwningComponentBase
return;
}
// Get localized "Folder" text
var folderLabel = SharedLocalizer["Folder"];
// Add breadcrumb for each folder in the path (from root to current)
foreach (var currentFolderId in folderIdPath)
for (int i = 0; i < folderIdPath.Count; i++)
{
var currentFolderId = folderIdPath[i];
var folder = allFolders.FirstOrDefault(f => f.Id == currentFolderId);
if (folder != null)
{
bool isLastFolder = i == folderIdPath.Count - 1;
bool shouldBeClickable = !isLastFolder || makeLastClickable;
BreadcrumbItems.Add(new BreadcrumbItem
{
DisplayName = $"{folderLabel}: {folder.Name}",
Url = $"/items/folder/{folder.Id}",
DisplayName = folder.Name,
Url = shouldBeClickable ? $"/items/folder/{folder.Id}" : null,
});
}
}