{#-
       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" class="row">
<ul class="menu dropdown" data-dropdown-menu>
  {% for s in c.project.grouped_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.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.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-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 = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe }};
        $(document).ready(function () {
            $('#toggle-admin-btn').click(function () {
                if (typeof Main === 'undefined') {
                    alert('Compiled JS is missing.  Need to run `npm install; 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 install; 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 %}
