From 3b85901b9590208b923efef931fc1c9544777b62 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 13 May 2016 16:29:11 +0900 Subject: [PATCH 01/72] reflect panel repeat status when variable updated --- public/app/features/templating/templateValuesSrv.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index d44f07ed366..0efc5eb468c 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -8,7 +8,7 @@ function (angular, _, kbn) { var module = angular.module('grafana.services'); - module.service('templateValuesSrv', function($q, $rootScope, datasourceSrv, $location, templateSrv, timeSrv) { + module.service('templateValuesSrv', function($q, $rootScope, datasourceSrv, $location, templateSrv, timeSrv, dynamicDashboardSrv) { var self = this; function getNoneOption() { return { text: 'None', value: '', isNone: true }; } @@ -27,7 +27,12 @@ function (angular, _, kbn) { .filter(function(variable) { return variable.refresh === 2; }).map(function(variable) { - return self.updateOptions(variable); + return self.updateOptions(variable).then(function () { + return self.variableUpdated(variable).then(function () { + dynamicDashboardSrv.update(self.dashboard); + $rootScope.$emit('template-variable-value-updated'); + }); + }); }); return $q.all(promises); @@ -35,6 +40,7 @@ function (angular, _, kbn) { }, $rootScope); this.init = function(dashboard) { + this.dashboard = dashboard; this.variables = dashboard.templating.list; templateSrv.init(this.variables); @@ -143,7 +149,7 @@ function (angular, _, kbn) { this.variableUpdated = function(variable) { templateSrv.updateTemplateData(); - return this.updateOptionsInChildVariables(variable); + return self.updateOptionsInChildVariables(variable); }; this.updateOptionsInChildVariables = function(updatedVariable) { From f585d22ce78027ccdf36b3dc9f4629aa998af7ef Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Mon, 16 May 2016 19:18:50 +0900 Subject: [PATCH 02/72] (templating) update dynamic dashboard only if variable is changed --- public/app/features/templating/templateValuesSrv.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index 0efc5eb468c..bec7545d9c6 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -27,10 +27,15 @@ function (angular, _, kbn) { .filter(function(variable) { return variable.refresh === 2; }).map(function(variable) { + var previousVariable = angular.copy(variable); return self.updateOptions(variable).then(function () { return self.variableUpdated(variable).then(function () { - dynamicDashboardSrv.update(self.dashboard); - $rootScope.$emit('template-variable-value-updated'); + var updatedVariable = angular.copy(variable); + delete(updatedVariable.$$hashKey); + if (JSON.stringify(previousVariable) !== JSON.stringify(updatedVariable)) { + dynamicDashboardSrv.update(self.dashboard); + $rootScope.$emit('template-variable-value-updated'); + } }); }); }); From d002cab28f1a8fed096ebf13b99e79c335b59d9a Mon Sep 17 00:00:00 2001 From: f1 Date: Sun, 5 Jun 2016 00:57:04 +0200 Subject: [PATCH 03/72] add reads/min and etc to unitFormats --- public/app/core/utils/kbn.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/app/core/utils/kbn.js b/public/app/core/utils/kbn.js index f54979b0e97..47a5c734c83 100644 --- a/public/app/core/utils/kbn.js +++ b/public/app/core/utils/kbn.js @@ -649,6 +649,9 @@ function($, _) { {text: 'reads/sec (rps)', value: 'rps' }, {text: 'writes/sec (wps)', value: 'wps' }, {text: 'I/O ops/sec (iops)', value: 'iops'}, + {text: 'ops/min (opm)', value: 'opm' }, + {text: 'reads/min (rpm)', value: 'rpm' }, + {text: 'writes/min (wpm)', value: 'wpm' }, ] }, { From 13d1fec2cbd8580aa5a55425e9896d9288f92a19 Mon Sep 17 00:00:00 2001 From: hailthemelody Date: Mon, 20 Jun 2016 20:54:01 -0400 Subject: [PATCH 04/72] fix z-index order in Series Overrides --- public/app/plugins/panel/graph/series_overrides_ctrl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/plugins/panel/graph/series_overrides_ctrl.js b/public/app/plugins/panel/graph/series_overrides_ctrl.js index 940da1a9e4b..0a338ff86e8 100644 --- a/public/app/plugins/panel/graph/series_overrides_ctrl.js +++ b/public/app/plugins/panel/graph/series_overrides_ctrl.js @@ -105,7 +105,7 @@ define([ $scope.addOverrideOption('Stack', 'stack', [true, false, 'A', 'B', 'C', 'D']); $scope.addOverrideOption('Color', 'color', ['change']); $scope.addOverrideOption('Y-axis', 'yaxis', [1, 2]); - $scope.addOverrideOption('Z-index', 'zindex', [-1,-2,-3,0,1,2,3]); + $scope.addOverrideOption('Z-index', 'zindex', [-3,-2,-1,0,1,2,3]); $scope.addOverrideOption('Transform', 'transform', ['negative-Y']); $scope.addOverrideOption('Legend', 'legend', [true, false]); $scope.updateCurrentOverrides(); From cc433c1fbdd7c118e768875ac1f0bc17aa9db5b7 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 21 Jun 2016 15:48:18 +0300 Subject: [PATCH 05/72] Issue #4740 - able to use $SeriesName variable in prefix of postfix. --- public/app/plugins/panel/singlestat/module.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index 59da49ca3d5..078f682be20 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -199,6 +199,13 @@ class SingleStatCtrl extends MetricsPanelCtrl { data.valueFormated = formatFunc(data.value, decimalInfo.decimals, decimalInfo.scaledDecimals); data.valueRounded = kbn.roundValue(data.value, decimalInfo.decimals); } + + // Add $SeriesName variable for using in prefix or postfix + data.scopedVars = { + SeriesName: { + value: this.series[0].label + } + }; } // check value to text mappings if its enabled @@ -296,7 +303,7 @@ class SingleStatCtrl extends MetricsPanelCtrl { } function getSpan(className, fontSize, value) { - value = templateSrv.replace(value); + value = templateSrv.replace(value, data.scopedVars); return '' + value + ''; } From 09f7222e79df874ead4918ab6ceffccc0a8298a4 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Thu, 23 Jun 2016 11:24:21 +0900 Subject: [PATCH 06/72] add cloudwatch metrics --- pkg/api/cloudwatch/metrics.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/api/cloudwatch/metrics.go b/pkg/api/cloudwatch/metrics.go index 54e60b781cb..3770f13ea24 100644 --- a/pkg/api/cloudwatch/metrics.go +++ b/pkg/api/cloudwatch/metrics.go @@ -32,8 +32,8 @@ func init() { "AWS/Billing": {"EstimatedCharges"}, "AWS/CloudFront": {"Requests", "BytesDownloaded", "BytesUploaded", "TotalErrorRate", "4xxErrorRate", "5xxErrorRate"}, "AWS/CloudSearch": {"SuccessfulRequests", "SearchableDocuments", "IndexUtilization", "Partitions"}, - "AWS/DynamoDB": {"ConditionalCheckFailedRequests", "ConsumedReadCapacityUnits", "ConsumedWriteCapacityUnits", "OnlineIndexConsumedWriteCapacity", "OnlineIndexPercentageProgress", "OnlineIndexThrottleEvents", "ProvisionedReadCapacityUnits", "ProvisionedWriteCapacityUnits", "ReadThrottleEvents", "ReturnedItemCount", "SuccessfulRequestLatency", "SystemErrors", "ThrottledRequests", "UserErrors", "WriteThrottleEvents"}, - "AWS/ECS": {"CPUUtilization", "MemoryUtilization"}, + "AWS/DynamoDB": {"ConditionalCheckFailedRequests", "ConsumedReadCapacityUnits", "ConsumedWriteCapacityUnits", "OnlineIndexConsumedWriteCapacity", "OnlineIndexPercentageProgress", "OnlineIndexThrottleEvents", "ProvisionedReadCapacityUnits", "ProvisionedWriteCapacityUnits", "ReadThrottleEvents", "ReturnedBytes", "ReturnedItemCount", "ReturnedRecordsCount", "SuccessfulRequestLatency", "SystemErrors", "ThrottledRequests", "UserErrors", "WriteThrottleEvents"}, + "AWS/ECS": {"CPUReservation", "MemoryReservation", "CPUUtilization", "MemoryUtilization"}, "AWS/ElastiCache": { "CPUUtilization", "FreeableMemory", "NetworkBytesIn", "NetworkBytesOut", "SwapUsage", "BytesUsedForCacheItems", "BytesReadIntoMemcached", "BytesWrittenOutFromMemcached", "CasBadval", "CasHits", "CasMisses", "CmdFlush", "CmdGet", "CmdSet", "CurrConnections", "CurrItems", "DecrHits", "DecrMisses", "DeleteHits", "DeleteMisses", "Evictions", "GetHits", "GetMisses", "IncrHits", "IncrMisses", "Reclaimed", @@ -42,8 +42,8 @@ func init() { "BytesUsedForCache", "CacheHits", "CacheMisses", "CurrConnections", "Evictions", "HyperLogLogBasedCmds", "NewConnections", "Reclaimed", "ReplicationBytes", "ReplicationLag", "SaveInProgress", "CurrItems", "GetTypeCmds", "HashBasedCmds", "KeyBasedCmds", "ListBasedCmds", "SetBasedCmds", "SetTypeCmds", "SortedSetBasedCmds", "StringBasedCmds", }, - "AWS/EBS": {"VolumeReadBytes", "VolumeWriteBytes", "VolumeReadOps", "VolumeWriteOps", "VolumeTotalReadTime", "VolumeTotalWriteTime", "VolumeIdleTime", "VolumeQueueLength", "VolumeThroughputPercentage", "VolumeConsumedReadWriteOps"}, - "AWS/EC2": {"CPUCreditUsage", "CPUCreditBalance", "CPUUtilization", "DiskReadOps", "DiskWriteOps", "DiskReadBytes", "DiskWriteBytes", "NetworkIn", "NetworkOut", "StatusCheckFailed", "StatusCheckFailed_Instance", "StatusCheckFailed_System"}, + "AWS/EBS": {"VolumeReadBytes", "VolumeWriteBytes", "VolumeReadOps", "VolumeWriteOps", "VolumeTotalReadTime", "VolumeTotalWriteTime", "VolumeIdleTime", "VolumeQueueLength", "VolumeThroughputPercentage", "VolumeConsumedReadWriteOps", "BurstBalance"}, + "AWS/EC2": {"CPUCreditUsage", "CPUCreditBalance", "CPUUtilization", "DiskReadOps", "DiskWriteOps", "DiskReadBytes", "DiskWriteBytes", "NetworkIn", "NetworkOut", "NetworkPacketsIn", "NetworkPacketsOut", "StatusCheckFailed", "StatusCheckFailed_Instance", "StatusCheckFailed_System"}, "AWS/ELB": {"HealthyHostCount", "UnHealthyHostCount", "RequestCount", "Latency", "HTTPCode_ELB_4XX", "HTTPCode_ELB_5XX", "HTTPCode_Backend_2XX", "HTTPCode_Backend_3XX", "HTTPCode_Backend_4XX", "HTTPCode_Backend_5XX", "BackendConnectionErrors", "SurgeQueueLength", "SpilloverCount"}, "AWS/ElasticBeanstalk": { "EnvironmentHealth", @@ -88,7 +88,7 @@ func init() { "AWS/Billing": {"ServiceName", "LinkedAccount", "Currency"}, "AWS/CloudFront": {"DistributionId", "Region"}, "AWS/CloudSearch": {}, - "AWS/DynamoDB": {"TableName", "GlobalSecondaryIndexName", "Operation"}, + "AWS/DynamoDB": {"TableName", "GlobalSecondaryIndexName", "Operation", "StreamLabel"}, "AWS/ECS": {"ClusterName", "ServiceName"}, "AWS/ElastiCache": {"CacheClusterId", "CacheNodeId"}, "AWS/EBS": {"VolumeId"}, @@ -99,12 +99,12 @@ func init() { "AWS/ES": {"ClientId", "DomainName"}, "AWS/Events": {"RuleName"}, "AWS/Kinesis": {"StreamName", "ShardID"}, - "AWS/Lambda": {"FunctionName"}, + "AWS/Lambda": {"FunctionName", "Resource", "Version", "Alias"}, "AWS/Logs": {"LogGroupName", "DestinationType", "FilterName"}, "AWS/ML": {"MLModelId", "RequestMode"}, "AWS/OpsWorks": {"StackId", "LayerId", "InstanceId"}, "AWS/Redshift": {"NodeID", "ClusterIdentifier"}, - "AWS/RDS": {"DBInstanceIdentifier", "DatabaseClass", "EngineName"}, + "AWS/RDS": {"DBInstanceIdentifier", "DBClusterIdentifier", "DatabaseClass", "EngineName"}, "AWS/Route53": {"HealthCheckId"}, "AWS/SNS": {"Application", "Platform", "TopicName"}, "AWS/SQS": {"QueueName"}, From eb54fbaef566f4b3b69a9f6a6686245bdcd4d5f4 Mon Sep 17 00:00:00 2001 From: bergquist Date: Thu, 23 Jun 2016 08:41:25 +0200 Subject: [PATCH 07/72] docs(changelog): add note about cli fix #5410 --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f911729cc1..eaff2e0bbc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,15 +12,16 @@ * **Scripts**: Use restart instead of start for deb package script, closes [#5282](https://github.com/grafana/grafana/pull/5282) * **Logging**: Moved to structured logging lib, and moved to component specific level filters via config file, closes [#4590](https://github.com/grafana/grafana/issues/4590) * **Search**: Add search limit query parameter, closes [#5292](https://github.com/grafana/grafana/pull/5292) -* **OpenTSDB**: Support nested template variables in tag_values function, closes [4398](https://github.com/grafana/grafana/issues/4398) -* **Datasource**: Pending data source requests are cancelled before new ones are issues (Graphite & Prometheus), closes [5321](https://github.com/grafana/grafana/issues/5321) +* **OpenTSDB**: Support nested template variables in tag_values function, closes [#4398](https://github.com/grafana/grafana/issues/4398) +* **Datasource**: Pending data source requests are cancelled before new ones are issues (Graphite & Prometheus), closes [#5321](https://github.com/grafana/grafana/issues/5321) ### Breaking changes * **Logging** : Changed default logging output format (now structured into message, and key value pairs, with logger key acting as component). You can also no change in config to json log ouput. -* **Graphite** : The Graph panel no longer have a Graphite PNG option. closes #[5367](https://github.com/grafana/grafana/issues/5367) +* **Graphite** : The Graph panel no longer have a Graphite PNG option. closes [#5367](https://github.com/grafana/grafana/issues/5367) ### Bug fixes -* **PNG rendering**: Fixed phantomjs rendering and y-axis label rotation. fixes #[5220](https://github.com/grafana/grafana/issues/5220) +* **PNG rendering**: Fixed phantomjs rendering and y-axis label rotation. fixes [#5220](https://github.com/grafana/grafana/issues/5220) +* **CLI**: The cli tool now supports reading plugin.json from dist/plugin.json. fixes [#5410](https://github.com/grafana/grafana/issues/5410) # 3.0.4 Patch release (2016-05-25) * **Panel**: Fixed blank dashboard issue when switching to other dashboard while in fullscreen edit mode, fixes [#5163](https://github.com/grafana/grafana/pull/5163) From 44b2a292eb1e467b07b2941246ab8e0e153dffd3 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Thu, 23 Jun 2016 16:49:36 +0900 Subject: [PATCH 08/72] notify dashboard migration fail --- public/app/features/dashboard/dashboard_ctrl.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/public/app/features/dashboard/dashboard_ctrl.ts b/public/app/features/dashboard/dashboard_ctrl.ts index 18e8893a507..a1fd877e980 100644 --- a/public/app/features/dashboard/dashboard_ctrl.ts +++ b/public/app/features/dashboard/dashboard_ctrl.ts @@ -21,6 +21,7 @@ export class DashboardCtrl { dynamicDashboardSrv, dashboardViewStateSrv, contextSrv, + alertSrv, $timeout) { $scope.editor = { index: 0 }; @@ -29,11 +30,15 @@ export class DashboardCtrl { var resizeEventTimeout; $scope.setupDashboard = function(data) { - var dashboard = dashboardSrv.create(data.dashboard, data.meta); - dashboardSrv.setCurrent(dashboard); + try { + var dashboard = dashboardSrv.create(data.dashboard, data.meta); + dashboardSrv.setCurrent(dashboard); - // init services - timeSrv.init(dashboard); + // init services + timeSrv.init(dashboard); + } catch (err) { + $scope.appEvent("alert-error", ['Dashboard init failed', err.message]); + } // template values service needs to initialize completely before // the rest of the dashboard can load From 6487814007744b1f3f50004887fa14e07722d450 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 21 Jun 2016 16:13:31 +0200 Subject: [PATCH 09/72] Avoid to request influxdb when query is hidden --- public/app/plugins/datasource/influxdb/datasource.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/app/plugins/datasource/influxdb/datasource.ts b/public/app/plugins/datasource/influxdb/datasource.ts index 40c7ba16f53..9a5ebbef859 100644 --- a/public/app/plugins/datasource/influxdb/datasource.ts +++ b/public/app/plugins/datasource/influxdb/datasource.ts @@ -134,6 +134,8 @@ export default class InfluxDatasource { }; _seriesQuery(query) { + if (!query) { return this.$q.when({results: []}); } + return this._influxRequest('GET', '/query', {q: query, epoch: 'ms'}); } From 6af2d9986250371de33fed848a3ba971867a4fe1 Mon Sep 17 00:00:00 2001 From: bergquist Date: Thu, 23 Jun 2016 13:17:53 +0200 Subject: [PATCH 10/72] style(light-theme): make text-color-weak a little bit darker otherwise its not possible to see which queries are disabled in the query editor --- public/sass/_variables.light.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/sass/_variables.light.scss b/public/sass/_variables.light.scss index 90262a3134c..bb38579ce2d 100644 --- a/public/sass/_variables.light.scss +++ b/public/sass/_variables.light.scss @@ -60,7 +60,7 @@ $page-bg: $white; $body-color: $gray-1; $text-color: $gray-1; $text-color-strong: $white; -$text-color-weak: $gray-1; +$text-color-weak: $gray-2; $text-color-faint: $gray-3; $text-color-emphasis: $dark-5; From e593cc3e9f34a32b8ffb4641225c9bc4d60b8a1f Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 23 Jun 2016 19:35:50 +0300 Subject: [PATCH 11/72] Issue #4740 - change variable $SeriesName to $seriesName. --- public/app/plugins/panel/singlestat/module.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index 078f682be20..a1998a778a3 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -200,9 +200,9 @@ class SingleStatCtrl extends MetricsPanelCtrl { data.valueRounded = kbn.roundValue(data.value, decimalInfo.decimals); } - // Add $SeriesName variable for using in prefix or postfix + // Add $seriesName variable for using in prefix or postfix data.scopedVars = { - SeriesName: { + seriesName: { value: this.series[0].label } }; From 040586604b84c7c1d88acc1a56ab881849173731 Mon Sep 17 00:00:00 2001 From: Kevin Fitzpatrick Date: Thu, 7 Apr 2016 11:25:05 -0700 Subject: [PATCH 12/72] Allow configuration to disable the username and password login interface. Used for when admins only want users to login via OAuth. --- pkg/api/login.go | 1 + pkg/setting/setting.go | 16 +++++++++------- public/app/core/controllers/login_ctrl.js | 1 + public/app/partials/login.html | 6 +++--- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pkg/api/login.go b/pkg/api/login.go index 463fa8282a5..93a6d114704 100644 --- a/pkg/api/login.go +++ b/pkg/api/login.go @@ -29,6 +29,7 @@ func LoginView(c *middleware.Context) { viewData.Settings["githubAuthEnabled"] = setting.OAuthService.GitHub viewData.Settings["disableUserSignUp"] = !setting.AllowUserSignUp viewData.Settings["loginHint"] = setting.LoginHint + viewData.Settings["oauthOnly"] = setting.DisableUserPassLogin if !tryLoginUsingRememberCookie(c) { c.HTML(200, VIEW_INDEX, viewData) diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 6c425505289..5a6b63a1de8 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -82,13 +82,14 @@ var ( ExternalEnabled bool // User settings - AllowUserSignUp bool - AllowUserOrgCreate bool - AutoAssignOrg bool - AutoAssignOrgRole string - VerifyEmailEnabled bool - LoginHint string - DefaultTheme string + AllowUserSignUp bool + AllowUserOrgCreate bool + AutoAssignOrg bool + AutoAssignOrgRole string + VerifyEmailEnabled bool + LoginHint string + DefaultTheme string + DisableUserPassLogin bool // Http auth AdminUser string @@ -485,6 +486,7 @@ func NewConfigContext(args *CommandLineArgs) error { VerifyEmailEnabled = users.Key("verify_email_enabled").MustBool(false) LoginHint = users.Key("login_hint").String() DefaultTheme = users.Key("default_theme").String() + DisableUserPassLogin = users.Key("disable_user_pass_login").MustBool(false) // anonymous access AnonymousEnabled = Cfg.Section("auth.anonymous").Key("enabled").MustBool(false) diff --git a/public/app/core/controllers/login_ctrl.js b/public/app/core/controllers/login_ctrl.js index 45a47558ed7..2be5f6b1740 100644 --- a/public/app/core/controllers/login_ctrl.js +++ b/public/app/core/controllers/login_ctrl.js @@ -18,6 +18,7 @@ function (angular, coreModule, config) { $scope.googleAuthEnabled = config.googleAuthEnabled; $scope.githubAuthEnabled = config.githubAuthEnabled; $scope.oauthEnabled = config.githubAuthEnabled || config.googleAuthEnabled; + $scope.oauthOnly = config.oauthOnly; $scope.disableUserSignUp = config.disableUserSignUp; $scope.loginHint = config.loginHint; diff --git a/public/app/partials/login.html b/public/app/partials/login.html index 8143ff35125..660206ede59 100644 --- a/public/app/partials/login.html +++ b/public/app/partials/login.html @@ -17,7 +17,7 @@ -