{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
{% set hide_left_bar = True %}
{% set h1_text = c.project.name ~ ' ' ~ 'Project' ~ ' ' ~ 'Member List' %}
{% set profile_path = 'profile/' if g.user_profile_urls_with_profile_path else '' %}
{% extends g.theme.master %}
{% block title %}{{ h1_text }}{% endblock %}
{% block header %}Members{% endblock %}
{% block content %}
<div class="grid-23">
<div style="overflow:auto">
<table>
    <thead>
    <tr>
        <th>Developer</th>
        <th>Username</th>
        <th>Role/Position</th>
    </tr>
    </thead>
    {%for user in users%}
    <tr>
        <td>{{ user.display_name }}</td>
        <td><a href="{{ user.url() ~ profile_path }}">{{ user.username }}</a></td>
        <td>{{user.roles}}</td>
    </tr>
    {%endfor%}
</table>
</div>
</div>
{% endblock %}
