12 |
- (self.webpackChunkgrafana=self.webpackChunkgrafana||[]).push([[4704],{11461:(t,e,n)=>{var l={"./angular/panel/partials/query_editor_row.html":91512,"./angular/partials/http_settings.html":96284,"./angular/partials/http_settings_next.html":59654,"./angular/partials/tls_auth_settings.html":12698,"./features/admin/partials/admin_home.html":82843,"./features/admin/partials/edit_org.html":14229,"./features/admin/partials/stats.html":19410,"./features/admin/partials/styleguide.html":71238,"./features/alerting/partials/alert_tab.html":88762,"./features/annotations/partials/event_editor.html":38906,"./partials/confirm_modal.html":78502,"./partials/modal.html":55274,"./partials/reset_password.html":61686,"./partials/signup_invited.html":35847,"./plugins/datasource/elasticsearch/partials/annotations.editor.html":25938,"./plugins/datasource/graphite/partials/annotations.editor.html":71064,"./plugins/datasource/graphite/partials/query.editor.html":35485,"./plugins/datasource/influxdb/partials/annotations.editor.html":89613,"./plugins/datasource/loki/partials/annotations.editor.html":87910,"./plugins/datasource/mssql/partials/annotations.editor.html":7314,"./plugins/datasource/mssql/partials/config.html":3246,"./plugins/datasource/mssql/partials/query.editor.html":34941,"./plugins/datasource/mysql/partials/annotations.editor.html":79939,"./plugins/datasource/mysql/partials/config.html":42100,"./plugins/datasource/mysql/partials/query.editor.html":50541,"./plugins/datasource/opentsdb/partials/annotations.editor.html":6404,"./plugins/datasource/opentsdb/partials/query.editor.html":21315,"./plugins/datasource/postgres/partials/annotations.editor.html":17077,"./plugins/datasource/postgres/partials/config.html":49463,"./plugins/datasource/postgres/partials/query.editor.html":26948,"./plugins/panel/graph/axes_editor.html":11675,"./plugins/panel/graph/tab_display.html":3205,"./plugins/panel/graph/tab_legend.html":49699,"./plugins/panel/graph/tab_series_overrides.html":85668,"./plugins/panel/graph/tab_thresholds.html":53233,"./plugins/panel/graph/tab_time_regions.html":59625,"./plugins/panel/graph/thresholds_form.html":17693,"./plugins/panel/graph/time_regions_form.html":99076,"./plugins/panel/heatmap/module.html":6438,"./plugins/panel/heatmap/partials/axes_editor.html":27546,"./plugins/panel/heatmap/partials/display_editor.html":48885,"./plugins/panel/table-old/column_options.html":26249,"./plugins/panel/table-old/editor.html":2700,"./plugins/panel/table-old/module.html":33807,"app/angular/panel/partials/query_editor_row.html":91512,"app/angular/partials/http_settings.html":96284,"app/angular/partials/http_settings_next.html":59654,"app/angular/partials/tls_auth_settings.html":12698,"app/features/admin/partials/admin_home.html":82843,"app/features/admin/partials/edit_org.html":14229,"app/features/admin/partials/stats.html":19410,"app/features/admin/partials/styleguide.html":71238,"app/features/alerting/partials/alert_tab.html":88762,"app/features/annotations/partials/event_editor.html":38906,"app/partials/confirm_modal.html":78502,"app/partials/modal.html":55274,"app/partials/reset_password.html":61686,"app/partials/signup_invited.html":35847,"app/plugins/datasource/elasticsearch/partials/annotations.editor.html":25938,"app/plugins/datasource/graphite/partials/annotations.editor.html":71064,"app/plugins/datasource/graphite/partials/query.editor.html":35485,"app/plugins/datasource/influxdb/partials/annotations.editor.html":89613,"app/plugins/datasource/loki/partials/annotations.editor.html":87910,"app/plugins/datasource/mssql/partials/annotations.editor.html":7314,"app/plugins/datasource/mssql/partials/config.html":3246,"app/plugins/datasource/mssql/partials/query.editor.html":34941,"app/plugins/datasource/mysql/partials/annotations.editor.html":79939,"app/plugins/datasource/mysql/partials/config.html":42100,"app/plugins/datasource/mysql/partials/query.editor.html":50541,"app/plugins/datasource/opentsdb/partials/annotations.editor.html":6404,"app/plugins/datasource/opentsdb/partials/query.editor.html":21315,"app/plugins/datasource/postgres/partials/annotations.editor.html":17077,"app/plugins/datasource/postgres/partials/config.html":49463,"app/plugins/datasource/postgres/partials/query.editor.html":26948,"app/plugins/panel/graph/axes_editor.html":11675,"app/plugins/panel/graph/tab_display.html":3205,"app/plugins/panel/graph/tab_legend.html":49699,"app/plugins/panel/graph/tab_series_overrides.html":85668,"app/plugins/panel/graph/tab_thresholds.html":53233,"app/plugins/panel/graph/tab_time_regions.html":59625,"app/plugins/panel/graph/thresholds_form.html":17693,"app/plugins/panel/graph/time_regions_form.html":99076,"app/plugins/panel/heatmap/module.html":6438,"app/plugins/panel/heatmap/partials/axes_editor.html":27546,"app/plugins/panel/heatmap/partials/display_editor.html":48885,"app/plugins/panel/table-old/column_options.html":26249,"app/plugins/panel/table-old/editor.html":2700,"app/plugins/panel/table-old/module.html":33807};function a(t){var e=r(t);return n(e)}function r(t){if(!n.o(l,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return l[t]}a.keys=function(){return Object.keys(l)},a.resolve=r,t.exports=a,a.id=11461},91512:t=>{var e="public/app/angular/panel/partials/query_editor_row.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div ng-transclude class="gf-form-query-content"></div>\n\n')}]),t.exports=e},96284:t=>{var e="public/app/angular/partials/http_settings.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,"")}]),t.exports=e},59654:t=>{var e="public/app/angular/partials/http_settings_next.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<datasource-http-settings-next on-change="onChange" datasourceconfig="current" showaccessoptions="showAccessOption" defaulturl="suggestUrl" showforwardoauthidentityoption="showForwardOAuthIdentityOption">\n')}]),t.exports=e},12698:t=>{var e="public/app/angular/partials/tls_auth_settings.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form">\n <h6>TLS/SSL Auth Details</h6>\n <info-popover mode="header">TLS/SSL certificates are encrypted and stored in the Grafana database.</info-popover>\n </div>\n <div ng-if="current.jsonData.tlsAuthWithCACert">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--v-stretch"><label class="gf-form-label width-7">CA Cert</label></div>\n <div class="gf-form gf-form--grow" ng-if="!current.secureJsonFields.tlsCACert">\n <textarea rows="7" class="gf-form-input gf-form-textarea" ng-model="current.secureJsonData.tlsCACert" placeholder="Begins with -----BEGIN CERTIFICATE-----"></textarea>\n </div>\n\n <div class="gf-form" ng-if="current.secureJsonFields.tlsCACert">\n <input type="text" class="gf-form-input max-width-12" disabled="disabled" value="configured">\n <button type="reset" aria-label="Reset CA Cert" class="btn btn-secondary gf-form-btn" ng-click="current.secureJsonFields.tlsCACert = false">\n reset\n </button>\n </div>\n </div>\n </div>\n\n <div ng-if="current.jsonData.tlsAuth">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--v-stretch"><label class="gf-form-label width-7">Client Cert</label></div>\n <div class="gf-form gf-form--grow" ng-if="!current.secureJsonFields.tlsClientCert">\n <textarea rows="7" class="gf-form-input gf-form-textarea" ng-model="current.secureJsonData.tlsClientCert" placeholder="Begins with -----BEGIN CERTIFICATE-----" required></textarea>\n </div>\n <div class="gf-form" ng-if="current.secureJsonFields.tlsClientCert">\n <input type="text" class="gf-form-input max-width-12" disabled="disabled" value="configured">\n <button class="btn btn-secondary gf-form-btn" aria-label="Reset Client Cert" type="reset" ng-click="current.secureJsonFields.tlsClientCert = false">\n reset\n </button>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form gf-form--v-stretch"><label class="gf-form-label width-7">Client Key</label></div>\n <div class="gf-form gf-form--grow" ng-if="!current.secureJsonFields.tlsClientKey">\n <textarea rows="7" class="gf-form-input gf-form-textarea" ng-model="current.secureJsonData.tlsClientKey" placeholder="Begins with -----BEGIN RSA PRIVATE KEY-----" required></textarea>\n </div>\n <div class="gf-form" ng-if="current.secureJsonFields.tlsClientKey">\n <input type="text" class="gf-form-input max-width-12" disabled="disabled" value="configured">\n <button class="btn btn-secondary gf-form-btn" type="reset" aria-label="Reset Client Key" ng-click="current.secureJsonFields.tlsClientKey = false">\n reset\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]),t.exports=e},82843:t=>{var e="public/app/features/admin/partials/admin_home.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="ctrl.navModel"></page-header>\n\n<div class="page-container page-body">\n\n <div class="grafana-info-box span8">\n Grafana is a multi-tenant system where most can be configured per organization. These\n admin pages are for server admins where you can manage orgs, & all users across all orgs.\n </div>\n\n</div>\n\n<footer>\n')}]),t.exports=e},14229:t=>{var e="public/app/features/admin/partials/edit_org.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="navModel"></page-header>\n\n<div class="page-container page-body">\n <h3 class="page-sub-heading">Edit Organization</h3>\n\n <form name="orgDetailsForm" class="gf-form-group">\n <div class="gf-form">\n <span class="gf-form-label width-10">Name</span>\n <input type="text" required ng-model="org.name" class="gf-form-input max-width-14">\n </div>\n\n <div class="gf-form-button-row">\n <button type="submit" class="btn btn-primary" ng-click="update()" ng-show="!createMode">Update</button>\n </div>\n </form>\n\n <h3 class="page-heading">Organization Users</h3>\n\n <table class="filter-table">\n <tr>\n <th>Username</th>\n <th>Email</th>\n <th>Role</th>\n <th></th>\n </tr>\n <tr ng-repeat="orgUser in orgUsers">\n <td>{{orgUser.login}}</td>\n <td>{{orgUser.email}}</td>\n <td>\n <div class="gf-form">\n <span class="gf-form-select-wrapper">\n <select type="text" ng-model="orgUser.role" class="gf-form-input max-width-8" ng-options="f for f in [\'Viewer\', \'Editor\', \'Admin\']" ng-change="updateOrgUser(orgUser)">\n </select>\n </span>\n </div>\n </td>\n <td style="width: 1%">\n <a ng-click="removeOrgUser(orgUser)" class="btn btn-danger btn-small">\n <icon name="\'times\'" style="margin-bottom: 0;"></icon>\n </a>\n </td>\n </tr>\n </table>\n</div>\n\n<footer>\n')}]),t.exports=e},19410:t=>{var e="public/app/features/admin/partials/stats.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="ctrl.navModel"></page-header>\n\n<div class="page-container page-body">\n\t<table class="filter-table form-inline">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th>Name</th>\n\t\t\t\t<th>Value</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td>Total dashboards</td>\n\t\t\t\t<td>{{ctrl.stats.dashboards}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total users</td>\n\t\t\t\t<td>{{ctrl.stats.users}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Active users (seen last 14 days)</td>\n\t\t\t\t<td>{{ctrl.stats.activeUsers}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total organizations</td>\n\t\t\t\t<td>{{ctrl.stats.orgs}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total datasources</td>\n\t\t\t\t<td>{{ctrl.stats.datasources}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total playlists</td>\n\t\t\t\t<td>{{ctrl.stats.playlists}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total snapshots</td>\n\t\t\t\t<td>{{ctrl.stats.snapshots}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total dashboard tags</td>\n\t\t\t\t<td>{{ctrl.stats.tags}}</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Total starred dashboards</td>\n\t\t\t\t<td>{{ctrl.stats.stars}}</td>\n\t\t\t</tr>\n <tr>\n\t\t\t\t<td>Total alerts</td>\n\t\t\t\t<td>{{ctrl.stats.alerts}}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</div>\n')}]),t.exports=e},71238:t=>{var e="public/app/features/admin/partials/styleguide.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="ctrl.navModel"></page-header>\n\n<div class="page-container page-body">\n\n\t<h3 class="page-heading">Buttons</h3>\n\n\t<div class="tab-pane">\n\t\t<div ng-repeat="variant in ctrl.buttonVariants" class="row">\n\t\t\t<div ng-repeat="btnSize in ctrl.buttonSizes" class="style-guide-button-list p-a-2 col-md-4">\n\t\t\t\t<button ng-repeat="buttonName in ctrl.buttonNames" class="btn btn{{variant}}{{buttonName}} {{btnSize}}">\n\t\t\t\t\tbtn{{variant}}{{buttonName}}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<h3 class="page-heading">Forms</h3>\n\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<label class="gf-form-label">Label</label>\n\t\t\t<input type="text" class="gf-form-input">\n\t\t</div>\n\t</div>\n\n</div>\n\n')}]),t.exports=e},88762:t=>{var e="public/app/features/alerting/partials/alert_tab.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div ng-if="ctrl.panel.alert">\n <div class="alert alert-error m-b-2" ng-show="ctrl.error">\n <icon name="\'exclamation-triangle\'"></icon> {{ctrl.error}}\n </div>\n\n <div class="gf-form-group">\n <h4 class="section-heading">Rule</h4>\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-6">Name</span>\n <input type="text" class="gf-form-input width-20 gf-form-input--has-help-icon" ng-model="ctrl.alert.name">\n <info-popover mode="right-absolute">\n If you want to apply templating to the alert rule name, you must use the following syntax - ${Label}\n </info-popover>\n </div>\n <div class="gf-form">\n <span class="gf-form-label width-9">Evaluate every</span>\n <input class="gf-form-input max-width-6" type="text" ng-model="ctrl.alert.frequency" ng-blur="ctrl.checkFrequency()">\n </div>\n <div class="gf-form max-width-11">\n <label class="gf-form-label width-5">For</label>\n <input type="text" class="gf-form-input max-width-6 gf-form-input--has-help-icon" ng-model="ctrl.alert.for" spellcheck="false" placeholder="5m" ng-pattern="/(^\\d+([dhms])$)|(0)|(^$)/">\n <info-popover mode="right-absolute">\n If an alert rule has a configured and the query violates the configured threshold, then it goes from OK\n to Pending. Grafana does not send any notifications for that change. Once the alert rule has been\n firing for more than For duration, then the alert changes to Alerting and sends alert notifications.\n </info-popover>\n </div>\n </div>\n <div class="gf-form" ng-if="ctrl.frequencyWarning">\n <label class="gf-form-label text-warning">\n <icon name="\'exclamation-triangle\'"></icon> {{ctrl.frequencyWarning}}\n </label>\n </div>\n </div>\n\n <div class="gf-form-group">\n <h4 class="section-heading">Conditions</h4>\n <div class="gf-form-inline" ng-repeat="conditionModel in ctrl.conditionModels">\n <div class="gf-form">\n <metric-segment-model css-class="query-keyword width-5" ng-if="$index" property="conditionModel.operator.type" options="ctrl.evalOperators" custom="false"></metric-segment-model>\n <span class="gf-form-label query-keyword width-5" ng-if="$index===0">WHEN</span>\n </div>\n <div class="gf-form">\n <query-part-editor class="gf-form-label query-part width-9" part="conditionModel.reducerPart" handle-event="ctrl.handleReducerPartEvent(conditionModel, $event)">\n </query-part-editor>\n <span class="gf-form-label query-keyword">OF</span>\n </div>\n <div class="gf-form">\n <query-part-editor class="gf-form-label query-part" part="conditionModel.queryPart" handle-event="ctrl.handleQueryPartEvent(conditionModel, $event)">\n </query-part-editor>\n </div>\n <div class="gf-form">\n <metric-segment-model property="conditionModel.evaluator.type" options="ctrl.evalFunctions" custom="false" css-class="query-keyword" on-change="ctrl.evaluatorTypeChanged(conditionModel.evaluator)"></metric-segment-model>\n <input class="gf-form-input max-width-9" type="number" step="any" ng-hide="conditionModel.evaluator.params.length === 0" ng-model="conditionModel.evaluator.params[0]" ng-change="ctrl.evaluatorParamsChanged()">\n <label class="gf-form-label query-keyword" ng-show="conditionModel.evaluator.params.length === 2">TO</label>\n <input class="gf-form-input max-width-9" type="number" step="any" ng-if="conditionModel.evaluator.params.length === 2" ng-model="conditionModel.evaluator.params[1]" ng-change="ctrl.evaluatorParamsChanged()">\n </div>\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" tabindex="1" ng-click="ctrl.removeCondition($index)">\n <icon name="\'trash-alt\'"></icon>\n </a>\n </label>\n </div>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label dropdown">\n <a class="pointer dropdown-toggle" data-toggle="dropdown">\n <icon name="\'plus-circle\'"></icon>\n </a>\n <ul class="dropdown-menu" role="menu">\n <li ng-repeat="ct in ctrl.conditionTypes" role="menuitem">\n <a ng-click="ctrl.addCondition(ct.value);">{{ct.text}}</a>\n </li>\n </ul>\n </label>\n </div>\n </div>\n\n <div class="gf-form-group">\n <h4 class="section-heading">No data and error handling</h4>\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-15">If no data or all values are null</span>\n </div>\n <div class="gf-form">\n <span class="gf-form-label query-keyword">set state to</span>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="ctrl.alert.noDataState" ng-options="f.value as f.text for f in ctrl.noDataModes">\n </select>\n </div>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-15">If execution error or timeout</span>\n </div>\n <div class="gf-form">\n <span class="gf-form-label query-keyword">set state to</span>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="ctrl.alert.executionErrorState" ng-options="f.value as f.text for f in ctrl.executionErrorModes">\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <h4 class="section-heading">Notifications</h4>\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-8">Send to</span>\n </div>\n <div class="gf-form" ng-repeat="nc in ctrl.alertNotifications">\n <span class="gf-form-label">\n <icon name="\'{{nc.iconClass}}\'"></icon>\n {{nc.name}} <span ng-if="nc.isDefault">(default)</span>\n <icon name="\'times\'" class="pointer muted" ng-click="ctrl.removeNotification(nc)" ng-if="nc.isDefault === false"></icon>\n </span>\n </div>\n <div class="gf-form">\n <metric-segment segment="ctrl.addNotificationSegment" get-options="ctrl.getNotifications()" on-change="ctrl.notificationAdded()"></metric-segment>\n </div>\n </div>\n <div class="gf-form gf-form--v-stretch">\n <span class="gf-form-label width-8">Message</span>\n <textarea class="gf-form-input gf-form-input--has-help-icon" rows="10" ng-model="ctrl.alert.message" placeholder="Notification message details..."></textarea>\n <info-popover mode="right-absolute">\n If you want to apply templating to the alert rule name, use the following syntax - ${Label}\n </info-popover>\n </div>\n <div class="gf-form">\n <span class="gf-form-label width-8">Tags</span>\n <div class="gf-form-group">\n <div class="gf-form-inline" ng-repeat="(name, value) in ctrl.alert.alertRuleTags">\n <label class="gf-form-label width-15">{{ name }}</label>\n <input class="gf-form-input width-15" placeholder="Tag value..." ng-model="ctrl.alert.alertRuleTags[name]" type="text">\n <label class="gf-form-label">\n <a class="pointer" tabindex="1" ng-click="ctrl.removeAlertRuleTag(name)">\n <icon name="\'trash-alt\'"></icon>\n </a>\n </label>\n </div>\n <div class="gf-form-inline">\n <div class="gf-form">\n <input class="gf-form-input width-15" placeholder="New tag name..." ng-model="ctrl.newAlertRuleTag.name" type="text">\n <input class="gf-form-input width-15" placeholder="New tag value..." ng-model="ctrl.newAlertRuleTag.value" type="text">\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" tabindex="1" ng-click="ctrl.addAlertRuleTag()">\n <icon name="\'plus-circle\'"></icon> Add Tag\n </a>\n </label>\n </div>\n </div>\n </div>\n</div>\n')}]),t.exports=e},38906:t=>{var e="public/app/features/annotations/partials/event_editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'\n<div class="graph-annotation">\n\t<div class="graph-annotation__header">\n\t\t<div class="graph-annotation__user" bs-tooltip="\'Created by {{ctrl.login}}\'">\n\t\t</div>\n\n\t\t<div class="graph-annotation__title">\n\t\t\t<span ng-if="!ctrl.event.id">Add annotation</span>\n\t\t\t<span ng-if="ctrl.event.id">Edit annotation</span>\n\t\t</div>\n\n <div class="graph-annotation__time">{{ctrl.timeFormated}}</div>\n\t</div>\n\n\t<form name="ctrl.form" class="graph-annotation__body text-center">\n\t\t<div style="display: inline-block">\n\t\t\t<div class="gf-form gf-form--v-stretch">\n\t\t\t\t<span class="gf-form-label width-7">Description</span>\n\t\t\t\t<textarea class="gf-form-input width-20" rows="2" ng-model="ctrl.event.text" placeholder="Description"></textarea>\n\t\t\t</div>\n\n\t\t\t<div class="gf-form">\n\t\t\t\t<span class="gf-form-label width-7">Tags</span>\n\t\t\t\t<bootstrap-tagsinput ng-model="ctrl.event.tags" tagclass="label label-tag" placeholder="add tags">\n\t\t\t\t</bootstrap-tagsinput>\n\t\t\t</div>\n\n\t\t\t<div class="gf-form-button-row">\n\t\t\t\t<button type="submit" class="btn btn-primary" ng-click="ctrl.save()">Save</button>\n\t\t\t\t<button ng-if="ctrl.event.id && ctrl.canDelete()" type="submit" class="btn btn-danger" ng-click="ctrl.delete()">Delete</button>\n\t\t\t\t<a class="btn-text" ng-click="ctrl.close();">Cancel</a>\n\t\t\t</div>\n\t\t</div>\n\t</form>\n</div>\n')}]),t.exports=e},78502:t=>{var e="public/app/partials/confirm_modal.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="modal-body" ng-cloak>\n <div class="modal-header">\n <h2 class="modal-header-title">\n <icon name="\'{{icon}}\'" size="\'lg\'"></icon>\n <span class="p-l-1">\n {{title}}\n </span>\n </h2>\n\n <a class="modal-header-close" ng-click="dismiss();">\n <icon name="\'times\'"></icon>\n </a>\n </div>\n\n <div class="modal-content text-center">\n <div class="confirm-modal-text">\n {{text}}\n <div ng-if="text2 && text2htmlBind" class="confirm-modal-text2" ng-bind-html="text2"></div>\n <div ng-if="text2 && !text2htmlBind" class="confirm-modal-text2">{{text2}}</div>\n </div>\n\n <div class="modal-content-confirm-text" ng-if="confirmText">\n <input type="text" class="gf-form-input width-16" style="display: inline-block;" placeholder="Type {{confirmText}} to confirm" ng-model="confirmInput" ng-change="updateConfirmText(confirmInput)">\n </div>\n\n <div class="confirm-modal-buttons">\n <button ng-show="onAltAction" type="button" class="btn btn-primary" ng-click="dismiss();onAltAction();">\n {{altActionText}}\n </button>\n <button ng-show="onConfirm" type="button" class="btn btn-danger" ng-click="onConfirm();dismiss();" ng-disabled="!confirmTextValid" give-focus="true" aria-label="{{selectors.delete}}">\n {{yesText}}\n </button>\n <button type="button" class="btn btn-inverse" ng-click="dismiss()">{{noText}}</button>\n </div>\n </div>\n</div>\n')}]),t.exports=e},55274:t=>{var e="public/app/partials/modal.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>\n <h3>{{modal.title}}</h3>\n</div>\n<div class="modal-body">\n\n <div ng-bind-html="modal.body"></div>\n\n</div>\n<div class="modal-footer">\n <button type="button" class="btn btn-danger" ng-click="dismiss()">Close</button>\n</div>')}]),t.exports=e},61686:t=>{var e="public/app/partials/reset_password.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="navModel"></page-header>\n\n<div class="page-container page-body">\n\t<div class="signup">\n\t\t<h3 class="p-b-1">Reset password</h3>\n\n\t\t<div ng-if="ldapEnabled || authProxyEnabled">\n\t\t\tYou cannot reset password when LDAP or Auth Proxy authentication is enabled.\n\t\t</div>\n\t\t<div ng-if="disableLoginForm">\n\t\t\tYou cannot reset password when login form is disabled.\n\t\t</div>\n\t\t<form name="sendResetForm" class="login-form gf-form-group" ng-show="mode === \'send\'" ng-hide="ldapEnabled || authProxyEnabled || disableLoginForm || mode === \'reset\'">\n\t\t\t<div class="gf-form">\n\t\t\t\t\t<span class="gf-form-label width-7">User</span>\n\t\t\t\t\t<input type="text" name="username" class="gf-form-input max-width-14" required ng-model="formModel.userOrEmail" placeholder="email or username">\n\t\t\t</div>\n\t\t\t<div class="gf-form-button-row">\n\t\t\t\t<button type="submit" class="btn btn-primary" ng-click="sendResetEmail();" ng-disabled="!sendResetForm.$valid">\n\t\t\t\t\tReset Password\n\t\t\t\t</button>\n\t\t\t\t<a href="login" class="btn btn-inverse">\n\t\t\t\t\tBack\n\t\t\t\t</a>\n\n\t\t\t</div>\n\t\t</form>\n\t\t<div ng-show="mode === \'email-sent\'">\n\t\t\tAn email with a reset link has been sent to the email address. <br>\n\t\t\tYou should receive it shortly.\n\t\t\t<div class="p-t-1">\n\t\t\t\t<a href="login" class="btn btn-primary p-t-1">\n\t\t\t\t\tLogin\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>\n\t\t<form name="resetForm" class="login-form gf-form-group" ng-show="mode === \'reset\'">\n\t\t\t<div class="gf-form">\n\t\t\t\t<span class="gf-form-label width-9">New Password</span>\n\t\t\t\t<input type="password" name="NewPassword" class="gf-form-input max-width-14" required ng-minlength="4" ng-model="formModel.newPassword" placeholder="password" watch-change="formModel.newPassword = inputValue;">\n\t\t\t</div>\n\t\t\t<div class="gf-form">\n\t\t\t\t<span class="gf-form-label width-9">Confirm Password</span>\n\t\t\t\t<input type="password" name="ConfirmPassword" class="gf-form-input max-width-14" required ng-minlength="4" ng-model="formModel.confirmPassword" placeholder="confirm password">\n\t\t\t</div>\n\t\t\t<div class="signup__password-strength">\n\t\t\t\t<password-strength password="formModel.newPassword"></password-strength>\n\t\t\t</div>\n\t\t\t<div class="gf-form-button-row">\n\t\t\t\t<button type="submit" class="btn btn-primary" ng-click="submitReset();" ng-disabled="!resetForm.$valid">\n\t\t\t\t\tReset Password\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</div>\n\n<footer>\n')}]),t.exports=e},35847:t=>{var e="public/app/partials/signup_invited.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<page-header model="navModel"></page-header>\n\n<div class="page-container page-body">\n\t<h3 class="page-sub-heading">Hello {{greeting}}.</h3>\n\n\t<div class="modal-tagline p-b-2">\n\t\t<em>{{invitedBy}}</em> has invited you to join Grafana and the organization <span class="highlight-word">{{contextSrv.user.orgName}}</span><br>Please complete the following and choose a password to accept your invitation and continue:\n\t</div>\n\n\t<form name="inviteForm" class="login-form gf-form-group">\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-7">Email</span>\n\t\t\t<input type="email" name="email" class="gf-form-input max-width-21" required ng-model="formModel.email" placeholder="Email">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-7">Name</span>\n\t\t\t<input type="text" name="name" class="gf-form-input max-width-21" ng-model="formModel.name" placeholder="Name (optional)">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-7">Username</span>\n\t\t\t<input type="text" name="username" class="gf-form-input max-width-21" required ng-model="formModel.username" placeholder="Username">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-7">Password</span>\n\t\t\t<input type="password" name="password" class="gf-form-input max-width-21" required ng-model="formModel.password" id="inputPassword" placeholder="password">\n\t\t</div>\n\n\t\t<div class="gf-form-button-row">\n\t\t\t<button type="submit" class="btn btn-primary" ng-click="submit();" ng-disable="!inviteForm.$valid">\n\t\t\t\tSign Up\n\t\t\t</button>\n\t\t</div>\n\t</form>\n</div>\n\n<footer>\n')}]),t.exports=e},25938:t=>{var e="public/app/plugins/datasource/elasticsearch/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n\t<div class="gf-form" ng-if="ctrl.annotation.index">\n\t\t<span class="gf-form-label width-14">Index name</span>\n\t\t<input type="text" class="gf-form-input max-width-20" ng-model="ctrl.annotation.index" placeholder="events-*">\n\t</div>\n\t<div class="gf-form-group">\n\t\t<div class="gf-form">\n\t\t\t<input type="text" class="gf-form-input" ng-model="ctrl.annotation.query" placeholder="Elasticsearch lucene query">\n\t\t</div>\n\t</div>\n</div>\n\n<div class="gf-form-group">\n\t<h6>Field mappings</h6>\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label">Time</span>\n\t\t\t<input type="text" class="gf-form-input max-width-14" ng-model="ctrl.annotation.timeField" placeholder="@timestamp">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label">Time End</span>\n\t\t\t<input type="text" class="gf-form-input max-width-14" ng-model="ctrl.annotation.timeEndField" placeholder="">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label">Text</span>\n\t\t\t<input type="text" class="gf-form-input max-width-14" ng-model="ctrl.annotation.textField" placeholder="">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label">Tags</span>\n\t\t\t<input type="text" class="gf-form-input max-width-10" ng-model="ctrl.annotation.tagsField" placeholder="tags">\n\t\t</div>\n\t\t<div class="gf-form" ng-show="ctrl.annotation.titleField">\n\t\t\t<span class="gf-form-label">Title <em class="muted">(deprecated)</em></span>\n\t\t\t<input type="text" class="gf-form-input max-width-16" ng-model="ctrl.annotation.titleField" placeholder="desc">\n\t\t</div>\n\t</div>\n</div>\n')}]),t.exports=e},71064:t=>{var e="public/app/plugins/datasource/graphite/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form">\n <span class="gf-form-label width-12">Graphite query</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.annotation.target" placeholder="Example: statsd.application.counters.*.count">\n </div>\n\n\t<h5 class="section-heading">Or</h5>\n\n <div class="gf-form">\n <span class="gf-form-label width-12">Graphite events tags</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.annotation.tags" placeholder="Example: event_tag_name">\n </div>\n</div>\n')}]),t.exports=e},35485:t=>{var e="public/app/plugins/datasource/graphite/partials/query.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<query-editor-row query-ctrl="ctrl" has-text-edit-mode="true">\n <graphite-query-editor state="ctrl.state" dispatch="ctrl.dispatch"></graphite-query-editor>\n</query-editor-row>\n')}]),t.exports=e},89613:t=>{var e="public/app/plugins/datasource/influxdb/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'\n<div class="gf-form-group">\n\t<div class="gf-form">\n\t\t<input type="text" class="gf-form-input" ng-model="ctrl.annotation.query" placeholder="select text from events where $timeFilter limit 1000">\n\t</div>\n</div>\n\n<h5 class="section-heading">Field mappings <tip>If your influxdb query returns more than one field you need to specify the column names below. An annotation event is composed of a title, tags, and an additional text field. Optionally you can map the timeEnd column for region annotation usage.</tip></h5>\n<div class="gf-form-group">\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-4">Text</span>\n\t\t\t<input type="text" class="gf-form-input max-width-10" ng-model="ctrl.annotation.textColumn" placeholder="">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-4">Tags</span>\n\t\t\t<input type="text" class="gf-form-input max-width-10" ng-model="ctrl.annotation.tagsColumn" placeholder="">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-4">TimeEnd</span>\n\t\t\t<input type="text" class="gf-form-input max-width-10" ng-model="ctrl.annotation.timeEndColumn" placeholder="">\n\t\t</div>\n\t\t<div class="gf-form" ng-show="ctrl.annotation.titleColumn">\n\t\t\t<span class="gf-form-label width-4">Title <em class="muted">(deprecated)</em></span>\n\t\t\t<input type="text" class="gf-form-input max-width-10" ng-model="ctrl.annotation.titleColumn" placeholder="">\n\t\t</div>\n\t</div>\n</div>\n')}]),t.exports=e},87910:t=>{var e="public/app/plugins/datasource/loki/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<loki-annotations-query-editor expr="ctrl.annotation.expr" max-lines="ctrl.annotation.maxLines" instant="ctrl.annotation.instant" on-change="ctrl.onQueryChange" datasource="ctrl.datasource">\n</loki-annotations-query-editor>\n\n<div class="gf-form-group">\n\t<h5 class="section-heading">Field formats<tip>For title and text fields, use either the name or a pattern. For example, {{instance}} is replaced with label value for the label instance.</tip></h5>\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-5">Title</span>\n\t\t\t<input type="text" class="gf-form-input max-width-9" ng-model="ctrl.annotation.titleFormat" placeholder="alertname">\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-5">Tags</span>\n\t\t\t<input type="text" class="gf-form-input max-width-9" ng-model="ctrl.annotation.tagKeys" placeholder="label1,label2">\n\t\t</div>\n\t\t<div class="gf-form-inline">\n\t\t\t<div class="gf-form">\n\t\t\t\t<span class="gf-form-label width-5">Text</span>\n\t\t\t\t<input type="text" class="gf-form-input max-width-9" ng-model="ctrl.annotation.textFormat" placeholder="instance">\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n')}]),t.exports=e},7314:t=>{var e="public/app/plugins/datasource/mssql/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <textarea rows="10" class="gf-form-input" ng-model="ctrl.annotation.rawQuery" spellcheck="false" placeholder="query expression" data-min-length="0" data-items="100" ng-model-onblur ng-change="ctrl.panelCtrl.refresh()"></textarea>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n </div>\n </div>\n\n <div class="gf-form" ng-show="ctrl.showHelp">\n <pre class="gf-form-pre alert alert-info"><h6>Annotation Query Format</h6>\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the <b>time</b> column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\n\n- column with alias: <b>time</b> for the annotation event time. Use epoch time or any native date data type.\n- column with alias: <b>timeend</b> for the annotation event end time. Use epoch time or any native date data type.\n- column with alias: <b>text</b> for the annotation text.\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. \'tag1,tag2\'.\n\n\nMacros:\n- $__time(column) -> column AS time\n- $__timeEpoch(column) -> DATEDIFF(second, \'1970-01-01\', column) AS time\n- $__timeFilter(column) -> column BETWEEN \'2017-04-21T05:01:17Z\' AND \'2017-04-21T05:01:17Z\'\n- $__unixEpochFilter(column) -> column >= 1492750877 AND column <= 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> \'2017-04-21T05:01:17Z\'\n- $__timeTo() -> \'2017-04-21T05:01:17Z\'\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n\t\t</pre>\n </div>\n</div>\n')}]),t.exports=e},3246:t=>{var e="public/app/plugins/datasource/mssql/partials/config.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<h3 class="page-heading">MS SQL connection</h3>\n\n<div class="gf-form-group">\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-7">Host</span>\n <input type="text" class="gf-form-input" style="width: 352px" ng-model="ctrl.current.url" placeholder="localhost" bs-typeahead="{{[\'localhost\', \'localhost:1433\']}}" required>\n </div>\n\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-7">Database</span>\n <input type="text" class="gf-form-input" style="width: 352px" ng-model="ctrl.current.database" placeholder="database name" required>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label width-7" for="auth-select">Authentication</label>\n <div class="gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon">\n <select id="auth-select" class="gf-form-input" ng-model="ctrl.current.jsonData.authenticationType" ng-options="mode for mode in [\'Windows Authentication\', \'SQL Server Authentication\']" ng-init="ctrl.current.jsonData.authenticationType" ng-change="ctrl.onAuthenticationTypeChange()"></select>\n <info-popover mode="right-absolute">\n <ul>\n <li><i>SQL Server Authentication</i> This is the default mechanism to connect to MS SQL Server. Enter the SQL\n Server Authentication login or the Windows Authentication login in the DOMAIN\\User format.</li>\n <li><i>Windows Authentication</i> Windows Integrated Security - single sign on for users who are already\n logged onto Windows and have enabled this option for MS SQL Server.</li>\n </ul>\n </info-popover>\n </div>\n </div>\n <div class="gf-form-inline" ng-show="ctrl.showUserCredentials">\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">User</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.current.user" placeholder="user">\n </div>\n <div class="gf-form">\n <secret-form-field isconfigured="ctrl.current.secureJsonFields.password" value="ctrl.current.secureJsonData.password" on-reset="ctrl.onPasswordReset" on-change="ctrl.onPasswordChange" labelwidth="7" inputwidth="7" aria-label="\'Password\'">\n </div>\n </div>\n\n</div>\n\n<h3 class="page-heading">TLS/SSL Auth</h3>\n\n<div class="gf-form-group">\n\n <div class="gf-form">\n <label class="gf-form-label width-15" for="encrypt-select">Encrypt</label>\n <div class="gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon">\n <select id="encrypt-select" class="gf-form-input" ng-model="ctrl.current.jsonData.encrypt" ng-options="mode for mode in [\'disable\', \'false\', \'true\']" ng-init="ctrl.current.jsonData.encrypt" ng-change="ctrl.onEncryptChange()" aria-labelledby="encrypt-label"></select>\n <info-popover mode="right-absolute">\n Determines whether or to which extent a secure SSL TCP/IP connection will be negotiated with the server.\n <ul>\n <li><i>disable</i> - Data sent between client and server is not encrypted.</li>\n <li><i>false</i> - Data sent between client and server is not encrypted beyond the login packet. (default)\n </li>\n <li><i>true</i> - Data sent between client and server is encrypted.</li>\n </ul>\n If you\'re using an older version of Microsoft SQL Server like 2008 and 2008R2 you may need to disable encryption\n to be able to connect.\n </info-popover>\n </div>\n </div>\n\n <div class="gf-form" ng-show="ctrl.showTlsConfig">\n <gf-form-switch class="gf-form" label="Skip TLS/SSL Verify" label-class="width-15" tooltip="Skip verifying Server Certificate for TLS/SSL. If this is enabled, any certificate presented by the server and any host name in that certificate will be accepted. In this mode, TLS is susceptible to man-in-the-middle attacks. This should be used only for testing." checked="ctrl.current.jsonData.tlsSkipVerify" switch-class="max-width-8" on-change="ctrl.onEncryptChange()">\n </gf-form-switch>\n </div>\n\n <div class="gf-form max-width-30" ng-show="ctrl.showCertificateConfig">\n <span class="gf-form-label width-15">TLS/SSL Root Certificate</span>\n <input type="text" class="gf-form-input" style="width: 352px" ng-model="ctrl.current.jsonData.sslRootCertFile" placeholder="TLS/SSL root certificate file">\n <info-popover mode="right-absolute">\n Path to file containing the public key certificate of the CA that signed the SQL Server certificate. Needed when\n the server certificate is self signed.\n </info-popover>\n </div>\n\n <div class="gf-form max-width-30" ng-show="ctrl.showCertificateConfig">\n <span class="gf-form-label width-15">Hostname in server certificate</span>\n <input type="text" class="gf-form-input" style="width: 352px" ng-model="ctrl.current.jsonData.serverName" placeholder="Common Name (CN) in server certificate">\n <info-popover mode="right-absolute">\n Specifies the Common Name (CN) in the server certificate. Default is the server host.\n </info-popover>\n </div>\n\n</div>\n\n<h3 class="page-heading">Connection limits</h3>\n\n<div class="gf-form-group">\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max open</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxOpenConns" placeholder="unlimited">\n <info-popover mode="right-absolute">\n The maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\n <i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\n reduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\n connections.\n </info-popover>\n </div>\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max idle</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxIdleConns" placeholder="2">\n <info-popover mode="right-absolute">\n The maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0\n but\n less than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\n <i>Max open connections</i> limit. If set to 0, no idle connections are retained.\n </info-popover>\n </div>\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max lifetime</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.connMaxLifetime" placeholder="14400">\n <info-popover mode="right-absolute">\n The maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.\n </info-popover>\n </div>\n</div>\n\n<h3 class="page-heading">MS SQL details</h3>\n\n<div class="gf-form-group">\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-9">Min time interval</span>\n <input type="text" class="gf-form-input width-6 gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.timeInterval" spellcheck="false" placeholder="1m" ng-pattern="/^\\d+(ms|[Mwdhmsy])$/">\n <info-popover mode="right-absolute">\n A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n for example <code>1m</code> if your data is written every minute.\n </info-popover>\n </div>\n </div>\n</div>\n\n<div class="gf-form-group">\n <div class="grafana-info-box">\n <h5>User Permission</h5>\n <p>\n The database user should only be granted SELECT permissions on the specified database and tables you want to\n query.\n Grafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\n like <code>USE otherdb;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\n <emphasis>highly</emphasis> recommmend you create a specific MS SQL user with restricted permissions.\n </p>\n </div>\n</div>\n')}]),t.exports=e},34941:t=>{var e="public/app/plugins/datasource/mssql/partials/query.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<query-editor-row query-ctrl="ctrl" can-collapse="false">\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource" on-change="ctrl.panelCtrl.refresh()" data-mode="sqlserver" textarea-label="Query Editor">\n\t\t\t</code-editor>\n\t\t</div>\n\t</div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n\t\t\t<label class="gf-form-label query-keyword" for="format-select-{{ ctrl.target.refId }}">Format as</label>\n\t\t\t<div class="gf-form-select-wrapper">\n\t\t\t\t<select id="format-select-{{ ctrl.target.refId }}" class="gf-form-input gf-size-auto" ng-model="ctrl.target.format" ng-options="f.value as f.text for f in ctrl.formats" ng-change="ctrl.refresh()"></select>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class="gf-form">\n <label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n\t\t</div>\n\t\t<div class="gf-form" ng-show="ctrl.lastQueryMeta">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL">\n Generated SQL\n <icon name="\'angle-down\'" ng-show="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n </label>\n </div>\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t</div>\n\t</div>\n\n\t<div class="gf-form" ng-show="ctrl.showHelp">\n\t\t<pre class="gf-form-pre alert alert-info">Time series:\n- return column named time (in UTC), as a unix time stamp or any sql native date data type. You can use the macros below.\n- any other columns returned will be the time point values.\nOptional:\n - return column named <i>metric</i> to represent the series name.\n - If multiple value columns are returned the metric column is used as prefix.\n - If no column named metric is found the column name of the value column is used as series name\n\nResultsets of time series queries need to be sorted by time.\n\nTable:\n- return any set of columns\n\nMacros:\n- $__time(column) -> column AS time\n- $__timeEpoch(column) -> DATEDIFF(second, \'1970-01-01\', column) AS time\n- $__timeFilter(column) -> column BETWEEN \'2017-04-21T05:01:17Z\' AND \'2017-04-21T05:01:17Z\'\n- $__unixEpochFilter(column) -> column >= 1492750877 AND column <= 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n- $__timeGroup(column, \'5m\'[, fillvalue]) -> CAST(ROUND(DATEDIFF(second, \'1970-01-01\', column)/300.0, 0) as bigint)*300.\n by setting fillvalue grafana will fill in missing values according to the interval\n fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\n- $__timeGroupAlias(column, \'5m\'[, fillvalue]) -> CAST(ROUND(DATEDIFF(second, \'1970-01-01\', column)/300.0, 0) as bigint)*300 AS [time]\n- $__unixEpochGroup(column,\'5m\') -> FLOOR(column/300)*300\n- $__unixEpochGroupAlias(column,\'5m\') -> FLOOR(column/300)*300 AS [time]\n\nExample of group by and order by with $__timeGroup:\nSELECT\n $__timeGroup(date_time_col, \'1h\') AS time,\n sum(value) as value\nFROM yourtable\nGROUP BY $__timeGroup(date_time_col, \'1h\')\nORDER BY 1\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> \'2017-04-21T05:01:17Z\'\n- $__timeTo() -> \'2017-04-21T05:01:17Z\'\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n\t\t</pre>\n\t</div>\n\n\t\n\n <div class="gf-form" ng-show="ctrl.showLastQuerySQL">\n <pre class="gf-form-pre">{{ctrl.lastQueryMeta.executedQueryString}}</pre>\n </div>\n\n\t<div class="gf-form" ng-show="ctrl.lastQueryError">\n\t\t<pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>\n\t</div>\n\n</query-editor-row>\n')}]),t.exports=e},79939:t=>{var e="public/app/plugins/datasource/mysql/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <textarea rows="10" class="gf-form-input" ng-model="ctrl.annotation.rawQuery" spellcheck="false" placeholder="query expression" data-min-length="0" data-items="100" ng-model-onblur ng-change="ctrl.panelCtrl.refresh()"></textarea>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n </div>\n </div>\n\n <div class="gf-form" ng-show="ctrl.showHelp">\n <pre class="gf-form-pre alert alert-info"><h6>Annotation Query Format</h6>\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the <i>time</i> or <i>time_sec</i> column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\n\n- column with alias: <b>time</b> or <i>time_sec</i> for the annotation event time. Use epoch time or any native date data type.\n- column with alias: <b>timeend</b> for the annotation event end time. Use epoch time or any native date data type.\n- column with alias: <b>text</b> for the annotation text\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. \'tag1,tag2\'\n\n\nMacros:\n- $__time(column) -> UNIX_TIMESTAMP(column) as time (or as time_sec)\n- $__timeEpoch(column) -> UNIX_TIMESTAMP(column) as time (or as time_sec)\n- $__timeFilter(column) -> column BETWEEN FROM_UNIXTIME(1492750877) AND FROM_UNIXTIME(1492750877)\n- $__unixEpochFilter(column) -> time_unix_epoch > 1492750877 AND time_unix_epoch < 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> FROM_UNIXTIME(1492750877)\n- $__timeTo() -> FROM_UNIXTIME(1492750877)\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n\t\t</pre>\n </div>\n</div>\n')}]),t.exports=e},42100:t=>{var e="public/app/plugins/datasource/mysql/partials/config.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<h3 class="page-heading">MySQL Connection</h3>\n\n<div class="gf-form-group">\n\t<div class="gf-form max-width-30">\n\t\t<span class="gf-form-label width-7">Host</span>\n\t\t<input type="text" class="gf-form-input" ng-model="ctrl.current.url" placeholder="localhost:3306" bs-typeahead="{{[\'localhost:3306\', \'localhost:3307\']}}" required>\n\t</div>\n\n\t<div class="gf-form max-width-30">\n\t\t<span class="gf-form-label width-7">Database</span>\n\t\t<input type="text" class="gf-form-input" ng-model="ctrl.current.database" placeholder="database name" required>\n\t</div>\n\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form max-width-15">\n\t\t\t<span class="gf-form-label width-7">User</span>\n\t\t\t<input type="text" class="gf-form-input" ng-model="ctrl.current.user" placeholder="user">\n\t\t</div>\n\t\t<div class="gf-form">\n <secret-form-field isconfigured="ctrl.current.secureJsonFields.password" value="ctrl.current.secureJsonData.password" on-reset="ctrl.onPasswordReset" on-change="ctrl.onPasswordChange" inputwidth="9" aria-label="\'Password\'">\n\t\t</div>\n\t</div>\n\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-10">Session Timezone</span>\n <input type="text" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.timezone" spellcheck="false" placeholder="(default)">\n <info-popover mode="right-absolute">\n Specify the time zone used in the database session, e.g. <code>Europe/Berlin</code> or <code>+02:00</code>.\n This is necessary, if the timezone of the database (or the host of the database) is set to something other than UTC.\n The value is set in the session with <code>SET time_zone=\'...\'</code>. If you leave this field empty,\n the timezone is not updated. You can find more information in the\n <a href="https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html">MySQL documentation</a>.\n </info-popover>\n </div>\n\n\t<div class="gf-form-group">\n\t\t<div class="gf-form-inline">\n\t\t\t<gf-form-checkbox class="gf-form" label="TLS Client Auth" label-class="width-10" checked="ctrl.current.jsonData.tlsAuth" switch-class="max-width-6"></gf-form-checkbox>\n\t\t\t<gf-form-checkbox class="gf-form" label="With CA Cert" tooltip="Needed for\n\t\t\t\tverifing self-signed TLS Certs" checked="ctrl.current.jsonData.tlsAuthWithCACert" label-class="width-11" switch-class="max-width-6"></gf-form-checkbox>\n\t\t</div>\n\t\t<div class="gf-form-inline">\n\t\t\t<gf-form-checkbox class="gf-form" label="Skip TLS Verify" label-class="width-10" checked="ctrl.current.jsonData.tlsSkipVerify" switch-class="max-width-6"></gf-form-checkbox>\n\t\t</div>\n\t</div>\n\n<datasource-tls-auth-settings current="ctrl.current" ng-if="(ctrl.current.jsonData.tlsAuth || ctrl.current.jsonData.tlsAuthWithCACert)">\n</datasource-tls-auth-settings>\n\n<b>Connection limits</b>\n\n<div class="gf-form-group">\n\t<div class="gf-form max-width-15">\n\t\t<span class="gf-form-label width-7">Max open</span>\n\t\t<input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxOpenConns" placeholder="unlimited">\n\t\t<info-popover mode="right-absolute">\n\t\t\tThe maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\n\t\t\t<i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\n\t\t\treduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\n\t\t\tconnections.\n\t\t</info-popover>\n\t</div>\n\t<div class="gf-form max-width-15">\n\t\t<span class="gf-form-label width-7">Max idle</span>\n\t\t<input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxIdleConns" placeholder="2">\n\t\t<info-popover mode="right-absolute">\n\t\t\tThe maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0 but\n\t\t\tless than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\n\t\t\t<i>Max open connections</i> limit. If set to 0, no idle connections are retained.\n\t\t</info-popover>\n\t</div>\n\t<div class="gf-form max-width-15">\n\t\t<span class="gf-form-label width-7">Max lifetime</span>\n\t\t<input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.connMaxLifetime" placeholder="14400">\n\t\t<info-popover mode="right-absolute">\n\t\t\tThe maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.<br><br>\n\t\t\tThis should always be lower than configured <a href="https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout" target="_blank">wait_timeout</a> in MySQL.\n\t\t</info-popover>\n\t</div>\n</div>\n\n<h3 class="page-heading">MySQL details</h3>\n\n<div class="gf-form-group">\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<span class="gf-form-label width-9">Min time interval</span>\n\t\t\t<input type="text" class="gf-form-input width-6 gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.timeInterval" spellcheck="false" placeholder="1m" ng-pattern="/^\\d+(ms|[Mwdhmsy])$/">\n\t\t\t<info-popover mode="right-absolute">\n\t\t\t\tA lower limit for the auto group by time interval. Recommended to be set to write frequency,\n\t\t\t\tfor example <code>1m</code> if your data is written every minute.\n\t\t\t</info-popover>\n\t\t</div>\n\t</div>\n</div>\n\n<div class="gf-form-group">\n\t<div class="grafana-info-box">\n\t\t<h5>User Permission</h5>\n\t\t<p>\n\t\t\tThe database user should only be granted SELECT permissions on the specified database & tables you want to query.\n\t\t\tGrafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\n\t\t\tlike <code>USE otherdb;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\n\t\t\t<strong>Highly</strong> recommmend you create a specific MySQL user with restricted permissions.\n\n\t\t\tCheckout the <a class="external-link" target="_blank" href="http://docs.grafana.org/features/datasources/mysql/">MySQL Data Source Docs</a> for more information.\n\t\t</p>\n\t</div>\n</div>\n</div>')}]),t.exports=e},50541:t=>{var e="public/app/plugins/datasource/mysql/partials/query.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<query-editor-row query-ctrl="ctrl" has-text-edit-mode="true">\n\n <div ng-if="ctrl.target.rawQuery">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource" on-change="ctrl.panelCtrl.refresh()" data-mode="sql" textarea-label="Query Editor">\n </code-editor>\n </div>\n </div>\n </div>\n\n <div ng-if="!ctrl.target.rawQuery">\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">FROM</label>\n <metric-segment segment="ctrl.tableSegment" get-options="ctrl.getTableSegments()" on-change="ctrl.tableChanged()"></metric-segment>\n\n <label class="gf-form-label query-keyword width-7">Time column</label>\n <metric-segment segment="ctrl.timeColumnSegment" get-options="ctrl.getTimeColumnSegments()" on-change="ctrl.timeColumnChanged()"></metric-segment>\n\n <label class="gf-form-label query-keyword width-9">\n Metric column\n <info-popover mode="right-normal">Column to be used as metric name for the value column.</info-popover>\n </label>\n <metric-segment segment="ctrl.metricColumnSegment" get-options="ctrl.getMetricColumnSegments()" on-change="ctrl.metricColumnChanged()"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n\n </div>\n\n <div class="gf-form-inline" ng-repeat="selectParts in ctrl.selectParts">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">\n <span ng-show="$index === 0">SELECT</span> \n </label>\n </div>\n\n <div class="gf-form" ng-repeat="part in selectParts">\n <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleSelectPartEvent(selectParts, part, $event)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <label class="dropdown" dropdown-typeahead2="ctrl.selectMenu" dropdown-typeahead-on-select="ctrl.addSelectPart(selectParts, $item, $subItem)" button-template-class="gf-form-label query-part">\n </label>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">WHERE</label>\n </div>\n\n <div class="gf-form" ng-repeat="part in ctrl.whereParts">\n <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <metric-segment segment="ctrl.whereAdd" get-options="ctrl.getWhereOptions()" on-change="ctrl.addWhereAction(part, $index)"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">\n <span>GROUP BY</span>\n </label>\n\n <sql-part-editor ng-repeat="part in ctrl.groupParts" part="part" class="gf-form-label sql-part" handle-event="ctrl.handleGroupPartEvent(part, $index, $event)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <metric-segment segment="ctrl.groupAdd" get-options="ctrl.getGroupOptions()" on-change="ctrl.addGroupAction(part, $index)"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword" for="format-select-{{ ctrl.target.refId }}">Format As</label>\n <div class="gf-form-select-wrapper">\n <select id="format-select-{{ ctrl.target.refId }}" class="gf-form-input gf-size-auto" ng-model="ctrl.target.format" ng-options="f.value as f.text for f in ctrl.formats" ng-change="ctrl.refresh()"></select>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.toggleEditorMode()" ng-show="ctrl.panelCtrl.panel.type !== \'table\'">\n <span ng-show="ctrl.target.rawQuery">Query Builder</span>\n <span ng-hide="ctrl.target.rawQuery">Edit SQL</span>\n </label>\n </div>\n <div class="gf-form">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n </div>\n <div class="gf-form" ng-show="ctrl.lastQueryMeta">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL">\n Generated SQL\n <icon name="\'angle-down\'" ng-show="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n </label>\n </div>\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n <div class="gf-form" ng-show="ctrl.showHelp">\n <pre class="gf-form-pre alert alert-info">Time series:\n- return column named time or time_sec (in UTC), as a unix time stamp or any sql native date data type. You can use the macros below.\n- return column(s) with numeric datatype as values\nOptional:\n - return column named <i>metric</i> to represent the series name.\n - If multiple value columns are returned the metric column is used as prefix.\n - If no column named metric is found the column name of the value column is used as series name\n\nResultsets of time series queries need to be sorted by time.\n\nTable:\n- return any set of columns\n\nMacros:\n- $__time(column) -> UNIX_TIMESTAMP(column) as time_sec\n- $__timeEpoch(column) -> UNIX_TIMESTAMP(column) as time_sec\n- $__timeFilter(column) -> column BETWEEN FROM_UNIXTIME(1492750877) AND FROM_UNIXTIME(1492750877)\n- $__unixEpochFilter(column) -> time_unix_epoch > 1492750877 AND time_unix_epoch < 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n- $__timeGroup(column,\'5m\'[, fillvalue]) -> cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed)\n by setting fillvalue grafana will fill in missing values according to the interval\n fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\n- $__timeGroupAlias(column,\'5m\') -> cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed) AS "time"\n- $__unixEpochGroup(column,\'5m\') -> column DIV 300 * 300\n- $__unixEpochGroupAlias(column,\'5m\') -> column DIV 300 * 300 AS "time"\n\nExample of group by and order by with $__timeGroup:\nSELECT\n $__timeGroupAlias(timestamp_col, \'1h\'),\n sum(value_double) as value\nFROM yourtable\nGROUP BY 1\nORDER BY 1\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> FROM_UNIXTIME(1492750877)\n- $__timeTo() -> FROM_UNIXTIME(1492750877)\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n </pre>\n </div>\n\n \n\n <div class="gf-form" ng-show="ctrl.showLastQuerySQL">\n <pre class="gf-form-pre">{{ctrl.lastQueryMeta.executedQueryString}}</pre>\n </div>\n\n <div class="gf-form" ng-show="ctrl.lastQueryError">\n <pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>\n </div>\n\n</query-editor-row>\n')}]),t.exports=e},6404:t=>{var e="public/app/plugins/datasource/opentsdb/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form">\n <span class="gf-form-label width-13">OpenTSDB metrics query</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.annotation.target" placeholder="events.eventname">\n </div>\n <gf-form-switch class="gf-form" label="Show Global Annotations?" checked="ctrl.annotation.isGlobal" switch-class="max-width-6" label-class="width-13"></gf-form-switch>\n</div>\n')}]),t.exports=e},21315:t=>{var e="public/app/plugins/datasource/opentsdb/partials/query.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<query-editor-row query-ctrl="ctrl" can-collapse="false">\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form max-width-25">\n\t\t\t<label class="gf-form-label query-keyword width-8">\n\t\t\t\tMetric\n\t\t\t\t<label class="gf-form-label" bs-tooltip="ctrl.errors.metric" style="color: rgb(229, 189, 28)" ng-show="ctrl.errors.metric">\n\t\t\t\t\t<icon name="\'exclamation-triangle\'"></icon>\n\t\t\t\t</label>\n\t\t\t</label>\n\t\t\t<input type="text" class="gf-form-input" ng-model="ctrl.target.metric" spellcheck="false" bs-typeahead="ctrl.suggestMetrics" placeholder="metric name" data-min-length="0" data-items="100" ng-blur="ctrl.targetBlur()">\n\t\t\t\n\t\t</div>\n\t\t<div class="gf-form">\n\t\t\t<label class="gf-form-label query-keyword">\n\t\t\t\tAggregator\n\t\t\t\t<a bs-tooltip="ctrl.errors.aggregator" style="color: rgb(229, 189, 28)" ng-show="ctrl.errors.aggregator">\n\t\t\t\t\t<icon name="\'exclamation-triangle\'"></icon>\n\t\t\t\t</a>\n\t\t\t</label>\n\t\t\t<div class="gf-form-select-wrapper max-width-15">\n\t\t\t\t<select aria-label="Metric aggregator" ng-model="ctrl.target.aggregator" class="gf-form-input" ng-options="agg for agg in ctrl.aggregators" ng-change="ctrl.targetBlur()">\n\t\t \t </select>\n\t\t\t</div>\n\t\t</div>\n\t\t\t<div class="gf-form max-width-20">\n\t\t\t\t<label class="gf-form-label query-keyword width-6">\n\t\t\t\t\tAlias:\n\t\t\t\t\t<info-popover mode="right-normal">\n\t\t\t\t\t\tUse patterns like $tag_tagname to replace part of the alias for a tag value\n\t\t\t\t\t</info-popover>\n\t\t\t\t</label>\n\t\t\t\t<input type="text" class="gf-form-input" ng-model="ctrl.target.alias" spellcheck="false" placeholder="series alias" data-min-length="0" data-items="100" ng-blur="ctrl.targetBlur()">\n\t\t\t</div>\n\n\t\t\t<div class="gf-form gf-form--grow">\n\t\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t\t</div>\n\t</div>\n\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form max-width-25">\n\t\t\t<label class="gf-form-label query-keyword width-8">Down sample</label>\n\t\t\t<input type="text" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.target.downsampleInterval" ng-model-onblur ng-change="ctrl.targetBlur()" placeholder="interval">\n\t\t\t<info-popover mode="right-absolute">\n\t\t\t\tblank for auto, or for example <code>1m</code>\n\t\t\t</info-popover>\n\t\t</div>\n\n\t\t<div class="gf-form">\n\t\t\t<label class="gf-form-label query-keyword">Aggregator</label>\n\t\t\t<div class="gf-form-select-wrapper">\n\t\t\t\t<select aria-label="Downsample aggregator" ng-model="ctrl.target.downsampleAggregator" class="gf-form-input" ng-options="agg for agg in ctrl.aggregators" ng-change="ctrl.targetBlur()">\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class="gf-form" ng-if="ctrl.tsdbVersion >= 2">\n\t\t\t<label class="gf-form-label query-keyword width-6">Fill</label>\n\t\t\t<div class="gf-form-select-wrapper">\n\t\t\t\t<select ng-model="ctrl.target.downsampleFillPolicy" class="gf-form-input" ng-options="agg for agg in ctrl.fillPolicies" ng-change="ctrl.targetBlur()">\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<gf-form-switch class="gf-form" label="Disable downsampling" label-class="query-keyword" checked="ctrl.target.disableDownsampling" on-change="ctrl.targetBlur()">\n\t\t</gf-form-switch>\n\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t</div>\n\t</div>\n\n\t<div class="gf-form-inline" ng-if="ctrl.tsdbVersion >= 2">\n\t\t<div class="gf-form">\n\n\t\t\t<label class="gf-form-label query-keyword width-8">\n\t\t\t\tFilters\n\t\t\t\t<info-popover mode="right-normal">\n\t\t\t\t\tFilters does not work with tags, either of the two will work but not both.\n\t\t\t\t</info-popover>\n\t\t\t</label>\n\n\t\t\t<div ng-repeat="fil in ctrl.target.filters track by $index" class="gf-form-label">\n\t\t\t\t{{fil.tagk}} = {{fil.type}}({{fil.filter}}) , groupBy = {{fil.groupBy}}\n\t\t\t\t<a ng-click="ctrl.editFilter(fil, $index)">\n\t\t\t\t\t<icon name="\'pen\'"></icon>\n\t\t\t\t</a>\n\t\t\t\t<a ng-click="ctrl.removeFilter($index)">\n\t\t\t\t\t<icon name="\'times\'"></icon>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<label class="gf-form-label query-keyword" ng-hide="ctrl.addFilterMode">\n\t\t\t\t<a ng-click="ctrl.addFilter()">\n\t\t\t\t\t<icon name="\'plus\'"></icon>\n\t\t\t\t</a>\n\t\t\t</label>\n \t\t</div>\n\n\t\t<div class="gf-form-inline" ng-show="ctrl.addFilterMode">\n\t\t\t<div class="gf-form">\n\t\t\t\t<input type="text" class="gf-form-input" spellcheck="false" bs-typeahead="ctrl.suggestTagKeys" data-min-length="0" data-items="100" ng-model="ctrl.target.currentFilterKey" placeholder="key">\n\t\t\t\t\n\t\t\t</div>\n\n\t\t\t<div class="gf-form">\n\t\t\t\t<label class="gf-form-label query-keyword">Type</label>\n\t\t\t\t<div class="gf-form-select-wrapper">\n\t\t\t\t\t<select ng-model="ctrl.target.currentFilterType" class="gf-form-input" ng-options="filType for filType in ctrl.filterTypes">\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="gf-form">\n\t\t\t\t<input type="text" class="gf-form-input" spellcheck="false" bs-typeahead="ctrl.suggestTagValues" data-min-length="0" data-items="100" ng-model="ctrl.target.currentFilterValue" placeholder="filter">\n\t\t\t\t\n\t\t\t</div>\n\n <gf-form-switch class="gf-form" label="Group by" label-class="query-keyword" checked="ctrl.target.currentFilterGroupBy" on-change="ctrl.targetBlur()">\n\t\t\t</gf-form-switch>\n\n\t\t\t<div class="gf-form" ng-show="ctrl.addFilterMode">\n\t\t\t\t<label class="gf-form-label" ng-show="ctrl.errors.filters">\n\t\t\t\t\t<a bs-tooltip="ctrl.errors.filters" style="color: rgb(229, 189, 28)">\n\t\t\t\t\t\t<icon name="\'exclamation-triangle\'"></icon>\n\t\t\t\t\t</a>\n\t\t\t\t</label>\n\t\t\t\t<label class="gf-form-label">\n\t\t\t\t\t<a ng-click="ctrl.addFilter()" ng-hide="ctrl.errors.filters">add filter</a>\n\t\t\t\t\t<a ng-click="ctrl.closeAddFilterMode()">\n\t\t\t\t\t\t<icon name="\'times\'"></icon>\n\t\t\t\t\t</a>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t</div>\n\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t</div>\n\t</div>\n\n\t<div class="gf-form-inline">\n\t\t<div class="gf-form">\n\t\t\t<label class="gf-form-label query-keyword width-8">\n\t\t\t\tTags\n\t\t\t\t<info-popover mode="right-normal" ng-if="ctrl.tsdbVersion >= 2">\n\t\t\t\t\tPlease use filters, tags are deprecated in opentsdb 2.2\n\t\t\t\t</info-popover>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div class="gf-form" ng-repeat="(key, value) in ctrl.target.tags track by $index" class="gf-form">\n\t\t\t<label class="gf-form-label">\n\t\t\t\t{{key}} = {{value}}\n\t\t\t\t<a ng-click="ctrl.editTag(key, value)">\n\t\t\t\t\t<icon name="\'pen\'"></icon>\n\t\t\t\t</a>\n\t\t\t\t<a ng-click="ctrl.removeTag(key)">\n\t\t\t\t\t<icon name="\'times\'"></icon>\n\t\t\t\t</a>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div class="gf-form" ng-hide="ctrl.addTagMode">\n\t\t\t<label class="gf-form-label query-keyword">\n\t\t\t\t<a ng-click="ctrl.addTag()"><icon name="\'plus\'"></icon></a>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div class="gf-form" ng-show="ctrl.addTagMode">\n\t\t\t<input type="text" class="gf-form-input" spellcheck="false" bs-typeahead="ctrl.suggestTagKeys" data-min-length="0" data-items="100" ng-model="ctrl.target.currentTagKey" placeholder="key">\n\t\t\t\n\n\t\t\t<input type="text" class="gf-form-input" spellcheck="false" bs-typeahead="ctrl.suggestTagValues" data-min-length="0" data-items="100" ng-model="ctrl.target.currentTagValue" placeholder="value">\n\t\t\t\n\n\t\t\t<label class="gf-form-label" ng-show="ctrl.errors.tags">\n\t\t\t\t<a bs-tooltip="ctrl.errors.tags" style="color: rgb(229, 189, 28)">\n\t\t\t\t\t<icon name="\'exclamation-triangle\'"></icon>\n\t\t\t\t</a>\n\t\t\t</label>\n\t\t\t<label class="gf-form-label">\n\t\t\t\t<a ng-click="ctrl.addTag()" ng-hide="ctrl.errors.tags">add tag</a>\n\t\t\t\t<a ng-click="ctrl.closeAddTagMode()"><icon name="\'times\'" size="\'sm\'"></icon></a>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t</div>\n\t</div>\n\n\t<div class="gf-form-inline">\n\t\t<gf-form-switch class="gf-form" label="Rate" label-class="width-8 query-keyword" checked="ctrl.target.shouldComputeRate" on-change="ctrl.targetBlur()">\n\t\t</gf-form-switch>\n\n\t\t<gf-form-switch ng-hide="!ctrl.target.shouldComputeRate" class="gf-form" label="Counter" label-class="query-keyword" checked="ctrl.target.isCounter" on-change="ctrl.targetBlur()">\n\t\t</gf-form-switch>\n\n\n\t\t<div class="gf-form" ng-hide="!ctrl.target.isCounter || !ctrl.target.shouldComputeRate">\n\t\t\t<label class="gf-form-label query-keyword">Counter Max</label>\n\t\t\t<input type="text" class="gf-form-input" ng-disabled="!ctrl.target.shouldComputeRate" ng-model="ctrl.target.counterMax" spellcheck="false" placeholder="max value" ng-model-onblur ng-blur="ctrl.targetBlur()">\n\t\t\t\n\n\t\t\t<label class="gf-form-label query-keyword">Reset Value</label>\n\t\t\t<input type="text" class="tight-form-input input-small" ng-disabled="!ctrl.target.shouldComputeRate" ng-model="ctrl.target.counterResetValue" spellcheck="false" placeholder="reset value" ng-model-onblur ng-blur="ctrl.targetBlur()">\n\t\t\t\n\t\t</div>\n\n\t\t<div class="gf-form" ng-if="ctrl.tsdbVersion > 2">\n\t\t\t<gf-form-switch class="gf-form" label="Explicit tags" label-class="width-8 query-keyword" checked="ctrl.target.explicitTags" on-change="ctrl.targetBlur()">\n\t\t\t</gf-form-switch>\n\t\t</div>\n\n\t\t<div class="gf-form gf-form--grow">\n\t\t\t<div class="gf-form-label gf-form-label--grow"></div>\n\t\t</div>\n\t</div>\n</query-editor-row>\n\n')}]),t.exports=e},17077:t=>{var e="public/app/plugins/datasource/postgres/partials/annotations.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <textarea rows="10" class="gf-form-input" ng-model="ctrl.annotation.rawQuery" spellcheck="false" placeholder="query expression" data-min-length="0" data-items="100" ng-model-onblur ng-change="ctrl.panelCtrl.refresh()"></textarea>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n </div>\n </div>\n\n <div class="gf-form" ng-show="ctrl.showHelp">\n <div class="grafana-info-box">\n <pre class="pre--no-style"><h6>Annotation Query Format</h6>\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the time column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\n\n- column with alias: <b>time</b> for the annotation event time. Use epoch time or any native date data type.\n- column with alias: <b>timeend</b> for the annotation event time-end. Use epoch time or any native date data type.\n- column with alias: <b>text</b> for the annotation text\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. \'tag1,tag2\'\n\n\nMacros:\n- $__time(column) -> column as "time"\n- $__timeEpoch -> extract(epoch from column) as "time"\n- $__timeFilter(column) -> column BETWEEN \'2017-04-21T05:01:17Z\' AND \'2017-04-21T05:01:17Z\'\n- $__unixEpochFilter(column) -> column >= 1492750877 AND column <= 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> \'2017-04-21T05:01:17Z\'\n- $__timeTo() -> \'2017-04-21T05:01:17Z\'\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n\t\t</pre>\n </div>\n </div>\n</div>\n')}]),t.exports=e},49463:t=>{var e="public/app/plugins/datasource/postgres/partials/config.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'\n<h3 class="page-heading">PostgreSQL Connection</h3>\n\n<div class="gf-form-group">\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-10">Host</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.current.url" placeholder="localhost:5432" bs-typeahead="{{[\'localhost:5432\', \'localhost:5433\']}}" required>\n </div>\n\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-10">Database</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.current.database" placeholder="database name" required>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-10">User</span>\n <input type="text" class="gf-form-input" ng-model="ctrl.current.user" placeholder="user">\n </div>\n <div class="gf-form">\n <secret-form-field isconfigured="ctrl.current.secureJsonFields.password" value="ctrl.current.secureJsonData.password" on-reset="ctrl.onPasswordReset" on-change="ctrl.onPasswordChange" inputwidth="9" aria-label="\'Password\'">\n </div>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label width-10" for="tls-mode-select">TLS/SSL Mode</label>\n <div class="gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon">\n <select id="tls-mode-select" class="gf-form-input" ng-model="ctrl.current.jsonData.sslmode" ng-options="mode for mode in [\'disable\', \'require\', \'verify-ca\', \'verify-full\']" ng-init="ctrl.current.jsonData.sslmode" ng-change="ctrl.tlsModeMapping()"></select>\n <info-popover mode="right-absolute">\n This option determines whether or with what priority a secure TLS/SSL TCP/IP connection will be negotiated with the server.\n </info-popover>\n </div>\n </div>\n\n <div class="gf-form" ng-if="ctrl.current.jsonData.sslmode != \'disable\'">\n <label class="gf-form-label width-10">TLS/SSL Method</label>\n <div class="gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon">\n <select class="gf-form-input" ng-model="ctrl.current.jsonData.tlsConfigurationMethod" ng-options="f.id as f.label for f in [{ id: \'file-path\', label: \'File system path\' }, { id: \'file-content\', label: \'Certificate content\' }]" ng-init="ctrl.current.jsonData.tlsConfigurationMethod"></select>\n <info-popover mode="right-absolute">\n This option determines how TLS/SSL certifications are configured. Selecting <i>File system path</i> will allow\n you to configure certificates by specifying paths to existing certificates on the local file system where\n Grafana is running. Be sure that the file is readable by the user executing the Grafana process.<br><br>\n\n Selecting <i>Certificate content</i> will allow you to configure certificates by specifying its content.\n The content will be stored encrypted in Grafana\'s database. When connecting to the database the certificates\n will be written as files to Grafana\'s configured data path on the local file system.\n </info-popover>\n </div>\n </div>\n</div>\n\n<div class="gf-form-group" ng-if="ctrl.current.jsonData.sslmode != \'disable\' && ctrl.current.jsonData.tlsConfigurationMethod === \'file-path\'">\n <div class="gf-form">\n <h6>TLS/SSL Auth Details</h6>\n </div>\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-11">TLS/SSL Root Certificate</span>\n <input type="text" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.sslRootCertFile" placeholder="TLS/SSL root cert file">\n <info-popover mode="right-absolute">\n If the selected TLS/SSL mode requires a server root certificate, provide the path to the file here.\n </info-popover>\n </div>\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-11">TLS/SSL Client Certificate</span>\n <input type="text" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.sslCertFile" placeholder="TLS/SSL client cert file">\n <info-popover mode="right-absolute">\n To authenticate with an TLS/SSL client certificate, provide the path to the file here.\n Be sure that the file is readable by the user executing the grafana process.\n </info-popover>\n </div>\n <div class="gf-form max-width-30">\n <span class="gf-form-label width-11">TLS/SSL Client Key</span>\n <input type="text" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.sslKeyFile" placeholder="TLS/SSL client key file">\n <info-popover mode="right-absolute">\n To authenticate with a client TLS/SSL certificate, provide the path to the corresponding key file here.\n Be sure that the file is <i>only</i> readable by the user executing the grafana process.\n </info-popover>\n </div>\n</div>\n<datasource-tls-auth-settings current="ctrl.current" ng-if="ctrl.current.jsonData.sslmode != \'disable\' && ctrl.current.jsonData.tlsConfigurationMethod === \'file-content\'">\n</datasource-tls-auth-settings>\n\n<b>Connection limits</b>\n\n<div class="gf-form-group">\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max open</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxOpenConns" placeholder="unlimited">\n <info-popover mode="right-absolute">\n The maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\n <i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\n reduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\n connections.\n </info-popover>\n </div>\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max idle</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.maxIdleConns" placeholder="2">\n <info-popover mode="right-absolute">\n The maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0 but\n less than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\n <i>Max open connections</i> limit. If set to 0, no idle connections are retained.\n </info-popover>\n </div>\n <div class="gf-form max-width-15">\n <span class="gf-form-label width-7">Max lifetime</span>\n <input type="number" min="0" class="gf-form-input gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.connMaxLifetime" placeholder="14400">\n <info-popover mode="right-absolute">\n The maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.\n </info-popover>\n </div>\n</div>\n\n<h3 class="page-heading">PostgreSQL details</h3>\n\n<div class="gf-form-group">\n <div class="gf-form">\n <span class="gf-form-label width-9" id="version-label">\n Version\n <info-popover mode="right-normal" position="top center">\n This option controls what functions are available in the PostgreSQL query builder.\n </info-popover>\n </span>\n <span class="gf-form-select-wrapper">\n <select class="gf-form-input gf-size-auto" ng-model="ctrl.current.jsonData.postgresVersion" ng-options="f.value as f.name for f in ctrl.postgresVersions" aria-labelledby="version-label"></select>\n </span>\n </div>\n <div class="gf-form">\n <gf-form-switch class="gf-form" label="TimescaleDB" label-class="width-9" checked="ctrl.current.jsonData.timescaledb" switch-class="max-width-6"></gf-form-switch>\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.toggleTimescaleDBHelp()">\n Help \n <icon name="\'angle-down\'" ng-show="ctrl.showTimescaleDBHelp"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showTimescaleDBHelp"> </icon>\n </label>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <span class="gf-form-label width-9">Min time interval</span>\n <input type="text" class="gf-form-input width-6 gf-form-input--has-help-icon" ng-model="ctrl.current.jsonData.timeInterval" spellcheck="false" placeholder="1m" ng-pattern="/^\\d+(ms|[Mwdhmsy])$/">\n <info-popover mode="right-absolute">\n A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n for example <code>1m</code> if your data is written every minute.\n </info-popover>\n </div>\n </div>\n <div class="grafana-info-box alert alert-info" ng-show="ctrl.showTimescaleDBHelp">\n <div class="alert-body">\n <p>\n <a href="https://github.com/timescale/timescaledb" class="pointer" target="_blank">TimescaleDB</a> is a\n time-series database built as a PostgreSQL extension. If enabled, Grafana will use <code>time_bucket</code> in\n the <code>$__timeGroup</code> macro and display TimescaleDB specific aggregate functions in the query builder.\n </p>\n </div>\n </div>\n</div>\n\n<div class="gf-form-group">\n <div class="grafana-info-box">\n <h5>User Permission</h5>\n <p>\n The database user should only be granted SELECT permissions on the specified database & tables you want to query.\n Grafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\n like <code>DELETE FROM user;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\n <strong>Highly</strong> recommmend you create a specific PostgreSQL user with restricted permissions.\n </p>\n </div>\n</div>\n')}]),t.exports=e},26948:t=>{var e="public/app/plugins/datasource/postgres/partials/query.editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<query-editor-row query-ctrl="ctrl" has-text-edit-mode="true">\n\n <div ng-if="ctrl.target.rawQuery">\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource" on-change="ctrl.panelCtrl.refresh()" data-mode="sql" textarea-label="Query Editor">\n </code-editor>\n </div>\n </div>\n </div>\n\n <div ng-if="!ctrl.target.rawQuery">\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">FROM</label>\n <metric-segment segment="ctrl.tableSegment" get-options="ctrl.getTableSegments()" on-change="ctrl.tableChanged()"></metric-segment>\n\n <label class="gf-form-label query-keyword width-7">Time column</label>\n <metric-segment segment="ctrl.timeColumnSegment" get-options="ctrl.getTimeColumnSegments()" on-change="ctrl.timeColumnChanged()"></metric-segment>\n\n <label class="gf-form-label query-keyword width-9">\n Metric column\n <info-popover mode="right-normal">Column to be used as metric name for the value column.</info-popover>\n </label>\n <metric-segment segment="ctrl.metricColumnSegment" get-options="ctrl.getMetricColumnSegments()" on-change="ctrl.metricColumnChanged()"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n\n </div>\n\n <div class="gf-form-inline" ng-repeat="selectParts in ctrl.selectParts">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">\n <span ng-show="$index === 0">SELECT</span> \n </label>\n </div>\n\n <div class="gf-form" ng-repeat="part in selectParts">\n <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleSelectPartEvent(selectParts, part, $event)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <label class="dropdown" dropdown-typeahead2="ctrl.selectMenu" dropdown-typeahead-on-select="ctrl.addSelectPart(selectParts, $item, $subItem)" button-template-class="gf-form-label query-part">\n </label>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">WHERE</label>\n </div>\n\n <div class="gf-form" ng-repeat="part in ctrl.whereParts">\n <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <metric-segment segment="ctrl.whereAdd" get-options="ctrl.getWhereOptions()" on-change="ctrl.addWhereAction(part, $index)"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword width-6">\n <span>GROUP BY</span>\n </label>\n\n <sql-part-editor ng-repeat="part in ctrl.groupParts" part="part" class="gf-form-label sql-part" handle-event="ctrl.handleGroupPartEvent(part, $index, $event)">\n </sql-part-editor>\n </div>\n\n <div class="gf-form">\n <metric-segment segment="ctrl.groupAdd" get-options="ctrl.getGroupOptions()" on-change="ctrl.addGroupAction(part, $index)"></metric-segment>\n </div>\n\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n </div>\n\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label query-keyword" for="format-select-{{ ctrl.target.refId }}">Format as</label>\n <div class="gf-form-select-wrapper">\n <select id="format-select-{{ ctrl.target.refId }}" class="gf-form-input gf-size-auto" ng-model="ctrl.target.format" ng-options="f.value as f.text for f in ctrl.formats" ng-change="ctrl.refresh()"></select>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.toggleEditorMode()" ng-show="ctrl.panelCtrl.panel.type !== \'table\'">\n <span ng-show="ctrl.target.rawQuery">Query Builder</span>\n <span ng-hide="ctrl.target.rawQuery">Edit SQL</span>\n </label>\n </div>\n <div class="gf-form">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showHelp = !ctrl.showHelp">\n Show Help\n <icon name="\'angle-down\'" ng-show="ctrl.showHelp" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showHelp" style="margin-top: 3px;"></icon>\n </label>\n </div>\n <div class="gf-form" ng-show="ctrl.lastQueryMeta">\n <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL">\n Generated SQL\n <icon name="\'angle-down\'" ng-show="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n <icon name="\'angle-right\'" ng-hide="ctrl.showLastQuerySQL" style="margin-top: 3px;"></icon>\n </label>\n </div>\n <div class="gf-form gf-form--grow">\n <div class="gf-form-label gf-form-label--grow"></div>\n </div>\n </div>\n\n\n <div class="gf-form" ng-show="ctrl.showHelp">\n <pre class="gf-form-pre alert alert-info">Time series:\n- return column named <i>time</i> (UTC in seconds or timestamp)\n- return column(s) with numeric datatype as values\nOptional:\n - return column named <i>metric</i> to represent the series name.\n - If multiple value columns are returned the metric column is used as prefix.\n - If no column named metric is found the column name of the value column is used as series name\n\nResultsets of time series queries need to be sorted by time.\n\nTable:\n- return any set of columns\n\nMacros:\n- $__time(column) -> column as "time"\n- $__timeEpoch -> extract(epoch from column) as "time"\n- $__timeFilter(column) -> column BETWEEN \'2017-04-21T05:01:17Z\' AND \'2017-04-21T05:01:17Z\'\n- $__unixEpochFilter(column) -> column >= 1492750877 AND column <= 1492750877\n- $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872\n- $__timeGroup(column,\'5m\'[, fillvalue]) -> (extract(epoch from column)/300)::bigint*300\n by setting fillvalue grafana will fill in missing values according to the interval\n fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\n- $__timeGroupAlias(column,\'5m\') -> (extract(epoch from column)/300)::bigint*300 AS "time"\n- $__unixEpochGroup(column,\'5m\') -> floor(column/300)*300\n- $__unixEpochGroupAlias(column,\'5m\') -> floor(column/300)*300 AS "time"\n\nExample of group by and order by with $__timeGroup:\nSELECT\n $__timeGroup(date_time_col, \'1h\'),\n sum(value) as value\nFROM yourtable\nGROUP BY time\nORDER BY time\n\nOr build your own conditionals using these macros which just return the values:\n- $__timeFrom() -> \'2017-04-21T05:01:17Z\'\n- $__timeTo() -> \'2017-04-21T05:01:17Z\'\n- $__unixEpochFrom() -> 1492750877\n- $__unixEpochTo() -> 1492750877\n- $__unixEpochNanoFrom() -> 1494410783152415214\n- $__unixEpochNanoTo() -> 1494497183142514872\n </pre>\n </div>\n\n \n\n <div class="gf-form" ng-show="ctrl.showLastQuerySQL">\n <pre class="gf-form-pre">{{ctrl.lastQueryMeta.executedQueryString}}</pre>\n </div>\n\n <div class="gf-form" ng-show="ctrl.lastQueryError">\n <pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>\n </div>\n\n</query-editor-row>\n')}]),t.exports=e},11675:t=>{var e="public/app/plugins/panel/graph/axes_editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="editor-row">\n <div class="gf-form-group" ng-repeat="yaxis in ctrl.panel.yaxes">\n <h5 class="section-heading" ng-show="$index === 0">Left Y</h5>\n <h5 class="section-heading" ng-show="$index === 1">Right Y</h5>\n\n <gf-form-switch class="gf-form" label="Show" label-class="width-6" checked="yaxis.show" on-change="ctrl.render()"></gf-form-switch>\n\n <div ng-if="yaxis.show">\n <div class="gf-form gf-form--grow">\n <label class="gf-form-label width-6">\n Unit\n\t\t\t\t <info-popover mode="right-normal">The default unit used when not defined by the datasource or in the Fields or Overrides configuration.</info-popover>\n </label>\n <unit-picker on-change="ctrl.setUnitFormat(yaxis)" value="yaxis.format" class="flex-grow-1">\n </div>\n </div>\n\n <div class="gf-form">\n <label for="yaxis-scale-select-{{$index}}" class="gf-form-label width-6">Scale</label>\n <div class="gf-form-select-wrapper max-width-20">\n <select id="yaxis-scale-select-{{$index}}" class="gf-form-input" ng-model="yaxis.logBase" ng-options="v as k for (k, v) in ctrl.logScales" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label width-6">Y-Min</label>\n <input type="text" class="gf-form-input" placeholder="auto" empty-to-null ng-model="yaxis.min" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-6">Y-Max</label>\n <input type="text" class="gf-form-input" placeholder="auto" empty-to-null ng-model="yaxis.max" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n\n <div ng-if="yaxis.show">\n <div class="gf-form">\n <label class="gf-form-label width-6">Decimals</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" empty-to-null bs-tooltip="\'Override automatic decimal precision for y-axis\'" data-placement="right" ng-model="yaxis.decimals" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n\n <div class="gf-form">\n <label for="yaxis-label-select-{{$index}}" class="gf-form-label width-6">Label</label>\n <input id="yaxis-label-select-{{$index}}" type="text" class="gf-form-input max-width-20" ng-model="yaxis.label" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n </div>\n\n <div class="gf-form-group">\n <h5 class="section-heading">Y-Axes</h5>\n <gf-form-switch class="gf-form" label="Align Y-Axes" label-class="width-6" switch-class="width-5" checked="ctrl.panel.yaxis.align" on-change="ctrl.render()"></gf-form-switch>\n <div class="gf-form" ng-show="ctrl.panel.yaxis.align">\n <label class="gf-form-label width-6">\n Level\n </label>\n <input type="number" class="gf-form-input width-6" placeholder="0" ng-model="ctrl.panel.yaxis.alignLevel" ng-change="ctrl.render()" ng-model-onblur bs-tooltip="\'Alignment of Y-axes are based on this value, starting from Y=0\'" data-placement="right">\n </div>\n </div>\n\n <div class="gf-form-group" aria-label="{{ctrl.selectors.xAxisSection}}">\n <h5 class="section-heading">X-Axis</h5>\n <gf-form-switch class="gf-form" label="Show" label-class="width-6" checked="ctrl.panel.xaxis.show" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form">\n <label for="xaxis-mode-select" class="gf-form-label width-6">Mode</label>\n <div class="gf-form-select-wrapper max-width-15">\n <select id="xaxis-mode-select" class="gf-form-input" ng-model="ctrl.panel.xaxis.mode" ng-options="v as k for (k, v) in ctrl.xAxisModes" ng-change="ctrl.xAxisModeChanged()"></select>\n </div>\n </div>\n\n \x3c!-- Series mode --\x3e\n <div class="gf-form" ng-if="ctrl.panel.xaxis.mode === \'series\'">\n <label class="gf-form-label width-6">Value</label>\n <metric-segment-model property="ctrl.panel.xaxis.values[0]" options="ctrl.xAxisStatOptions" on-change="ctrl.xAxisValueChanged()" custom="false" css-class="width-10" select-mode="true"></metric-segment-model>\n </div>\n\n \x3c!-- Histogram mode --\x3e\n <div class="gf-form" ng-if="ctrl.panel.xaxis.mode === \'histogram\'">\n <label class="gf-form-label width-6">Buckets</label>\n <input type="number" class="gf-form-input max-width-8" ng-model="ctrl.panel.xaxis.buckets" placeholder="auto" ng-change="ctrl.render()" ng-model-onblur bs-tooltip="\'Number of buckets\'" data-placement="right">\n </div>\n\n <div class="gf-form-inline" ng-if="ctrl.panel.xaxis.mode === \'histogram\'">\n <div class="gf-form">\n <label class="gf-form-label width-6">X-Min</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" empty-to-null ng-model="ctrl.panel.xaxis.min" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-6">X-Max</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" empty-to-null ng-model="ctrl.panel.xaxis.max" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n </div>\n</div>\n')}]),t.exports=e},3205:t=>{var e="public/app/plugins/panel/graph/tab_display.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="grafana-info-box">\n <h5>Migration</h5>\n <p>\n Consider switching to the Time series visualization type. It is a more capable and performant version of this panel.\n </p>\n <p>\n <button class="btn btn-primary" ng-click="ctrl.migrateToReact()">\n Migrate\n </button>\n </p>\n <p>Some features like colored time regions and negative transforms are not supported in the new panel yet.</p> \n </div>\n\n <gf-form-switch class="gf-form" label="Bars" label-class="width-8" checked="ctrl.panel.bars" on-change="ctrl.render()"></gf-form-switch>\n\n <gf-form-switch class="gf-form" label="Lines" label-class="width-8" checked="ctrl.panel.lines" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form" ng-if="ctrl.panel.lines">\n <label class="gf-form-label width-8" for="linewidth-select-input">Line width</label>\n <div class="gf-form-select-wrapper max-width-5">\n <select id="linewidth-select-input" class="gf-form-input" ng-model="ctrl.panel.linewidth" ng-options="f for f in [0,1,2,3,4,5,6,7,8,9,10]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <gf-form-switch ng-disabled="!ctrl.panel.lines" class="gf-form" label="Staircase" label-class="width-8" checked="ctrl.panel.steppedLine" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form" ng-if="ctrl.panel.lines">\n <label class="gf-form-label width-8" for="fill-select-input">Area fill</label>\n <div class="gf-form-select-wrapper max-width-5">\n <select id="fill-select-input" class="gf-form-input" ng-model="ctrl.panel.fill" ng-options="f for f in [0,1,2,3,4,5,6,7,8,9,10]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <div class="gf-form" ng-if="ctrl.panel.lines && ctrl.panel.fill">\n <label class="gf-form-label width-8">Fill gradient</label>\n <div class="gf-form-select-wrapper max-width-5">\n <select class="gf-form-input" ng-model="ctrl.panel.fillGradient" ng-options="f for f in [0,1,2,3,4,5,6,7,8,9,10]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <gf-form-switch class="gf-form" label="Points" label-class="width-8" checked="ctrl.panel.points" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form" ng-if="ctrl.panel.points">\n <label class="gf-form-label width-8" for="pointradius-select-input">Point Radius</label>\n <div class="gf-form-select-wrapper max-width-5">\n <select id="pointradius-select-input" class="gf-form-input" ng-model="ctrl.panel.pointradius" ng-options="f for f in [0.5,1,2,3,4,5,6,7,8,9,10]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <gf-form-switch class="gf-form" label="Alert thresholds" label-class="width-8" checked="ctrl.panel.options.alertThreshold" on-change="ctrl.render()"></gf-form-switch>\n</div>\n\n<div class="gf-form-group">\n <h5 class="section-heading">Stacking and null value</h5>\n <gf-form-switch class="gf-form" label="Stack" label-class="width-7" checked="ctrl.panel.stack" on-change="ctrl.render()">\n </gf-form-switch>\n <gf-form-switch class="gf-form" ng-show="ctrl.panel.stack" label="Percent" label-class="width-7" checked="ctrl.panel.percentage" on-change="ctrl.render()">\n </gf-form-switch>\n <div class="gf-form">\n <label class="gf-form-label width-7" for="null-value-select-input">Null value</label>\n <div class="gf-form-select-wrapper">\n <select id="null-value-select-input" class="gf-form-input max-width-9" ng-model="ctrl.panel.nullPointMode" ng-options="f for f in [\'connected\', \'null\', \'null as zero\']" ng-change="ctrl.render()"></select>\n </div>\n </div>\n</div>\n\n<div class="gf-form-group">\n <h5 class="section-heading">Hover tooltip</h5>\n <div class="gf-form">\n <label class="gf-form-label width-9" for="tooltip-mode-select-input">Mode</label>\n <div class="gf-form-select-wrapper max-width-8">\n <select id="tooltip-mode-select-input" class="gf-form-input" ng-model="ctrl.panel.tooltip.shared" ng-options="f.value as f.text for f in [{text: \'All series\', value: true}, {text: \'Single\', value: false}]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-9" for="tooltip-sort-select-input">Sort order</label>\n <div class="gf-form-select-wrapper max-width-8">\n <select id="tooltip-sort-select-input" class="gf-form-input" ng-model="ctrl.panel.tooltip.sort" ng-options="f.value as f.text for f in [{text: \'None\', value: 0}, {text: \'Increasing\', value: 1}, {text: \'Decreasing\', value: 2}]" ng-change="ctrl.render()"></select>\n </div>\n </div>\n <div class="gf-form" ng-show="ctrl.panel.stack">\n <label class="gf-form-label width-9">Stacked value</label>\n <div class="gf-form-select-wrapper max-width-8">\n <select class="gf-form-input" ng-model="ctrl.panel.tooltip.value_type" ng-options="f for f in [\'cumulative\',\'individual\']" ng-change="ctrl.render()"></select>\n </div>\n </div>\n</div>\n')}]),t.exports=e},49699:t=>{var e="public/app/plugins/panel/graph/tab_legend.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="editor-row">\n <div class="section gf-form-group">\n <h5 class="section-heading">Options</h5>\n <gf-form-switch class="gf-form" label="Show" label-class="width-7" checked="ctrl.panel.legend.show" on-change="ctrl.render()" aria-label="gpl show legend">\n </gf-form-switch>\n <gf-form-switch class="gf-form" label="As Table" label-class="width-7" checked="ctrl.panel.legend.alignAsTable" on-change="ctrl.render()">\n </gf-form-switch>\n <gf-form-switch class="gf-form" label="To the right" label-class="width-7" checked="ctrl.panel.legend.rightSide" on-change="ctrl.render()">\n </gf-form-switch>\n <div ng-if="ctrl.panel.legend.rightSide" class="gf-form">\n <label class="gf-form-label width-7">Width</label>\n <input type="number" class="gf-form-input max-width-5" placeholder="250" bs-tooltip="\'Set a min-width for the legend side table/block\'" data-placement="right" ng-model="ctrl.panel.legend.sideWidth" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Values</h5>\n\n <div class="gf-form-inline">\n <gf-form-switch class="gf-form" label="Min" label-class="width-7" checked="ctrl.panel.legend.min" on-change="ctrl.legendValuesOptionChanged()">\n </gf-form-switch>\n\n <gf-form-switch class="gf-form max-width-12" label="Max" label-class="width-7" switch-class="max-width-5" checked="ctrl.panel.legend.max" on-change="ctrl.legendValuesOptionChanged()">\n </gf-form-switch>\n </div>\n\n <div class="gf-form-inline">\n <gf-form-switch class="gf-form" label="Avg" label-class="width-7" checked="ctrl.panel.legend.avg" on-change="ctrl.legendValuesOptionChanged()">\n </gf-form-switch>\n\n <gf-form-switch class="gf-form max-width-12" label="Current" label-class="width-7" switch-class="max-width-5" checked="ctrl.panel.legend.current" on-change="ctrl.legendValuesOptionChanged()">\n </gf-form-switch>\n </div>\n\n <div class="gf-form-inline">\n <gf-form-switch class="gf-form" label="Total" label-class="width-7" checked="ctrl.panel.legend.total" on-change="ctrl.legendValuesOptionChanged()">\n </gf-form-switch>\n\n <div class="gf-form">\n <label class="gf-form-label width-7">Decimals</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" bs-tooltip="\'Override automatic decimal precision for legend and tooltips\'" data-placement="right" ng-model="ctrl.panel.decimals" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Hide series</h5>\n <gf-form-switch class="gf-form" label="With only nulls" label-class="width-7" checked="ctrl.panel.legend.hideEmpty" on-change="ctrl.render()">\n </gf-form-switch>\n <gf-form-switch class="gf-form" label="With only zeros" label-class="width-7" checked="ctrl.panel.legend.hideZero" on-change="ctrl.render()">\n </gf-form-switch>\n </div>\n</div>\n')}]),t.exports=e},85668:t=>{var e="public/app/plugins/panel/graph/tab_series_overrides.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="graph-series-override" ng-repeat="override in ctrl.panel.seriesOverrides" ng-controller="SeriesOverridesCtrl">\n <div class="gf-form">\n <label class="gf-form-label">Alias or regex</label>\n <input type="text" ng-model="override.alias" bs-typeahead="getSeriesNames" ng-blur="ctrl.render()" data-min-length="0" data-items="100" class="gf-form-input width-15" placeholder="For regex use /pattern/">\n <label class="gf-form-label pointer" ng-click="ctrl.removeSeriesOverride(override)">\n <icon name="\'trash-alt\'"></icon>\n </label>\n </div>\n <div class="graph-series-override__properties">\n <div class="gf-form" ng-repeat="option in currentOverrides">\n <label class="gf-form-label gf-form-label--grow">\n <span ng-show="option.propertyName === \'color\'">\n Color: <icon name="\'circle\'" type="\'mono\'" ng-style="{color:option.value}"></icon>\n </span>\n <span ng-show="option.propertyName !== \'color\'"> {{ option.name }}: {{ option.value }} </span>\n <icon name="\'times\'" size="\'sm\'" ng-click="removeOverride(option)" style="margin-right: 4px;cursor: pointer;"></icon>\n </label>\n </div>\n <div class="gf-form">\n <span class="dropdown" dropdown-typeahead2="overrideMenu" dropdown-typeahead-on-select="setOverride($item, $subItem)" button-template-class="gf-form-label"></span>\n </div>\n </div>\n</div>\n<div class="gf-form-button-row">\n <button class="btn btn-inverse" ng-click="ctrl.addSeriesOverride()">\n <icon name="\'plus\'"></icon> Add series override\n </button>\n</div>\n')}]),t.exports=e},53233:t=>{var e="public/app/plugins/panel/graph/tab_thresholds.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<graph-threshold-form panel-ctrl="ctrl"></graph-threshold-form>\n')}]),t.exports=e},59625:t=>{var e="public/app/plugins/panel/graph/tab_time_regions.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<graph-time-region-form panel-ctrl="ctrl"></graph-time-region-form>\n')}]),t.exports=e},17693:t=>{var e="public/app/plugins/panel/graph/thresholds_form.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <p class="muted" ng-show="ctrl.disabled">\n Visual thresholds options <strong>disabled.</strong> Visit the Alert tab to update your thresholds.<br>\n To re-enable thresholds, the alert rule must be deleted from this panel.\n </p>\n <div ng-class="{\'thresholds-form-disabled\': ctrl.disabled}">\n <div class="gf-form-inline" ng-repeat="threshold in ctrl.panel.thresholds">\n <div class="gf-form">\n <label class="gf-form-label">T{{$index+1}}</label>\n </div>\n\n <div class="gf-form">\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="threshold.op" ng-options="f for f in [\'gt\', \'lt\']" ng-change="ctrl.render()" ng-disabled="ctrl.disabled"></select>\n </div>\n <input type="number" ng-model="threshold.value" class="gf-form-input width-8" ng-change="ctrl.render()" placeholder="value" ng-disabled="ctrl.disabled">\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">Color</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="threshold.colorMode" ng-options="f for f in [\'custom\', \'critical\', \'warning\', \'ok\']" ng-change="ctrl.onThresholdTypeChange($index)" ng-disabled="ctrl.disabled">\n </select>\n </div>\n </div>\n\n <gf-form-switch class="gf-form" label="Fill" checked="threshold.fill" on-change="ctrl.render()" ng-disabled="ctrl.disabled"></gf-form-switch>\n\n <div class="gf-form" ng-if="threshold.fill && threshold.colorMode === \'custom\'">\n <label class="gf-form-label">Fill color</label>\n <span class="gf-form-label">\n <color-picker color="threshold.fillColor" on-change="ctrl.onFillColorChange($index)"></color-picker>\n </span>\n </div>\n\n <gf-form-switch class="gf-form" label="Line" checked="threshold.line" on-change="ctrl.render()" ng-disabled="ctrl.disabled"></gf-form-switch>\n\n <div class="gf-form" ng-if="threshold.line && threshold.colorMode === \'custom\'">\n <label class="gf-form-label">Line color</label>\n <span class="gf-form-label">\n <color-picker color="threshold.lineColor" on-change="ctrl.onLineColorChange($index)"></color-picker>\n </span>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">Y-Axis</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="threshold.yaxis" ng-init="threshold.yaxis = threshold.yaxis === \'left\' || threshold.yaxis === \'right\' ? threshold.yaxis : \'left\'" ng-options="f for f in [\'left\', \'right\']" ng-change="ctrl.render()" ng-disabled="ctrl.disabled">\n </select>\n </div>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" ng-click="ctrl.removeThreshold($index)" ng-disabled="ctrl.disabled">\n <icon name="\'trash-alt\'"></icon>\n </a>\n </label>\n </div>\n </div>\n\n <div class="gf-form-button-row">\n <button class="btn btn-inverse" ng-click="ctrl.addThreshold()" ng-disabled="ctrl.disabled">\n <icon name="\'plus\'"></icon> Add threshold\n </button>\n </div>\n </div>\n</div>\n')}]),t.exports=e},99076:t=>{var e="public/app/plugins/panel/graph/time_regions_form.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="gf-form-inline" ng-repeat="timeRegion in ctrl.panel.timeRegions">\n <div class="gf-form">\n <label class="gf-form-label">T{{$index+1}}</label>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">From</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input width-6" ng-model="timeRegion.fromDayOfWeek" ng-options="f.d as f.value for f in [{d: undefined, value: \'Any\'}, {d:1, value: \'Mon\'}, {d:2, value: \'Tue\'}, {d:3, value: \'Wed\'}, {d:4, value: \'Thu\'}, {d:5, value: \'Fri\'}, {d:6, value: \'Sat\'}, {d:7, value: \'Sun\'}]" ng-change="ctrl.render()"></select>\n </div>\n <input type="text" ng-maxlength="5" ng-model="timeRegion.from" class="gf-form-input width-5" ng-change="ctrl.render()" placeholder="hh:mm">\n <label class="gf-form-label">To</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input width-6" ng-model="timeRegion.toDayOfWeek" ng-options="f.d as f.value for f in [{d: undefined, value: \'Any\'}, {d:1, value: \'Mon\'}, {d:2, value: \'Tue\'}, {d:3, value: \'Wed\'}, {d:4, value: \'Thu\'}, {d:5, value: \'Fri\'}, {d:6, value: \'Sat\'}, {d:7, value: \'Sun\'}]" ng-change="ctrl.render()"></select>\n </div>\n <input type="text" ng-maxlength="5" ng-model="timeRegion.to" class="gf-form-input width-5" ng-change="ctrl.render()" placeholder="hh:mm">\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">Color</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="timeRegion.colorMode" ng-options="f.key as f.value for f in ctrl.colorModes" ng-change="ctrl.render()">\n </select>\n </div>\n </div>\n\n <gf-form-switch class="gf-form" label="Fill" checked="timeRegion.fill" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form" ng-if="timeRegion.fill && timeRegion.colorMode === \'custom\'">\n <label class="gf-form-label">Fill color</label>\n <span class="gf-form-label">\n <color-picker color="timeRegion.fillColor" on-change="ctrl.onFillColorChange($index)"></color-picker>\n </span>\n </div>\n\n <gf-form-switch class="gf-form" label="Line" checked="timeRegion.line" on-change="ctrl.render()"></gf-form-switch>\n\n <div class="gf-form" ng-if="timeRegion.line && timeRegion.colorMode === \'custom\'">\n <label class="gf-form-label">Line color</label>\n <span class="gf-form-label">\n <color-picker color="timeRegion.lineColor" on-change="ctrl.onLineColorChange($index)"></color-picker>\n </span>\n </div>\n\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" ng-click="ctrl.removeTimeRegion($index)">\n <icon name="\'trash-alt\'"></icon>\n </a>\n </label>\n </div>\n </div>\n\n <div class="gf-form-button-row">\n <button class="btn btn-inverse" ng-click="ctrl.addTimeRegion()">\n <icon name="\'plus\'"></icon> Add time region<tip>All configured time regions refer to UTC time</tip>\n </button>\n </div>\n</div>\n')}]),t.exports=e},6438:t=>{var e="public/app/plugins/panel/heatmap/module.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="heatmap-wrapper">\n\t<div class="heatmap-canvas-wrapper">\n\n\t\t<div class="datapoints-warning" ng-if="ctrl.dataWarning">\n\t\t\t<span class="small" bs-tooltip="ctrl.dataWarning.tip">{{ctrl.dataWarning.title}}</span>\n\t\t</div>\n\n\t\t<div class="heatmap-panel" ng-dblclick="ctrl.zoomOut()"></div>\n\t</div>\n\t<div class="heatmap-legend-wrapper" ng-if="ctrl.panel.legend.show">\n\t\t<heatmap-legend></heatmap-legend>\n\t</div>\n</div>\n<div class="clearfix"></div>\n')}]),t.exports=e},27546:t=>{var e="public/app/plugins/panel/heatmap/partials/axes_editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="editor-row">\n <div class="section gf-form-group">\n <h5 class="section-heading">Y Axis</h5>\n <div class="gf-form">\n <label class="gf-form-label width-8">Unit</label>\n <unit-picker on-change="editor.setUnitFormat" value="ctrl.panel.yAxis.format" class="width-12"></unit-picker>\n </div>\n <div ng-if="ctrl.panel.dataFormat == \'timeseries\'">\n <div class="gf-form">\n <label class="gf-form-label width-8">Scale</label>\n <div class="gf-form-select-wrapper width-12">\n <select class="gf-form-input" ng-model="ctrl.panel.yAxis.logBase" ng-options="v as k for (k, v) in editor.logScales" ng-change="ctrl.refresh()"></select>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Y-Min</label>\n <input type="text" class="gf-form-input width-12" placeholder="auto" empty-to-null ng-model="ctrl.panel.yAxis.min" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Y-Max</label>\n <input type="text" class="gf-form-input width-12" placeholder="auto" empty-to-null ng-model="ctrl.panel.yAxis.max" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Width</label>\n <input type="text" class="gf-form-input width-12" placeholder="auto" empty-to-null ng-model="ctrl.panel.yAxis.width" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Decimals</label>\n <input type="number" class="gf-form-input width-12" placeholder="auto" data-placement="right" bs-tooltip="\'Override automatic decimal precision for axis.\'" ng-model="ctrl.panel.yAxis.decimals" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n <div class="gf-form" ng-if="ctrl.panel.dataFormat == \'tsbuckets\'">\n <label class="gf-form-label width-8">Bucket bound</label>\n <div class="gf-form-select-wrapper max-width-12">\n <select class="gf-form-input" ng-model="ctrl.panel.yBucketBound" ng-options="v as k for (k, v) in editor.yBucketBoundModes" ng-change="ctrl.render()" data-placement="right" bs-tooltip="\'Use series label as an upper or lower bucket bound.\'">\n </select>\n </div>\n </div>\n <gf-form-switch ng-if="ctrl.panel.dataFormat == \'tsbuckets\'" class="gf-form" label-class="width-8" label="Reverse order" checked="ctrl.panel.reverseYBuckets" on-change="ctrl.refresh()">\n </gf-form-switch>\n </div>\n\n <div class="section gf-form-group" ng-if="ctrl.panel.dataFormat == \'timeseries\'">\n <h5 class="section-heading">Buckets</h5>\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label width-4">Y Axis</label>\n </div>\n <div class="gf-form" ng-show="ctrl.panel.yAxis.logBase === 1">\n <label class="gf-form-label width-5">Buckets</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'Number of buckets for Y axis.\'" ng-model="ctrl.panel.yBucketNumber" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n <div class="gf-form" ng-show="ctrl.panel.yAxis.logBase === 1">\n <label class="gf-form-label width-4">Size</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'Size of bucket. Has priority over Buckets option.\'" ng-model="ctrl.panel.yBucketSize" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n <div class="gf-form" ng-show="ctrl.panel.yAxis.logBase !== 1">\n <label class="gf-form-label width-10">Split Factor</label>\n <input type="number" class="gf-form-input width-9" placeholder="1" data-placement="right" bs-tooltip="\'For log scales only. By default Y values is splitted by integer powers of log base (1, 2, 4, 8, 16, ... for log2). This option allows to split each default bucket into specified number of buckets.\'" ng-model="ctrl.panel.yAxis.splitFactor" ng-change="ctrl.refresh()" ng-model-onblur>\n \n </div>\n </div>\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label width-4">X Axis</label>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-5">Buckets</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'Number of buckets for X axis.\'" ng-model="ctrl.panel.xBucketNumber" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-4">Size</label>\n <input type="text" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'Size of bucket. Number or interval (10s, 5m, 1h, etc). Supported intervals: ms, s, m, h, d, w, M, y. Has priority over Buckets option.\'" ng-model="ctrl.panel.xBucketSize" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Data format</h5>\n <div class="gf-form">\n <label class="gf-form-label width-5">Format</label>\n <div class="gf-form-select-wrapper max-width-15">\n <select class="gf-form-input" ng-model="ctrl.panel.dataFormat" ng-options="v as k for (k, v) in editor.dataFormats" ng-change="ctrl.render()" data-placement="right" bs-tooltip="\'Time series: create heatmap from regular time series. <br>Time series buckets: use histogram data returned from data source. Each series represents bucket which upper/lower bound is a series label.\'">\n </select>\n </div>\n </div>\n </div>\n</div>\n')}]),t.exports=e},48885:t=>{var e="public/app/plugins/panel/heatmap/partials/display_editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="editor-row">\n <div class="section gf-form-group">\n <h5 class="section-heading">Colors</h5>\n <div class="gf-form">\n <label class="gf-form-label width-9">Mode</label>\n <div class="gf-form-select-wrapper width-8">\n <select class="input-small gf-form-input" ng-model="ctrl.panel.color.mode" ng-options="s for s in ctrl.colorModes" ng-change="ctrl.render()"></select>\n </div>\n </div>\n\n <div ng-show="ctrl.panel.color.mode === \'opacity\'">\n <div class="gf-form">\n <label class="gf-form-label width-9">Color</label>\n <span class="gf-form-label">\n <color-picker color="ctrl.panel.color.cardColor" on-change="ctrl.onCardColorChange"></color-picker>\n </span>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-9">Scale</label>\n <div class="gf-form-select-wrapper width-8">\n <select class="input-small gf-form-input" ng-model="ctrl.panel.color.colorScale" ng-options="s for s in ctrl.opacityScales" ng-change="ctrl.render()"></select>\n </div>\n </div>\n <div class="gf-form" ng-if="ctrl.panel.color.colorScale === \'sqrt\'">\n <label class="gf-form-label width-9">Exponent</label>\n <input type="number" class="gf-form-input width-8" placeholder="auto" data-placement="right" bs-tooltip="\'\'" ng-model="ctrl.panel.color.exponent" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n </div>\n\n <div ng-show="ctrl.panel.color.mode === \'spectrum\'">\n <div class="gf-form">\n <label class="gf-form-label width-9">Scheme</label>\n <div class="gf-form-select-wrapper width-8">\n <select class="input-small gf-form-input" ng-model="ctrl.panel.color.colorScheme" ng-options="s.value as s.name for s in ctrl.colorSchemes" ng-change="ctrl.render()"></select>\n </div>\n </div>\n </div>\n\n <div class="gf-form">\n <color-legend></color-legend>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Color scale</h5>\n <div class="gf-form">\n <label class="gf-form-label width-8">Min</label>\n <input type="number" ng-model="ctrl.panel.color.min" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'\'" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Max</label>\n <input type="number" ng-model="ctrl.panel.color.max" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'\'" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Legend</h5>\n <gf-form-switch class="gf-form" label-class="width-8" label="Show legend" checked="ctrl.panel.legend.show" on-change="ctrl.render()">\n </gf-form-switch>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Buckets</h5>\n <gf-form-switch class="gf-form" label-class="width-8" label="Hide zero" checked="ctrl.panel.hideZeroBuckets" on-change="ctrl.render()">\n </gf-form-switch>\n <div class="gf-form">\n <label class="gf-form-label width-8">Space</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'\'" ng-model="ctrl.panel.cards.cardPadding" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Round</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'\'" ng-model="ctrl.panel.cards.cardRound" ng-change="ctrl.refresh()" ng-model-onblur>\n </div>\n </div>\n\n <div class="section gf-form-group">\n <h5 class="section-heading">Tooltip</h5>\n <gf-form-switch class="gf-form" label-class="width-8" label="Show tooltip" checked="ctrl.panel.tooltip.show" on-change="ctrl.render()">\n </gf-form-switch>\n <div ng-if="ctrl.panel.tooltip.show">\n <gf-form-switch class="gf-form" label-class="width-8" label="Histogram" checked="ctrl.panel.tooltip.showHistogram" on-change="ctrl.render()">\n </gf-form-switch>\n <div class="gf-form">\n <label class="gf-form-label width-8">Decimals</label>\n <input type="number" class="gf-form-input width-5" placeholder="auto" data-placement="right" bs-tooltip="\'Max decimal precision for tooltip.\'" ng-model="ctrl.panel.tooltipDecimals" ng-change="ctrl.render()" ng-model-onblur>\n </div>\n </div>\n </div>\n</div>\n')}]),t.exports=e},26249:t=>{var e="public/app/plugins/panel/table-old/column_options.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="edit-tab-content" ng-repeat="style in editor.panel.styles">\n <div class="gf-form-group">\n <h5 class="section-heading">Options</h5>\n <div class="gf-form-inline">\n <div class="gf-form gf-form--grow">\n <label class="gf-form-label width-8">Name pattern</label>\n <input type="text" placeholder="Name or regex" class="gf-form-input max-width-15" ng-model="style.pattern" bs-tooltip="\'Specify regex using /my.*regex/ syntax\'" bs-typeahead="editor.getColumnNames" ng-blur="editor.render()" data-min-length="0" data-items="100" ng-model-onblur data-placement="right">\n </div>\n </div>\n <div class="gf-form gf-form--grow" ng-if="style.type !== \'hidden\'">\n <label class="gf-form-label width-8">Column Header</label>\n <input type="text" class="gf-form-input max-width-15" ng-model="style.alias" ng-change="editor.render()" ng-model-onblur placeholder="Override header label">\n </div>\n <gf-form-switch class="gf-form" label-class="width-8" label="Render value as link" checked="style.link" on-change="editor.render()"></gf-form-switch>\n </div>\n\n <div class="gf-form-group">\n <h5 class="section-heading">Type</h5>\n\n <div class="gf-form gf-form--grow">\n <label class="gf-form-label width-8">Type</label>\n <div class="gf-form-select-wrapper width-16">\n <select class="gf-form-input" ng-model="style.type" ng-options="c.value as c.text for c in editor.columnTypes" ng-change="editor.render()"></select>\n </div>\n </div>\n <div class="gf-form gf-form--grow" ng-if="style.type === \'date\'">\n <label class="gf-form-label width-8">Date Format</label>\n <gf-form-dropdown model="style.dateFormat" css-class="gf-form-input width-16" lookup-text="true" get-options="editor.dateFormats" on-change="editor.render()" allow-custom="true">\n </gf-form-dropdown>\n </div>\n\n <div ng-if="style.type === \'string\'">\n <gf-form-switch class="gf-form" label-class="width-8" ng-if="style.type === \'string\'" label="Sanitize HTML" checked="style.sanitize" on-change="editor.render()"></gf-form-switch>\n </div>\n\n <div ng-if="style.type !== \'hidden\'">\n <div class="gf-form gf-form--grow">\n <label class="gf-form-label width-8">Align</label>\n <gf-form-dropdown model="style.align" css-class="gf-form-input" lookup-text="true" get-options="editor.alignTypes" allow-custom="false" on-change="editor.render()" allow-custom="false">\n </div>\n </div>\n\n <div ng-if="style.type === \'string\'">\n <gf-form-switch class="gf-form" label-class="width-10" ng-if="style.type === \'string\'" label="Preserve Formatting" checked="style.preserveFormat" on-change="editor.render()"></gf-form-switch>\n </div>\n\n <div ng-if="style.type === \'number\'">\n <div class="gf-form">\n <label class="gf-form-label width-8">Unit</label>\n <unit-picker on-change="editor.setUnitFormat(style)" value="style.unit" width="16"></unit-picker>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Decimals</label>\n <input type="number" class="gf-form-input width-4" data-placement="right" ng-model="style.decimals" ng-change="editor.render()" ng-model-onblur>\n </div>\n </div>\n </div>\n\n <div class="gf-form-group" ng-if="style.type === \'string\'">\n <h5 class="section-heading">Value Mappings</h5>\n <div class="editor-row">\n <div class="gf-form-group">\n <div class="gf-form">\n <span class="gf-form-label">\n Type\n </span>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="style.mappingType" ng-options="c.value as c.text for c in editor.mappingTypes" ng-change="editor.render()"></select>\n </div>\n </div>\n <div class="gf-form-group" ng-if="style.mappingType==1">\n <div class="gf-form" ng-repeat="map in style.valueMaps">\n <span class="gf-form-label">\n <icon name="\'times\'" ng-click="editor.removeValueMap(style, $index)"></icon>\n </span>\n <input type="text" class="gf-form-input max-width-6" ng-model="map.value" placeholder="Value" ng-blur="editor.render()">\n <label class="gf-form-label">\n <icon name="\'arrow-right\'"></icon>\n </label>\n <input type="text" class="gf-form-input max-width-8" ng-model="map.text" placeholder="Text" ng-blur="editor.render()">\n </div>\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" ng-click="editor.addValueMap(style)"><icon name="\'plus\'"></icon></a>\n </label>\n </div>\n </div>\n <div class="gf-form-group" ng-if="style.mappingType==2">\n <div class="gf-form" ng-repeat="rangeMap in style.rangeMaps">\n <span class="gf-form-label">\n <icon name="\'times\'" ng-click="editor.removeRangeMap(style, $index)"></icon>\n </span>\n <span class="gf-form-label">From</span>\n <input type="text" ng-model="rangeMap.from" class="gf-form-input max-width-6" ng-blur="editor.render()">\n <span class="gf-form-label">To</span>\n <input type="text" ng-model="rangeMap.to" class="gf-form-input max-width-6" ng-blur="editor.render()">\n <span class="gf-form-label">Text</span>\n <input type="text" ng-model="rangeMap.text" class="gf-form-input max-width-8" ng-blur="editor.render()">\n </div>\n <div class="gf-form">\n <label class="gf-form-label">\n <a class="pointer" ng-click="editor.addRangeMap(style)"><icon name="\'plus\'"></icon></a>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="gf-form-group" ng-if="[\'number\', \'string\'].indexOf(style.type) !== -1">\n <h5 class="section-heading">Thresholds</h5>\n <div class="gf-form">\n <label class="gf-form-label width-8">Thresholds\n <tip>Comma separated values</tip>\n </label>\n <input type="text" class="gf-form-input width-10" ng-model="style.thresholds" placeholder="50,80" ng-blur="editor.render()" array-join>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Color Mode</label>\n <div class="gf-form-select-wrapper width-10">\n <select class="gf-form-input" ng-model="style.colorMode" ng-options="c.value as c.text for c in editor.colorModes" ng-change="editor.render()"></select>\n </div>\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-8">Colors</label>\n <span class="gf-form-label">\n <color-picker color="style.colors[0]" on-change="editor.onColorChange(style, 0)"></color-picker>\n </span>\n <span class="gf-form-label">\n <color-picker color="style.colors[1]" on-change="editor.onColorChange(style, 1)"></color-picker>\n </span>\n <span class="gf-form-label">\n <color-picker color="style.colors[2]" on-change="editor.onColorChange(style, 2)"></color-picker>\n </span>\n <div class="gf-form-label">\n <a class="pointer" ng-click="editor.invertColorOrder($index)">Invert</a>\n </div>\n </div>\n </div>\n\n <div class="section gf-form-group" ng-if="style.link">\n <h5 class="section-heading">Link</h5>\n <div class="gf-form">\n <label class="gf-form-label width-9">\n Url\n <info-popover mode="right-normal">\n <p>Specify an URL (relative or absolute)</p>\n <span>\n Use special variables to specify cell values:\n <br>\n <em>${__cell}</em> refers to current cell value\n <br>\n <em>${__cell_n}</em> refers to Nth column value in current row. Column indexes are started from 0. For\n instance, <em>${__cell_1}</em> refers to second column\'s value.\n <br>\n <em>${__cell:raw}</em> disables all encoding. Useful if the value is a complete URL. By default values are\n URI encoded.\n </span>\n </info-popover>\n </label>\n <input type="text" class="gf-form-input width-29" ng-model="style.linkUrl" ng-blur="editor.render()" ng-model-onblur data-placement="right">\n </div>\n <div class="gf-form">\n <label class="gf-form-label width-9">\n Tooltip\n <info-popover mode="right-normal">\n <p>Specify text for link tooltip.</p>\n <span>\n This title appears when user hovers pointer over the cell with link. Use the same variables as for URL.\n </span>\n </info-popover>\n </label>\n <input type="text" class="gf-form-input width-29" ng-model="style.linkTooltip" ng-blur="editor.render()" ng-model-onblur data-placement="right">\n </div>\n <gf-form-switch class="gf-form" label-class="width-9" label="Open in new tab" checked="style.linkTargetBlank"></gf-form-switch>\n </div>\n\n <div class="clearfix"></div>\n <div class="gf-form-group">\n <button class="btn btn-danger btn-small" ng-click="editor.removeColumnStyle(style)">\n <icon name="\'trash-alt\'"></icon> Remove Rule\n </button>\n </div>\n\n <hr>\n</div>\n\n<button class="btn btn-inverse" ng-click="editor.addColumnStyle()">\n <icon name="\'plus\'"></icon> Add column style\n</button>\n')}]),t.exports=e},2700:t=>{var e="public/app/plugins/panel/table-old/editor.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="gf-form-group">\n <div class="grafana-info-box">\n <h5>Table migration</h5>\n <p>\n This panel is deprecated. Please migrate to the new Table panel.\n </p>\n <p>\n <button class="btn btn-primary" ng-click="ctrl.migrateToPanel(\'table\')">\n Migrate to Table panel\n </button>\n </p>\n <p><b>NOTE:</b> Sorting is not persisted after migration.</p>\n <p ng-if="ctrl.panelHasRowColorMode">\n <b>NOTE:</b> Row color mode is no longer supported and will fallback to cell color mode.\n </p>\n <p ng-if="ctrl.panelHasLinks">\n <b>NOTE:</b> Links that specify cell values will need to be updated manually after migration.\n </p>\n </div>\n <h5 class="section-heading">Data</h5>\n <div class="gf-form gf-form--grow">\n <label class="gf-form-label width-8">Table Transform</label>\n <div class="gf-form-select-wrapper">\n <select class="gf-form-input" ng-model="editor.panel.transform" ng-options="k as v.description for (k, v) in editor.transformers" ng-change="editor.transformChanged()"></select>\n </div>\n </div>\n <div class="gf-form-inline">\n <div class="gf-form">\n <label class="gf-form-label width-8">Columns</label>\n </div>\n <div class="gf-form" ng-repeat="column in editor.panel.columns">\n <label class="gf-form-label">\n <icon name="\'times\'" ng-click="editor.removeColumn(column)"></icon>\n <span>{{ column.text }}</span>\n </label>\n </div>\n <div class="gf-form" ng-show="editor.canSetColumns">\n <metric-segment segment="editor.addColumnSegment" get-options="editor.getColumnOptions()" on-change="editor.addColumn()"></metric-segment>\n </div>\n <div class="gf-form" ng-hide="editor.canSetColumns">\n <label class="gf-form-label">\n Auto\n <info-popover mode="right-normal" ng-if="editor.columnsHelpMessage">\n {{ editor.columnsHelpMessage }}\n </info-popover>\n </label>\n </div>\n </div>\n</div>\n\n<div class="gf-form-group">\n <h5 class="section-heading">Paging</h5>\n <div class="gf-form">\n <label class="gf-form-label width-8">Rows per page</label>\n <input type="number" class="gf-form-input width-7" placeholder="100" data-placement="right" ng-model="editor.panel.pageSize" ng-change="editor.render()" ng-model-onblur>\n </div>\n <div class="gf-form max-width-17">\n <label class="gf-form-label width-8">Font size</label>\n <div class="gf-form-select-wrapper width-7">\n <select class="gf-form-input" ng-model="editor.panel.fontSize" ng-options="f for f in editor.fontSizes" ng-change="editor.render()"></select>\n </div>\n </div>\n</div>\n')}]),t.exports=e},33807:t=>{var e="public/app/plugins/panel/table-old/module.html";window.angular.module("ng").run(["$templateCache",function(t){t.put(e,'<div class="table-panel-container">\n <div class="table-panel-header-bg" ng-show="ctrl.table.rows.length"></div>\n <div class="table-panel-scroll" ng-show="ctrl.table.rows.length">\n <table class="table-panel-table">\n <thead>\n <tr>\n <th ng-repeat="col in ctrl.table.columns" ng-if="!col.hidden">\n <div class="table-panel-table-header-inner pointer" ng-click="ctrl.toggleColumnSort(col, $index)">\n {{col.title}}\n <span class="table-panel-table-header-controls" ng-if="col.sort">\n <icon name="\'angle-down\'" ng-show="col.desc"></icon>\n <icon name="\'angle-up\'" ng-hide="col.desc"></icon>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody></tbody>\n </table>\n </div>\n</div>\n<div class="datapoints-warning" ng-show="ctrl.table.rows.length===0">\n <span class="small"> No data to show <tip>Nothing returned by data query</tip> </span>\n</div>\n<div class="table-panel-footer"></div>\n')}]),t.exports=e}}]);
- //# sourceMappingURL=AngularApp.f44d8965c24f576b03ab.js.map
|