admin/users: view user, archive + restore

This commit is contained in:
Philippe Loctaux 2023-05-03 21:49:25 +02:00
parent 4a63bfa9a9
commit e600405f22
6 changed files with 492 additions and 4 deletions

View file

@ -0,0 +1,341 @@
{% extends "shell" %}
{% block content %}
<div class="page-header d-print-none">
<div class="container-xl">
<div class="row align-items-center">
<div class="col">
<div class="page-pretitle">
Admin dashboard
</div>
<h2 class="page-title">
Users
</h2>
</div>
</div>
</div>
</div>
<!-- Page body -->
<div class="page-body">
<div class="container-xl">
{% if flash %}
<div class="alert alert-{{flash.0}}" role="alert">
<h4 class="alert-title">{{ flash.1 | safe }}</h4>
</div>
{% endif %}
{% if local.is_archived %}
<div class="card">
<div class="card-header">
<h3 class="card-title">Archived user</h3>
</div>
<div class="card-body">
<p>This user is archived.</p>
<form action="{{ local.id }}/archive" method="post">
<button type="submit" name="restore" value="true"
class="btn btn-primary">
Restore user
</button>
</form>
</div>
</div>
{% else %}
<div class="card">
<div class="card-header">
<h3 class="card-title">User information</h3>
</div>
<div class="card-body">
<div class="datagrid">
<div class="datagrid-item">
<div class="datagrid-title">
<label class="required" for="username">Username</label>
</div>
<div class="datagrid-content">
<div class="input-icon">
<span class="input-icon-addon">
{% include "icons/id-badge-2" %}
</span>
<input name="username" id="username" value="{{ local.username }}" type="text"
placeholder="Enter a username"
class="form-control"
required>
</div>
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">
<label for="name">Full Name</label>
</div>
<div class="datagrid-content">
<div class="input-icon">
<span class="input-icon-addon">
{% include "icons/user" %}
</span>
<input name="name" id="name" value="{{ local.name }}" type="text"
placeholder="Napoleon Bonaparte"
class="form-control">
</div>
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">
<label for="email">Email address</label>
</div>
<div class="datagrid-content">
<div class="input-icon">
<span class="input-icon-addon">
{% include "icons/at" %}
</span>
<input name="email" id="email" value="{{ local.email }}" type="email"
placeholder="napoleon@bonaparte.fr"
class="form-control">
</div>
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">Admin status</div>
<div class="datagrid-content">
<div class="mt-2">
<label class="form-check">
{% if local.is_admin %}
<input class="form-check-input" type="checkbox" checked>
{% else %}
<input class="form-check-input" type="checkbox">
{% endif %}
<span class="form-check-label">Administrator</span>
</label>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<div class="d-flex">
<button type="submit" class="btn btn-primary ms-auto">Save</button>
</div>
</div>
</div>
<div class="mt-4 card">
<div class="card-header">
<h3 class="card-title">Security</h3>
</div>
<div class="card-body">
<div class="datagrid">
<div class="datagrid-item">
<div class="datagrid-title">Password</div>
<div class="datagrid-content">
<div>
{% if local.password %}
<span class="text-green">{% include "icons/check" %}</span>
Password is set
{% else %}
<span class="text-red">{% include "icons/x" %}</span>
Password is not set
{% endif %}
</div>
{% if local.password %}
<div class="mt-1">
{% if local.paper_key %}
<span class="text-green">{% include "icons/check" %}</span>
Paper key is set
{% else %}
<span class="text-red">{% include "icons/x" %}</span>
Paper key is not set
{% endif %}
</div>
{% endif %}
{% if local.password_recover %}
<div class="mt-1">
<span class="text-yellow">{% include "icons/progress" %}</span>
Password reset has been requested
</div>
{% endif %}
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">2FA (TOTP)</div>
<div class="datagrid-content">
<div>
{% if local.totp_secret %}
<span class="text-green">{% include "icons/check" %}</span>
TOTP is enabled
{% else %}
<span class="text-red">{% include "icons/x" %}</span>
TOTP is not enabled
{% endif %}
</div>
{% if local.totp_secret %}
<div class="mt-1">
{% if local.totp_backup %}
<span class="text-green">{% include "icons/check" %}</span>
TOTP backup is enabled
{% else %}
<span class="text-red">{% include "icons/x" %}</span>
TOTP backup is not enabled
{% endif %}
</div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<div class="mt-4 card">
<div class="card-header">
<h3 class="card-title">Timings</h3>
</div>
<div class="card-body">
<div class="datagrid">
<div class="datagrid-item">
<div class="datagrid-title">Account Creation</div>
<div class="datagrid-content">
{{ local.created_at | date(format="%F %T", timezone=user.zoneinfo | default(value="UTC")) }}
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">Account Modification</div>
<div class="datagrid-content">
{{ local.updated_at | date(format="%F %T", timezone=user.zoneinfo | default(value="UTC")) }}
</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">Account Timezone</div>
<div class="datagrid-content">{{ local.timezone }}</div>
</div>
</div>
</div>
</div>
<div class="mt-4 card">
<div class="card-header bg-danger-lt">
<h3 class="card-title">Danger zone</h3>
</div>
<div class="card-body">
<!-- Archive user -->
<div class="mb-4">
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#modal-archive">
Archive user
</a>
</div>
{% if local.password %}
<h2 class="mb-4">Password</h2>
<!-- Reset password -->
<div class="mb-4">
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#modal-password-reset">
Force password reset
</a>
</div>
<!-- Reset paper key -->
{% if local.paper_key %}
<div class="mb-4">
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#modal-paper-key">
Reset paper key
</a>
</div>
{% endif %}
{% endif %}
{% if local.totp_secret %}
<h2 class="mb-4">TOTP</h2>
<!-- Disable TOTP -->
<div class="mb-4">
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#modal-totp-secret">
Disable TOTP
</a>
</div>
{% if local.totp_backup %}
<!-- Delete TOTP backup -->
<div class="mb-4">
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#modal-totp-backup">
Delete TOTP backup
</a>
</div>
{% endif %}
{% endif %}
</div>
</div>
{% endif %}
</div>
</div>
<!-- Archive modal -->
<div class="modal modal-blur" tabindex="-1" id="modal-archive">
<div class="modal-dialog modal-sm modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-status bg-danger"></div>
<div class="modal-body text-center py-4">
<div class="text-danger mb-2">
{% include "icons/alert-triangle-large" %}
</div>
<h3>Do you want to archive this user?</h3>
<div class="mt-2">This user will not be able to log in.</div>
<div class="mt-2">This action can take up to {{ jwt_duration }} minutes to be effective.</div>
</div>
<div class="modal-footer">
<div class="w-100">
<div class="row">
<div class="col">
<a href="#" class="btn w-100" data-bs-dismiss="modal">Cancel</a>
</div>
<div class="col">
<form action="{{ local.id }}/archive" method="post">
<button type="submit" name="archive" value="true"
class="btn btn-danger w-100">
Archive user
</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block libs_js %}
{% endblock lib_js %}
{% block additional_js %}
{% endblock additional_js %}