{{!
* 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="glyphicon glyphicon-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="panel panel-default" id="metricAccordion">
      {{#each view.moreMetrics}}
      <div class="panel-group">
        <div class="panel-heading">
          <a class="panel-toggle" data-toggle="collapse" data-parent="#metricAccordion"
             href="#{{unbound code}}Collapse">
            <i class="glyphicon glyphicon-play"></i>{{unbound label}}
          </a>
        </div>
        <div id="{{unbound code}}Collapse" class="panel-body collapse">
          {{#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>
      {{/each}}
    </div>
    {{/if}}
  </li>
</ul>