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

<div class="span title">
  {{t common.metrics}} <i class="icon-question-sign"></i>
</div>
<ul class="display-inline-block nav nav-pills">
  {{#each metric in view.metrics}}
  {{view view.itemView metricBinding="metric" widgetBinding="view"}}
  {{/each}}

  <li class="dropdown">
    <a {{action toggleMore target="view"}} href="#">
      {{t metric.more}}
      <b class="caret"></b>
    </a>

    {{#if view.showMore}}
    <div class="accordion" id="metricAccordion">
      {{#each view.moreMetrics}}
      <div class="accordion-group">
        <div class="accordion-heading">
          <a class="accordion-toggle" data-toggle="collapse" data-parent="#metricAccordion"
             href="#{{unbound code}}Collapse">
            <i class="icon-play"></i>{{unbound label}}
          </a>
        </div>
        <div id="{{unbound code}}Collapse" class="accordion-body collapse">
          <div class="accordion-inner">
            {{#if items.length }}
            <ul class="items">
              {{#each metric in items}}
              {{view view.moreItemView metricBinding="metric" widgetBinding="view"}}
              {{/each}}
            </ul>
            {{else}}
            {{t metric.notFound}}
            {{/if}}
          </div>
        </div>
      </div>
      {{/each}}
    </div>
    {{/if}}
  </li>
</ul>