{{!
* 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.
}}

<!--dropdown menu for the items had dropdowns-->
{{#if view.isServicesItem}}
  <a {{bindAttr title="view.content.label" href="view.content.href" class="view.content.isView:views-button-container"}} data-toggle="collapse-sub-menu">
    <span class="toggle-icon glyphicon glyphicon-menu-down pull-right"></span>
    <span {{bindAttr class=":navigation-icon view.content.iconClass"}}></span>
    <span class="navigation-menu-item">{{{unbound view.content.label}}}</span>
  </a>
  {{view App.AllServicesActionView}}
  {{view App.SideNavServiceMenuView}}
{{else}}
  {{#if view.isAdminItem}}
    <a {{bindAttr data-original-title="view.content.label" href="view.content.href" class="view.content.isView:views-button-container"}} data-toggle="collapse-sub-menu">
      <span class="toggle-icon glyphicon glyphicon-menu-down pull-right"></span>
      <span {{bindAttr class=":navigation-icon view.content.iconClass"}}></span>
      <span class="navigation-menu-item">{{{unbound view.content.label}}}</span>
    </a>
    <ul class="admin-submenu sub-menu nav nav-pills nav-stacked">
      {{#each category in view.dropdownCategories}}
        {{#view view.AdminDropdownItemView itemBinding="category.name"}}
          <a {{bindAttr href="category.href"}} {{action "goToCategory" category.url target="view"}}>{{category.label}}</a>
        {{/view}}
      {{/each}}
    </ul>
  {{else}}
    <a {{action goToSection view.content.routing target="view"}} {{bindAttr data-original-title="view.content.label" href="view.content.href" class="view.content.isView:views-button-container"}}>
      <span {{bindAttr class=":navigation-icon view.content.iconClass"}}></span>
      <span class="navigation-menu-item">{{{unbound view.content.label}}}</span>
    </a>
  {{/if}}
{{/if}}





