{#-
       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.
-#}
{% if c.project %}
<div id="top_nav_admin">
<ul class="dropdown">
  {% set navbar_entries = c.project.grouped_navbar_entries() %}
  {% for s in navbar_entries %}
    <li class="{% if s.matches_url(request) %}selected{% endif %}">
        <a href="{{s.url}}" class="tool-{{(s.tool_name or 'admin').lower()}}-32" {{ s.extra_html_attrs|xmlattr }}>
            {{s.label}}
        </a>
        {% set grouped_tool_count = s.matching_urls|length %}
        {% if grouped_tool_count %}
            <ul>
                {%for tool in s.children%}
                    <li class="{% if tool.matches_url(request) %}selected{% endif %}"><a href="{{tool.url}}" {{ tool.extra_html_attrs|xmlattr }}>{{tool.label}}</a></li>
                {%endfor%}
            </ul>
        {% endif %}
    </li>
  {% endfor %}
  {% if h.has_access(c.project, 'admin') %}
    <li id="add-tool-container"><a href='#' class="add-tool-toggle">Add New...</a></li>
    <button id="toggle-admin-btn" title="Click to unlock the toolbar and configure your project's tools.">
        <i class="fa fa-lock"></i>
    </button>
  {% endif %}
</ul>
</div>
{% if h.has_access(c.project, 'admin') %}
    {% do g.register_forge_js('js/underscore-1.13.6.min.js') %}
    {% do g.register_forge_js('js/browser-polyfill.min.js') %}
    {% do lib.register_react_js_files() %}
    {% do g.register_forge_js('js/react-drag.min.js') %}
    {% do g.register_forge_js('js/react-reorderable.min.js') %}
    {% do g.register_forge_js('js/build/transpiled.js') %} {# if we do more es6, we'll need to register this in other places, or maybe even global #}
    <script>
        'use strict';
        /*global ReactDOM, React, Main, ToggleAddNewTool */
        var _data = {{ c.project.nav_data(admin_options=True, navbar_entries=navbar_entries)|tojson }};
        $(document).ready(function () {
            $('#toggle-admin-btn').click(function () {
                if (typeof Main === 'undefined') {
                    alert('Compiled JS is missing.  Need to run `npm ci; npm run build;` on the server.');
                    return;
                }
                ReactDOM.render(React.createElement(Main, {
                    initialData: _data
                }), document.getElementById("top_nav_admin"));
            });

            if (typeof ToggleAddNewTool === 'undefined') {
                $('#add-tool-container').click(function(){
                    alert('Compiled JS is missing.  Need to run `npm ci; npm run build;` on the server.');
                });
            } else {
                ReactDOM.render(React.createElement(ToggleAddNewTool, {
                        installableTools: _data['installable_tools']
                    }), document.getElementById('add-tool-container'));
            }
            $("#toggle-admin-btn").tooltipster({
                delay: 200,
                theme: 'tooltipster-light',
                position: 'top'
            });
        });
    </script>
{% endif %}
{% endif %}
