mirror of
https://github.com/aliasvault/aliasvault.git
synced 2026-01-29 00:12:30 -05:00
159 lines
5.9 KiB
Plaintext
159 lines
5.9 KiB
Plaintext
@using AliasVault.RazorComponents.Tables
|
|
@using AliasVault.Client.Main.Models
|
|
@inject NavigationManager NavigationManager
|
|
|
|
<SortableTable Columns="@_tableColumns" SortColumn="@SortColumn" SortDirection="@CurrentSortDirection" OnSortChanged="HandleSortChanged">
|
|
@foreach (var credential in DisplayedCredentials)
|
|
{
|
|
<SortableTableRow Class="cursor-pointer" OnClick="@(() => NavigateToCredential(credential.Id))">
|
|
<SortableTableColumn Padding="false">
|
|
<div class="flex items-center space-x-2 py-2 pl-2">
|
|
<DisplayFavicon FaviconBytes="@credential.Logo" Width="24" />
|
|
<span class="font-bold ml-2">@credential.Service</span>
|
|
</div>
|
|
</SortableTableColumn>
|
|
<SortableTableColumn Padding="false">@credential.Username</SortableTableColumn>
|
|
<SortableTableColumn Padding="false">@credential.Email</SortableTableColumn>
|
|
<SortableTableColumn Padding="false">@credential.CreatedAt.ToString("yyyy-MM-dd")</SortableTableColumn>
|
|
</SortableTableRow>
|
|
}
|
|
</SortableTable>
|
|
|
|
@code {
|
|
/// <summary>
|
|
/// Gets or sets the list of credentials to show.
|
|
/// </summary>
|
|
[Parameter]
|
|
public List<CredentialListEntry> Credentials { get; set; } = [];
|
|
|
|
/// <summary>
|
|
/// Gets or sets the sort order for the credentials (used to determine initial table state).
|
|
/// </summary>
|
|
[Parameter]
|
|
public CredentialSortOrder SortOrder { get; set; } = CredentialSortOrder.OldestFirst;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the column to sort by.
|
|
/// </summary>
|
|
private string SortColumn { get; set; } = "CreatedAt";
|
|
|
|
/// <summary>
|
|
/// Gets or sets the current sort direction for table column sorting.
|
|
/// </summary>
|
|
private SortDirection CurrentSortDirection { get; set; } = SortDirection.Ascending;
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether the user has explicitly clicked a column to sort.
|
|
/// </summary>
|
|
private bool UserHasClickedColumn { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the columns to show in the table.
|
|
/// </summary>
|
|
private readonly List<TableColumn> _tableColumns = [
|
|
new TableColumn { Title = "Service", PropertyName = "Service" },
|
|
new TableColumn { Title = "Username", PropertyName = "Username" },
|
|
new TableColumn { Title = "Email", PropertyName = "Email" },
|
|
new TableColumn { Title = "Created", PropertyName = "CreatedAt" }
|
|
];
|
|
|
|
/// <summary>
|
|
/// Gets the credentials to display, with optional column-based sorting applied.
|
|
/// </summary>
|
|
private IEnumerable<CredentialListEntry> DisplayedCredentials
|
|
{
|
|
get
|
|
{
|
|
// If user has explicitly clicked a column header to sort, apply that sorting
|
|
if (UserHasClickedColumn)
|
|
{
|
|
return SortList(Credentials, SortColumn, CurrentSortDirection);
|
|
}
|
|
|
|
// Otherwise use the pre-sorted credentials passed from parent
|
|
return Credentials;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the default sort column based on the sort order.
|
|
/// </summary>
|
|
private string GetDefaultSortColumn()
|
|
{
|
|
return SortOrder switch
|
|
{
|
|
CredentialSortOrder.Alphabetical => "Service",
|
|
_ => "CreatedAt", // OldestFirst and NewestFirst
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the default sort direction based on the sort order.
|
|
/// </summary>
|
|
private SortDirection GetDefaultSortDirection()
|
|
{
|
|
return SortOrder switch
|
|
{
|
|
CredentialSortOrder.NewestFirst => SortDirection.Descending,
|
|
CredentialSortOrder.Alphabetical => SortDirection.Ascending,
|
|
_ => SortDirection.Ascending, // OldestFirst (default)
|
|
};
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void OnParametersSet()
|
|
{
|
|
base.OnParametersSet();
|
|
|
|
// Only reset if the SortOrder parameter has changed
|
|
var newDefaultColumn = GetDefaultSortColumn();
|
|
var newDefaultDirection = GetDefaultSortDirection();
|
|
|
|
if (SortColumn != newDefaultColumn || (!UserHasClickedColumn && CurrentSortDirection != newDefaultDirection))
|
|
{
|
|
SortColumn = newDefaultColumn;
|
|
CurrentSortDirection = newDefaultDirection;
|
|
UserHasClickedColumn = false; // Reset user interaction state when parameters change
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the sort changed event.
|
|
/// </summary>
|
|
/// <param name="sort">The sort event.</param>
|
|
private void HandleSortChanged((string column, SortDirection direction) sort)
|
|
{
|
|
SortColumn = sort.column;
|
|
CurrentSortDirection = sort.direction;
|
|
UserHasClickedColumn = true;
|
|
StateHasChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sorts the list of credentials.
|
|
/// </summary>
|
|
/// <param name="credentials">The list of credentials to sort.</param>
|
|
/// <param name="sortColumn">The column to sort by.</param>
|
|
/// <param name="sortDirection">The direction to sort by.</param>
|
|
private static IEnumerable<CredentialListEntry> SortList(List<CredentialListEntry> credentials, string sortColumn, SortDirection sortDirection)
|
|
{
|
|
return sortColumn switch
|
|
{
|
|
"Service" => SortableTable.SortListByProperty(credentials, c => c.Service, sortDirection),
|
|
"Username" => SortableTable.SortListByProperty(credentials, c => c.Username, sortDirection),
|
|
"Email" => SortableTable.SortListByProperty(credentials, c => c.Email, sortDirection),
|
|
"CreatedAt" => SortableTable.SortListByProperty(credentials, c => c.CreatedAt, sortDirection),
|
|
_ => credentials
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigates to the credential details page.
|
|
/// </summary>
|
|
/// <param name="credentialId">The ID of the credential to navigate to.</param>
|
|
private void NavigateToCredential(Guid credentialId)
|
|
{
|
|
NavigationManager.NavigateTo($"/credentials/{credentialId}");
|
|
}
|
|
}
|