{#-
       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.
-#}
{% extends g.theme.master %}

{% do g.register_forge_css('css/forge/deck.css') %}

{% block title %}{{c.project.name}} / {{app.config.options.mount_label}} / Permissions{% endblock %}

{% block header %}{{app.config.options.mount_point}} Permissions{% endblock %}

{% block extra_css %}
<style>
  ul.deck {
    cursor: auto;
  }
</style>
{% endblock %}

{% block content %}
  {% if not (app.permissions and allow_config) %}
    You are not allowed to edit permissions for {{app.config.options.mount_point}}.
  {% else %}
    <form method="POST" action="update">
      {% for row in permissions|dictsort|batch(4) %}
      {% set i0=loop.index0  %}
      <div class="fourcol">
        {% for name, ids in row %}
        {% set i1 = i0*4 + loop.index0 %}
        {{c.card.display(
            index=i1,
            id=name,
            name=name,
            desc=app.describe_permission(name),
            items=h.make_roles(ids)
        )}}
        {% endfor %}
        <br style="clear:both"/>
      </div>
      {% endfor %}
      <hr/>
      <p class="clearfix">
        <input type="submit" value="Save">
        <a href="{{c.app.url}}" class="btn link cancel">Cancel</a>
      </p>
    </form>
  {%endif%}
{% endblock %}
