[backend/razor] Add remote user management & search to admin dashboard (ISH-582)
This commit is contained in:
parent
ba0b8f76d4
commit
241486a778
2 changed files with 82 additions and 32 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue