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 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"))
@ -107,6 +109,7 @@ def edit_group(group):
"group.html",
"partial/users.html",
form=form,
menuitem="groups",
edited_group=group,
table_form=table_form,
)

View file

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

View file

@ -15,6 +15,19 @@
<script src="/static/js/users.js"></script>
{% 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 %}
{% if edited_group %}
<div class="ui basic modal" id="modal-delete">
@ -89,18 +102,16 @@
</div>
{% if edited_group %}
<div class="ui segment">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
<div class="content">
{% trans %}Group members{% endtrans %}
</div>
</h2>
<div class="ui attached segment">
{{ table.search(table_form, "table.users") }}
</div>
{% include "partial/users.html" %}
{{ table.search(table_form, "table.users") }}
</div>
{% include "partial/users.html" %}
{% endif %}
{% endblock %}

View file

@ -5,20 +5,27 @@
{% trans %}Groups{% endtrans %}
{% endblock %}
{% block content %}
<div class="ui segment">
<a class="ui primary button" href="{{ url_for('groups.create_group') }}">{% trans %}Add a group{% endtrans %}</a>
</div>
{% block submenu %}
<nav class="ui bottom attached two item borderless menu">
<a class="active item" href="{{ url_for('groups.groups') }}">
<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">
<div class="content">
{% trans %}Groups{% endtrans %}
</div>
</h2>
<div class="ui attached segment">
{{ table.search(table_form, "table.groups") }}
</div>
{% include "partial/groups.html" %}
{{ table.search(table_form, "table.groups") }}
</div>
{% include "partial/groups.html" %}
{% endblock %}

View file

@ -9,11 +9,28 @@
<script src="/static/js/copy.js"></script>
{% 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 %}
<div class="invitationform">
{% if form_validated %}
<div class="ui attached segment">
<div class="ui segment">
<h2 class="ui center aligned header">
<div class="content">
{% if request.form["action"] == "generate" %}
@ -25,34 +42,31 @@
{% endif %}
</div>
</h2>
</div>
{% if request.form["action"] == "generate" %}
{% if request.form["action"] == "generate" %}
<div class="ui attached success message">
{% trans %}Here is the invitation link you can provide to the user you want to invite:{% endtrans %}
</div>
<div class="ui success message">
{% trans %}Here is the invitation link you can provide to the user you want to invite:{% endtrans %}
</div>
{% elif mail_sent %}
{% elif mail_sent %}
<div class="ui attached success message">
{% set email = form.mail.data %}
{% 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 %}
</div>
<div class="ui success message">
{% set email = form.mail.data %}
{% 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 %}
</div>
{% else %}
{% else %}
<div class="ui attached error message">
{% set email = form.mail.data %}
{% 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 %}
</div>
<div class="ui error message">
{% set email = form.mail.data %}
{% 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 %}
</div>
{% endif %}
{% endif %}
<div class="ui attached segment">
<div class="ui center aligned container">
<div class="ui fields">
<div class="ui action input">
@ -79,22 +93,20 @@
{% else %}
<div class="ui attached segment">
<div class="ui segment">
<h2 class="ui center aligned header">
<div class="content">
{{ _("Invite a user") }}
</div>
</h2>
</div>
<div class="ui attached message">
{% trans %}
After this form is sent, the recipient your indicated will receive an email
containing an account creation link.
{% endtrans %}
</div>
<div class="ui message">
{% trans %}
After this form is sent, the recipient your indicated will receive an email
containing an account creation link.
{% endtrans %}
</div>
<div class="ui attached segment">
<form method="POST"
id="{{ form.id or form.__class__.__name__|lower }}"
action="{{ request.url }}"

View file

@ -5,6 +5,31 @@
{% trans %}Emails{% endtrans %}
{% 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 %}
<div class="ui segment">
<h2 class="ui center aligned header">

View file

@ -9,8 +9,33 @@
<script src="/static/js/users.js"></script>
{% 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 %}
<div class="ui attached segment">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
<div class="content">
{% trans %}Codes{% endtrans %}

View file

@ -5,6 +5,31 @@
{% trans %}View an authorization{% endtrans %}
{% 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 %}
<div class="loginform">
<h3 class="ui top attached header">

View file

@ -5,14 +5,37 @@
{% trans %}Add a client{% endtrans %}
{% endblock %}
{% block content %}
<div class="loginform">
<h3 class="ui top attached header">
{% 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="active item" href="{{ url_for('oidc.clients.add') }}">
<i class="plus icon"></i>
{% 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">
{{ sui.render_form(form, _("Confirm")) }}
</div>
{% block content %}
<div class="ui top attached segment">
<h2 class="ui center aligned header">
{% trans %}Add a client{% endtrans %}
</h2>
{{ sui.render_form(form, _("Confirm")) }}
</div>
{% endblock %}

View file

@ -9,6 +9,31 @@
<script src="/static/js/admin/client_edit.js"></script>
{% 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 %}
<div class="ui basic modal">
<div class="ui icon header">
@ -24,65 +49,63 @@
</div>
</div>
<div class="loginform">
<h3 class="ui top attached header">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
{% trans %}Edit a client{% endtrans %}
</h3>
</h2>
<div class="ui attached clearing segment">
<div class="ui form">
<form id="readonly">
<div class="field">
<label>{% trans %}ID{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_id }}" readonly name="client_id">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</div>
<div class="ui form">
<form id="readonly">
<div class="field">
<label>{% trans %}ID{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_id }}" readonly name="client_id">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</div>
</div>
<div class="field">
<label>{% trans %}Secret{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_secret }}" readonly name="client_secret">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</div>
</div>
<div class="field">
<label>{% trans %}Secret{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_secret }}" readonly name="client_secret">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</div>
</div>
<div class="field">
<label>{% trans %}Issued at{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_id_issued_at }}" readonly name="client_id_issued_at">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</div>
</div>
<div class="field">
<label>{% trans %}Issued at{% endtrans %}</label>
<div class="ui cornor labeled input">
<input type="text" value="{{ client.client_id_issued_at }}" readonly name="client_id_issued_at">
<div class="ui corner label" title="{{ _("This field is not editable") }}">
<i class="lock icon"></i>
</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>
</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>
</form>
</div>
{% endblock %}

View file

@ -9,13 +9,33 @@
<script src="/static/js/users.js"></script>
{% 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 %}
<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">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
<div class="content">
{% trans %}Clients{% endtrans %}

View file

@ -9,8 +9,33 @@
<script src="/static/js/users.js"></script>
{% 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 %}
<div class="ui attached segment">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
<div class="content">
{% trans %}Tokens{% endtrans %}

View file

@ -10,6 +10,31 @@
<script src="/static/js/copy.js"></script>
{% 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 %}
<div id="modal-delete" class="ui basic modal">
<div class="ui icon header">

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -16,6 +16,27 @@
<script src="/static/js/profile.js"></script>
{% 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) %}
{% set lock_indicator = field.render_kw and ("readonly" in field.render_kw or "disabled" in field.render_kw) %}
{% if not edited_user %}

View file

@ -9,16 +9,27 @@
<script src="/static/js/users.js"></script>
{% 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 %}
<div class="ui 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">
<div class="ui top attached segment">
<h2 class="ui center aligned header">
<div class="content">
{% trans %}Users{% endtrans %}

View file

@ -25,77 +25,62 @@
<body>
{% block menu %}
{% if user and menu %}
<nav class="ui stackable labeled icon menu container">
{% if logo_url %}
<div class="header item">
<a href="/" class="logo">
<div class="ui container menu-container">
<nav class="ui stackable labeled icon seven item {% if self.submenu() | trim %}top attached{% endif %} menu">
{% if logo_url %}
<a href="/" class="item logo">
<img class="ui img" src="{{ logo_url }}" alt="{{ website_name }}" />
</a>
</div>
{% endif %}
{% if user.can_edit_self %}
<a class="item {% if menuitem == "profile" %}active{% endif %}"
href="{{ url_for('account.profile_edition', username=user.uid[0]) }}">
<i class="id card icon"></i>
{% trans %}My profile{% endtrans %}
{% endif %}
{% if user.can_edit_self %}
<a class="item {% if menuitem == "profile" %}active{% endif %}"
href="{{ url_for('account.profile_edition', username=user.uid[0]) }}">
<i class="id card icon"></i>
{% 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>
{% 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 %}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>
</nav>
{% block submenu %}{% endblock %}
</div>
{% endif %}
{% endblock %}
{% block container %}
<div class="ui container">
<div class="content">
<div class="ui content">
{{ flask.messages() }}
{% block content %}{% endblock %}
</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):
res = testclient.get("/users")
res.mustcontain("Invite a user")
res.mustcontain("Invite")
res = testclient.get("/profile")
res.mustcontain("Invite a user")
res.mustcontain("Invite")
testclient.get("/invite")
del testclient.app.config["SMTP"]
res = testclient.get("/users")
res.mustcontain(no="Invite a user")
res.mustcontain(no="Invite")
res = testclient.get("/profile")
res.mustcontain(no="Invite a user")
res.mustcontain(no="Invite")
testclient.get("/invite", status=500, expect_errors=True)