Introduced a submenu

This commit is contained in:
Éloi Rivard 2023-03-15 17:27:32 +01:00
parent 3ef07a955b
commit 69c67345c2
22 changed files with 441 additions and 193 deletions

View file

@ -51,7 +51,9 @@ def create_group(user):
) )
return redirect(url_for("groups.group", groupname=group.display_name)) return redirect(url_for("groups.group", groupname=group.display_name))
return render_template("group.html", form=form, edited_group=None, members=None) return render_template(
"group.html", menuitem="groups", form=form, edited_group=None, members=None
)
@bp.route("/<groupname>", methods=("GET", "POST")) @bp.route("/<groupname>", methods=("GET", "POST"))
@ -107,6 +109,7 @@ def edit_group(group):
"group.html", "group.html",
"partial/users.html", "partial/users.html",
form=form, form=form,
menuitem="groups",
edited_group=group, edited_group=group,
table_form=table_form, table_form=table_form,
) )

View file

@ -1,5 +1,3 @@
@media only screen and (min-width: 1200px) { @media only screen and (min-width: 1200px) {
.ui.ui.ui.container:not(.fluid) { .ui.ui.ui.container:not(.fluid) {
width: 770px; width: 770px;
@ -33,7 +31,8 @@ body {
} }
.logo { .logo {
margin: auto; margin-left: auto;
margin-right: auto;
display: block; display: block;
} }
@ -42,6 +41,14 @@ body {
max-height: 50px; max-height: 50px;
} }
.menu-container {
margin-bottom: 1em;
}
.menu-container .ui.item.menu {
justify-content: normal;
}
footer { footer {
font-size: x-small; font-size: x-small;
text-align: center; text-align: center;

View file

@ -15,6 +15,19 @@
<script src="/static/js/users.js"></script> <script src="/static/js/users.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached two item borderless menu">
<a class="{% if edited_group %}active {% endif %}item" href="{{ url_for('groups.groups') }}">
<i class="th list icon"></i>
{% trans %}View{% endtrans %}
</a>
<a class="{% if not edited_group %}active {% endif %}item" href="{{ url_for('groups.create_group') }}">
<i class="plus icon"></i>
{% trans %}Add{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
{% if edited_group %} {% if edited_group %}
<div class="ui basic modal" id="modal-delete"> <div class="ui basic modal" id="modal-delete">
@ -89,18 +102,16 @@
</div> </div>
{% if edited_group %} {% if edited_group %}
<div class="ui segment"> <div class="ui top attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Group members{% endtrans %} {% trans %}Group members{% endtrans %}
</div> </div>
</h2> </h2>
<div class="ui attached segment"> {{ table.search(table_form, "table.users") }}
{{ table.search(table_form, "table.users") }}
</div>
{% include "partial/users.html" %}
</div> </div>
{% include "partial/users.html" %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -5,20 +5,27 @@
{% trans %}Groups{% endtrans %} {% trans %}Groups{% endtrans %}
{% endblock %} {% endblock %}
{% block content %} {% block submenu %}
<div class="ui segment"> <nav class="ui bottom attached two item borderless menu">
<a class="ui primary button" href="{{ url_for('groups.create_group') }}">{% trans %}Add a group{% endtrans %}</a> <a class="active item" href="{{ url_for('groups.groups') }}">
</div> <i class="th list icon"></i>
{% trans %}View{% endtrans %}
</a>
<a class="item" href="{{ url_for('groups.create_group') }}">
<i class="plus icon"></i>
{% trans %}Add{% endtrans %}
</a>
</nav>
{% endblock %}
<div class="ui segment"> {% block content %}
<div class="ui top attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Groups{% endtrans %} {% trans %}Groups{% endtrans %}
</div> </div>
</h2> </h2>
<div class="ui attached segment"> {{ table.search(table_form, "table.groups") }}
{{ table.search(table_form, "table.groups") }}
</div>
{% include "partial/groups.html" %}
</div> </div>
{% include "partial/groups.html" %}
{% endblock %} {% endblock %}

View file

@ -9,11 +9,28 @@
<script src="/static/js/copy.js"></script> <script src="/static/js/copy.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached three item borderless menu">
<a class="item" href="{{ url_for('account.users') }}">
<i class="th list icon"></i>
{% trans %}View{% endtrans %}
</a>
<a class="item" href="{{ url_for('account.profile_creation') }}">
<i class="plus icon"></i>
{% trans %}Add{% endtrans %}
</a>
<a class="active item" href="{{ url_for('account.user_invitation') }}">
<i class="paper plane icon"></i>
{% trans %}Invite{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="invitationform"> <div class="invitationform">
{% if form_validated %} {% if form_validated %}
<div class="ui attached segment"> <div class="ui segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% if request.form["action"] == "generate" %} {% if request.form["action"] == "generate" %}
@ -25,34 +42,31 @@
{% endif %} {% endif %}
</div> </div>
</h2> </h2>
</div>
{% if request.form["action"] == "generate" %} {% if request.form["action"] == "generate" %}
<div class="ui attached success message"> <div class="ui success message">
{% trans %}Here is the invitation link you can provide to the user you want to invite:{% endtrans %} {% trans %}Here is the invitation link you can provide to the user you want to invite:{% endtrans %}
</div> </div>
{% elif mail_sent %} {% elif mail_sent %}
<div class="ui attached success message"> <div class="ui success message">
{% set email = form.mail.data %} {% set email = form.mail.data %}
{% trans %}This invitation link has been sent to {{ email }}{% endtrans %} {% trans %}This invitation link has been sent to {{ email }}{% endtrans %}
{% trans %}If you need to provide this link by other ways than email, you can copy it there:{% endtrans %} {% trans %}If you need to provide this link by other ways than email, you can copy it there:{% endtrans %}
</div> </div>
{% else %} {% else %}
<div class="ui attached error message"> <div class="ui error message">
{% set email = form.mail.data %} {% set email = form.mail.data %}
{% trans %}This invitation link could not be sent to {{ email }} due to technical issues.{% endtrans %} {% trans %}This invitation link could not be sent to {{ email }} due to technical issues.{% endtrans %}
{% trans %}However you can copy the link there to provide it by other ways than email:{% endtrans %} {% trans %}However you can copy the link there to provide it by other ways than email:{% endtrans %}
</div> </div>
{% endif %} {% endif %}
<div class="ui attached segment">
<div class="ui center aligned container"> <div class="ui center aligned container">
<div class="ui fields"> <div class="ui fields">
<div class="ui action input"> <div class="ui action input">
@ -79,22 +93,20 @@
{% else %} {% else %}
<div class="ui attached segment"> <div class="ui segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{{ _("Invite a user") }} {{ _("Invite a user") }}
</div> </div>
</h2> </h2>
</div>
<div class="ui attached message"> <div class="ui message">
{% trans %} {% trans %}
After this form is sent, the recipient your indicated will receive an email After this form is sent, the recipient your indicated will receive an email
containing an account creation link. containing an account creation link.
{% endtrans %} {% endtrans %}
</div> </div>
<div class="ui attached segment">
<form method="POST" <form method="POST"
id="{{ form.id or form.__class__.__name__|lower }}" id="{{ form.id or form.__class__.__name__|lower }}"
action="{{ request.url }}" action="{{ request.url }}"

View file

@ -5,6 +5,31 @@
{% trans %}Emails{% endtrans %} {% trans %}Emails{% endtrans %}
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="active item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui segment"> <div class="ui segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">

View file

@ -9,8 +9,33 @@
<script src="/static/js/users.js"></script> <script src="/static/js/users.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui attached segment"> <div class="ui top attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Codes{% endtrans %} {% trans %}Codes{% endtrans %}

View file

@ -5,6 +5,31 @@
{% trans %}View an authorization{% endtrans %} {% trans %}View an authorization{% endtrans %}
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="loginform"> <div class="loginform">
<h3 class="ui top attached header"> <h3 class="ui top attached header">

View file

@ -5,14 +5,37 @@
{% trans %}Add a client{% endtrans %} {% trans %}Add a client{% endtrans %}
{% endblock %} {% endblock %}
{% block content %} {% block submenu %}
<div class="loginform"> <nav class="ui bottom attached five item borderless menu">
<h3 class="ui top attached header"> <a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %} {% trans %}Add a client{% endtrans %}
</h3> </a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
<div class="ui attached clearing segment"> {% block content %}
{{ sui.render_form(form, _("Confirm")) }} <div class="ui top attached segment">
</div> <h2 class="ui center aligned header">
{% trans %}Add a client{% endtrans %}
</h2>
{{ sui.render_form(form, _("Confirm")) }}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -9,6 +9,31 @@
<script src="/static/js/admin/client_edit.js"></script> <script src="/static/js/admin/client_edit.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui basic modal"> <div class="ui basic modal">
<div class="ui icon header"> <div class="ui icon header">
@ -24,65 +49,63 @@
</div> </div>
</div> </div>
<div class="loginform"> <div class="ui top attached segment">
<h3 class="ui top attached header"> <h2 class="ui center aligned header">
{% trans %}Edit a client{% endtrans %} {% trans %}Edit a client{% endtrans %}
</h3> </h2>
<div class="ui attached clearing segment"> <div class="ui form">
<div class="ui form"> <form id="readonly">
<form id="readonly"> <div class="field">
<div class="field"> <label>{% trans %}ID{% endtrans %}</label>
<label>{% trans %}ID{% endtrans %}</label> <div class="ui cornor labeled input">
<div class="ui cornor labeled input"> <input type="text" value="{{ client.client_id }}" readonly name="client_id">
<input type="text" value="{{ client.client_id }}" readonly name="client_id"> <div class="ui corner label" title="{{ _("This field is not editable") }}">
<div class="ui corner label" title="{{ _("This field is not editable") }}"> <i class="lock icon"></i>
<i class="lock icon"></i>
</div>
</div> </div>
</div> </div>
<div class="field"> </div>
<label>{% trans %}Secret{% endtrans %}</label> <div class="field">
<div class="ui cornor labeled input"> <label>{% trans %}Secret{% endtrans %}</label>
<input type="text" value="{{ client.client_secret }}" readonly name="client_secret"> <div class="ui cornor labeled input">
<div class="ui corner label" title="{{ _("This field is not editable") }}"> <input type="text" value="{{ client.client_secret }}" readonly name="client_secret">
<i class="lock icon"></i> <div class="ui corner label" title="{{ _("This field is not editable") }}">
</div> <i class="lock icon"></i>
</div> </div>
</div> </div>
<div class="field"> </div>
<label>{% trans %}Issued at{% endtrans %}</label> <div class="field">
<div class="ui cornor labeled input"> <label>{% trans %}Issued at{% endtrans %}</label>
<input type="text" value="{{ client.client_id_issued_at }}" readonly name="client_id_issued_at"> <div class="ui cornor labeled input">
<div class="ui corner label" title="{{ _("This field is not editable") }}"> <input type="text" value="{{ client.client_id_issued_at }}" readonly name="client_id_issued_at">
<i class="lock icon"></i> <div class="ui corner label" title="{{ _("This field is not editable") }}">
</div> <i class="lock icon"></i>
</div> </div>
</div> </div>
</form>
</div>
<form method="POST"
id="{{ form.__class__.__name__|lower }}"
action="{{ form.action }}"
role="form"
enctype="multipart/form-data"
class="ui form"
>
{{ sui.render_fields(form) }}
<div class="ui right aligned container">
<div class="ui stackable buttons">
<button type="submit" class="ui right floated negative basic button confirm" name="action" value="delete" id="delete">
{{ _("Delete the client") }}
</button>
<button type="submit" class="ui right floated primary button" name="action" value="edit" id="edit">
{{ _("Edit") }}
</button>
</div>
</div> </div>
</form> </form>
</div> </div>
<form method="POST"
id="{{ form.__class__.__name__|lower }}"
action="{{ form.action }}"
role="form"
enctype="multipart/form-data"
class="ui form"
>
{{ sui.render_fields(form) }}
<div class="ui right aligned container">
<div class="ui stackable buttons">
<button type="submit" class="ui right floated negative basic button confirm" name="action" value="delete" id="delete">
{{ _("Delete the client") }}
</button>
<button type="submit" class="ui right floated primary button" name="action" value="edit" id="edit">
{{ _("Edit") }}
</button>
</div>
</div>
</form>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -9,13 +9,33 @@
<script src="/static/js/users.js"></script> <script src="/static/js/users.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui top attached segment">
<div class="ui segment">
<a class="ui primary button" href="{{ url_for('oidc.clients.add') }}">{% trans %}Add client{% endtrans %}</a>
</div>
<div class="ui attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Clients{% endtrans %} {% trans %}Clients{% endtrans %}

View file

@ -9,8 +9,33 @@
<script src="/static/js/users.js"></script> <script src="/static/js/users.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui attached segment"> <div class="ui top attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Tokens{% endtrans %} {% trans %}Tokens{% endtrans %}

View file

@ -10,6 +10,31 @@
<script src="/static/js/copy.js"></script> <script src="/static/js/copy.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached five item borderless menu">
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="th list icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% trans %}Add a client{% endtrans %}
</a>
<a class="active item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
</nav>
{% endblock %}
{% block content %} {% block content %}
<div id="modal-delete" class="ui basic modal"> <div id="modal-delete" class="ui basic modal">
<div class="ui icon header"> <div class="ui icon header">

View file

@ -1,5 +1,5 @@
{% import "macro/table.html" as table %} {% import "macro/table.html" as table %}
<table class="ui attached table groups"> <table class="ui bottom attached table groups">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>

View file

@ -1,5 +1,5 @@
{% import "macro/table.html" as table %} {% import "macro/table.html" as table %}
<table class="ui attached table codes"> <table class="ui bottom attached table codes">
<thead> <thead>
<tr> <tr>
<th>{% trans %}Code{% endtrans %}</th> <th>{% trans %}Code{% endtrans %}</th>

View file

@ -1,5 +1,5 @@
{% import "macro/table.html" as table %} {% import "macro/table.html" as table %}
<table class="ui attached table clients"> <table class="ui bottom attached table clients">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>

View file

@ -1,5 +1,5 @@
{% import "macro/table.html" as table %} {% import "macro/table.html" as table %}
<table class="ui attached table tokens"> <table class="ui bottom attached table tokens">
<thead> <thead>
<tr> <tr>
<th>{% trans %}Token{% endtrans %}</th> <th>{% trans %}Token{% endtrans %}</th>

View file

@ -1,5 +1,5 @@
{% import "macro/table.html" as table %} {% import "macro/table.html" as table %}
<table class="ui attached table users"> <table class="ui bottom attached table users">
<thead> <thead>
<tr> <tr>
{% if user.can_read("jpegPhoto") %} {% if user.can_read("jpegPhoto") %}

View file

@ -16,6 +16,27 @@
<script src="/static/js/profile.js"></script> <script src="/static/js/profile.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
{% if not edited_user or edited_user != user %}
<nav class="ui bottom attached {% if has_smtp %}three{% else %}two{% endif %} item borderless menu">
<a class="{% if edited_user %}active {% endif %}item" href="{{ url_for('account.users') }}">
<i class="th list icon"></i>
{% trans %}View{% endtrans %}
</a>
<a class="{% if not edited_user %}active {% endif %}item" href="{{ url_for('account.profile_creation') }}">
<i class="plus icon"></i>
{% trans %}Add{% endtrans %}
</a>
{% if has_smtp %}
<a class="item" href="{{ url_for('account.user_invitation') }}">
<i class="paper plane icon"></i>
{% trans %}Invite{% endtrans %}
</a>
{% endif %}
</nav>
{% endif %}
{% endblock %}
{% macro render_field(field, noindicator=false) %} {% macro render_field(field, noindicator=false) %}
{% set lock_indicator = field.render_kw and ("readonly" in field.render_kw or "disabled" in field.render_kw) %} {% set lock_indicator = field.render_kw and ("readonly" in field.render_kw or "disabled" in field.render_kw) %}
{% if not edited_user %} {% if not edited_user %}

View file

@ -9,16 +9,27 @@
<script src="/static/js/users.js"></script> <script src="/static/js/users.js"></script>
{% endblock %} {% endblock %}
{% block submenu %}
<nav class="ui bottom attached {% if has_smtp %}three{% else %}two{% endif %} item borderless menu">
<a class="active item" href="{{ url_for('account.users') }}">
<i class="th list icon"></i>
{% trans %}View{% endtrans %}
</a>
<a class="item" href="{{ url_for('account.profile_creation') }}">
<i class="plus icon"></i>
{% trans %}Add{% endtrans %}
</a>
{% if has_smtp %}
<a class="item" href="{{ url_for('account.user_invitation') }}">
<i class="paper plane icon"></i>
{% trans %}Invite{% endtrans %}
</a>
{% endif %}
</nav>
{% endblock %}
{% block content %} {% block content %}
<div class="ui segment"> <div class="ui top attached segment">
<div class="ui stackable buttons">
<a class="ui primary button" href="{{ url_for('account.profile_creation') }}">{% trans %}Add a user{% endtrans %}</a>
{% if has_smtp %}
<a class="ui button" href="{{ url_for('account.user_invitation') }}">{% trans %}Invite a user{% endtrans %}</a>
{% endif %}
</div>
</div>
<div class="ui attached segment">
<h2 class="ui center aligned header"> <h2 class="ui center aligned header">
<div class="content"> <div class="content">
{% trans %}Users{% endtrans %} {% trans %}Users{% endtrans %}

View file

@ -25,77 +25,62 @@
<body> <body>
{% block menu %} {% block menu %}
{% if user and menu %} {% if user and menu %}
<nav class="ui stackable labeled icon menu container"> <div class="ui container menu-container">
{% if logo_url %} <nav class="ui stackable labeled icon seven item {% if self.submenu() | trim %}top attached{% endif %} menu">
<div class="header item"> {% if logo_url %}
<a href="/" class="logo"> <a href="/" class="item logo">
<img class="ui img" src="{{ logo_url }}" alt="{{ website_name }}" /> <img class="ui img" src="{{ logo_url }}" alt="{{ website_name }}" />
</a> </a>
</div> {% endif %}
{% endif %}
{% if user.can_edit_self %} {% if user.can_edit_self %}
<a class="item {% if menuitem == "profile" %}active{% endif %}" <a class="item {% if menuitem == "profile" %}active{% endif %}"
href="{{ url_for('account.profile_edition', username=user.uid[0]) }}"> href="{{ url_for('account.profile_edition', username=user.uid[0]) }}">
<i class="id card icon"></i> <i class="id card icon"></i>
{% trans %}My profile{% endtrans %} {% trans %}Profile{% endtrans %}
</a>
{% endif %}
{% if user.can_use_oidc %}
<a class="item {% if menuitem == "consents" %}active{% endif %}"
href="{{ url_for('oidc.consents.consents') }}">
<i class="handshake icon"></i>
{% trans %}Consents{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_users %}
<a class="item {% if menuitem == "users" %}active{% endif %}"
href="{{ url_for('account.users') }}">
<i class="address book icon"></i>
{% trans %}Users{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_groups %}
<a class="item {% if menuitem == "groups" %}active{% endif %}"
href="{{ url_for('groups.groups') }}">
<i class="users icon"></i>
{% trans %}Groups{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_oidc %}
<a class="item {% if menuitem == "admin" %}active{% endif %}" href="{{ url_for('admin.mail_index') }}">
<i class="settings icon"></i>
{% trans %}Admin{% endtrans %}
</a>
{% endif %}
<a class="item" href="{{ url_for('account.logout') }}">
<i class="sign out alternate icon"></i>
{% trans %}Log out{% endtrans %}
</a> </a>
{% endif %} </nav>
{% if user.can_use_oidc %} {% block submenu %}{% endblock %}
<a class="item {% if menuitem == "consents" %}active{% endif %}" </div>
href="{{ url_for('oidc.consents.consents') }}">
<i class="handshake icon"></i>
{% trans %}My consents{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_users %}
<a class="item {% if menuitem == "users" %}active{% endif %}"
href="{{ url_for('account.users') }}">
<i class="address book icon"></i>
{% trans %}Users{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_groups %}
<a class="item {% if menuitem == "groups" %}active{% endif %}"
href="{{ url_for('groups.groups') }}">
<i class="users icon"></i>
{% trans %}Groups{% endtrans %}
</a>
{% endif %}
{% if user.can_manage_oidc %}
<div class="ui dropdown item {% if menuitem == "admin" %}dropdown-active{% endif %}">
<i class="settings icon"></i>
{% trans %}Admin{% endtrans %}
<div class="menu">
<a class="item" href="{{ url_for('oidc.clients.index') }}">
<i class="plug icon"></i>
{% trans %}Clients{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.tokens.index') }}">
<i class="key icon"></i>
{% trans %}Tokens{% endtrans %}
</a>
<a class="item" href="{{ url_for('oidc.authorizations.index') }}">
<i class="user secret icon"></i>
{% trans %}Codes{% endtrans %}
</a>
<a class="item" href="{{ url_for('admin.mail_index') }}">
<i class="user mail icon"></i>
{% trans %}Emails{% endtrans %}
</a>
</div>
</div>
{% endif %}
<a class="item" href="{{ url_for('account.logout') }}">
<i class="sign out alternate icon"></i>
{% trans %}Log out{% endtrans %}
</a>
</nav>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block container %} {% block container %}
<div class="ui container"> <div class="ui container">
<div class="content"> <div class="ui content">
{{ flask.messages() }} {{ flask.messages() }}
{% block content %}{% endblock %} {% block content %}{% endblock %}
</div> </div>

View file

@ -253,17 +253,17 @@ def test_no_registration_if_logged_in(testclient, logged_user, foo_group):
def test_unavailable_if_no_smtp(testclient, logged_admin): def test_unavailable_if_no_smtp(testclient, logged_admin):
res = testclient.get("/users") res = testclient.get("/users")
res.mustcontain("Invite a user") res.mustcontain("Invite")
res = testclient.get("/profile") res = testclient.get("/profile")
res.mustcontain("Invite a user") res.mustcontain("Invite")
testclient.get("/invite") testclient.get("/invite")
del testclient.app.config["SMTP"] del testclient.app.config["SMTP"]
res = testclient.get("/users") res = testclient.get("/users")
res.mustcontain(no="Invite a user") res.mustcontain(no="Invite")
res = testclient.get("/profile") res = testclient.get("/profile")
res.mustcontain(no="Invite a user") res.mustcontain(no="Invite")
testclient.get("/invite", status=500, expect_errors=True) testclient.get("/invite", status=500, expect_errors=True)