[backend/razor] Add remote user management & search to admin dashboard (ISH-582)

This commit is contained in:
Laura Hausmann 2025-01-09 09:28:44 +01:00
parent ba0b8f76d4
commit 241486a778
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 82 additions and 32 deletions

View file

@ -7,7 +7,7 @@
@inherits AdminComponentBase
<AdminPageHeader Title="Users"/>
<table>
<table class="auto-table">
<thead>
<th>Username</th>
<th>Status</th>
@ -17,7 +17,14 @@
@foreach (var user in _users)
{
<tr>
@if (Remote)
{
<td>@@@user.Username<span class="text-dim">@@@user.Host</span></td>
}
else
{
<td>@@@user.Username</td>
}
<td>
@{
var text = "Active";
@ -66,12 +73,15 @@
else
{
<p>
<i>Listing @_count local users. </i>
@if (!Remote)
{
<i>Listing @_count <a href="/admin/users?remote=true">local</a> users. </i>
@if (Options.Value.Registrations == Enums.Registrations.Invite)
{
<i>Registrations are invite-only. </i>
<a class="fake-link" id="gen-invite" role="button" onclick="generateInviteAndCopy()">Generate invite!</a>
<a class="fake-link" id="gen-invite" role="button" onclick="generateInviteAndCopy()">Generate
invite!</a>
}
else if (Options.Value.Registrations == Enums.Registrations.Open)
{
@ -81,12 +91,20 @@ else
{
<i>Registrations are closed.</i>
}
}
else
{
<i>Listing @_count <a href="/admin/users">remote</a> users.</i>
}
</p>
}
<div class="flex">
@if (Offset is > 0)
{
<button role="link" data-target="/admin/users?offset=@(Math.Max(0, Offset.Value - 50))" onclick="navigate(event)"> Previous page</button>
<button role="link" data-target="/admin/users?offset=@(Math.Max(0, Offset.Value - 50))" onclick="navigate(event)">
Previous page
</button>
}
else
{
@ -95,26 +113,46 @@ else
@if (_users.Length == 50)
{
<button role="link" data-target="/admin/users?offset=@((Offset ?? 0) + 50)" onclick="navigate(event)">Next page </button>
<button role="link" data-target="/admin/users?offset=@((Offset ?? 0) + 50)" onclick="navigate(event)">
Next page
</button>
}
else
{
<button disabled>Next page </button>
}
<form method="get" class="inline-flex flex-grow">
<input type="text" id="search" name="q" placeholder="Search..." class="flex-grow" value="@(Query ?? "")"/>
@if (Remote)
{
<input type="hidden" name="remote" value="true"/>
}
</form>
</div>
@code {
[Inject] public required IOptionsSnapshot<Config.SecuritySection> Options { get; set; }
[CascadingParameter] public required User AuthUser { get; set; }
[SupplyParameterFromQuery] public int? Offset { get; set; }
[SupplyParameterFromQuery] public bool Remote { get; set; }
[SupplyParameterFromQuery(Name = "q")] public string? Query { get; set; }
private User[] _users = [];
private int _count;
protected override async Task OnGet()
{
var query = Database.Users.Where(p => p.IsLocalUser && !p.IsSystemUser);
_users = await query.OrderBy(p => p.Id).Skip(Offset ?? 0).Take(50).ToArrayAsync();
var query = Remote
? Database.Users.Where(p => p.IsRemoteUser)
.Where(p => ("@" + p.Username + "@" + p.Host).ToLower().Contains((Query ?? "").ToLower()))
.OrderBy(p => p.Username + "@" + p.Host)
: Database.Users.Where(p => p.IsLocalUser && !p.IsSystemUser)
.Where(p => ("@" + p.Username.ToLower()).Contains((Query ?? "").ToLower()))
.OrderBy(p => p.Username);
_users = await query.Skip(Offset ?? 0).Take(50).ToArrayAsync();
_count = await query.CountAsync();
}
}

View file

@ -27,3 +27,15 @@ p {
.flex-grow {
flex-grow: 1;
}
.text-muted {
color: var(--text-muted);
}
.text-dim {
color: var(--text-dim);
}
.auto-table {
table-layout: auto;
}