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

{% block title %}Trove categories{% endblock %}

{% block header %}Managing trove categories{% endblock %}

{% block content %}
  <div class="grid-20">
    {% if selected_cat %} 
      <div class="grid-20">
        <a href="/categories">Top-level categories</a>
        {% for cat in hierarchy %}
          &gt; <a href="/categories/{{cat.shortname}}">{{cat.fullname}}</a>
        {% endfor %}
        &gt; {{selected_cat.fullname}}
      </div>
      <h2>
        Sub-categories of {{selected_cat.fullname}}
      </h2>
    {% else %} 
      <h2>
        List of all top-level categories
      </h2>
    {% endif %}
   
    {% if categories|length > 0 %}
      <table>
        <thead>
          <tr>
            <th>Name</th>
            <th>Actions</th>
          </tr>
        </thead>
        <tbody>
          {% for cat in categories %}
              {{g.theme.remove_trove_category.display(category=cat)}}
          {% endfor %}
        </tbody>
      </table>
    {% else %}
      <div class="grid-20">
        There are no categories in this list.
      </div>
    {% endif %}
  </div>

  <div class="grid-20">
    <h2>Create a new item in this category</h2>
    {% if selected_cat %}
      {{g.theme.add_trove_category.display(uppercategory_id=selected_cat.trove_cat_id)}}
    {% else %}
      {{g.theme.add_trove_category.display(uppercategory_id=0)}}
    {% endif %}
    <div class="grid-20" style="margin-bottom:10px;">
      Are you done creating new categories? <a href="/auth/user_info/skills/{{selected_cat.shortname}}">Click here</a> to configure your skills!
    </div>

  </div>
{% endblock %}
