<!--
  ~ 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.
  -->
<section class="grafana-metric-options">
	<div class="tight-form last">
		<ul class="tight-form-list">
			<li class="tight-form-item tight-form-item-icon">
				<i class="fa fa-info-circle"></i>
			</li>
			<li class="tight-form-item">
				<a ng-click="toggleEditorHelp(1);" bs-tooltip="'click to show helpful info'" data-placement="bottom">
					Single Stats
				</a>
			</li>
		</ul>
		<div class="clearfix"></div>
	</div>
</section>

<div class="editor-row">
	<div class="pull-left" style="margin-top: 30px;">
		<div class="grafana-info-box span6" ng-if="editorHelpIndex === 1">
			<h5>Single Stats</h5>
			<blockquote>To get the current value of the metric selected, Click on the <strong>Options</strong> tab above
				and set the <strong>Big Value's</strong> value to <strong>"current"</strong>.</blockquote>
		</div>
	</div>
</div>