{#-
       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.trove_cat_id}}">{{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
        <a href="/categories/browse">(browse all categories)</a>
      </h2>
    {% endif %}
   
    {% if categories|length > 0 %}
      <table>
        <thead>
          <tr>
            <th>Name</th>
            <th>Short 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, value=kw)}}
    {% else %}
      {{g.theme.add_trove_category.display(uppercategory_id=0, value=kw)}}
    {% endif %}
    <div class="grid-20" style="margin-bottom:10px;">
      Are you done creating new categories? <a href="/auth/user_info/skills/{{selected_cat.trove_cat_id}}">Click here</a> to configure your skills!
    </div>

  </div>
{% endblock %}
