[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 @inherits AdminComponentBase
<AdminPageHeader Title="Users"/> <AdminPageHeader Title="Users"/>
<table> <table class="auto-table">
<thead> <thead>
<th>Username</th> <th>Username</th>
<th>Status</th> <th>Status</th>
@ -17,7 +17,14 @@
@foreach (var user in _users) @foreach (var user in _users)
{ {
<tr> <tr>
@if (Remote)
{
<td>@@@user.Username<span class="text-dim">@@@user.Host</span></td>
}
else
{
<td>@@@user.Username</td> <td>@@@user.Username</td>
}
<td> <td>
@{ @{
var text = "Active"; var text = "Active";
@ -66,12 +73,15 @@
else else
{ {
<p> <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) @if (Options.Value.Registrations == Enums.Registrations.Invite)
{ {
<i>Registrations are invite-only. </i> <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) else if (Options.Value.Registrations == Enums.Registrations.Open)
{ {
@ -81,40 +91,68 @@ else
{ {
<i>Registrations are closed.</i> <i>Registrations are closed.</i>
} }
}
else
{
<i>Listing @_count <a href="/admin/users">remote</a> users.</i>
}
</p> </p>
} }
@if (Offset is > 0) <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)">
else Previous page
{ </button>
}
else
{
<button disabled> Previous page</button> <button disabled> Previous page</button>
} }
@if (_users.Length == 50) @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
else </button>
{ }
else
{
<button disabled>Next page </button> <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 { @code {
[Inject] public required IOptionsSnapshot<Config.SecuritySection> Options { get; set; } [Inject] public required IOptionsSnapshot<Config.SecuritySection> Options { get; set; }
[CascadingParameter] public required User AuthUser { get; set; } [CascadingParameter] public required User AuthUser { get; set; }
[SupplyParameterFromQuery] public int? Offset { 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 User[] _users = [];
private int _count; private int _count;
protected override async Task OnGet() protected override async Task OnGet()
{ {
var query = Database.Users.Where(p => p.IsLocalUser && !p.IsSystemUser); var query = Remote
_users = await query.OrderBy(p => p.Id).Skip(Offset ?? 0).Take(50).ToArrayAsync(); ? 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(); _count = await query.CountAsync();
} }
} }

View file

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