mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-01-19 05:33:31 +01:00
6290b0f3bf
* Users list: Cleanups * Policies: Flip registration settings * Policies: Add RequireUserApproval setting * Add approval to user * Require approval on login and for API key * API handling * AccountController cleanups * Test fix * Apply suggestions from code review Co-authored-by: Nicolas Dorier <nicolas.dorier@gmail.com> * Add missing imports * Communicate login requirements to user on account creation * Add login requirements to basic auth handler * Cleanups and test fix * Encapsulate approval logic in user service and log approval changes * Send follow up "Account approved" email Closes #5656. * Add notification for admins * Fix creating a user via the admin view * Update list: Unify flags into status column, add approve action * Adjust "Resend email" wording * Incorporate feedback from code review * Remove duplicate test server policy reset --------- Co-authored-by: Nicolas Dorier <nicolas.dorier@gmail.com>
102 lines
4.3 KiB
Plaintext
102 lines
4.3 KiB
Plaintext
@using BTCPayServer.Abstractions.Models
|
|
@model UsersViewModel
|
|
@{
|
|
ViewData.SetActivePage(ServerNavPages.Users);
|
|
var nextUserEmailSortOrder = (string)ViewData["NextUserEmailSortOrder"];
|
|
var userEmailSortOrder = nextUserEmailSortOrder switch
|
|
{
|
|
"asc" => "desc",
|
|
"desc" => "asc",
|
|
_ => null
|
|
};
|
|
|
|
var sortIconClass = "fa-sort";
|
|
if (userEmailSortOrder != null)
|
|
{
|
|
sortIconClass = $"fa-sort-alpha-{userEmailSortOrder}";
|
|
}
|
|
|
|
const string sortByDesc = "Sort by descending...";
|
|
const string sortByAsc = "Sort by ascending...";
|
|
}
|
|
|
|
<div class="d-flex align-items-center justify-content-between mb-3">
|
|
<h3 class="mb-0">@ViewData["Title"]</h3>
|
|
<a asp-action="CreateUser" class="btn btn-primary" role="button" id="CreateUser">
|
|
Add User
|
|
</a>
|
|
</div>
|
|
|
|
<form asp-action="ListUsers" asp-route-sortOrder="@(userEmailSortOrder)" style="max-width:640px" method="get">
|
|
<input asp-for="SearchTerm" class="form-control" placeholder="Search by email..." />
|
|
</form>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>
|
|
<a
|
|
asp-action="ListUsers"
|
|
asp-route-sortOrder="@(nextUserEmailSortOrder ?? "asc")"
|
|
class="text-nowrap"
|
|
title="@(nextUserEmailSortOrder == "desc" ? sortByAsc : sortByDesc)"
|
|
>
|
|
Email
|
|
<span class="fa @(sortIconClass)"></span>
|
|
</a>
|
|
</th>
|
|
<th>Created</th>
|
|
<th>Status</th>
|
|
<th class="actions-col"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="UsersList">
|
|
@foreach (var user in Model.Users)
|
|
{
|
|
var status = user switch
|
|
{
|
|
{ Disabled: true } => ("Disabled", "danger"),
|
|
{ Approved: false } => ("Pending Approval", "warning"),
|
|
{ EmailConfirmed: false } => ("Pending Email Verification", "warning"),
|
|
_ => ("Active", "success")
|
|
};
|
|
<tr>
|
|
<td class="d-flex align-items-center gap-2">
|
|
<span class="user-email">@user.Email</span>
|
|
@foreach (var role in user.Roles)
|
|
{
|
|
<span class="badge bg-info">@Model.Roles[role]</span>
|
|
}
|
|
</td>
|
|
<td>@user.Created?.ToBrowserDate()</td>
|
|
<td>
|
|
<span class="user-status badge bg-@status.Item2">@status.Item1</span>
|
|
</td>
|
|
<td class="actions-col">
|
|
<div class="d-inline-flex align-items-center gap-3">
|
|
@if (user is { EmailConfirmed: false, Disabled: false }) {
|
|
<a asp-action="SendVerificationEmail" asp-route-userId="@user.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-title="Send verification email" data-description="This will send a verification email to <strong>@Html.Encode(user.Email)</strong>." data-confirm="Send">Resend email</a>
|
|
}
|
|
else if (user is { Approved: false, Disabled: false })
|
|
{
|
|
<a asp-action="ApproveUser" asp-route-userId="@user.Id" asp-route-approved="true" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-title="Approve user" data-description="This will approve the user <strong>@Html.Encode(user.Email)</strong>." data-confirm="Approve">Approve</a>
|
|
}
|
|
else
|
|
{
|
|
<a asp-action="ToggleUser" asp-route-userId="@user.Id" asp-route-enable="@user.Disabled">@(user.Disabled ? "Enable" : "Disable")</a>
|
|
}
|
|
<a asp-action="User" asp-route-userId="@user.Id" class="user-edit">Edit</a>
|
|
<a asp-action="DeleteUser" asp-route-userId="@user.Id">Remove</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<vc:pager view-model="Model"></vc:pager>
|
|
|
|
<partial name="_Confirm" model="@(new ConfirmModel("Send verification email", $"This will send a verification email to the user.", "Send"))" />
|