Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
432e203d
Commit
432e203d
authored
Sep 05, 2018
by
Torkel Ödegaard
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '12918-only-arrow-functions3'
parents
72ab24f3
19b7ad61
Hide whitespace changes
Inline
Side-by-side
Showing
49 changed files
with
286 additions
and
285 deletions
+286
-285
public/app/core/components/grafana_app.ts
+14
-11
public/app/core/components/info_popover.ts
+3
-3
public/app/core/components/layout_selector/layout_selector.ts
+1
-1
public/app/core/components/navbar/navbar.ts
+1
-1
public/app/core/components/query_part/query_part_editor.ts
+10
-10
public/app/core/controllers/inspect_ctrl.ts
+2
-2
public/app/core/controllers/json_editor_ctrl.ts
+1
-1
public/app/core/directives/array_join.ts
+1
-1
public/app/features/annotations/annotation_tooltip.ts
+1
-1
public/app/features/panellinks/link_srv.ts
+2
-2
public/app/features/plugins/datasource_srv.ts
+3
-3
public/app/features/plugins/plugin_loader.ts
+1
-1
public/app/plugins/datasource/cloudwatch/query_parameter_ctrl.ts
+24
-24
public/app/plugins/datasource/elasticsearch/bucket_agg.ts
+18
-18
public/app/plugins/datasource/elasticsearch/datasource.ts
+10
-10
public/app/plugins/datasource/elasticsearch/elastic_response.ts
+1
-1
public/app/plugins/datasource/elasticsearch/metric_agg.ts
+16
-16
public/app/plugins/datasource/elasticsearch/query_def.ts
+4
-4
public/app/plugins/datasource/graphite/graphite_query.ts
+2
-2
public/app/plugins/datasource/graphite/lexer.ts
+1
-1
public/app/plugins/datasource/influxdb/datasource.ts
+2
-2
public/app/plugins/datasource/influxdb/influx_query.ts
+3
-3
public/app/plugins/datasource/influxdb/influx_series.ts
+5
-5
public/app/plugins/datasource/influxdb/query_builder.ts
+1
-1
public/app/plugins/datasource/influxdb/query_ctrl.ts
+1
-1
public/app/plugins/datasource/influxdb/query_part.ts
+2
-2
public/app/plugins/datasource/mixed/datasource.ts
+2
-2
public/app/plugins/datasource/mssql/datasource.ts
+1
-1
public/app/plugins/datasource/mysql/datasource.ts
+1
-1
public/app/plugins/datasource/opentsdb/datasource.ts
+39
-41
public/app/plugins/datasource/opentsdb/query_ctrl.ts
+1
-1
public/app/plugins/datasource/prometheus/datasource.ts
+3
-3
public/app/plugins/datasource/prometheus/metric_find_query.ts
+13
-13
public/app/plugins/datasource/prometheus/query_ctrl.ts
+1
-1
public/app/plugins/datasource/prometheus/result_transformer.ts
+5
-5
public/app/plugins/panel/graph/graph.ts
+6
-6
public/app/plugins/panel/graph/graph_tooltip.ts
+11
-11
public/app/plugins/panel/graph/jquery.flot.events.ts
+21
-21
public/app/plugins/panel/graph/legend.ts
+7
-7
public/app/plugins/panel/graph/series_overrides_ctrl.ts
+11
-11
public/app/plugins/panel/graph/threshold_manager.ts
+1
-1
public/app/plugins/panel/graph/thresholds_form.ts
+1
-1
public/app/plugins/panel/heatmap/color_legend.ts
+6
-6
public/app/plugins/panel/heatmap/heatmap_tooltip.ts
+1
-1
public/app/plugins/panel/heatmap/rendering.ts
+1
-1
public/app/plugins/panel/singlestat/module.ts
+8
-8
public/app/plugins/panel/table/column_options.ts
+1
-1
public/app/plugins/panel/table/module.ts
+2
-2
public/app/plugins/panel/table/transformers.ts
+13
-13
No files found.
public/app/core/components/grafana_app.ts
View file @
432e203d
...
...
@@ -28,7 +28,7 @@ export class GrafanaCtrl {
setBackendSrv
(
backendSrv
);
createStore
({
backendSrv
,
datasourceSrv
});
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
contextSrv
=
contextSrv
;
$scope
.
appSubUrl
=
config
.
appSubUrl
;
$scope
.
_
=
_
;
...
...
@@ -43,7 +43,7 @@ export class GrafanaCtrl {
$rootScope
.
colors
=
colors
;
$scope
.
initDashboard
=
function
(
dashboardData
,
viewScope
)
{
$scope
.
initDashboard
=
(
dashboardData
,
viewScope
)
=>
{
$scope
.
appEvent
(
'dashboard-fetch-end'
,
dashboardData
);
$controller
(
'DashboardCtrl'
,
{
$scope
:
viewScope
}).
init
(
dashboardData
);
};
...
...
@@ -60,7 +60,7 @@ export class GrafanaCtrl {
callerScope
.
$on
(
'$destroy'
,
unbind
);
};
$rootScope
.
appEvent
=
function
(
name
,
payload
)
{
$rootScope
.
appEvent
=
(
name
,
payload
)
=>
{
$rootScope
.
$emit
(
name
,
payload
);
appEvents
.
emit
(
name
,
payload
);
};
...
...
@@ -103,7 +103,7 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
const
body
=
$
(
'body'
);
// see https://github.com/zenorocha/clipboard.js/issues/155
$
.
fn
.
modal
.
Constructor
.
prototype
.
enforceFocus
=
function
()
{};
$
.
fn
.
modal
.
Constructor
.
prototype
.
enforceFocus
=
()
=>
{};
$
(
'.preloader'
).
remove
();
...
...
@@ -123,9 +123,12 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
body
.
toggleClass
(
'sidemenu-hidden'
);
});
scope
.
$watch
(()
=>
playlistSrv
.
isPlaying
,
function
(
newValue
)
{
elem
.
toggleClass
(
'view-mode--playlist'
,
newValue
===
true
);
});
scope
.
$watch
(
()
=>
playlistSrv
.
isPlaying
,
newValue
=>
{
elem
.
toggleClass
(
'view-mode--playlist'
,
newValue
===
true
);
}
);
// check if we are in server side render
if
(
document
.
cookie
.
indexOf
(
'renderKey'
)
!==
-
1
)
{
...
...
@@ -135,7 +138,7 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
// tooltip removal fix
// manage page classes
let
pageClass
;
scope
.
$on
(
'$routeChangeSuccess'
,
function
(
evt
,
data
)
{
scope
.
$on
(
'$routeChangeSuccess'
,
(
evt
,
data
)
=>
{
if
(
pageClass
)
{
body
.
removeClass
(
pageClass
);
}
...
...
@@ -236,7 +239,7 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
});
// handle document clicks that should hide things
body
.
click
(
function
(
evt
)
{
body
.
click
(
evt
=>
{
const
target
=
$
(
evt
.
target
);
if
(
target
.
parents
().
length
===
0
)
{
return
;
...
...
@@ -248,7 +251,7 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
if
(
clickAutoHide
.
length
)
{
const
clickAutoHideParent
=
clickAutoHide
.
parent
();
clickAutoHide
.
detach
();
setTimeout
(
function
()
{
setTimeout
(
()
=>
{
clickAutoHideParent
.
append
(
clickAutoHide
);
},
100
);
}
...
...
@@ -260,7 +263,7 @@ export function grafanaAppDirective(playlistSrv, contextSrv, $timeout, $rootScop
// hide search
if
(
body
.
find
(
'.search-container'
).
length
>
0
)
{
if
(
target
.
parents
(
'.search-results-container, .search-field-wrapper'
).
length
===
0
)
{
scope
.
$apply
(
function
()
{
scope
.
$apply
(
()
=>
{
scope
.
appEvent
(
'hide-dash-search'
);
});
}
...
...
public/app/core/components/info_popover.ts
View file @
432e203d
...
...
@@ -7,7 +7,7 @@ export function infoPopover() {
restrict
:
'E'
,
template
:
'<i class="fa fa-info-circle"></i>'
,
transclude
:
true
,
link
:
function
(
scope
,
elem
,
attrs
,
ctrl
,
transclude
)
{
link
:
(
scope
,
elem
,
attrs
,
ctrl
,
transclude
)
=>
{
const
offset
=
attrs
.
offset
||
'0 -10px'
;
const
position
=
attrs
.
position
||
'right middle'
;
let
classes
=
'drop-help drop-hide-out-of-bounds'
;
...
...
@@ -23,7 +23,7 @@ export function infoPopover() {
elem
.
addClass
(
'gf-form-help-icon--'
+
attrs
.
mode
);
}
transclude
(
function
(
clone
,
newScope
)
{
transclude
(
(
clone
,
newScope
)
=>
{
const
content
=
document
.
createElement
(
'div'
);
content
.
className
=
'markdown-html'
;
...
...
@@ -54,7 +54,7 @@ export function infoPopover() {
scope
.
$applyAsync
(()
=>
{
const
drop
=
new
Drop
(
dropOptions
);
const
unbind
=
scope
.
$on
(
'$destroy'
,
function
()
{
const
unbind
=
scope
.
$on
(
'$destroy'
,
()
=>
{
drop
.
destroy
();
unbind
();
});
...
...
public/app/core/components/layout_selector/layout_selector.ts
View file @
432e203d
...
...
@@ -50,7 +50,7 @@ export function layoutMode($rootScope) {
return
{
restrict
:
'A'
,
scope
:
{},
link
:
function
(
scope
,
elem
)
{
link
:
(
scope
,
elem
)
=>
{
const
layout
=
store
.
get
(
'grafana.list.layout.mode'
)
||
'grid'
;
let
className
=
'card-list-layout-'
+
layout
;
elem
.
addClass
(
className
);
...
...
public/app/core/components/navbar/navbar.ts
View file @
432e203d
...
...
@@ -30,7 +30,7 @@ export function navbarDirective() {
scope
:
{
model
:
'='
,
},
link
:
function
(
scope
,
elem
)
{},
link
:
(
scope
,
elem
)
=>
{},
};
}
...
...
public/app/core/components/query_part/query_part_editor.ts
View file @
432e203d
...
...
@@ -89,20 +89,20 @@ export function queryPartEditorDirective($compile, templateSrv) {
return
;
}
const
typeaheadSource
=
function
(
query
,
callback
)
{
const
typeaheadSource
=
(
query
,
callback
)
=>
{
if
(
param
.
options
)
{
let
options
=
param
.
options
;
if
(
param
.
type
===
'int'
)
{
options
=
_
.
map
(
options
,
function
(
val
)
{
options
=
_
.
map
(
options
,
val
=>
{
return
val
.
toString
();
});
}
return
options
;
}
$scope
.
$apply
(
function
()
{
$scope
.
handleEvent
({
$event
:
{
name
:
'get-param-options'
}
}).
then
(
function
(
result
)
{
const
dynamicOptions
=
_
.
map
(
result
,
function
(
op
)
{
$scope
.
$apply
(
()
=>
{
$scope
.
handleEvent
({
$event
:
{
name
:
'get-param-options'
}
}).
then
(
result
=>
{
const
dynamicOptions
=
_
.
map
(
result
,
op
=>
{
return
op
.
value
;
});
callback
(
dynamicOptions
);
...
...
@@ -116,8 +116,8 @@ export function queryPartEditorDirective($compile, templateSrv) {
source
:
typeaheadSource
,
minLength
:
0
,
items
:
1000
,
updater
:
function
(
value
)
{
setTimeout
(
function
()
{
updater
:
value
=>
{
setTimeout
(
()
=>
{
inputBlur
.
call
(
$input
[
0
],
paramIndex
);
},
0
);
return
value
;
...
...
@@ -136,18 +136,18 @@ export function queryPartEditorDirective($compile, templateSrv) {
}
}
$scope
.
showActionsMenu
=
function
()
{
$scope
.
showActionsMenu
=
()
=>
{
$scope
.
handleEvent
({
$event
:
{
name
:
'get-part-actions'
}
}).
then
(
res
=>
{
$scope
.
partActions
=
res
;
});
};
$scope
.
triggerPartAction
=
function
(
action
)
{
$scope
.
triggerPartAction
=
action
=>
{
$scope
.
handleEvent
({
$event
:
{
name
:
'action'
,
action
:
action
}
});
};
function
addElementsAndCompile
()
{
_
.
each
(
partDef
.
params
,
function
(
param
,
index
)
{
_
.
each
(
partDef
.
params
,
(
param
,
index
)
=>
{
if
(
param
.
optional
&&
part
.
params
.
length
<=
index
)
{
return
;
}
...
...
public/app/core/controllers/inspect_ctrl.ts
View file @
432e203d
...
...
@@ -28,7 +28,7 @@ export class InspectCtrl {
}
if
(
model
.
error
.
config
&&
model
.
error
.
config
.
params
)
{
$scope
.
request_parameters
=
_
.
map
(
model
.
error
.
config
.
params
,
function
(
value
,
key
)
{
$scope
.
request_parameters
=
_
.
map
(
model
.
error
.
config
.
params
,
(
value
,
key
)
=>
{
return
{
key
:
key
,
value
:
value
};
});
}
...
...
@@ -45,7 +45,7 @@ export class InspectCtrl {
if
(
_
.
isString
(
model
.
error
.
config
.
data
))
{
$scope
.
request_parameters
=
this
.
getParametersFromQueryString
(
model
.
error
.
config
.
data
);
}
else
{
$scope
.
request_parameters
=
_
.
map
(
model
.
error
.
config
.
data
,
function
(
value
,
key
)
{
$scope
.
request_parameters
=
_
.
map
(
model
.
error
.
config
.
data
,
(
value
,
key
)
=>
{
return
{
key
:
key
,
value
:
angular
.
toJson
(
value
,
true
)
};
});
}
...
...
public/app/core/controllers/json_editor_ctrl.ts
View file @
432e203d
...
...
@@ -8,7 +8,7 @@ export class JsonEditorCtrl {
$scope
.
canUpdate
=
$scope
.
updateHandler
!==
void
0
&&
$scope
.
contextSrv
.
isEditor
;
$scope
.
canCopy
=
$scope
.
enableCopy
;
$scope
.
update
=
function
()
{
$scope
.
update
=
()
=>
{
const
newObject
=
angular
.
fromJson
(
$scope
.
json
);
$scope
.
updateHandler
(
newObject
,
$scope
.
object
);
};
...
...
public/app/core/directives/array_join.ts
View file @
432e203d
...
...
@@ -7,7 +7,7 @@ export function arrayJoin() {
return
{
restrict
:
'A'
,
require
:
'ngModel'
,
link
:
function
(
scope
,
element
,
attr
,
ngModel
)
{
link
:
(
scope
,
element
,
attr
,
ngModel
)
=>
{
function
split_array
(
text
)
{
return
(
text
||
''
).
split
(
','
);
}
...
...
public/app/features/annotations/annotation_tooltip.ts
View file @
432e203d
...
...
@@ -20,7 +20,7 @@ export function annotationTooltipDirective($sanitize, dashboardSrv, contextSrv,
event
:
'='
,
onEdit
:
'&'
,
},
link
:
function
(
scope
,
element
)
{
link
:
(
scope
,
element
)
=>
{
const
event
=
scope
.
event
;
let
title
=
event
.
title
;
let
text
=
event
.
text
;
...
...
public/app/features/panellinks/link_srv.ts
View file @
432e203d
...
...
@@ -26,14 +26,14 @@ export class LinkSrv {
addParamsToUrl
(
url
,
params
)
{
const
paramsArray
=
[];
_
.
each
(
params
,
function
(
value
,
key
)
{
_
.
each
(
params
,
(
value
,
key
)
=>
{
if
(
value
===
null
)
{
return
;
}
if
(
value
===
true
)
{
paramsArray
.
push
(
key
);
}
else
if
(
_
.
isArray
(
value
))
{
_
.
each
(
value
,
function
(
instance
)
{
_
.
each
(
value
,
instance
=>
{
paramsArray
.
push
(
key
+
'='
+
encodeURIComponent
(
instance
));
});
}
else
{
...
...
public/app/features/plugins/datasource_srv.ts
View file @
432e203d
...
...
@@ -77,7 +77,7 @@ export class DatasourceSrv {
this
.
addDataSourceVariables
(
sources
);
_
.
each
(
config
.
datasources
,
function
(
value
)
{
_
.
each
(
config
.
datasources
,
value
=>
{
if
(
value
.
meta
&&
value
.
meta
.
annotations
)
{
sources
.
push
(
value
);
}
...
...
@@ -97,7 +97,7 @@ export class DatasourceSrv {
getMetricSources
(
options
)
{
const
metricSources
=
[];
_
.
each
(
config
.
datasources
,
function
(
value
,
key
)
{
_
.
each
(
config
.
datasources
,
(
value
,
key
)
=>
{
if
(
value
.
meta
&&
value
.
meta
.
metrics
)
{
let
metricSource
=
{
value
:
key
,
name
:
key
,
meta
:
value
.
meta
,
sort
:
key
};
...
...
@@ -121,7 +121,7 @@ export class DatasourceSrv {
this
.
addDataSourceVariables
(
metricSources
);
}
metricSources
.
sort
(
function
(
a
,
b
)
{
metricSources
.
sort
(
(
a
,
b
)
=>
{
if
(
a
.
sort
.
toLowerCase
()
>
b
.
sort
.
toLowerCase
())
{
return
1
;
}
...
...
public/app/features/plugins/plugin_loader.ts
View file @
432e203d
...
...
@@ -65,7 +65,7 @@ System.config({
});
function
exposeToPlugin
(
name
:
string
,
component
:
any
)
{
System
.
registerDynamic
(
name
,
[],
true
,
function
(
require
,
exports
,
module
)
{
System
.
registerDynamic
(
name
,
[],
true
,
(
require
,
exports
,
module
)
=>
{
module
.
exports
=
component
;
});
}
...
...
public/app/plugins/datasource/cloudwatch/query_parameter_ctrl.ts
View file @
432e203d
...
...
@@ -19,7 +19,7 @@ export class CloudWatchQueryParameter {
export
class
CloudWatchQueryParameterCtrl
{
/** @ngInject */
constructor
(
$scope
,
templateSrv
,
uiSegmentSrv
,
datasourceSrv
,
$q
)
{
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
const
target
=
$scope
.
target
;
target
.
namespace
=
target
.
namespace
||
''
;
target
.
metricName
=
target
.
metricName
||
''
;
...
...
@@ -38,7 +38,7 @@ export class CloudWatchQueryParameterCtrl {
$scope
.
dimSegments
=
_
.
reduce
(
$scope
.
target
.
dimensions
,
function
(
memo
,
value
,
key
)
{
(
memo
,
value
,
key
)
=>
{
memo
.
push
(
uiSegmentSrv
.
newKey
(
key
));
memo
.
push
(
uiSegmentSrv
.
newOperator
(
'='
));
memo
.
push
(
uiSegmentSrv
.
newKeyValue
(
value
));
...
...
@@ -47,7 +47,7 @@ export class CloudWatchQueryParameterCtrl {
[]
);
$scope
.
statSegments
=
_
.
map
(
$scope
.
target
.
statistics
,
function
(
stat
)
{
$scope
.
statSegments
=
_
.
map
(
$scope
.
target
.
statistics
,
stat
=>
{
return
uiSegmentSrv
.
getSegmentForValue
(
stat
);
});
...
...
@@ -67,15 +67,15 @@ export class CloudWatchQueryParameterCtrl {
}
if
(
!
$scope
.
onChange
)
{
$scope
.
onChange
=
function
()
{};
$scope
.
onChange
=
()
=>
{};
}
};
$scope
.
getStatSegments
=
function
()
{
$scope
.
getStatSegments
=
()
=>
{
return
$q
.
when
(
_
.
flatten
([
angular
.
copy
(
$scope
.
removeStatSegment
),
_
.
map
(
$scope
.
datasource
.
standardStatistics
,
function
(
s
)
{
_
.
map
(
$scope
.
datasource
.
standardStatistics
,
s
=>
{
return
uiSegmentSrv
.
getSegmentForValue
(
s
);
}),
uiSegmentSrv
.
getSegmentForValue
(
'pNN.NN'
),
...
...
@@ -83,7 +83,7 @@ export class CloudWatchQueryParameterCtrl {
);
};
$scope
.
statSegmentChanged
=
function
(
segment
,
index
)
{
$scope
.
statSegmentChanged
=
(
segment
,
index
)
=>
{
if
(
segment
.
value
===
$scope
.
removeStatSegment
.
value
)
{
$scope
.
statSegments
.
splice
(
index
,
1
);
}
else
{
...
...
@@ -92,7 +92,7 @@ export class CloudWatchQueryParameterCtrl {
$scope
.
target
.
statistics
=
_
.
reduce
(
$scope
.
statSegments
,
function
(
memo
,
seg
)
{
(
memo
,
seg
)
=>
{
if
(
!
seg
.
fake
)
{
memo
.
push
(
seg
.
value
);
}
...
...
@@ -105,7 +105,7 @@ export class CloudWatchQueryParameterCtrl {
$scope
.
onChange
();
};
$scope
.
ensurePlusButton
=
function
(
segments
)
{
$scope
.
ensurePlusButton
=
segments
=>
{
const
count
=
segments
.
length
;
const
lastSegment
=
segments
[
Math
.
max
(
count
-
1
,
0
)];
...
...
@@ -114,7 +114,7 @@ export class CloudWatchQueryParameterCtrl {
}
};
$scope
.
getDimSegments
=
function
(
segment
,
$index
)
{
$scope
.
getDimSegments
=
(
segment
,
$index
)
=>
{
if
(
segment
.
type
===
'operator'
)
{
return
$q
.
when
([]);
}
...
...
@@ -135,7 +135,7 @@ export class CloudWatchQueryParameterCtrl {
);
}
return
query
.
then
(
$scope
.
transformToSegments
(
true
)).
then
(
function
(
results
)
{
return
query
.
then
(
$scope
.
transformToSegments
(
true
)).
then
(
results
=>
{
if
(
segment
.
type
===
'key'
)
{
results
.
splice
(
0
,
0
,
angular
.
copy
(
$scope
.
removeDimSegment
));
}
...
...
@@ -143,7 +143,7 @@ export class CloudWatchQueryParameterCtrl {
});
};
$scope
.
dimSegmentChanged
=
function
(
segment
,
index
)
{
$scope
.
dimSegmentChanged
=
(
segment
,
index
)
=>
{
$scope
.
dimSegments
[
index
]
=
segment
;
if
(
segment
.
value
===
$scope
.
removeDimSegment
.
value
)
{
...
...
@@ -160,7 +160,7 @@ export class CloudWatchQueryParameterCtrl {
$scope
.
onChange
();
};
$scope
.
syncDimSegmentsWithModel
=
function
()
{
$scope
.
syncDimSegmentsWithModel
=
()
=>
{
const
dims
=
{};
const
length
=
$scope
.
dimSegments
.
length
;
...
...
@@ -175,44 +175,44 @@ export class CloudWatchQueryParameterCtrl {
$scope
.
target
.
dimensions
=
dims
;
};
$scope
.
getRegions
=
function
()
{
$scope
.
getRegions
=
()
=>
{
return
$scope
.
datasource
.
metricFindQuery
(
'regions()'
)
.
then
(
function
(
results
)
{
.
then
(
results
=>
{
results
.
unshift
({
text
:
'default'
});
return
results
;
})
.
then
(
$scope
.
transformToSegments
(
true
));
};
$scope
.
getNamespaces
=
function
()
{
$scope
.
getNamespaces
=
()
=>
{
return
$scope
.
datasource
.
metricFindQuery
(
'namespaces()'
).
then
(
$scope
.
transformToSegments
(
true
));
};
$scope
.
getMetrics
=
function
()
{
$scope
.
getMetrics
=
()
=>
{
return
$scope
.
datasource
.
metricFindQuery
(
'metrics('
+
$scope
.
target
.
namespace
+
','
+
$scope
.
target
.
region
+
')'
)
.
then
(
$scope
.
transformToSegments
(
true
));
};
$scope
.
regionChanged
=
function
()
{
$scope
.
regionChanged
=
()
=>
{
$scope
.
target
.
region
=
$scope
.
regionSegment
.
value
;
$scope
.
onChange
();
};
$scope
.
namespaceChanged
=
function
()
{
$scope
.
namespaceChanged
=
()
=>
{
$scope
.
target
.
namespace
=
$scope
.
namespaceSegment
.
value
;
$scope
.
onChange
();
};
$scope
.
metricChanged
=
function
()
{
$scope
.
metricChanged
=
()
=>
{
$scope
.
target
.
metricName
=
$scope
.
metricSegment
.
value
;
$scope
.
onChange
();
};
$scope
.
transformToSegments
=
function
(
addTemplateVars
)
{
return
function
(
results
)
{
const
segments
=
_
.
map
(
results
,
function
(
segment
)
{
$scope
.
transformToSegments
=
addTemplateVars
=>
{
return
results
=>
{
const
segments
=
_
.
map
(
results
,
segment
=>
{
return
uiSegmentSrv
.
newSegment
({
value
:
segment
.
text
,
expandable
:
segment
.
expandable
,
...
...
@@ -220,7 +220,7 @@ export class CloudWatchQueryParameterCtrl {
});
if
(
addTemplateVars
)
{
_
.
each
(
templateSrv
.
variables
,
function
(
variable
)
{
_
.
each
(
templateSrv
.
variables
,
variable
=>
{
segments
.
unshift
(
uiSegmentSrv
.
newSegment
({
type
:
'template'
,
...
...
public/app/plugins/datasource/elasticsearch/bucket_agg.ts
View file @
432e203d
...
...
@@ -23,36 +23,36 @@ export class ElasticBucketAggCtrl {
$scope
.
orderByOptions
=
[];
$scope
.
getBucketAggTypes
=
function
()
{
$scope
.
getBucketAggTypes
=
()
=>
{
return
queryDef
.
bucketAggTypes
;
};
$scope
.
getOrderOptions
=
function
()
{
$scope
.
getOrderOptions
=
()
=>
{
return
queryDef
.
orderOptions
;
};
$scope
.
getSizeOptions
=
function
()
{
$scope
.
getSizeOptions
=
()
=>
{
return
queryDef
.
sizeOptions
;
};
$rootScope
.
onAppEvent
(
'elastic-query-updated'
,
function
()
{
()
=>
{
$scope
.
validateModel
();
},
$scope
);
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
agg
=
bucketAggs
[
$scope
.
index
];
$scope
.
validateModel
();
};
$scope
.
onChangeInternal
=
function
()
{
$scope
.
onChangeInternal
=
()
=>
{
$scope
.
onChange
();
};
$scope
.
onTypeChanged
=
function
()
{
$scope
.
onTypeChanged
=
()
=>
{
$scope
.
agg
.
settings
=
{};
$scope
.
showOptions
=
false
;
...
...
@@ -79,7 +79,7 @@ export class ElasticBucketAggCtrl {
$scope
.
onChange
();
};
$scope
.
validateModel
=
function
()
{
$scope
.
validateModel
=
()
=>
{
$scope
.
index
=
_
.
indexOf
(
bucketAggs
,
$scope
.
agg
);
$scope
.
isFirst
=
$scope
.
index
===
0
;
$scope
.
bucketAggCount
=
bucketAggs
.
length
;
...
...
@@ -114,7 +114,7 @@ export class ElasticBucketAggCtrl {
settings
.
filters
=
settings
.
filters
||
[{
query
:
'*'
}];
settingsLinkText
=
_
.
reduce
(
settings
.
filters
,
function
(
memo
,
value
,
index
)
{
(
memo
,
value
,
index
)
=>
{
memo
+=
'Q'
+
(
index
+
1
)
+
' = '
+
value
.
query
+
' '
;
return
memo
;
},
...
...
@@ -168,23 +168,23 @@ export class ElasticBucketAggCtrl {
return
true
;
};
$scope
.
addFiltersQuery
=
function
()
{
$scope
.
addFiltersQuery
=
()
=>
{
$scope
.
agg
.
settings
.
filters
.
push
({
query
:
'*'
});
};
$scope
.
removeFiltersQuery
=
f
unction
(
filter
)
{
$scope
.
removeFiltersQuery
=
f
ilter
=>
{
$scope
.
agg
.
settings
.
filters
=
_
.
without
(
$scope
.
agg
.
settings
.
filters
,
filter
);
};
$scope
.
toggleOptions
=
function
()
{
$scope
.
toggleOptions
=
()
=>
{
$scope
.
showOptions
=
!
$scope
.
showOptions
;
};
$scope
.
getOrderByOptions
=
function
()
{
$scope
.
getOrderByOptions
=
()
=>
{
return
queryDef
.
getOrderByOptions
(
$scope
.
target
);
};
$scope
.
getFieldsInternal
=
function
()
{
$scope
.
getFieldsInternal
=
()
=>
{
if
(
$scope
.
agg
.
type
===
'date_histogram'
)
{
return
$scope
.
getFields
({
$fieldType
:
'date'
});
}
else
{
...
...
@@ -192,11 +192,11 @@ export class ElasticBucketAggCtrl {
}
};
$scope
.
getIntervalOptions
=
function
()
{
$scope
.
getIntervalOptions
=
()
=>
{
return
$q
.
when
(
uiSegmentSrv
.
transformToSegments
(
true
,
'interval'
)(
queryDef
.
intervalOptions
));
};
$scope
.
addBucketAgg
=
function
()
{
$scope
.
addBucketAgg
=
()
=>
{
// if last is date histogram add it before
const
lastBucket
=
bucketAggs
[
bucketAggs
.
length
-
1
];
let
addIndex
=
bucketAggs
.
length
-
1
;
...
...
@@ -207,7 +207,7 @@ export class ElasticBucketAggCtrl {
const
id
=
_
.
reduce
(
$scope
.
target
.
bucketAggs
.
concat
(
$scope
.
target
.
metrics
),
function
(
max
,
val
)
{
(
max
,
val
)
=>
{
return
parseInt
(
val
.
id
)
>
max
?
parseInt
(
val
.
id
)
:
max
;
},
0
...
...
@@ -217,7 +217,7 @@ export class ElasticBucketAggCtrl {
$scope
.
onChange
();
};
$scope
.
removeBucketAgg
=
function
()
{
$scope
.
removeBucketAgg
=
()
=>
{
bucketAggs
.
splice
(
$scope
.
index
,
1
);
$scope
.
onChange
();
};
...
...
public/app/plugins/datasource/elasticsearch/datasource.ts
View file @
432e203d
...
...
@@ -59,12 +59,12 @@ export class ElasticDatasource {
const
range
=
this
.
timeSrv
.
timeRange
();
const
indexList
=
this
.
indexPattern
.
getIndexList
(
range
.
from
.
valueOf
(),
range
.
to
.
valueOf
());
if
(
_
.
isArray
(
indexList
)
&&
indexList
.
length
)
{
return
this
.
request
(
'GET'
,
indexList
[
0
]
+
url
).
then
(
function
(
results
)
{
return
this
.
request
(
'GET'
,
indexList
[
0
]
+
url
).
then
(
results
=>
{
results
.
data
.
$$config
=
results
.
config
;
return
results
.
data
;
});
}
else
{
return
this
.
request
(
'GET'
,
this
.
indexPattern
.
getIndexForToday
()
+
url
).
then
(
function
(
results
)
{
return
this
.
request
(
'GET'
,
this
.
indexPattern
.
getIndexForToday
()
+
url
).
then
(
results
=>
{
results
.
data
.
$$config
=
results
.
config
;
return
results
.
data
;
});
...
...
@@ -73,7 +73,7 @@ export class ElasticDatasource {
private
post
(
url
,
data
)
{
return
this
.
request
(
'POST'
,
url
,
data
)
.
then
(
function
(
results
)
{
.
then
(
results
=>
{
results
.
data
.
$$config
=
results
.
config
;
return
results
.
data
;
})
...
...
@@ -145,7 +145,7 @@ export class ElasticDatasource {
const
list
=
[];
const
hits
=
res
.
responses
[
0
].
hits
.
hits
;
const
getFieldFromSource
=
function
(
source
,
fieldName
)
{
const
getFieldFromSource
=
(
source
,
fieldName
)
=>
{
if
(
!
fieldName
)
{
return
;
}
...
...
@@ -213,7 +213,7 @@ export class ElasticDatasource {
}
return
{
status
:
'success'
,
message
:
'Index OK. Time field name OK.'
};
},
function
(
err
)
{
err
=>
{
console
.
log
(
err
);
if
(
err
.
data
&&
err
.
data
.
error
)
{
let
message
=
angular
.
toJson
(
err
.
data
.
error
);
...
...
@@ -274,13 +274,13 @@ export class ElasticDatasource {
payload
=
payload
.
replace
(
/
\$
timeTo/g
,
options
.
range
.
to
.
valueOf
());
payload
=
this
.
templateSrv
.
replace
(
payload
,
options
.
scopedVars
);
return
this
.
post
(
'_msearch'
,
payload
).
then
(
function
(
res
)
{
return
this
.
post
(
'_msearch'
,
payload
).
then
(
res
=>
{
return
new
ElasticResponse
(
sentTargets
,
res
).
getTimeSeries
();
});
}
getFields
(
query
)
{
return
this
.
get
(
'/_mapping'
).
then
(
function
(
result
)
{
return
this
.
get
(
'/_mapping'
).
then
(
result
=>
{
const
typeMap
=
{
float
:
'number'
,
double
:
'number'
,
...
...
@@ -352,7 +352,7 @@ export class ElasticDatasource {
}
// transform to array
return
_
.
map
(
fields
,
function
(
value
)
{
return
_
.
map
(
fields
,
value
=>
{
return
value
;
});
});
...
...
@@ -368,13 +368,13 @@ export class ElasticDatasource {
esQuery
=
esQuery
.
replace
(
/
\$
timeTo/g
,
range
.
to
.
valueOf
());
esQuery
=
header
+
'
\
n'
+
esQuery
+
'
\
n'
;
return
this
.
post
(
'_msearch?search_type='
+
searchType
,
esQuery
).
then
(
function
(
res
)
{
return
this
.
post
(
'_msearch?search_type='
+
searchType
,
esQuery
).
then
(
res
=>
{
if
(
!
res
.
responses
[
0
].
aggregations
)
{
return
[];
}
const
buckets
=
res
.
responses
[
0
].
aggregations
[
'1'
].
buckets
;
return
_
.
map
(
buckets
,
function
(
bucket
)
{
return
_
.
map
(
buckets
,
bucket
=>
{
return
{
text
:
bucket
.
key_as_string
||
bucket
.
key
,
value
:
bucket
.
key
,
...
...
public/app/plugins/datasource/elasticsearch/elastic_response.ts
View file @
432e203d
...
...
@@ -227,7 +227,7 @@ export class ElasticResponse {
if
(
target
.
alias
)
{
const
regex
=
/
\{\{([\s\S]
+
?)\}\}
/g
;
return
target
.
alias
.
replace
(
regex
,
function
(
match
,
g1
,
g2
)
{
return
target
.
alias
.
replace
(
regex
,
(
match
,
g1
,
g2
)
=>
{
const
group
=
g1
||
g2
;
if
(
group
.
indexOf
(
'term '
)
===
0
)
{
...
...
public/app/plugins/datasource/elasticsearch/metric_agg.ts
View file @
432e203d
...
...
@@ -25,19 +25,19 @@ export class ElasticMetricAggCtrl {
$scope
.
pipelineAggOptions
=
[];
$scope
.
modelSettingsValues
=
{};
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
agg
=
metricAggs
[
$scope
.
index
];
$scope
.
validateModel
();
$scope
.
updatePipelineAggOptions
();
};
$scope
.
updatePipelineAggOptions
=
function
()
{
$scope
.
updatePipelineAggOptions
=
()
=>
{
$scope
.
pipelineAggOptions
=
queryDef
.
getPipelineAggOptions
(
$scope
.
target
);
};
$rootScope
.
onAppEvent
(
'elastic-query-updated'
,
function
()
{
()
=>
{
$scope
.
index
=
_
.
indexOf
(
metricAggs
,
$scope
.
agg
);
$scope
.
updatePipelineAggOptions
();
$scope
.
validateModel
();
...
...
@@ -45,7 +45,7 @@ export class ElasticMetricAggCtrl {
$scope
);
$scope
.
validateModel
=
function
()
{
$scope
.
validateModel
=
()
=>
{
$scope
.
isFirst
=
$scope
.
index
===
0
;
$scope
.
isSingle
=
metricAggs
.
length
===
1
;
$scope
.
settingsLinkText
=
''
;
...
...
@@ -57,7 +57,7 @@ export class ElasticMetricAggCtrl {
const
pipelineOptions
=
queryDef
.
getPipelineOptions
(
$scope
.
agg
);
if
(
pipelineOptions
.
length
>
0
)
{
_
.
each
(
pipelineOptions
,
function
(
opt
)
{
_
.
each
(
pipelineOptions
,
opt
=>
{
$scope
.
agg
.
settings
[
opt
.
text
]
=
$scope
.
agg
.
settings
[
opt
.
text
]
||
opt
.
default
;
});
$scope
.
settingsLinkText
=
'Options'
;
...
...
@@ -84,7 +84,7 @@ export class ElasticMetricAggCtrl {
const
stats
=
_
.
reduce
(
$scope
.
agg
.
meta
,
function
(
memo
,
val
,
key
)
{
(
memo
,
val
,
key
)
=>
{
if
(
val
)
{
const
def
=
_
.
find
(
$scope
.
extendedStats
,
{
value
:
key
});
memo
.
push
(
def
.
text
);
...
...
@@ -128,16 +128,16 @@ export class ElasticMetricAggCtrl {
}
};
$scope
.
toggleOptions
=
function
()
{
$scope
.
toggleOptions
=
()
=>
{
$scope
.
showOptions
=
!
$scope
.
showOptions
;
$scope
.
updatePipelineAggOptions
();
};
$scope
.
onChangeInternal
=
function
()
{
$scope
.
onChangeInternal
=
()
=>
{
$scope
.
onChange
();
};
$scope
.
updateMovingAvgModelSettings
=
function
()
{
$scope
.
updateMovingAvgModelSettings
=
()
=>
{
const
modelSettingsKeys
=
[];
const
modelSettings
=
queryDef
.
getMovingAvgSettings
(
$scope
.
agg
.
settings
.
model
,
false
);
for
(
let
i
=
0
;
i
<
modelSettings
.
length
;
i
++
)
{
...
...
@@ -151,12 +151,12 @@ export class ElasticMetricAggCtrl {
}
};
$scope
.
onChangeClearInternal
=
function
()
{
$scope
.
onChangeClearInternal
=
()
=>
{
delete
$scope
.
agg
.
settings
.
minimize
;
$scope
.
onChange
();
};
$scope
.
onTypeChange
=
function
()
{
$scope
.
onTypeChange
=
()
=>
{
$scope
.
agg
.
settings
=
{};
$scope
.
agg
.
meta
=
{};
$scope
.
showOptions
=
false
;
...
...
@@ -164,19 +164,19 @@ export class ElasticMetricAggCtrl {
$scope
.
onChange
();
};
$scope
.
getFieldsInternal
=
function
()
{
$scope
.
getFieldsInternal
=
()
=>
{
if
(
$scope
.
agg
.
type
===
'cardinality'
)
{
return
$scope
.
getFields
();
}
return
$scope
.
getFields
({
$fieldType
:
'number'
});
};
$scope
.
addMetricAgg
=
function
()
{
$scope
.
addMetricAgg
=
()
=>
{
const
addIndex
=
metricAggs
.
length
;
const
id
=
_
.
reduce
(
$scope
.
target
.
bucketAggs
.
concat
(
$scope
.
target
.
metrics
),
function
(
max
,
val
)
{
(
max
,
val
)
=>
{
return
parseInt
(
val
.
id
)
>
max
?
parseInt
(
val
.
id
)
:
max
;
},
0
...
...
@@ -186,12 +186,12 @@ export class ElasticMetricAggCtrl {
$scope
.
onChange
();
};
$scope
.
removeMetricAgg
=
function
()
{
$scope
.
removeMetricAgg
=
()
=>
{
metricAggs
.
splice
(
$scope
.
index
,
1
);
$scope
.
onChange
();
};
$scope
.
toggleShowMetric
=
function
()
{
$scope
.
toggleShowMetric
=
()
=>
{
$scope
.
agg
.
hide
=
!
$scope
.
agg
.
hide
;
if
(
!
$scope
.
agg
.
hide
)
{
delete
$scope
.
agg
.
hide
;
...
...
public/app/plugins/datasource/elasticsearch/query_def.ts
View file @
432e203d
...
...
@@ -145,7 +145,7 @@ export const movingAvgModelSettings = {
};
export
function
getMetricAggTypes
(
esVersion
)
{
return
_
.
filter
(
metricAggTypes
,
f
unction
(
f
)
{
return
_
.
filter
(
metricAggTypes
,
f
=>
{
if
(
f
.
minVersion
)
{
return
f
.
minVersion
<=
esVersion
;
}
else
{
...
...
@@ -173,7 +173,7 @@ export function isPipelineAgg(metricType) {
export
function
getPipelineAggOptions
(
targets
)
{
const
result
=
[];
_
.
each
(
targets
.
metrics
,
function
(
metric
)
{
_
.
each
(
targets
.
metrics
,
metric
=>
{
if
(
!
isPipelineAgg
(
metric
.
type
))
{
result
.
push
({
text
:
describeMetric
(
metric
),
value
:
metric
.
id
});
}
...
...
@@ -185,7 +185,7 @@ export function getPipelineAggOptions(targets) {
export
function
getMovingAvgSettings
(
model
,
filtered
)
{
const
filteredResult
=
[];
if
(
filtered
)
{
_
.
each
(
movingAvgModelSettings
[
model
],
function
(
setting
)
{
_
.
each
(
movingAvgModelSettings
[
model
],
setting
=>
{
if
(
!
setting
.
isCheckbox
)
{
filteredResult
.
push
(
setting
);
}
...
...
@@ -197,7 +197,7 @@ export function getMovingAvgSettings(model, filtered) {
export
function
getOrderByOptions
(
target
)
{
const
metricRefs
=
[];
_
.
each
(
target
.
metrics
,
function
(
metric
)
{
_
.
each
(
target
.
metrics
,
metric
=>
{
if
(
metric
.
type
!==
'count'
)
{
metricRefs
.
push
({
text
:
describeMetric
(
metric
),
value
:
metric
.
id
});
}
...
...
public/app/plugins/datasource/graphite/graphite_query.ts
View file @
432e203d
...
...
@@ -73,7 +73,7 @@ export default class GraphiteQuery {
return
_
.
reduce
(
arr
,
function
(
result
,
segment
)
{
(
result
,
segment
)
=>
{
return
result
?
result
+
'.'
+
segment
.
value
:
segment
.
value
;
},
''
...
...
@@ -133,7 +133,7 @@ export default class GraphiteQuery {
}
moveAliasFuncLast
()
{
const
aliasFunc
=
_
.
find
(
this
.
functions
,
func
tion
(
func
)
{
const
aliasFunc
=
_
.
find
(
this
.
functions
,
func
=>
{
return
func
.
def
.
name
.
startsWith
(
'alias'
);
});
...
...
public/app/plugins/datasource/graphite/lexer.ts
View file @
432e203d
...
...
@@ -1370,7 +1370,7 @@ Lexer.prototype = {
};
},
isPunctuator:
function(ch1)
{
isPunctuator:
ch1 =>
{
switch (ch1) {
case '
.
':
case '
(
':
...
...
public/app/plugins/datasource/influxdb/datasource.ts
View file @
432e203d
...
...
@@ -23,7 +23,7 @@ export default class InfluxDatasource {
/** @ngInject */
constructor
(
instanceSettings
,
private
$q
,
private
backendSrv
,
private
templateSrv
)
{
this
.
type
=
'influxdb'
;
this
.
urls
=
_
.
map
(
instanceSettings
.
url
.
split
(
','
),
function
(
url
)
{
this
.
urls
=
_
.
map
(
instanceSettings
.
url
.
split
(
','
),
url
=>
{
return
url
.
trim
();
});
...
...
@@ -274,7 +274,7 @@ export default class InfluxDatasource {
result
=>
{
return
result
.
data
;
},
function
(
err
)
{
err
=>
{
if
(
err
.
status
!==
0
||
err
.
status
>=
300
)
{
if
(
err
.
data
&&
err
.
data
.
error
)
{
throw
{
...
...
public/app/plugins/datasource/influxdb/influx_query.ts
View file @
432e203d
...
...
@@ -27,15 +27,15 @@ export default class InfluxQuery {
}
updateProjection
()
{
this
.
selectModels
=
_
.
map
(
this
.
target
.
select
,
function
(
parts
:
any
)
{
this
.
selectModels
=
_
.
map
(
this
.
target
.
select
,
(
parts
:
any
)
=>
{
return
_
.
map
(
parts
,
queryPart
.
create
);
});
this
.
groupByParts
=
_
.
map
(
this
.
target
.
groupBy
,
queryPart
.
create
);
}
updatePersistedParts
()
{
this
.
target
.
select
=
_
.
map
(
this
.
selectModels
,
function
(
selectParts
)
{
return
_
.
map
(
selectParts
,
function
(
part
:
any
)
{
this
.
target
.
select
=
_
.
map
(
this
.
selectModels
,
selectParts
=>
{
return
_
.
map
(
selectParts
,
(
part
:
any
)
=>
{
return
{
type
:
part
.
def
.
type
,
params
:
part
.
params
};
});
});
...
...
public/app/plugins/datasource/influxdb/influx_series.ts
View file @
432e203d
...
...
@@ -22,7 +22,7 @@ export default class InfluxSeries {
_
.
each
(
this
.
series
,
series
=>
{
const
columns
=
series
.
columns
.
length
;
const
tags
=
_
.
map
(
series
.
tags
,
function
(
value
,
key
)
{
const
tags
=
_
.
map
(
series
.
tags
,
(
value
,
key
)
=>
{
return
key
+
': '
+
value
;
});
...
...
@@ -57,7 +57,7 @@ export default class InfluxSeries {
const
regex
=
/
\$(\w
+
)
|
\[\[([\s\S]
+
?)\]\]
/g
;
const
segments
=
series
.
name
.
split
(
'.'
);
return
this
.
alias
.
replace
(
regex
,
function
(
match
,
g1
,
g2
)
{
return
this
.
alias
.
replace
(
regex
,
(
match
,
g1
,
g2
)
=>
{
const
group
=
g1
||
g2
;
const
segIndex
=
parseInt
(
group
,
10
);
...
...
@@ -124,10 +124,10 @@ export default class InfluxSeries {
// Remove empty values, then split in different tags for comma separated values
tags
:
_
.
flatten
(
tagsCol
.
filter
(
function
(
t
)
{
.
filter
(
t
=>
{
return
value
[
t
];
})
.
map
(
function
(
t
)
{
.
map
(
t
=>
{
return
value
[
t
].
split
(
','
);
})
),
...
...
@@ -158,7 +158,7 @@ export default class InfluxSeries {
table
.
columns
.
push
({
text
:
'Time'
,
type
:
'time'
});
j
++
;
}
_
.
each
(
_
.
keys
(
series
.
tags
),
function
(
key
)
{
_
.
each
(
_
.
keys
(
series
.
tags
),
key
=>
{
table
.
columns
.
push
({
text
:
key
});
});
for
(;
j
<
series
.
columns
.
length
;
j
++
)
{
...
...
public/app/plugins/datasource/influxdb/query_builder.ts
View file @
432e203d
...
...
@@ -84,7 +84,7 @@ export class InfluxQueryBuilder {
if
(
this
.
target
.
tags
&&
this
.
target
.
tags
.
length
>
0
)
{
const
whereConditions
=
_
.
reduce
(
this
.
target
.
tags
,
function
(
memo
,
tag
)
{
(
memo
,
tag
)
=>
{
// do not add a condition for the key we want to explore for
if
(
tag
.
key
===
withKey
)
{
return
memo
;
...
...
public/app/plugins/datasource/influxdb/query_ctrl.ts
View file @
432e203d
...
...
@@ -70,7 +70,7 @@ export class InfluxQueryCtrl extends QueryCtrl {
const
categories
=
queryPart
.
getCategories
();
this
.
selectMenu
=
_
.
reduce
(
categories
,
function
(
memo
,
cat
,
key
)
{
(
memo
,
cat
,
key
)
=>
{
const
menu
=
{
text
:
key
,
submenu
:
cat
.
map
(
item
=>
{
...
...
public/app/plugins/datasource/influxdb/query_part.ts
View file @
432e203d
...
...
@@ -126,7 +126,7 @@ function addAliasStrategy(selectParts, partModel) {
function
addFieldStrategy
(
selectParts
,
partModel
,
query
)
{
// copy all parts
const
parts
=
_
.
map
(
selectParts
,
function
(
part
:
any
)
{
const
parts
=
_
.
map
(
selectParts
,
(
part
:
any
)
=>
{
return
createPart
({
type
:
part
.
def
.
type
,
params
:
_
.
clone
(
part
.
params
)
});
});
...
...
@@ -453,7 +453,7 @@ register({
export
default
{
create
:
createPart
,
getCategories
:
function
()
{
getCategories
:
()
=>
{
return
categories
;
},
replaceAggregationAdd
:
replaceAggregationAddStrategy
,
...
...
public/app/plugins/datasource/mixed/datasource.ts
View file @
432e203d
...
...
@@ -13,14 +13,14 @@ class MixedDatasource {
return
this
.
$q
([]);
}
return
this
.
datasourceSrv
.
get
(
dsName
).
then
(
function
(
ds
)
{
return
this
.
datasourceSrv
.
get
(
dsName
).
then
(
ds
=>
{
const
opt
=
angular
.
copy
(
options
);
opt
.
targets
=
targets
;
return
ds
.
query
(
opt
);
});
});
return
this
.
$q
.
all
(
promises
).
then
(
function
(
results
)
{
return
this
.
$q
.
all
(
promises
).
then
(
results
=>
{
return
{
data
:
_
.
flatten
(
_
.
map
(
results
,
'data'
))
};
});
}
...
...
public/app/plugins/datasource/mssql/datasource.ts
View file @
432e203d
...
...
@@ -26,7 +26,7 @@ export class MssqlDatasource {
return
value
;
}
const
quotedValues
=
_
.
map
(
value
,
function
(
val
)
{
const
quotedValues
=
_
.
map
(
value
,
val
=>
{
if
(
typeof
value
===
'number'
)
{
return
value
;
}
...
...
public/app/plugins/datasource/mysql/datasource.ts
View file @
432e203d
...
...
@@ -26,7 +26,7 @@ export class MysqlDatasource {
return
value
;
}
const
quotedValues
=
_
.
map
(
value
,
function
(
val
)
{
const
quotedValues
=
_
.
map
(
value
,
val
=>
{
if
(
typeof
value
===
'number'
)
{
return
value
;
}
...
...
public/app/plugins/datasource/opentsdb/datasource.ts
View file @
432e203d
...
...
@@ -56,19 +56,19 @@ export default class OpenTsDatasource {
}
const
groupByTags
=
{};
_
.
each
(
queries
,
function
(
query
)
{
_
.
each
(
queries
,
query
=>
{
if
(
query
.
filters
&&
query
.
filters
.
length
>
0
)
{
_
.
each
(
query
.
filters
,
function
(
val
)
{
_
.
each
(
query
.
filters
,
val
=>
{
groupByTags
[
val
.
tagk
]
=
true
;
});
}
else
{
_
.
each
(
query
.
tags
,
function
(
val
,
key
)
{
_
.
each
(
query
.
tags
,
(
val
,
key
)
=>
{
groupByTags
[
key
]
=
true
;
});
}
});
options
.
targets
=
_
.
filter
(
options
.
targets
,
function
(
query
)
{
options
.
targets
=
_
.
filter
(
options
.
targets
,
query
=>
{
return
query
.
hide
!==
true
;
});
...
...
@@ -97,28 +97,26 @@ export default class OpenTsDatasource {
const
queries
=
_
.
compact
(
qs
);
return
this
.
performTimeSeriesQuery
(
queries
,
start
,
end
).
then
(
function
(
results
)
{
if
(
results
.
data
[
0
])
{
let
annotationObject
=
results
.
data
[
0
].
annotations
;
if
(
options
.
annotation
.
isGlobal
)
{
annotationObject
=
results
.
data
[
0
].
globalAnnotations
;
}
if
(
annotationObject
)
{
_
.
each
(
annotationObject
,
function
(
annotation
)
{
const
event
=
{
text
:
annotation
.
description
,
time
:
Math
.
floor
(
annotation
.
startTime
)
*
1000
,
annotation
:
options
.
annotation
,
};
eventList
.
push
(
event
);
});
}
return
this
.
performTimeSeriesQuery
(
queries
,
start
,
end
).
then
(
results
=>
{
if
(
results
.
data
[
0
])
{
let
annotationObject
=
results
.
data
[
0
].
annotations
;
if
(
options
.
annotation
.
isGlobal
)
{
annotationObject
=
results
.
data
[
0
].
globalAnnotations
;
}
if
(
annotationObject
)
{
_
.
each
(
annotationObject
,
annotation
=>
{
const
event
=
{
text
:
annotation
.
description
,
time
:
Math
.
floor
(
annotation
.
startTime
)
*
1000
,
annotation
:
options
.
annotation
,
};
eventList
.
push
(
event
);
});
}
return
eventList
;
}.
bind
(
this
)
);
}
return
eventList
;
}
);
}
targetContainsTemplate
(
target
)
{
...
...
@@ -177,7 +175,7 @@ export default class OpenTsDatasource {
_saveTagKeys
(
metricData
)
{
const
tagKeys
=
Object
.
keys
(
metricData
.
tags
);
_
.
each
(
metricData
.
aggregateTags
,
function
(
tag
)
{
_
.
each
(
metricData
.
aggregateTags
,
tag
=>
{
tagKeys
.
push
(
tag
);
});
...
...
@@ -185,7 +183,7 @@ export default class OpenTsDatasource {
}
_performSuggestQuery
(
query
,
type
)
{
return
this
.
_get
(
'/api/suggest'
,
{
type
:
type
,
q
:
query
,
max
:
1000
}).
then
(
function
(
result
)
{
return
this
.
_get
(
'/api/suggest'
,
{
type
:
type
,
q
:
query
,
max
:
1000
}).
then
(
result
=>
{
return
result
.
data
;
});
}
...
...
@@ -195,7 +193,7 @@ export default class OpenTsDatasource {
return
this
.
$q
.
when
([]);
}
const
keysArray
=
keys
.
split
(
','
).
map
(
function
(
key
)
{
const
keysArray
=
keys
.
split
(
','
).
map
(
key
=>
{
return
key
.
trim
();
});
const
key
=
keysArray
[
0
];
...
...
@@ -207,10 +205,10 @@ export default class OpenTsDatasource {
const
m
=
metric
+
'{'
+
keysQuery
+
'}'
;
return
this
.
_get
(
'/api/search/lookup'
,
{
m
:
m
,
limit
:
3000
}).
then
(
function
(
result
)
{
return
this
.
_get
(
'/api/search/lookup'
,
{
m
:
m
,
limit
:
3000
}).
then
(
result
=>
{
result
=
result
.
data
.
results
;
const
tagvs
=
[];
_
.
each
(
result
,
function
(
r
)
{
_
.
each
(
result
,
r
=>
{
if
(
tagvs
.
indexOf
(
r
.
tags
[
key
])
===
-
1
)
{
tagvs
.
push
(
r
.
tags
[
key
]);
}
...
...
@@ -224,11 +222,11 @@ export default class OpenTsDatasource {
return
this
.
$q
.
when
([]);
}
return
this
.
_get
(
'/api/search/lookup'
,
{
m
:
metric
,
limit
:
1000
}).
then
(
function
(
result
)
{
return
this
.
_get
(
'/api/search/lookup'
,
{
m
:
metric
,
limit
:
1000
}).
then
(
result
=>
{
result
=
result
.
data
.
results
;
const
tagks
=
[];
_
.
each
(
result
,
function
(
r
)
{
_
.
each
(
r
.
tags
,
function
(
tagv
,
tagk
)
{
_
.
each
(
result
,
r
=>
{
_
.
each
(
r
.
tags
,
(
tagv
,
tagk
)
=>
{
if
(
tagks
.
indexOf
(
tagk
)
===
-
1
)
{
tagks
.
push
(
tagk
);
}
...
...
@@ -271,8 +269,8 @@ export default class OpenTsDatasource {
return
this
.
$q
.
reject
(
err
);
}
const
responseTransform
=
function
(
result
)
{
return
_
.
map
(
result
,
function
(
value
)
{
const
responseTransform
=
result
=>
{
return
_
.
map
(
result
,
value
=>
{
return
{
text
:
value
};
});
};
...
...
@@ -312,7 +310,7 @@ export default class OpenTsDatasource {
}
testDatasource
()
{
return
this
.
_performSuggestQuery
(
'cpu'
,
'metrics'
).
then
(
function
()
{
return
this
.
_performSuggestQuery
(
'cpu'
,
'metrics'
).
then
(
()
=>
{
return
{
status
:
'success'
,
message
:
'Data source is working'
};
});
}
...
...
@@ -322,7 +320,7 @@ export default class OpenTsDatasource {
return
this
.
aggregatorsPromise
;
}
this
.
aggregatorsPromise
=
this
.
_get
(
'/api/aggregators'
).
then
(
function
(
result
)
{
this
.
aggregatorsPromise
=
this
.
_get
(
'/api/aggregators'
).
then
(
result
=>
{
if
(
result
.
data
&&
_
.
isArray
(
result
.
data
))
{
return
result
.
data
.
sort
();
}
...
...
@@ -336,7 +334,7 @@ export default class OpenTsDatasource {
return
this
.
filterTypesPromise
;
}
this
.
filterTypesPromise
=
this
.
_get
(
'/api/config/filters'
).
then
(
function
(
result
)
{
this
.
filterTypesPromise
=
this
.
_get
(
'/api/config/filters'
).
then
(
result
=>
{
if
(
result
.
data
)
{
return
Object
.
keys
(
result
.
data
).
sort
();
}
...
...
@@ -351,7 +349,7 @@ export default class OpenTsDatasource {
// TSDB returns datapoints has a hash of ts => value.
// Can't use _.pairs(invert()) because it stringifies keys/values
_
.
each
(
md
.
dps
,
function
(
v
,
k
)
{
_
.
each
(
md
.
dps
,
(
v
,
k
)
=>
{
if
(
tsdbResolution
===
2
)
{
dps
.
push
([
v
,
k
*
1
]);
}
else
{
...
...
@@ -365,7 +363,7 @@ export default class OpenTsDatasource {
createMetricLabel
(
md
,
target
,
groupByTags
,
options
)
{
if
(
target
.
alias
)
{
const
scopedVars
=
_
.
clone
(
options
.
scopedVars
||
{});
_
.
each
(
md
.
tags
,
function
(
value
,
key
)
{
_
.
each
(
md
.
tags
,
(
value
,
key
)
=>
{
scopedVars
[
'tag_'
+
key
]
=
{
value
:
value
};
});
return
this
.
templateSrv
.
replace
(
target
.
alias
,
scopedVars
);
...
...
@@ -375,7 +373,7 @@ export default class OpenTsDatasource {
const
tagData
=
[];
if
(
!
_
.
isEmpty
(
md
.
tags
))
{
_
.
each
(
_
.
toPairs
(
md
.
tags
),
function
(
tag
)
{
_
.
each
(
_
.
toPairs
(
md
.
tags
),
tag
=>
{
if
(
_
.
has
(
groupByTags
,
tag
[
0
]))
{
tagData
.
push
(
tag
[
0
]
+
'='
+
tag
[
1
]);
}
...
...
public/app/plugins/datasource/opentsdb/query_ctrl.ts
View file @
432e203d
...
...
@@ -88,7 +88,7 @@ export class OpenTsQueryCtrl extends QueryCtrl {
}
getTextValues
(
metricFindResult
)
{
return
_
.
map
(
metricFindResult
,
function
(
value
)
{
return
_
.
map
(
metricFindResult
,
value
=>
{
return
value
.
text
;
});
}
...
...
public/app/plugins/datasource/prometheus/datasource.ts
View file @
432e203d
...
...
@@ -526,13 +526,13 @@ export class PrometheusDatasource {
const query = this.createQuery({ expr, interval: step }, queryOptions, start, end);
const self = this;
return this.performTimeSeriesQuery(query, query.start, query.end).then(
function(results)
{
return this.performTimeSeriesQuery(query, query.start, query.end).then(
results =>
{
const eventList = [];
tagKeys = tagKeys.split('
,
');
_.each(results.data.data.result,
function(series)
{
_.each(results.data.data.result,
series =>
{
const tags = _.chain(series.metric)
.filter(
function(v, k)
{
.filter(
(v, k) =>
{
return _.includes(tagKeys, k);
})
.value();
...
...
public/app/plugins/datasource/prometheus/metric_find_query.ts
View file @
432e203d
...
...
@@ -46,8 +46,8 @@ export default class PrometheusMetricFindQuery {
// return label values globally
url
=
'/api/v1/label/'
+
label
+
'/values'
;
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
function
(
result
)
{
return
_
.
map
(
result
.
data
.
data
,
function
(
value
)
{
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
result
=>
{
return
_
.
map
(
result
.
data
.
data
,
value
=>
{
return
{
text
:
value
};
});
});
...
...
@@ -56,14 +56,14 @@ export default class PrometheusMetricFindQuery {
const
end
=
this
.
datasource
.
getPrometheusTime
(
this
.
range
.
to
,
true
);
url
=
'/api/v1/series?match[]='
+
encodeURIComponent
(
metric
)
+
'&start='
+
start
+
'&end='
+
end
;
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
function
(
result
)
{
const
_labels
=
_
.
map
(
result
.
data
.
data
,
function
(
metric
)
{
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
result
=>
{
const
_labels
=
_
.
map
(
result
.
data
.
data
,
metric
=>
{
return
metric
[
label
]
||
''
;
}).
filter
(
function
(
label
)
{
}).
filter
(
label
=>
{
return
label
!==
''
;
});
return
_
.
uniq
(
_labels
).
map
(
function
(
metric
)
{
return
_
.
uniq
(
_labels
).
map
(
metric
=>
{
return
{
text
:
metric
,
expandable
:
true
,
...
...
@@ -76,13 +76,13 @@ export default class PrometheusMetricFindQuery {
metricNameQuery
(
metricFilterPattern
)
{
const
url
=
'/api/v1/label/__name__/values'
;
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
function
(
result
)
{
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
result
=>
{
return
_
.
chain
(
result
.
data
.
data
)
.
filter
(
function
(
metricName
)
{
.
filter
(
metricName
=>
{
const
r
=
new
RegExp
(
metricFilterPattern
);
return
r
.
test
(
metricName
);
})
.
map
(
function
(
matchedMetricName
)
{
.
map
(
matchedMetricName
=>
{
return
{
text
:
matchedMetricName
,
expandable
:
true
,
...
...
@@ -94,13 +94,13 @@ export default class PrometheusMetricFindQuery {
queryResultQuery
(
query
)
{
const
end
=
this
.
datasource
.
getPrometheusTime
(
this
.
range
.
to
,
true
);
return
this
.
datasource
.
performInstantQuery
({
expr
:
query
},
end
).
then
(
function
(
result
)
{
return
_
.
map
(
result
.
data
.
data
.
result
,
function
(
metricData
)
{
return
this
.
datasource
.
performInstantQuery
({
expr
:
query
},
end
).
then
(
result
=>
{
return
_
.
map
(
result
.
data
.
data
.
result
,
metricData
=>
{
let
text
=
metricData
.
metric
.
__name__
||
''
;
delete
metricData
.
metric
.
__name__
;
text
+=
'{'
+
_
.
map
(
metricData
.
metric
,
function
(
v
,
k
)
{
_
.
map
(
metricData
.
metric
,
(
v
,
k
)
=>
{
return
k
+
'="'
+
v
+
'"'
;
}).
join
(
','
)
+
'}'
;
...
...
@@ -120,7 +120,7 @@ export default class PrometheusMetricFindQuery {
const
url
=
'/api/v1/series?match[]='
+
encodeURIComponent
(
query
)
+
'&start='
+
start
+
'&end='
+
end
;
const
self
=
this
;
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
function
(
result
)
{
return
this
.
datasource
.
metadataRequest
(
url
).
then
(
result
=>
{
return
_
.
map
(
result
.
data
.
data
,
metric
=>
{
return
{
text
:
self
.
datasource
.
getOriginalMetricName
(
metric
),
...
...
public/app/plugins/datasource/prometheus/query_ctrl.ts
View file @
432e203d
...
...
@@ -27,7 +27,7 @@ class PrometheusQueryCtrl extends QueryCtrl {
target
.
format
=
target
.
format
||
this
.
getDefaultFormat
();
this
.
metric
=
''
;
this
.
resolutions
=
_
.
map
([
1
,
2
,
3
,
4
,
5
,
10
],
f
unction
(
f
)
{
this
.
resolutions
=
_
.
map
([
1
,
2
,
3
,
4
,
5
,
10
],
f
=>
{
return
{
factor
:
f
,
label
:
'1/'
+
f
};
});
...
...
public/app/plugins/datasource/prometheus/result_transformer.ts
View file @
432e203d
...
...
@@ -81,7 +81,7 @@ export class ResultTransformer {
}
// Collect all labels across all metrics
_
.
each
(
md
,
function
(
series
)
{
_
.
each
(
md
,
series
=>
{
for
(
const
label
in
series
.
metric
)
{
if
(
!
metricLabels
.
hasOwnProperty
(
label
))
{
metricLabels
[
label
]
=
1
;
...
...
@@ -92,7 +92,7 @@ export class ResultTransformer {
// Sort metric labels, create columns for them and record their index
const
sortedLabels
=
_
.
keys
(
metricLabels
).
sort
();
table
.
columns
.
push
({
text
:
'Time'
,
type
:
'time'
});
_
.
each
(
sortedLabels
,
function
(
label
,
labelIndex
)
{
_
.
each
(
sortedLabels
,
(
label
,
labelIndex
)
=>
{
metricLabels
[
label
]
=
labelIndex
+
1
;
table
.
columns
.
push
({
text
:
label
,
filterable
:
!
label
.
startsWith
(
'__'
)
});
});
...
...
@@ -100,7 +100,7 @@ export class ResultTransformer {
table
.
columns
.
push
({
text
:
valueText
});
// Populate rows, set value to empty string when label not present.
_
.
each
(
md
,
function
(
series
)
{
_
.
each
(
md
,
series
=>
{
if
(
series
.
value
)
{
series
.
values
=
[
series
.
value
];
}
...
...
@@ -150,7 +150,7 @@ export class ResultTransformer {
renderTemplate
(
aliasPattern
,
aliasData
)
{
const
aliasRegex
=
/
\{\{\s
*
(
.+
?)\s
*
\}\}
/g
;
return
aliasPattern
.
replace
(
aliasRegex
,
function
(
match
,
g1
)
{
return
aliasPattern
.
replace
(
aliasRegex
,
(
match
,
g1
)
=>
{
if
(
aliasData
[
g1
])
{
return
aliasData
[
g1
];
}
...
...
@@ -161,7 +161,7 @@ export class ResultTransformer {
getOriginalMetricName
(
labelData
)
{
const
metricName
=
labelData
.
__name__
||
''
;
delete
labelData
.
__name__
;
const
labelPart
=
_
.
map
(
_
.
toPairs
(
labelData
),
function
(
label
)
{
const
labelPart
=
_
.
map
(
_
.
toPairs
(
labelData
),
label
=>
{
return
label
[
0
]
+
'="'
+
label
[
1
]
+
'"'
;
}).
join
(
','
);
return
metricName
+
'{'
+
labelPart
+
'}'
;
...
...
public/app/plugins/panel/graph/graph.ts
View file @
432e203d
...
...
@@ -464,7 +464,7 @@ class GraphElement {
}
addXSeriesAxis
(
options
)
{
const
ticks
=
_
.
map
(
this
.
data
,
function
(
series
,
index
)
{
const
ticks
=
_
.
map
(
this
.
data
,
(
series
,
index
)
=>
{
return
[
index
+
1
,
series
.
alias
];
});
...
...
@@ -533,8 +533,8 @@ class GraphElement {
}
addXTableAxis
(
options
)
{
let
ticks
=
_
.
map
(
this
.
data
,
function
(
series
,
seriesIndex
)
{
return
_
.
map
(
series
.
datapoints
,
function
(
point
,
pointIndex
)
{
let
ticks
=
_
.
map
(
this
.
data
,
(
series
,
seriesIndex
)
=>
{
return
_
.
map
(
series
.
datapoints
,
(
point
,
pointIndex
)
=>
{
const
tickIndex
=
seriesIndex
*
series
.
datapoints
.
length
+
pointIndex
;
return
[
tickIndex
+
1
,
point
[
1
]];
});
...
...
@@ -627,10 +627,10 @@ class GraphElement {
}
}
axis
.
transform
=
function
(
v
)
{
axis
.
transform
=
v
=>
{
return
v
<
Number
.
MIN_VALUE
?
null
:
Math
.
log
(
v
)
/
Math
.
log
(
axis
.
logBase
);
};
axis
.
inverseTransform
=
function
(
v
)
{
axis
.
inverseTransform
=
v
=>
{
return
Math
.
pow
(
axis
.
logBase
,
v
);
};
...
...
@@ -701,7 +701,7 @@ class GraphElement {
}
configureAxisMode
(
axis
,
format
)
{
axis
.
tickFormatter
=
function
(
val
,
axis
)
{
axis
.
tickFormatter
=
(
val
,
axis
)
=>
{
if
(
!
kbn
.
valueFormats
[
format
])
{
throw
new
Error
(
`Unit '
${
format
}
' is not supported`
);
}
...
...
public/app/plugins/panel/graph/graph_tooltip.ts
View file @
432e203d
...
...
@@ -8,11 +8,11 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
const
$tooltip
=
$
(
'<div class="graph-tooltip">'
);
this
.
destroy
=
function
()
{
this
.
destroy
=
()
=>
{
$tooltip
.
remove
();
};
this
.
findHoverIndexFromDataPoints
=
function
(
posX
,
series
,
last
)
{
this
.
findHoverIndexFromDataPoints
=
(
posX
,
series
,
last
)
=>
{
const
ps
=
series
.
datapoints
.
pointsize
;
const
initial
=
last
*
ps
;
const
len
=
series
.
datapoints
.
points
.
length
;
...
...
@@ -30,7 +30,7 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
return
j
/
ps
-
1
;
};
this
.
findHoverIndexFromData
=
function
(
posX
,
series
)
{
this
.
findHoverIndexFromData
=
(
posX
,
series
)
=>
{
let
lower
=
0
;
let
upper
=
series
.
data
.
length
-
1
;
let
middle
;
...
...
@@ -49,7 +49,7 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
}
};
this
.
renderAndShow
=
function
(
absoluteTime
,
innerHtml
,
pos
,
xMode
)
{
this
.
renderAndShow
=
(
absoluteTime
,
innerHtml
,
pos
,
xMode
)
=>
{
if
(
xMode
===
'time'
)
{
innerHtml
=
'<div class="graph-tooltip-time">'
+
absoluteTime
+
'</div>'
+
innerHtml
;
}
...
...
@@ -147,7 +147,7 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
return
results
;
};
elem
.
mouseleave
(
function
()
{
elem
.
mouseleave
(
()
=>
{
if
(
panel
.
tooltip
.
shared
)
{
const
plot
=
elem
.
data
().
plot
;
if
(
plot
)
{
...
...
@@ -158,7 +158,7 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
appEvents
.
emit
(
'graph-hover-clear'
);
});
elem
.
bind
(
'plothover'
,
function
(
event
,
pos
,
item
)
{
elem
.
bind
(
'plothover'
,
(
event
,
pos
,
item
)
=>
{
self
.
show
(
pos
,
item
);
// broadcast to other graph panels that we are hovering!
...
...
@@ -166,17 +166,17 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
appEvents
.
emit
(
'graph-hover'
,
{
pos
:
pos
,
panel
:
panel
});
});
elem
.
bind
(
'plotclick'
,
function
(
event
,
pos
,
item
)
{
elem
.
bind
(
'plotclick'
,
(
event
,
pos
,
item
)
=>
{
appEvents
.
emit
(
'graph-click'
,
{
pos
:
pos
,
panel
:
panel
,
item
:
item
});
});
this
.
clear
=
function
(
plot
)
{
this
.
clear
=
plot
=>
{
$tooltip
.
detach
();
plot
.
clearCrosshair
();
plot
.
unhighlight
();
};
this
.
show
=
function
(
pos
,
item
)
{
this
.
show
=
(
pos
,
item
)
=>
{
const
plot
=
elem
.
data
().
plot
;
const
plotData
=
plot
.
getData
();
const
xAxes
=
plot
.
getXAxes
();
...
...
@@ -232,11 +232,11 @@ export default function GraphTooltip(this: any, elem, dashboard, scope, getSerie
// Dynamically reorder the hovercard for the current time point if the
// option is enabled.
if
(
panel
.
tooltip
.
sort
===
2
)
{
seriesHoverInfo
.
sort
(
function
(
a
,
b
)
{
seriesHoverInfo
.
sort
(
(
a
,
b
)
=>
{
return
b
.
value
-
a
.
value
;
});
}
else
if
(
panel
.
tooltip
.
sort
===
1
)
{
seriesHoverInfo
.
sort
(
function
(
a
,
b
)
{
seriesHoverInfo
.
sort
(
(
a
,
b
)
=>
{
return
a
.
value
-
b
.
value
;
});
}
...
...
public/app/plugins/panel/graph/jquery.flot.events.ts
View file @
432e203d
...
...
@@ -12,11 +12,11 @@ export function createAnnotationToolip(element, event, plot) {
injector
.
invoke
([
'$compile'
,
'$rootScope'
,
function
(
$compile
,
$rootScope
)
{
(
$compile
,
$rootScope
)
=>
{
const
eventManager
=
plot
.
getOptions
().
events
.
manager
;
const
tmpScope
=
$rootScope
.
$new
(
true
);
tmpScope
.
event
=
event
;
tmpScope
.
onEdit
=
function
()
{
tmpScope
.
onEdit
=
()
=>
{
eventManager
.
editEvent
(
event
);
};
...
...
@@ -38,8 +38,8 @@ export function createAnnotationToolip(element, event, plot) {
drop
.
open
();
drop
.
on
(
'close'
,
function
()
{
setTimeout
(
function
()
{
drop
.
on
(
'close'
,
()
=>
{
setTimeout
(
()
=>
{
drop
.
destroy
();
});
});
...
...
@@ -65,7 +65,7 @@ export function createEditPopover(element, event, plot) {
markerElementToAttachTo
=
element
;
// wait for element to be attached and positioned
setTimeout
(
function
()
{
setTimeout
(
()
=>
{
const
injector
=
angular
.
element
(
document
).
injector
();
const
content
=
document
.
createElement
(
'div'
);
content
.
innerHTML
=
'<event-editor panel-ctrl="panelCtrl" event="event" close="close()"></event-editor>'
;
...
...
@@ -73,13 +73,13 @@ export function createEditPopover(element, event, plot) {
injector
.
invoke
([
'$compile'
,
'$rootScope'
,
function
(
$compile
,
$rootScope
)
{
(
$compile
,
$rootScope
)
=>
{
const
scope
=
$rootScope
.
$new
(
true
);
let
drop
;
scope
.
event
=
event
;
scope
.
panelCtrl
=
eventManager
.
panelCtrl
;
scope
.
close
=
function
()
{
scope
.
close
=
()
=>
{
drop
.
close
();
};
...
...
@@ -100,9 +100,9 @@ export function createEditPopover(element, event, plot) {
drop
.
open
();
eventManager
.
editorOpened
();
drop
.
on
(
'close'
,
function
()
{
drop
.
on
(
'close'
,
()
=>
{
// need timeout here in order call drop.destroy
setTimeout
(
function
()
{
setTimeout
(
()
=>
{
eventManager
.
editorClosed
();
scope
.
$destroy
();
drop
.
destroy
();
...
...
@@ -428,7 +428,7 @@ export class EventMarkers {
createEditPopover
(
marker
,
event
.
editModel
,
that
.
_plot
);
}
const
mouseleave
=
function
()
{
const
mouseleave
=
()
=>
{
that
.
_plot
.
clearSelection
();
};
...
...
@@ -443,10 +443,10 @@ export class EventMarkers {
function
drawFunc
(
obj
)
{
obj
.
show
();
},
function
(
obj
)
{
obj
=>
{
obj
.
remove
();
},
function
(
obj
,
position
)
{
(
obj
,
position
)
=>
{
obj
.
css
({
top
:
position
.
top
,
left
:
position
.
left
,
...
...
@@ -549,7 +549,7 @@ export class EventMarkers {
createEditPopover
(
region
,
event
.
editModel
,
that
.
_plot
);
}
const
mouseleave
=
function
()
{
const
mouseleave
=
()
=>
{
that
.
_plot
.
clearSelection
();
};
...
...
@@ -563,10 +563,10 @@ export class EventMarkers {
function
drawFunc
(
obj
)
{
obj
.
show
();
},
function
(
obj
)
{
obj
=>
{
obj
.
remove
();
},
function
(
obj
,
position
)
{
(
obj
,
position
)
=>
{
obj
.
css
({
top
:
position
.
top
,
left
:
position
.
left
,
...
...
@@ -601,11 +601,11 @@ export function init(this: any, plot) {
const
that
=
this
;
const
eventMarkers
=
new
EventMarkers
(
plot
);
plot
.
getEvents
=
function
()
{
plot
.
getEvents
=
()
=>
{
return
eventMarkers
.
_events
;
};
plot
.
hideEvents
=
function
()
{
plot
.
hideEvents
=
()
=>
{
$
.
each
(
eventMarkers
.
_events
,
(
index
,
event
)
=>
{
event
.
visual
()
...
...
@@ -614,7 +614,7 @@ export function init(this: any, plot) {
});
};
plot
.
showEvents
=
function
()
{
plot
.
showEvents
=
()
=>
{
plot
.
hideEvents
();
$
.
each
(
eventMarkers
.
_events
,
(
index
,
event
)
=>
{
event
.
hide
();
...
...
@@ -624,20 +624,20 @@ export function init(this: any, plot) {
};
// change events on an existing plot
plot
.
setEvents
=
function
(
events
)
{
plot
.
setEvents
=
events
=>
{
if
(
eventMarkers
.
eventsEnabled
)
{
eventMarkers
.
setupEvents
(
events
);
}
};
plot
.
hooks
.
processOptions
.
push
(
function
(
plot
,
options
)
{
plot
.
hooks
.
processOptions
.
push
(
(
plot
,
options
)
=>
{
// enable the plugin
if
(
options
.
events
.
data
!=
null
)
{
eventMarkers
.
eventsEnabled
=
true
;
}
});
plot
.
hooks
.
draw
.
push
(
function
(
plot
)
{
plot
.
hooks
.
draw
.
push
(
plot
=>
{
const
options
=
plot
.
getOptions
();
if
(
eventMarkers
.
eventsEnabled
)
{
...
...
public/app/plugins/panel/graph/legend.ts
View file @
432e203d
...
...
@@ -5,9 +5,9 @@ import baron from 'baron';
const
module
=
angular
.
module
(
'grafana.directives'
);
module
.
directive
(
'graphLegend'
,
function
(
popoverSrv
,
$timeout
)
{
module
.
directive
(
'graphLegend'
,
(
popoverSrv
,
$timeout
)
=>
{
return
{
link
:
function
(
scope
,
elem
)
{
link
:
(
scope
,
elem
)
=>
{
let
firstRender
=
true
;
const
ctrl
=
scope
.
ctrl
;
const
panel
=
ctrl
.
panel
;
...
...
@@ -18,7 +18,7 @@ module.directive('graphLegend', function(popoverSrv, $timeout) {
const
legendRightDefaultWidth
=
10
;
const
legendElem
=
elem
.
parent
();
scope
.
$on
(
'$destroy'
,
function
()
{
scope
.
$on
(
'$destroy'
,
()
=>
{
destroyScrollbar
();
});
...
...
@@ -44,7 +44,7 @@ module.directive('graphLegend', function(popoverSrv, $timeout) {
const
index
=
getSeriesIndexForElement
(
el
);
const
series
=
seriesList
[
index
];
$timeout
(
function
()
{
$timeout
(
()
=>
{
popoverSrv
.
show
({
element
:
el
[
0
],
position
:
'bottom left'
,
...
...
@@ -55,10 +55,10 @@ module.directive('graphLegend', function(popoverSrv, $timeout) {
openOn
:
'hover'
,
model
:
{
series
:
series
,
toggleAxis
:
function
()
{
toggleAxis
:
()
=>
{
ctrl
.
toggleAxis
(
series
);
},
colorSelected
:
function
(
color
)
{
colorSelected
:
color
=>
{
ctrl
.
changeSeriesColor
(
series
,
color
);
},
},
...
...
@@ -154,7 +154,7 @@ module.directive('graphLegend', function(popoverSrv, $timeout) {
}
if
(
panel
.
legend
.
sort
)
{
seriesList
=
_
.
sortBy
(
seriesList
,
function
(
series
)
{
seriesList
=
_
.
sortBy
(
seriesList
,
series
=>
{
let
sort
=
series
.
stats
[
panel
.
legend
.
sort
];
if
(
sort
===
null
)
{
sort
=
-
Infinity
;
...
...
public/app/plugins/panel/graph/series_overrides_ctrl.ts
View file @
432e203d
...
...
@@ -7,13 +7,13 @@ export function SeriesOverridesCtrl($scope, $element, popoverSrv) {
$scope
.
currentOverrides
=
[];
$scope
.
override
=
$scope
.
override
||
{};
$scope
.
addOverrideOption
=
function
(
name
,
propertyName
,
values
)
{
$scope
.
addOverrideOption
=
(
name
,
propertyName
,
values
)
=>
{
const
option
=
{
text
:
name
,
propertyName
:
propertyName
,
index
:
$scope
.
overrideMenu
.
lenght
,
values
:
values
,
submenu
:
_
.
map
(
values
,
function
(
value
)
{
submenu
:
_
.
map
(
values
,
value
=>
{
return
{
text
:
String
(
value
),
value
:
value
};
}),
};
...
...
@@ -21,7 +21,7 @@ export function SeriesOverridesCtrl($scope, $element, popoverSrv) {
$scope
.
overrideMenu
.
push
(
option
);
};
$scope
.
setOverride
=
function
(
item
,
subItem
)
{
$scope
.
setOverride
=
(
item
,
subItem
)
=>
{
// handle color overrides
if
(
item
.
propertyName
===
'color'
)
{
$scope
.
openColorSelector
(
$scope
.
override
[
'color'
]);
...
...
@@ -41,13 +41,13 @@ export function SeriesOverridesCtrl($scope, $element, popoverSrv) {
$scope
.
ctrl
.
render
();
};
$scope
.
colorSelected
=
function
(
color
)
{
$scope
.
colorSelected
=
color
=>
{
$scope
.
override
[
'color'
]
=
color
;
$scope
.
updateCurrentOverrides
();
$scope
.
ctrl
.
render
();
};
$scope
.
openColorSelector
=
function
(
color
)
{
$scope
.
openColorSelector
=
color
=>
{
const
fakeSeries
=
{
color
:
color
};
popoverSrv
.
show
({
element
:
$element
.
find
(
'.dropdown'
)[
0
],
...
...
@@ -59,27 +59,27 @@ export function SeriesOverridesCtrl($scope, $element, popoverSrv) {
colorSelected
:
$scope
.
colorSelected
,
series
:
fakeSeries
,
},
onClose
:
function
()
{
onClose
:
()
=>
{
$scope
.
ctrl
.
render
();
},
});
};
$scope
.
removeOverride
=
function
(
option
)
{
$scope
.
removeOverride
=
option
=>
{
delete
$scope
.
override
[
option
.
propertyName
];
$scope
.
updateCurrentOverrides
();
$scope
.
ctrl
.
refresh
();
};
$scope
.
getSeriesNames
=
function
()
{
return
_
.
map
(
$scope
.
ctrl
.
seriesList
,
function
(
series
)
{
$scope
.
getSeriesNames
=
()
=>
{
return
_
.
map
(
$scope
.
ctrl
.
seriesList
,
series
=>
{
return
series
.
alias
;
});
};
$scope
.
updateCurrentOverrides
=
function
()
{
$scope
.
updateCurrentOverrides
=
()
=>
{
$scope
.
currentOverrides
=
[];
_
.
each
(
$scope
.
overrideMenu
,
function
(
option
)
{
_
.
each
(
$scope
.
overrideMenu
,
option
=>
{
const
value
=
$scope
.
override
[
option
.
propertyName
];
if
(
_
.
isUndefined
(
value
))
{
return
;
...
...
public/app/plugins/panel/graph/threshold_manager.ts
View file @
432e203d
...
...
@@ -61,7 +61,7 @@ export class ThresholdManager {
handleElem
.
off
(
'mouseleave'
,
dragging
);
// trigger digest and render
panelCtrl
.
$scope
.
$apply
(
function
()
{
panelCtrl
.
$scope
.
$apply
(
()
=>
{
panelCtrl
.
render
();
panelCtrl
.
events
.
emit
(
'threshold-changed'
,
{
threshold
:
model
,
...
...
public/app/plugins/panel/graph/thresholds_form.ts
View file @
432e203d
...
...
@@ -138,7 +138,7 @@ const template = `
</div>
`
;
coreModule
.
directive
(
'graphThresholdForm'
,
function
()
{
coreModule
.
directive
(
'graphThresholdForm'
,
()
=>
{
return
{
restrict
:
'E'
,
template
:
template
,
...
...
public/app/plugins/panel/heatmap/color_legend.ts
View file @
432e203d
...
...
@@ -16,17 +16,17 @@ const LEGEND_VALUE_MARGIN = 0;
/**
* Color legend for heatmap editor.
*/
module
.
directive
(
'colorLegend'
,
function
()
{
module
.
directive
(
'colorLegend'
,
()
=>
{
return
{
restrict
:
'E'
,
template
:
'<div class="heatmap-color-legend"><svg width="16.5rem" height="24px"></svg></div>'
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
const
ctrl
=
scope
.
ctrl
;
const
panel
=
scope
.
ctrl
.
panel
;
render
();
ctrl
.
events
.
on
(
'render'
,
function
()
{
ctrl
.
events
.
on
(
'render'
,
()
=>
{
render
();
});
...
...
@@ -52,16 +52,16 @@ module.directive('colorLegend', function() {
/**
* Heatmap legend with scale values.
*/
module
.
directive
(
'heatmapLegend'
,
function
()
{
module
.
directive
(
'heatmapLegend'
,
()
=>
{
return
{
restrict
:
'E'
,
template
:
`<div class="heatmap-color-legend"><svg width="
${
LEGEND_WIDTH_PX
}
px" height="
${
LEGEND_HEIGHT_PX
}
px"></svg></div>`
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
const
ctrl
=
scope
.
ctrl
;
const
panel
=
scope
.
ctrl
.
panel
;
render
();
ctrl
.
events
.
on
(
'render'
,
function
()
{
ctrl
.
events
.
on
(
'render'
,
()
=>
{
render
();
});
...
...
public/app/plugins/panel/heatmap/heatmap_tooltip.ts
View file @
432e203d
...
...
@@ -267,7 +267,7 @@ export class HeatmapTooltip {
countValueFormatter
(
decimals
,
scaledDecimals
=
null
)
{
const
format
=
'short'
;
return
function
(
value
)
{
return
value
=>
{
return
kbn
.
valueFormats
[
format
](
value
,
decimals
,
scaledDecimals
);
};
}
...
...
public/app/plugins/panel/heatmap/rendering.ts
View file @
432e203d
...
...
@@ -436,7 +436,7 @@ export class HeatmapRenderer {
tickValueFormatter
(
decimals
,
scaledDecimals
=
null
)
{
const
format
=
this
.
panel
.
yAxis
.
format
;
return
function
(
value
)
{
return
value
=>
{
try
{
return
format
!==
'none'
?
kbn
.
valueFormats
[
format
](
value
,
decimals
,
scaledDecimals
)
:
value
;
}
catch
(
err
)
{
...
...
public/app/plugins/panel/singlestat/module.ts
View file @
432e203d
...
...
@@ -528,7 +528,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
},
value
:
{
color
:
panel
.
colorValue
?
getColorForValue
(
data
,
data
.
valueRounded
)
:
null
,
formatter
:
function
()
{
formatter
:
()
=>
{
return
getValueText
();
},
font
:
{
...
...
@@ -617,7 +617,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
data
=
ctrl
.
data
;
// get thresholds
data
.
thresholds
=
panel
.
thresholds
.
split
(
','
).
map
(
function
(
strVale
)
{
data
.
thresholds
=
panel
.
thresholds
.
split
(
','
).
map
(
strVale
=>
{
return
Number
(
strVale
.
trim
());
});
data
.
colorMap
=
panel
.
colors
;
...
...
@@ -662,16 +662,16 @@ class SingleStatCtrl extends MetricsPanelCtrl {
// drilldown link tooltip
const
drilldownTooltip
=
$
(
'<div id="tooltip" class="">hello</div>"'
);
elem
.
mouseleave
(
function
()
{
elem
.
mouseleave
(
()
=>
{
if
(
panel
.
links
.
length
===
0
)
{
return
;
}
$timeout
(
function
()
{
$timeout
(
()
=>
{
drilldownTooltip
.
detach
();
});
});
elem
.
click
(
function
(
evt
)
{
elem
.
click
(
evt
=>
{
if
(
!
linkInfo
)
{
return
;
}
...
...
@@ -688,7 +688,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
if
(
linkInfo
.
href
.
indexOf
(
'http'
)
===
0
)
{
window
.
location
.
href
=
linkInfo
.
href
;
}
else
{
$timeout
(
function
()
{
$timeout
(
()
=>
{
$location
.
url
(
linkInfo
.
href
);
});
}
...
...
@@ -696,7 +696,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
drilldownTooltip
.
detach
();
});
elem
.
mousemove
(
function
(
e
)
{
elem
.
mousemove
(
e
=>
{
if
(
!
linkInfo
)
{
return
;
}
...
...
@@ -708,7 +708,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
hookupDrilldownLinkTooltip
();
this
.
events
.
on
(
'render'
,
function
()
{
this
.
events
.
on
(
'render'
,
()
=>
{
render
();
ctrl
.
renderingCompleted
();
});
...
...
public/app/plugins/panel/table/column_options.ts
View file @
432e203d
...
...
@@ -48,7 +48,7 @@ export class ColumnOptionsCtrl {
if
(
!
this
.
panelCtrl
.
table
)
{
return
[];
}
return
_
.
map
(
this
.
panelCtrl
.
table
.
columns
,
function
(
col
:
any
)
{
return
_
.
map
(
this
.
panelCtrl
.
table
.
columns
,
(
col
:
any
)
=>
{
return
col
.
text
;
});
};
...
...
public/app/plugins/panel/table/module.ts
View file @
432e203d
...
...
@@ -257,13 +257,13 @@ class TablePanelCtrl extends MetricsPanelCtrl {
elem
.
on
(
'click'
,
'.table-panel-page-link'
,
switchPage
);
elem
.
on
(
'click'
,
'.table-panel-filter-link'
,
addFilterClicked
);
const
unbindDestroy
=
scope
.
$on
(
'$destroy'
,
function
()
{
const
unbindDestroy
=
scope
.
$on
(
'$destroy'
,
()
=>
{
elem
.
off
(
'click'
,
'.table-panel-page-link'
);
elem
.
off
(
'click'
,
'.table-panel-filter-link'
);
unbindDestroy
();
});
ctrl
.
events
.
on
(
'render'
,
function
(
renderData
)
{
ctrl
.
events
.
on
(
'render'
,
renderData
=>
{
data
=
renderData
||
data
;
if
(
data
)
{
renderPanel
();
...
...
public/app/plugins/panel/table/transformers.ts
View file @
432e203d
...
...
@@ -7,10 +7,10 @@ const transformers = {};
transformers
[
'timeseries_to_rows'
]
=
{
description
:
'Time series to rows'
,
getColumns
:
function
()
{
getColumns
:
()
=>
{
return
[];
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
model
.
columns
=
[{
text
:
'Time'
,
type
:
'date'
},
{
text
:
'Metric'
},
{
text
:
'Value'
}];
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
...
...
@@ -25,10 +25,10 @@ transformers['timeseries_to_rows'] = {
transformers
[
'timeseries_to_columns'
]
=
{
description
:
'Time series to columns'
,
getColumns
:
function
()
{
getColumns
:
()
=>
{
return
[];
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
model
.
columns
.
push
({
text
:
'Time'
,
type
:
'date'
});
// group by time
...
...
@@ -67,7 +67,7 @@ transformers['timeseries_to_columns'] = {
transformers
[
'timeseries_aggregations'
]
=
{
description
:
'Time series aggregations'
,
getColumns
:
function
()
{
getColumns
:
()
=>
{
return
[
{
text
:
'Avg'
,
value
:
'avg'
},
{
text
:
'Min'
,
value
:
'min'
},
...
...
@@ -77,7 +77,7 @@ transformers['timeseries_aggregations'] = {
{
text
:
'Count'
,
value
:
'count'
},
];
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
let
i
,
y
;
model
.
columns
.
push
({
text
:
'Metric'
});
...
...
@@ -105,10 +105,10 @@ transformers['timeseries_aggregations'] = {
transformers
[
'annotations'
]
=
{
description
:
'Annotations'
,
getColumns
:
function
()
{
getColumns
:
()
=>
{
return
[];
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
model
.
columns
.
push
({
text
:
'Time'
,
type
:
'date'
});
model
.
columns
.
push
({
text
:
'Title'
});
model
.
columns
.
push
({
text
:
'Text'
});
...
...
@@ -127,7 +127,7 @@ transformers['annotations'] = {
transformers
[
'table'
]
=
{
description
:
'Table'
,
getColumns
:
function
(
data
)
{
getColumns
:
data
=>
{
if
(
!
data
||
data
.
length
===
0
)
{
return
[];
}
...
...
@@ -154,7 +154,7 @@ transformers['table'] = {
return
columns
;
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
if
(
!
data
||
data
.
length
===
0
)
{
return
;
}
...
...
@@ -264,7 +264,7 @@ transformers['table'] = {
transformers
[
'json'
]
=
{
description
:
'JSON Data'
,
getColumns
:
function
(
data
)
{
getColumns
:
data
=>
{
if
(
!
data
||
data
.
length
===
0
)
{
return
[];
}
...
...
@@ -287,11 +287,11 @@ transformers['json'] = {
}
}
return
_
.
map
(
names
,
function
(
value
,
key
)
{
return
_
.
map
(
names
,
(
value
,
key
)
=>
{
return
{
text
:
key
,
value
:
key
};
});
},
transform
:
function
(
data
,
panel
,
model
)
{
transform
:
(
data
,
panel
,
model
)
=>
{
let
i
,
y
,
z
;
for
(
const
column
of
panel
.
columns
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment