{#-
       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 %}
{% import 'allura:templates/jinja_master/lib.html' as lib with context %}

{% block title %}{{c.project.name}} / Import{% endblock %}

{% block header %}Import{% endblock %}

{% block content %}
<p>
    To import from one of these external sources into your project, just click on "Import" and fill out the form.
</p>
<table>
    <thead>
    <tr>
        <th></th>
        {% for tool in tools|sort %}
            <th>{{tool}}</th>
        {% endfor %}
    </tr>
    </thead>
    {% for source in importer_matrix.keys()|sort  %}
        <tr>
        <td><strong>{{ source }}</strong></td>
        {% for tool in tools|sort %}
            <td>
                {% if importer_matrix[source].get(tool) %}
                <a href="{{ importer_matrix[source][tool] }}">Import</a>
                {% endif %}
            </td>
        {% endfor %}
        </tr>
    {% endfor %}
</table>
{% endblock %}
