{#-
       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.
-#}
<!DOCTYPE html>
{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
<form method="post" action="{{c.project.url()}}admin/{{app.config.options.mount_point}}/configure">
  {% for o in app.config_options if o.name not in ['mount_point', 'mount_label', 'ordinal'] %}
    <label for="{{o.name}}" class="grid-4">{{o.label}}</label>
    <div class="grid-9">
      {% if not allow_config %}
           {{app.config.options.get(o.name, o.default)}}
      {% else%}
        {% if o.ming_type.__name__ == 'bool' %}
            <input {{o.render_attrs()}} id="{{o.name}}" name="{{o.name}}" type="checkbox"{{ ' checked="checked"' if app.config.options.get(o.name, o.default)}}>
        {% else %}
            <input {{o.render_attrs()}} id="{{o.name}}" name="{{o.name}}" value="{{app.config.options.get(o.name, o.default)}}">
        {% endif %}
        {% if o.help_text %}
          <div class="grid-9"><small>{{o.help_text}}</small></div>
        {% endif %}
      {% endif %}
    </div>
  {% else %}
    <p>No options to administer for {{app.config.options.mount_point}}.</p>
  {% endfor %}
  {% if allow_config %}
    <div class="grid-13">&nbsp;</div>
    <hr>
    <div class="grid-13">&nbsp;</div>
    <div class="grid-13">
      <input type="submit" value="Save"/>
      <a href="#" class="close">Cancel</a>
    </div>
  {% endif %}
  {{lib.csrf_token()}}
</form>
