{% extends "layouts/settings.html" %} {% comment %} The team, in the shape contacts/tag_list.html established — but three lists on one page rather than one, so each gets its own .section-title over its own card. The invite form's field names are untouched: apps/members/views.py parses `ws_` and `ws_role_` by exact string, so the per-workspace pairs have to keep spelling themselves that way however they are laid out. Changing somebody's role is an inline reveal off the "…" rather than a select sitting in every row. A dropdown that silently posts on change, on a control that can demote the person reading it, is not a thing to leave lying in a list. {% endcomment %} {% load common_extras %} {% block title %}Team members · DemandTrail Messaging{% endblock %} {% block content_wrap %}{% endblock %} {% block content %}
{% if can_invite %} {% modal "invite-member" title="Invite someone" size="lg" %}
{% csrf_token %}
Workspace access {% for workspace in workspaces %}
{% empty %}

You cannot manage members in any workspace yet.

{% endfor %}
{% endmodal %} {% endif %}

Members

{% if rows %}
{% for row in rows %}
{{ row.membership.user.display_name|make_list|first|upper }}
{{ row.membership.user.display_name }} {{ row.membership.get_org_role_display }}
{{ row.membership.user.email }}
Manage access {% if is_admin and row.can_manage %}
{% csrf_token %}
{% endif %}
{% endfor %}
{% else %}

Nobody here yet

Invite the people who answer messages with you.

{% endif %}

Pending invitations

{% if invitations %}
{% for invite in invitations %}
{% include "partials/_nav_icon.html" with name="user" icon_size=19 %}
{{ invite.email }} {{ invite.get_org_role_display }}
Expires {{ invite.expires_at }}
{% if is_admin %}
{% csrf_token %}
{% csrf_token %}
{% endif %}
{% endfor %}
{% else %}

No pending invitations

Invitations you send appear here until they are accepted.

{% endif %}
{% endblock %} {% block alpine_components %}{{ block.super }}{% include "partials/_list_behaviours.html" %}{% endblock %}