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
72ab24f3
Commit
72ab24f3
authored
Sep 05, 2018
by
Patrick O'Carroll
Committed by
Torkel Ödegaard
Sep 05, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changed functions to arrow functions for only-arrow-functions rule. (#13131)
parent
7c88436a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
50 changed files
with
214 additions
and
214 deletions
+214
-214
public/app/app.ts
+4
-4
public/app/containers/Explore/utils/debounce.ts
+1
-1
public/app/core/components/gf_page.ts
+1
-1
public/app/core/components/scroll/page_scroll.ts
+1
-1
public/app/core/components/scroll/scroll.ts
+1
-1
public/app/core/controllers/invited_ctrl.ts
+4
-4
public/app/core/controllers/login_ctrl.ts
+12
-12
public/app/core/controllers/reset_password_ctrl.ts
+4
-4
public/app/core/filters/filters.ts
+12
-12
public/app/core/lodash_extended.ts
+1
-1
public/app/core/services/alert_srv.ts
+1
-1
public/app/core/services/popover_srv.ts
+3
-3
public/app/core/services/segment_srv.ts
+15
-15
public/app/core/services/util_srv.ts
+3
-3
public/app/core/specs/backend_srv.test.ts
+1
-1
public/app/core/specs/datemath.test.ts
+6
-6
public/app/core/specs/file_export.test.ts
+1
-1
public/app/core/specs/kbn.test.ts
+0
-0
public/app/core/specs/time_series.test.ts
+0
-0
public/app/core/utils/css_loader.ts
+10
-10
public/app/features/dashboard/change_tracker.ts
+1
-1
public/app/features/dashboard/dashboard_loader_srv.ts
+1
-1
public/app/features/dashboard/repeat_option/repeat_option.ts
+2
-2
public/app/features/dashboard/shareModalCtrl.ts
+4
-4
public/app/features/dashboard/share_snapshot_ctrl.ts
+18
-18
public/app/features/dashboard/timepicker/input_date.ts
+3
-3
public/app/features/dashboard/upload.ts
+4
-4
public/app/features/dashboard/view_state_srv.ts
+7
-7
public/app/features/dashlinks/module.ts
+9
-9
public/app/features/org/change_password_ctrl.ts
+2
-2
public/app/features/org/new_org_ctrl.ts
+3
-3
public/app/features/org/org_api_keys_ctrl.ts
+6
-6
public/app/features/org/select_org_ctrl.ts
+5
-5
public/app/features/panel/panel_directive.ts
+7
-7
public/app/features/panel/panel_header.ts
+2
-2
public/app/features/panel/query_troubleshooter.ts
+2
-2
public/app/features/panel/solo_panel_ctrl.ts
+3
-3
public/app/features/panellinks/module.ts
+8
-8
public/app/features/playlist/playlist_routes.ts
+1
-1
public/app/features/plugins/ds_edit_ctrl.ts
+4
-4
public/app/features/plugins/plugin_component.ts
+11
-11
public/app/features/templating/all.ts
+1
-1
public/app/features/templating/custom_variable.ts
+1
-1
public/app/features/templating/editor_ctrl.ts
+16
-16
public/app/features/templating/interval_variable.ts
+1
-1
public/app/features/templating/query_variable.ts
+2
-2
public/app/features/templating/template_srv.ts
+3
-3
public/app/features/templating/variable_srv.ts
+3
-3
public/app/routes/ReactContainer.tsx
+1
-1
public/app/routes/dashboard_loaders.ts
+2
-2
No files found.
public/app/app.ts
View file @
72ab24f3
...
...
@@ -21,7 +21,7 @@ import _ from 'lodash';
import
moment
from
'moment'
;
// add move to lodash for backward compatabiltiy
_
.
move
=
function
(
array
,
fromIndex
,
toIndex
)
{
_
.
move
=
(
array
,
fromIndex
,
toIndex
)
=>
{
array
.
splice
(
toIndex
,
0
,
array
.
splice
(
fromIndex
,
1
)[
0
]);
return
array
;
};
...
...
@@ -76,9 +76,9 @@ export class GrafanaApp {
$provide
.
decorator
(
'$http'
,
[
'$delegate'
,
'$templateCache'
,
function
(
$delegate
,
$templateCache
)
{
(
$delegate
,
$templateCache
)
=>
{
const
get
=
$delegate
.
get
;
$delegate
.
get
=
function
(
url
,
config
)
{
$delegate
.
get
=
(
url
,
config
)
=>
{
if
(
url
.
match
(
/
\.
html$/
))
{
// some template's already exist in the cache
if
(
!
$templateCache
.
get
(
url
))
{
...
...
@@ -135,7 +135,7 @@ export class GrafanaApp {
this
.
preBootModules
=
null
;
});
})
.
catch
(
function
(
err
)
{
.
catch
(
err
=>
{
console
.
log
(
'Application boot failed:'
,
err
);
});
}
...
...
public/app/containers/Explore/utils/debounce.ts
View file @
72ab24f3
...
...
@@ -4,7 +4,7 @@ export default function debounce(func, wait) {
return
function
(
this
:
any
)
{
const
context
=
this
;
const
args
=
arguments
;
const
later
=
function
()
{
const
later
=
()
=>
{
timeout
=
null
;
func
.
apply
(
context
,
args
);
};
...
...
public/app/core/components/gf_page.ts
View file @
72ab24f3
...
...
@@ -31,7 +31,7 @@ export function gfPageDirective() {
header
:
'?gfPageHeader'
,
body
:
'gfPageBody'
,
},
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
console
.
log
(
scope
);
},
};
...
...
public/app/core/components/scroll/page_scroll.ts
View file @
72ab24f3
...
...
@@ -4,7 +4,7 @@ import appEvents from 'app/core/app_events';
export
function
pageScrollbar
()
{
return
{
restrict
:
'A'
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
let
lastPos
=
0
;
appEvents
.
on
(
...
...
public/app/core/components/scroll/scroll.ts
View file @
72ab24f3
...
...
@@ -14,7 +14,7 @@ const scrollerClass = 'baron__scroller';
export
function
geminiScrollbar
()
{
return
{
restrict
:
'A'
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
let
scrollRoot
=
elem
.
parent
();
const
scroller
=
elem
;
...
...
public/app/core/controllers/invited_ctrl.ts
View file @
72ab24f3
...
...
@@ -16,8 +16,8 @@ export class InvitedCtrl {
},
};
$scope
.
init
=
function
()
{
backendSrv
.
get
(
'/api/user/invite/'
+
$routeParams
.
code
).
then
(
function
(
invite
)
{
$scope
.
init
=
()
=>
{
backendSrv
.
get
(
'/api/user/invite/'
+
$routeParams
.
code
).
then
(
invite
=>
{
$scope
.
formModel
.
name
=
invite
.
name
;
$scope
.
formModel
.
email
=
invite
.
email
;
$scope
.
formModel
.
username
=
invite
.
email
;
...
...
@@ -28,12 +28,12 @@ export class InvitedCtrl {
});
};
$scope
.
submit
=
function
()
{
$scope
.
submit
=
()
=>
{
if
(
!
$scope
.
inviteForm
.
$valid
)
{
return
;
}
backendSrv
.
post
(
'/api/user/invite/complete'
,
$scope
.
formModel
).
then
(
function
()
{
backendSrv
.
post
(
'/api/user/invite/complete'
,
$scope
.
formModel
).
then
(
()
=>
{
window
.
location
.
href
=
config
.
appSubUrl
+
'/'
;
});
};
...
...
public/app/core/controllers/login_ctrl.ts
View file @
72ab24f3
...
...
@@ -29,7 +29,7 @@ export class LoginCtrl {
$scope
.
loginMode
=
true
;
$scope
.
submitBtnText
=
'Log in'
;
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
$watch
(
'loginMode'
,
$scope
.
loginModeChanged
);
if
(
config
.
loginError
)
{
...
...
@@ -37,7 +37,7 @@ export class LoginCtrl {
}
};
$scope
.
submit
=
function
()
{
$scope
.
submit
=
()
=>
{
if
(
$scope
.
loginMode
)
{
$scope
.
login
();
}
else
{
...
...
@@ -45,7 +45,7 @@ export class LoginCtrl {
}
};
$scope
.
changeView
=
function
()
{
$scope
.
changeView
=
()
=>
{
const
loginView
=
document
.
querySelector
(
'#login-view'
);
const
changePasswordView
=
document
.
querySelector
(
'#change-password-view'
);
...
...
@@ -65,7 +65,7 @@ export class LoginCtrl {
},
400
);
};
$scope
.
changePassword
=
function
()
{
$scope
.
changePassword
=
()
=>
{
$scope
.
command
.
oldPassword
=
'admin'
;
if
(
$scope
.
command
.
newPassword
!==
$scope
.
command
.
confirmNew
)
{
...
...
@@ -73,25 +73,25 @@ export class LoginCtrl {
return
;
}
backendSrv
.
put
(
'/api/user/password'
,
$scope
.
command
).
then
(
function
()
{
backendSrv
.
put
(
'/api/user/password'
,
$scope
.
command
).
then
(
()
=>
{
$scope
.
toGrafana
();
});
};
$scope
.
skip
=
function
()
{
$scope
.
skip
=
()
=>
{
$scope
.
toGrafana
();
};
$scope
.
loginModeChanged
=
function
(
newValue
)
{
$scope
.
loginModeChanged
=
newValue
=>
{
$scope
.
submitBtnText
=
newValue
?
'Log in'
:
'Sign up'
;
};
$scope
.
signUp
=
function
()
{
$scope
.
signUp
=
()
=>
{
if
(
!
$scope
.
loginForm
.
$valid
)
{
return
;
}
backendSrv
.
post
(
'/api/user/signup'
,
$scope
.
formModel
).
then
(
function
(
result
)
{
backendSrv
.
post
(
'/api/user/signup'
,
$scope
.
formModel
).
then
(
result
=>
{
if
(
result
.
status
===
'SignUpCreated'
)
{
$location
.
path
(
'/signup'
).
search
({
email
:
$scope
.
formModel
.
email
});
}
else
{
...
...
@@ -100,7 +100,7 @@ export class LoginCtrl {
});
};
$scope
.
login
=
function
()
{
$scope
.
login
=
()
=>
{
delete
$scope
.
loginError
;
if
(
!
$scope
.
loginForm
.
$valid
)
{
...
...
@@ -110,7 +110,7 @@ export class LoginCtrl {
backendSrv
.
post
(
'/login'
,
$scope
.
formModel
)
.
then
(
function
(
result
)
{
.
then
(
result
=>
{
$scope
.
result
=
result
;
if
(
$scope
.
formModel
.
password
!==
'admin'
||
$scope
.
ldapEnabled
||
$scope
.
authProxyEnabled
)
{
...
...
@@ -125,7 +125,7 @@ export class LoginCtrl {
});
};
$scope
.
toGrafana
=
function
()
{
$scope
.
toGrafana
=
()
=>
{
const
params
=
$location
.
search
();
if
(
params
.
redirect
&&
params
.
redirect
[
0
]
===
'/'
)
{
...
...
public/app/core/controllers/reset_password_ctrl.ts
View file @
72ab24f3
...
...
@@ -22,16 +22,16 @@ export class ResetPasswordCtrl {
},
};
$scope
.
sendResetEmail
=
function
()
{
$scope
.
sendResetEmail
=
()
=>
{
if
(
!
$scope
.
sendResetForm
.
$valid
)
{
return
;
}
backendSrv
.
post
(
'/api/user/password/send-reset-email'
,
$scope
.
formModel
).
then
(
function
()
{
backendSrv
.
post
(
'/api/user/password/send-reset-email'
,
$scope
.
formModel
).
then
(
()
=>
{
$scope
.
mode
=
'email-sent'
;
});
};
$scope
.
submitReset
=
function
()
{
$scope
.
submitReset
=
()
=>
{
if
(
!
$scope
.
resetForm
.
$valid
)
{
return
;
}
...
...
@@ -41,7 +41,7 @@ export class ResetPasswordCtrl {
return
;
}
backendSrv
.
post
(
'/api/user/password/reset'
,
$scope
.
formModel
).
then
(
function
()
{
backendSrv
.
post
(
'/api/user/password/reset'
,
$scope
.
formModel
).
then
(
()
=>
{
$location
.
path
(
'login'
);
});
};
...
...
public/app/core/filters/filters.ts
View file @
72ab24f3
...
...
@@ -3,22 +3,22 @@ import angular from 'angular';
import
moment
from
'moment'
;
import
coreModule
from
'../core_module'
;
coreModule
.
filter
(
'stringSort'
,
function
()
{
return
function
(
input
)
{
coreModule
.
filter
(
'stringSort'
,
()
=>
{
return
input
=>
{
return
input
.
sort
();
};
});
coreModule
.
filter
(
'slice'
,
function
()
{
return
function
(
arr
,
start
,
end
)
{
coreModule
.
filter
(
'slice'
,
()
=>
{
return
(
arr
,
start
,
end
)
=>
{
if
(
!
_
.
isUndefined
(
arr
))
{
return
arr
.
slice
(
start
,
end
);
}
};
});
coreModule
.
filter
(
'stringify'
,
function
()
{
return
function
(
arr
)
{
coreModule
.
filter
(
'stringify'
,
()
=>
{
return
arr
=>
{
if
(
_
.
isObject
(
arr
)
&&
!
_
.
isArray
(
arr
))
{
return
angular
.
toJson
(
arr
);
}
else
{
...
...
@@ -27,8 +27,8 @@ coreModule.filter('stringify', function() {
};
});
coreModule
.
filter
(
'moment'
,
function
()
{
return
function
(
date
,
mode
)
{
coreModule
.
filter
(
'moment'
,
()
=>
{
return
(
date
,
mode
)
=>
{
switch
(
mode
)
{
case
'ago'
:
return
moment
(
date
).
fromNow
();
...
...
@@ -37,8 +37,8 @@ coreModule.filter('moment', function() {
};
});
coreModule
.
filter
(
'noXml'
,
function
()
{
const
noXml
=
function
(
text
)
{
coreModule
.
filter
(
'noXml'
,
()
=>
{
const
noXml
=
text
=>
{
return
_
.
isString
(
text
)
?
text
.
replace
(
/&/g
,
'&'
)
...
...
@@ -48,14 +48,14 @@ coreModule.filter('noXml', function() {
.
replace
(
/"/g
,
'"'
)
:
text
;
};
return
function
(
text
)
{
return
text
=>
{
return
_
.
isArray
(
text
)
?
_
.
map
(
text
,
noXml
)
:
noXml
(
text
);
};
});
/** @ngInject */
function
interpolateTemplateVars
(
templateSrv
)
{
const
filterFunc
:
any
=
function
(
text
,
scope
)
{
const
filterFunc
:
any
=
(
text
,
scope
)
=>
{
let
scopedVars
;
if
(
scope
.
ctrl
)
{
scopedVars
=
(
scope
.
ctrl
.
panel
||
scope
.
ctrl
.
row
).
scopedVars
;
...
...
public/app/core/lodash_extended.ts
View file @
72ab24f3
...
...
@@ -4,7 +4,7 @@ import _ from 'lodash';
Mixins :)
*/
_
.
mixin
({
move
:
function
(
array
,
fromIndex
,
toIndex
)
{
move
:
(
array
,
fromIndex
,
toIndex
)
=>
{
array
.
splice
(
toIndex
,
0
,
array
.
splice
(
fromIndex
,
1
)[
0
]);
return
array
;
},
...
...
public/app/core/services/alert_srv.ts
View file @
72ab24f3
...
...
@@ -70,7 +70,7 @@ export class AlertSrv {
const
newAlertJson
=
angular
.
toJson
(
newAlert
);
// remove same alert if it already exists
_
.
remove
(
this
.
list
,
function
(
value
)
{
_
.
remove
(
this
.
list
,
value
=>
{
return
angular
.
toJson
(
value
)
===
newAlertJson
;
});
...
...
public/app/core/services/popover_srv.ts
View file @
72ab24f3
...
...
@@ -6,13 +6,13 @@ import Drop from 'tether-drop';
function
popoverSrv
(
this
:
any
,
$compile
,
$rootScope
,
$timeout
)
{
let
openDrop
=
null
;
this
.
close
=
function
()
{
this
.
close
=
()
=>
{
if
(
openDrop
)
{
openDrop
.
close
();
}
};
this
.
show
=
function
(
options
)
{
this
.
show
=
options
=>
{
if
(
openDrop
)
{
openDrop
.
close
();
openDrop
=
null
;
...
...
@@ -68,7 +68,7 @@ function popoverSrv(this: any, $compile, $rootScope, $timeout) {
},
100
);
// return close function
return
function
()
{
return
()
=>
{
if
(
drop
)
{
drop
.
close
();
}
...
...
public/app/core/services/segment_srv.ts
View file @
72ab24f3
...
...
@@ -42,48 +42,48 @@ export function uiSegmentSrv(this: any, $sce, templateSrv) {
}
};
this
.
newSelectMeasurement
=
function
()
{
this
.
newSelectMeasurement
=
()
=>
{
return
new
MetricSegment
({
value
:
'select measurement'
,
fake
:
true
});
};
this
.
newFake
=
function
(
text
,
type
,
cssClass
)
{
this
.
newFake
=
(
text
,
type
,
cssClass
)
=>
{
return
new
MetricSegment
({
value
:
text
,
fake
:
true
,
type
:
type
,
cssClass
:
cssClass
});
};
this
.
newSegment
=
function
(
options
)
{
this
.
newSegment
=
options
=>
{
return
new
MetricSegment
(
options
);
};
this
.
newKey
=
function
(
key
)
{
this
.
newKey
=
key
=>
{
return
new
MetricSegment
({
value
:
key
,
type
:
'key'
,
cssClass
:
'query-segment-key'
});
};
this
.
newKeyValue
=
function
(
value
)
{
this
.
newKeyValue
=
value
=>
{
return
new
MetricSegment
({
value
:
value
,
type
:
'value'
,
cssClass
:
'query-segment-value'
});
};
this
.
newCondition
=
function
(
condition
)
{
this
.
newCondition
=
condition
=>
{
return
new
MetricSegment
({
value
:
condition
,
type
:
'condition'
,
cssClass
:
'query-keyword'
});
};
this
.
newOperator
=
function
(
op
)
{
this
.
newOperator
=
op
=>
{
return
new
MetricSegment
({
value
:
op
,
type
:
'operator'
,
cssClass
:
'query-segment-operator'
});
};
this
.
newOperators
=
function
(
ops
)
{
return
_
.
map
(
ops
,
function
(
op
)
{
this
.
newOperators
=
ops
=>
{
return
_
.
map
(
ops
,
op
=>
{
return
new
MetricSegment
({
value
:
op
,
type
:
'operator'
,
cssClass
:
'query-segment-operator'
});
});
};
this
.
transformToSegments
=
function
(
addTemplateVars
,
variableTypeFilter
)
{
return
function
(
results
)
{
const
segments
=
_
.
map
(
results
,
function
(
segment
)
{
this
.
transformToSegments
=
(
addTemplateVars
,
variableTypeFilter
)
=>
{
return
results
=>
{
const
segments
=
_
.
map
(
results
,
segment
=>
{
return
self
.
newSegment
({
value
:
segment
.
text
,
expandable
:
segment
.
expandable
});
});
if
(
addTemplateVars
)
{
_
.
each
(
templateSrv
.
variables
,
function
(
variable
)
{
_
.
each
(
templateSrv
.
variables
,
variable
=>
{
if
(
variableTypeFilter
===
void
0
||
variableTypeFilter
===
variable
.
type
)
{
segments
.
unshift
(
self
.
newSegment
({
type
:
'value'
,
value
:
'$'
+
variable
.
name
,
expandable
:
true
}));
}
...
...
@@ -94,11 +94,11 @@ export function uiSegmentSrv(this: any, $sce, templateSrv) {
};
};
this
.
newSelectMetric
=
function
()
{
this
.
newSelectMetric
=
()
=>
{
return
new
MetricSegment
({
value
:
'select metric'
,
fake
:
true
});
};
this
.
newPlusButton
=
function
()
{
this
.
newPlusButton
=
()
=>
{
return
new
MetricSegment
({
fake
:
true
,
html
:
'<i class="fa fa-plus "></i>'
,
...
...
public/app/core/services/util_srv.ts
View file @
72ab24f3
...
...
@@ -44,7 +44,7 @@ export class UtilSrv {
backdrop
:
options
.
backdrop
,
});
Promise
.
resolve
(
modal
).
then
(
function
(
modalEl
)
{
Promise
.
resolve
(
modal
).
then
(
modalEl
=>
{
modalEl
.
modal
(
'show'
);
});
}
...
...
@@ -52,12 +52,12 @@ export class UtilSrv {
showConfirmModal
(
payload
)
{
const
scope
=
this
.
$rootScope
.
$new
();
scope
.
onConfirm
=
function
()
{
scope
.
onConfirm
=
()
=>
{
payload
.
onConfirm
();
scope
.
dismiss
();
};
scope
.
updateConfirmText
=
function
(
value
)
{
scope
.
updateConfirmText
=
value
=>
{
scope
.
confirmTextValid
=
payload
.
confirmText
.
toLowerCase
()
===
value
.
toLowerCase
();
};
...
...
public/app/core/specs/backend_srv.test.ts
View file @
72ab24f3
import
{
BackendSrv
}
from
'app/core/services/backend_srv'
;
jest
.
mock
(
'app/core/store'
);
describe
(
'backend_srv'
,
function
()
{
describe
(
'backend_srv'
,
()
=>
{
const
_httpBackend
=
options
=>
{
if
(
options
.
url
===
'gateway-error'
)
{
return
Promise
.
reject
({
status
:
502
});
...
...
public/app/core/specs/datemath.test.ts
View file @
72ab24f3
...
...
@@ -91,11 +91,11 @@ describe('DateMath', () => {
});
_
.
each
(
spans
,
span
=>
{
it
(
'should round now to the beginning of the '
+
span
,
function
()
{
it
(
'should round now to the beginning of the '
+
span
,
()
=>
{
expect
(
dateMath
.
parse
(
'now/'
+
span
).
format
(
format
)).
toEqual
(
now
.
startOf
(
span
).
format
(
format
));
});
it
(
'should round now to the end of the '
+
span
,
function
()
{
it
(
'should round now to the end of the '
+
span
,
()
=>
{
expect
(
dateMath
.
parse
(
'now/'
+
span
,
true
).
format
(
format
)).
toEqual
(
now
.
endOf
(
span
).
format
(
format
));
});
});
...
...
@@ -114,18 +114,18 @@ describe('DateMath', () => {
});
});
describe
(
'relative time to date parsing'
,
function
()
{
it
(
'should handle negative time'
,
function
()
{
describe
(
'relative time to date parsing'
,
()
=>
{
it
(
'should handle negative time'
,
()
=>
{
const
date
=
dateMath
.
parseDateMath
(
'-2d'
,
moment
([
2014
,
1
,
5
]));
expect
(
date
.
valueOf
()).
toEqual
(
moment
([
2014
,
1
,
3
]).
valueOf
());
});
it
(
'should handle multiple math expressions'
,
function
()
{
it
(
'should handle multiple math expressions'
,
()
=>
{
const
date
=
dateMath
.
parseDateMath
(
'-2d-6h'
,
moment
([
2014
,
1
,
5
]));
expect
(
date
.
valueOf
()).
toEqual
(
moment
([
2014
,
1
,
2
,
18
]).
valueOf
());
});
it
(
'should return false when invalid expression'
,
function
()
{
it
(
'should return false when invalid expression'
,
()
=>
{
const
date
=
dateMath
.
parseDateMath
(
'2'
,
moment
([
2014
,
1
,
5
]));
expect
(
date
).
toEqual
(
undefined
);
});
...
...
public/app/core/specs/file_export.test.ts
View file @
72ab24f3
...
...
@@ -101,7 +101,7 @@ describe('file_export', () => {
expect
(
returnedText
).
toBe
(
expectedText
);
});
it
(
'should decode HTML encoded characters'
,
function
()
{
it
(
'should decode HTML encoded characters'
,
()
=>
{
const
inputTable
=
{
columns
:
[{
text
:
'string_value'
}],
rows
:
[
...
...
public/app/core/specs/kbn.test.ts
View file @
72ab24f3
This diff is collapsed.
Click to expand it.
public/app/core/specs/time_series.test.ts
View file @
72ab24f3
This diff is collapsed.
Click to expand it.
public/app/core/utils/css_loader.ts
View file @
72ab24f3
...
...
@@ -9,8 +9,8 @@ for (let i = 0; i < links.length; i++) {
}
const
isWebkit
=
!!
window
.
navigator
.
userAgent
.
match
(
/AppleWebKit
\/([^
;
]
*
)
/
);
const
webkitLoadCheck
=
function
(
link
,
callback
)
{
setTimeout
(
function
()
{
const
webkitLoadCheck
=
(
link
,
callback
)
=>
{
setTimeout
(
()
=>
{
for
(
let
i
=
0
;
i
<
document
.
styleSheets
.
length
;
i
++
)
{
const
sheet
=
document
.
styleSheets
[
i
];
if
(
sheet
.
href
===
link
.
href
)
{
...
...
@@ -21,19 +21,19 @@ const webkitLoadCheck = function(link, callback) {
},
10
);
};
const
noop
=
function
()
{};
const
noop
=
()
=>
{};
const
loadCSS
=
function
(
url
)
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
const
loadCSS
=
url
=>
{
return
new
Promise
(
(
resolve
,
reject
)
=>
{
const
link
=
document
.
createElement
(
'link'
);
const
timeout
=
setTimeout
(
function
()
{
const
timeout
=
setTimeout
(
()
=>
{
reject
(
'Unable to load CSS'
);
},
waitSeconds
*
1000
);
const
_callback
=
function
(
error
)
{
const
_callback
=
error
=>
{
clearTimeout
(
timeout
);
link
.
onload
=
link
.
onerror
=
noop
;
setTimeout
(
function
()
{
setTimeout
(
()
=>
{
if
(
error
)
{
reject
(
error
);
}
else
{
...
...
@@ -47,14 +47,14 @@ const loadCSS = function(url) {
link
.
href
=
url
;
if
(
!
isWebkit
)
{
link
.
onload
=
function
()
{
link
.
onload
=
()
=>
{
_callback
(
undefined
);
};
}
else
{
webkitLoadCheck
(
link
,
_callback
);
}
link
.
onerror
=
function
(
evt
:
any
)
{
link
.
onerror
=
(
evt
:
any
)
=>
{
_callback
(
evt
.
error
||
new
Error
(
'Error loading CSS file.'
));
};
...
...
public/app/features/dashboard/change_tracker.ts
View file @
72ab24f3
...
...
@@ -128,7 +128,7 @@ export class ChangeTracker {
});
// ignore template variable values
_
.
each
(
dash
.
templating
.
list
,
function
(
value
)
{
_
.
each
(
dash
.
templating
.
list
,
value
=>
{
value
.
current
=
null
;
value
.
options
=
null
;
value
.
filters
=
null
;
...
...
public/app/features/dashboard/dashboard_loader_srv.ts
View file @
72ab24f3
...
...
@@ -59,7 +59,7 @@ export class DashboardLoaderSrv {
});
}
promise
.
then
(
function
(
result
)
{
promise
.
then
(
result
=>
{
if
(
result
.
meta
.
dashboardNotFound
!==
true
)
{
impressionSrv
.
addDashboardImpression
(
result
.
dashboard
.
id
);
}
...
...
public/app/features/dashboard/repeat_option/repeat_option.ts
View file @
72ab24f3
...
...
@@ -15,7 +15,7 @@ function dashRepeatOptionDirective(variableSrv) {
scope
:
{
panel
:
'='
,
},
link
:
function
(
scope
,
element
)
{
link
:
(
scope
,
element
)
=>
{
element
.
css
({
display
:
'block'
,
width
:
'100%'
});
scope
.
variables
=
variableSrv
.
variables
.
map
(
item
=>
{
...
...
@@ -36,7 +36,7 @@ function dashRepeatOptionDirective(variableSrv) {
scope
.
panel
.
repeatDirection
=
'h'
;
}
scope
.
optionChanged
=
function
()
{
scope
.
optionChanged
=
()
=>
{
if
(
scope
.
panel
.
repeat
)
{
scope
.
panel
.
repeatDirection
=
'h'
;
}
...
...
public/app/features/dashboard/shareModalCtrl.ts
View file @
72ab24f3
...
...
@@ -11,7 +11,7 @@ export function ShareModalCtrl($scope, $rootScope, $location, $timeout, timeSrv,
};
$scope
.
editor
=
{
index
:
$scope
.
tabIndex
||
0
};
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
modeSharePanel
=
$scope
.
panel
?
true
:
false
;
$scope
.
tabs
=
[{
title
:
'Link'
,
src
:
'shareLink.html'
}];
...
...
@@ -34,7 +34,7 @@ export function ShareModalCtrl($scope, $rootScope, $location, $timeout, timeSrv,
$scope
.
buildUrl
();
};
$scope
.
buildUrl
=
function
()
{
$scope
.
buildUrl
=
()
=>
{
let
baseUrl
=
$location
.
absUrl
();
const
queryStart
=
baseUrl
.
indexOf
(
'?'
);
...
...
@@ -90,7 +90,7 @@ export function ShareModalCtrl($scope, $rootScope, $location, $timeout, timeSrv,
// This function will try to return the proper full name of the local timezone
// Chrome does not handle the timezone offset (but phantomjs does)
$scope
.
getLocalTimeZone
=
function
()
{
$scope
.
getLocalTimeZone
=
()
=>
{
const
utcOffset
=
'&tz=UTC'
+
encodeURIComponent
(
moment
().
format
(
'Z'
));
// Older browser does not the internationalization API
...
...
@@ -111,7 +111,7 @@ export function ShareModalCtrl($scope, $rootScope, $location, $timeout, timeSrv,
return
'&tz='
+
encodeURIComponent
(
options
.
timeZone
);
};
$scope
.
getShareUrl
=
function
()
{
$scope
.
getShareUrl
=
()
=>
{
return
$scope
.
shareUrl
;
};
}
...
...
public/app/features/dashboard/share_snapshot_ctrl.ts
View file @
72ab24f3
...
...
@@ -25,8 +25,8 @@ export class ShareSnapshotCtrl {
{
text
:
'Public on the web'
,
value
:
3
},
];
$scope
.
init
=
function
()
{
backendSrv
.
get
(
'/api/snapshot/shared-options'
).
then
(
function
(
options
)
{
$scope
.
init
=
()
=>
{
backendSrv
.
get
(
'/api/snapshot/shared-options'
).
then
(
options
=>
{
$scope
.
externalUrl
=
options
[
'externalSnapshotURL'
];
$scope
.
sharingButtonText
=
options
[
'externalSnapshotName'
];
$scope
.
externalEnabled
=
options
[
'externalEnabled'
];
...
...
@@ -35,7 +35,7 @@ export class ShareSnapshotCtrl {
$scope
.
apiUrl
=
'/api/snapshots'
;
$scope
.
createSnapshot
=
function
(
external
)
{
$scope
.
createSnapshot
=
external
=>
{
$scope
.
dashboard
.
snapshot
=
{
timestamp
:
new
Date
(),
};
...
...
@@ -49,12 +49,12 @@ export class ShareSnapshotCtrl {
$rootScope
.
$broadcast
(
'refresh'
);
$timeout
(
function
()
{
$timeout
(
()
=>
{
$scope
.
saveSnapshot
(
external
);
},
$scope
.
snapshot
.
timeoutSeconds
*
1000
);
};
$scope
.
saveSnapshot
=
function
(
external
)
{
$scope
.
saveSnapshot
=
external
=>
{
const
dash
=
$scope
.
dashboard
.
getSaveModelClone
();
$scope
.
scrubDashboard
(
dash
);
...
...
@@ -67,7 +67,7 @@ export class ShareSnapshotCtrl {
const
postUrl
=
external
?
$scope
.
externalUrl
+
$scope
.
apiUrl
:
$scope
.
apiUrl
;
backendSrv
.
post
(
postUrl
,
cmdData
).
then
(
function
(
results
)
{
results
=>
{
$scope
.
loading
=
false
;
if
(
external
)
{
...
...
@@ -88,17 +88,17 @@ export class ShareSnapshotCtrl {
$scope
.
step
=
2
;
},
function
()
{
()
=>
{
$scope
.
loading
=
false
;
}
);
};
$scope
.
getSnapshotUrl
=
function
()
{
$scope
.
getSnapshotUrl
=
()
=>
{
return
$scope
.
snapshotUrl
;
};
$scope
.
scrubDashboard
=
function
(
dash
)
{
$scope
.
scrubDashboard
=
dash
=>
{
// change title
dash
.
title
=
$scope
.
snapshot
.
name
;
...
...
@@ -106,7 +106,7 @@ export class ShareSnapshotCtrl {
dash
.
time
=
timeSrv
.
timeRange
();
// remove panel queries & links
_
.
each
(
dash
.
panels
,
function
(
panel
)
{
_
.
each
(
dash
.
panels
,
panel
=>
{
panel
.
targets
=
[];
panel
.
links
=
[];
panel
.
datasource
=
null
;
...
...
@@ -114,10 +114,10 @@ export class ShareSnapshotCtrl {
// remove annotation queries
dash
.
annotations
.
list
=
_
.
chain
(
dash
.
annotations
.
list
)
.
filter
(
function
(
annotation
)
{
.
filter
(
annotation
=>
{
return
annotation
.
enable
;
})
.
map
(
function
(
annotation
)
{
.
map
(
annotation
=>
{
return
{
name
:
annotation
.
name
,
enable
:
annotation
.
enable
,
...
...
@@ -131,7 +131,7 @@ export class ShareSnapshotCtrl {
.
value
();
// remove template queries
_
.
each
(
dash
.
templating
.
list
,
function
(
variable
)
{
_
.
each
(
dash
.
templating
.
list
,
variable
=>
{
variable
.
query
=
''
;
variable
.
options
=
variable
.
current
;
variable
.
refresh
=
false
;
...
...
@@ -149,21 +149,21 @@ export class ShareSnapshotCtrl {
// cleanup snapshotData
delete
$scope
.
dashboard
.
snapshot
;
$scope
.
dashboard
.
forEachPanel
(
function
(
panel
)
{
$scope
.
dashboard
.
forEachPanel
(
panel
=>
{
delete
panel
.
snapshotData
;
});
_
.
each
(
$scope
.
dashboard
.
annotations
.
list
,
function
(
annotation
)
{
_
.
each
(
$scope
.
dashboard
.
annotations
.
list
,
annotation
=>
{
delete
annotation
.
snapshotData
;
});
};
$scope
.
deleteSnapshot
=
function
()
{
backendSrv
.
get
(
$scope
.
deleteUrl
).
then
(
function
()
{
$scope
.
deleteSnapshot
=
()
=>
{
backendSrv
.
get
(
$scope
.
deleteUrl
).
then
(
()
=>
{
$scope
.
step
=
3
;
});
};
$scope
.
saveExternalSnapshotRef
=
function
(
cmdData
,
results
)
{
$scope
.
saveExternalSnapshotRef
=
(
cmdData
,
results
)
=>
{
// save external in local instance as well
cmdData
.
external
=
true
;
cmdData
.
key
=
results
.
key
;
...
...
public/app/features/dashboard/timepicker/input_date.ts
View file @
72ab24f3
...
...
@@ -5,10 +5,10 @@ export function inputDateDirective() {
return
{
restrict
:
'A'
,
require
:
'ngModel'
,
link
:
function
(
$scope
,
$elem
,
attrs
,
ngModel
)
{
link
:
(
$scope
,
$elem
,
attrs
,
ngModel
)
=>
{
const
format
=
'YYYY-MM-DD HH:mm:ss'
;
const
fromUser
=
function
(
text
)
{
const
fromUser
=
text
=>
{
if
(
text
.
indexOf
(
'now'
)
!==
-
1
)
{
if
(
!
dateMath
.
isValid
(
text
))
{
ngModel
.
$setValidity
(
'error'
,
false
);
...
...
@@ -34,7 +34,7 @@ export function inputDateDirective() {
return
parsed
;
};
const
toUser
=
function
(
currentValue
)
{
const
toUser
=
currentValue
=>
{
if
(
moment
.
isMoment
(
currentValue
))
{
return
currentValue
.
format
(
format
);
}
else
{
...
...
public/app/features/dashboard/upload.ts
View file @
72ab24f3
...
...
@@ -16,11 +16,11 @@ function uploadDashboardDirective(timer, alertSrv, $location) {
scope
:
{
onUpload
:
'&'
,
},
link
:
function
(
scope
)
{
link
:
scope
=>
{
function
file_selected
(
evt
)
{
const
files
=
evt
.
target
.
files
;
// FileList object
const
readerOnload
=
function
()
{
return
function
(
e
)
{
const
readerOnload
=
()
=>
{
return
e
=>
{
let
dash
;
try
{
dash
=
JSON
.
parse
(
e
.
target
.
result
);
...
...
@@ -30,7 +30,7 @@ function uploadDashboardDirective(timer, alertSrv, $location) {
return
;
}
scope
.
$apply
(
function
()
{
scope
.
$apply
(
()
=>
{
scope
.
onUpload
({
dash
:
dash
});
});
};
...
...
public/app/features/dashboard/view_state_srv.ts
View file @
72ab24f3
...
...
@@ -22,18 +22,18 @@ export class DashboardViewState {
self
.
$scope
=
$scope
;
self
.
dashboard
=
$scope
.
dashboard
;
$scope
.
onAppEvent
(
'$routeUpdate'
,
function
()
{
$scope
.
onAppEvent
(
'$routeUpdate'
,
()
=>
{
const
urlState
=
self
.
getQueryStringState
();
if
(
self
.
needsSync
(
urlState
))
{
self
.
update
(
urlState
,
true
);
}
});
$scope
.
onAppEvent
(
'panel-change-view'
,
function
(
evt
,
payload
)
{
$scope
.
onAppEvent
(
'panel-change-view'
,
(
evt
,
payload
)
=>
{
self
.
update
(
payload
);
});
$scope
.
onAppEvent
(
'panel-initialized'
,
function
(
evt
,
payload
)
{
$scope
.
onAppEvent
(
'panel-initialized'
,
(
evt
,
payload
)
=>
{
self
.
registerPanel
(
payload
.
scope
);
});
...
...
@@ -156,7 +156,7 @@ export class DashboardViewState {
}
getPanelScope
(
id
)
{
return
_
.
find
(
this
.
panelScopes
,
function
(
panelScope
)
{
return
_
.
find
(
this
.
panelScopes
,
panelScope
=>
{
return
panelScope
.
ctrl
.
panel
.
id
===
id
;
});
}
...
...
@@ -176,7 +176,7 @@ export class DashboardViewState {
return
false
;
}
this
.
$timeout
(
function
()
{
this
.
$timeout
(
()
=>
{
if
(
self
.
oldTimeRange
!==
ctrl
.
range
)
{
self
.
$rootScope
.
$broadcast
(
'refresh'
);
}
else
{
...
...
@@ -216,7 +216,7 @@ export class DashboardViewState {
}
}
const
unbind
=
panelScope
.
$on
(
'$destroy'
,
function
()
{
const
unbind
=
panelScope
.
$on
(
'$destroy'
,
()
=>
{
self
.
panelScopes
=
_
.
without
(
self
.
panelScopes
,
panelScope
);
unbind
();
});
...
...
@@ -226,7 +226,7 @@ export class DashboardViewState {
/** @ngInject */
export
function
dashboardViewStateSrv
(
$location
,
$timeout
,
$rootScope
)
{
return
{
create
:
function
(
$scope
)
{
create
:
$scope
=>
{
return
new
DashboardViewState
(
$scope
,
$location
,
$timeout
,
$rootScope
);
},
};
...
...
public/app/features/dashlinks/module.ts
View file @
72ab24f3
...
...
@@ -10,7 +10,7 @@ function dashLinksContainer() {
restrict
:
'E'
,
controller
:
'DashLinksContainerCtrl'
,
template
:
'<dash-link ng-repeat="link in generatedLinks" link="link"></dash-link>'
,
link
:
function
()
{},
link
:
()
=>
{},
};
}
...
...
@@ -18,7 +18,7 @@ function dashLinksContainer() {
function
dashLink
(
$compile
,
$sanitize
,
linkSrv
)
{
return
{
restrict
:
'E'
,
link
:
function
(
scope
,
elem
)
{
link
:
(
scope
,
elem
)
=>
{
const
link
=
scope
.
link
;
let
template
=
'<div class="gf-form">'
+
...
...
@@ -130,16 +130,16 @@ export class DashLinksContainerCtrl {
function
updateDashLinks
()
{
const
promises
=
_
.
map
(
$scope
.
links
,
buildLinks
);
$q
.
all
(
promises
).
then
(
function
(
results
)
{
$q
.
all
(
promises
).
then
(
results
=>
{
$scope
.
generatedLinks
=
_
.
flatten
(
results
);
});
}
$scope
.
searchDashboards
=
function
(
link
,
limit
)
{
return
backendSrv
.
search
({
tag
:
link
.
tags
,
limit
:
limit
}).
then
(
function
(
results
)
{
$scope
.
searchDashboards
=
(
link
,
limit
)
=>
{
return
backendSrv
.
search
({
tag
:
link
.
tags
,
limit
:
limit
}).
then
(
results
=>
{
return
_
.
reduce
(
results
,
function
(
memo
,
dash
)
{
(
memo
,
dash
)
=>
{
// do not add current dashboard
if
(
dash
.
id
!==
currentDashId
)
{
memo
.
push
({
...
...
@@ -158,9 +158,9 @@ export class DashLinksContainerCtrl {
});
};
$scope
.
fillDropdown
=
function
(
link
)
{
$scope
.
searchDashboards
(
link
,
100
).
then
(
function
(
results
)
{
_
.
each
(
results
,
function
(
hit
)
{
$scope
.
fillDropdown
=
link
=>
{
$scope
.
searchDashboards
(
link
,
100
).
then
(
results
=>
{
_
.
each
(
results
,
hit
=>
{
hit
.
url
=
linkSrv
.
getLinkUrl
(
hit
);
});
link
.
searchHits
=
results
;
...
...
public/app/features/org/change_password_ctrl.ts
View file @
72ab24f3
...
...
@@ -9,7 +9,7 @@ export class ChangePasswordCtrl {
$scope
.
ldapEnabled
=
config
.
ldapEnabled
;
$scope
.
navModel
=
navModelSrv
.
getNav
(
'profile'
,
'change-password'
,
0
);
$scope
.
changePassword
=
function
()
{
$scope
.
changePassword
=
()
=>
{
if
(
!
$scope
.
userForm
.
$valid
)
{
return
;
}
...
...
@@ -19,7 +19,7 @@ export class ChangePasswordCtrl {
return
;
}
backendSrv
.
put
(
'/api/user/password'
,
$scope
.
command
).
then
(
function
()
{
backendSrv
.
put
(
'/api/user/password'
,
$scope
.
command
).
then
(
()
=>
{
$location
.
path
(
'profile'
);
});
};
...
...
public/app/features/org/new_org_ctrl.ts
View file @
72ab24f3
...
...
@@ -7,9 +7,9 @@ export class NewOrgCtrl {
$scope
.
navModel
=
navModelSrv
.
getNav
(
'cfg'
,
'admin'
,
'global-orgs'
,
1
);
$scope
.
newOrg
=
{
name
:
''
};
$scope
.
createOrg
=
function
()
{
backendSrv
.
post
(
'/api/orgs/'
,
$scope
.
newOrg
).
then
(
function
(
result
)
{
backendSrv
.
post
(
'/api/user/using/'
+
result
.
orgId
).
then
(
function
()
{
$scope
.
createOrg
=
()
=>
{
backendSrv
.
post
(
'/api/orgs/'
,
$scope
.
newOrg
).
then
(
result
=>
{
backendSrv
.
post
(
'/api/user/using/'
+
result
.
orgId
).
then
(
()
=>
{
window
.
location
.
href
=
config
.
appSubUrl
+
'/org'
;
});
});
...
...
public/app/features/org/org_api_keys_ctrl.ts
View file @
72ab24f3
...
...
@@ -8,22 +8,22 @@ export class OrgApiKeysCtrl {
$scope
.
roleTypes
=
[
'Viewer'
,
'Editor'
,
'Admin'
];
$scope
.
token
=
{
role
:
'Viewer'
};
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
getTokens
();
};
$scope
.
getTokens
=
function
()
{
backendSrv
.
get
(
'/api/auth/keys'
).
then
(
function
(
tokens
)
{
$scope
.
getTokens
=
()
=>
{
backendSrv
.
get
(
'/api/auth/keys'
).
then
(
tokens
=>
{
$scope
.
tokens
=
tokens
;
});
};
$scope
.
removeToken
=
function
(
id
)
{
$scope
.
removeToken
=
id
=>
{
backendSrv
.
delete
(
'/api/auth/keys/'
+
id
).
then
(
$scope
.
getTokens
);
};
$scope
.
addToken
=
function
()
{
backendSrv
.
post
(
'/api/auth/keys'
,
$scope
.
token
).
then
(
function
(
result
)
{
$scope
.
addToken
=
()
=>
{
backendSrv
.
post
(
'/api/auth/keys'
,
$scope
.
token
).
then
(
result
=>
{
const
modalScope
=
$scope
.
$new
(
true
);
modalScope
.
key
=
result
.
key
;
modalScope
.
rootPath
=
window
.
location
.
origin
+
$scope
.
$root
.
appSubUrl
;
...
...
public/app/features/org/select_org_ctrl.ts
View file @
72ab24f3
...
...
@@ -14,18 +14,18 @@ export class SelectOrgCtrl {
},
};
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
getUserOrgs
();
};
$scope
.
getUserOrgs
=
function
()
{
backendSrv
.
get
(
'/api/user/orgs'
).
then
(
function
(
orgs
)
{
$scope
.
getUserOrgs
=
()
=>
{
backendSrv
.
get
(
'/api/user/orgs'
).
then
(
orgs
=>
{
$scope
.
orgs
=
orgs
;
});
};
$scope
.
setUsingOrg
=
function
(
org
)
{
backendSrv
.
post
(
'/api/user/using/'
+
org
.
orgId
).
then
(
function
()
{
$scope
.
setUsingOrg
=
org
=>
{
backendSrv
.
post
(
'/api/user/using/'
+
org
.
orgId
).
then
(
()
=>
{
window
.
location
.
href
=
config
.
appSubUrl
+
'/'
;
});
};
...
...
public/app/features/panel/panel_directive.ts
View file @
72ab24f3
...
...
@@ -54,13 +54,13 @@ const panelTemplate = `
</div>
`
;
module
.
directive
(
'grafanaPanel'
,
function
(
$rootScope
,
$document
,
$timeout
)
{
module
.
directive
(
'grafanaPanel'
,
(
$rootScope
,
$document
,
$timeout
)
=>
{
return
{
restrict
:
'E'
,
template
:
panelTemplate
,
transclude
:
true
,
scope
:
{
ctrl
:
'='
},
link
:
function
(
scope
,
elem
)
{
link
:
(
scope
,
elem
)
=>
{
const
panelContainer
=
elem
.
find
(
'.panel-container'
);
const
panelContent
=
elem
.
find
(
'.panel-content'
);
const
cornerInfoElem
=
elem
.
find
(
'.panel-info-corner'
);
...
...
@@ -184,7 +184,7 @@ module.directive('grafanaPanel', function($rootScope, $document, $timeout) {
infoDrop
=
new
Drop
({
target
:
cornerInfoElem
[
0
],
content
:
function
()
{
content
:
()
=>
{
return
ctrl
.
getInfoContent
({
mode
:
'tooltip'
});
},
classes
:
ctrl
.
error
?
'drop-error'
:
'drop-help'
,
...
...
@@ -208,7 +208,7 @@ module.directive('grafanaPanel', function($rootScope, $document, $timeout) {
scope
.
$watchGroup
([
'ctrl.error'
,
'ctrl.panel.description'
],
updatePanelCornerInfo
);
scope
.
$watchCollection
(
'ctrl.panel.links'
,
updatePanelCornerInfo
);
cornerInfoElem
.
on
(
'click'
,
function
()
{
cornerInfoElem
.
on
(
'click'
,
()
=>
{
infoDrop
.
close
();
scope
.
$apply
(
ctrl
.
openInspector
.
bind
(
ctrl
));
});
...
...
@@ -216,7 +216,7 @@ module.directive('grafanaPanel', function($rootScope, $document, $timeout) {
elem
.
on
(
'mouseenter'
,
mouseEnter
);
elem
.
on
(
'mouseleave'
,
mouseLeave
);
scope
.
$on
(
'$destroy'
,
function
()
{
scope
.
$on
(
'$destroy'
,
()
=>
{
elem
.
off
();
cornerInfoElem
.
off
();
...
...
@@ -232,7 +232,7 @@ module.directive('grafanaPanel', function($rootScope, $document, $timeout) {
};
});
module
.
directive
(
'panelHelpCorner'
,
function
(
$rootScope
)
{
module
.
directive
(
'panelHelpCorner'
,
$rootScope
=>
{
return
{
restrict
:
'E'
,
template
:
`
...
...
@@ -242,6 +242,6 @@ module.directive('panelHelpCorner', function($rootScope) {
</span>
</span>
`
,
link
:
function
(
scope
,
elem
)
{},
link
:
(
scope
,
elem
)
=>
{},
};
});
public/app/features/panel/panel_header.ts
View file @
72ab24f3
...
...
@@ -85,12 +85,12 @@ function panelHeader($compile) {
return
{
restrict
:
'E'
,
template
:
template
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
const
menuElem
=
elem
.
find
(
'.panel-menu'
);
let
menuScope
;
let
isDragged
;
elem
.
click
(
function
(
evt
)
{
elem
.
click
(
evt
=>
{
const
targetClass
=
evt
.
target
.
className
;
// remove existing scope
...
...
public/app/features/panel/query_troubleshooter.ts
View file @
72ab24f3
...
...
@@ -170,8 +170,8 @@ export function queryTroubleshooter() {
panelCtrl
:
'='
,
isOpen
:
'='
,
},
link
:
function
(
scope
,
elem
,
attrs
,
ctrl
)
{
ctrl
.
renderJsonExplorer
=
function
(
data
)
{
link
:
(
scope
,
elem
,
attrs
,
ctrl
)
=>
{
ctrl
.
renderJsonExplorer
=
data
=>
{
const
jsonElem
=
elem
.
find
(
'.query-troubleshooter-json'
);
ctrl
.
jsonExplorer
=
new
JsonExplorer
(
data
,
3
,
{
...
...
public/app/features/panel/solo_panel_ctrl.ts
View file @
72ab24f3
...
...
@@ -7,7 +7,7 @@ export class SoloPanelCtrl {
constructor
(
$scope
,
$routeParams
,
$location
,
dashboardLoaderSrv
,
contextSrv
,
backendSrv
)
{
let
panelId
;
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
contextSrv
.
sidemenu
=
false
;
appEvents
.
emit
(
'toggle-sidemenu-hidden'
);
...
...
@@ -27,13 +27,13 @@ export class SoloPanelCtrl {
return
;
}
dashboardLoaderSrv
.
loadDashboard
(
$routeParams
.
type
,
$routeParams
.
slug
,
$routeParams
.
uid
).
then
(
function
(
result
)
{
dashboardLoaderSrv
.
loadDashboard
(
$routeParams
.
type
,
$routeParams
.
slug
,
$routeParams
.
uid
).
then
(
result
=>
{
result
.
meta
.
soloMode
=
true
;
$scope
.
initDashboard
(
result
,
$scope
);
});
};
$scope
.
initPanelScope
=
function
()
{
$scope
.
initPanelScope
=
()
=>
{
const
panelInfo
=
$scope
.
dashboard
.
getPanelInfoById
(
panelId
);
// fake row ctrl scope
...
...
public/app/features/panellinks/module.ts
View file @
72ab24f3
...
...
@@ -10,7 +10,7 @@ function panelLinksEditor() {
restrict
:
'E'
,
controller
:
'PanelLinksEditorCtrl'
,
templateUrl
:
'public/app/features/panellinks/module.html'
,
link
:
function
()
{},
link
:
()
=>
{},
};
}
...
...
@@ -19,15 +19,15 @@ export class PanelLinksEditorCtrl {
constructor
(
$scope
,
backendSrv
)
{
$scope
.
panel
.
links
=
$scope
.
panel
.
links
||
[];
$scope
.
addLink
=
function
()
{
$scope
.
addLink
=
()
=>
{
$scope
.
panel
.
links
.
push
({
type
:
'dashboard'
,
});
};
$scope
.
searchDashboards
=
function
(
queryStr
,
callback
)
{
backendSrv
.
search
({
query
:
queryStr
}).
then
(
function
(
hits
)
{
const
dashboards
=
_
.
map
(
hits
,
function
(
dash
)
{
$scope
.
searchDashboards
=
(
queryStr
,
callback
)
=>
{
backendSrv
.
search
({
query
:
queryStr
}).
then
(
hits
=>
{
const
dashboards
=
_
.
map
(
hits
,
dash
=>
{
return
dash
.
title
;
});
...
...
@@ -35,8 +35,8 @@ export class PanelLinksEditorCtrl {
});
};
$scope
.
dashboardChanged
=
function
(
link
)
{
backendSrv
.
search
({
query
:
link
.
dashboard
}).
then
(
function
(
hits
)
{
$scope
.
dashboardChanged
=
link
=>
{
backendSrv
.
search
({
query
:
link
.
dashboard
}).
then
(
hits
=>
{
const
dashboard
=
_
.
find
(
hits
,
{
title
:
link
.
dashboard
});
if
(
dashboard
)
{
if
(
dashboard
.
url
)
{
...
...
@@ -50,7 +50,7 @@ export class PanelLinksEditorCtrl {
});
};
$scope
.
deleteLink
=
function
(
link
)
{
$scope
.
deleteLink
=
link
=>
{
$scope
.
panel
.
links
=
_
.
without
(
$scope
.
panel
.
links
,
link
);
};
}
...
...
public/app/features/playlist/playlist_routes.ts
View file @
72ab24f3
...
...
@@ -21,7 +21,7 @@ function grafanaRoutes($routeProvider) {
.
when
(
'/playlists/play/:id'
,
{
template
:
''
,
resolve
:
{
init
:
function
(
playlistSrv
,
$route
)
{
init
:
(
playlistSrv
,
$route
)
=>
{
const
playlistId
=
$route
.
current
.
params
.
id
;
playlistSrv
.
start
(
playlistId
);
},
...
...
public/app/features/plugins/ds_edit_ctrl.ts
View file @
72ab24f3
...
...
@@ -200,7 +200,7 @@ export class DataSourceEditCtrl {
coreModule
.
controller
(
'DataSourceEditCtrl'
,
DataSourceEditCtrl
);
coreModule
.
directive
(
'datasourceHttpSettings'
,
function
()
{
coreModule
.
directive
(
'datasourceHttpSettings'
,
()
=>
{
return
{
scope
:
{
current
:
'='
,
...
...
@@ -209,15 +209,15 @@ coreModule.directive('datasourceHttpSettings', function() {
},
templateUrl
:
'public/app/features/plugins/partials/ds_http_settings.html'
,
link
:
{
pre
:
function
(
$scope
,
elem
,
attrs
)
{
pre
:
(
$scope
,
elem
,
attrs
)
=>
{
// do not show access option if direct access is disabled
$scope
.
showAccessOption
=
$scope
.
noDirectAccess
!==
'true'
;
$scope
.
showAccessHelp
=
false
;
$scope
.
toggleAccessHelp
=
function
()
{
$scope
.
toggleAccessHelp
=
()
=>
{
$scope
.
showAccessHelp
=
!
$scope
.
showAccessHelp
;
};
$scope
.
getSuggestUrls
=
function
()
{
$scope
.
getSuggestUrls
=
()
=>
{
return
[
$scope
.
suggestUrl
];
};
},
...
...
public/app/features/plugins/plugin_component.ts
View file @
72ab24f3
...
...
@@ -36,7 +36,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
// handle relative template urls for plugin templates
options
.
Component
.
templateUrl
=
relativeTemplateUrlToAbs
(
options
.
Component
.
templateUrl
,
options
.
baseUrl
);
return
function
()
{
return
()
=>
{
return
{
templateUrl
:
options
.
Component
.
templateUrl
,
template
:
options
.
Component
.
template
,
...
...
@@ -71,12 +71,12 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
const
panelInfo
=
config
.
panels
[
scope
.
panel
.
type
];
let
panelCtrlPromise
=
Promise
.
resolve
(
UnknownPanelCtrl
);
if
(
panelInfo
)
{
panelCtrlPromise
=
importPluginModule
(
panelInfo
.
module
).
then
(
function
(
panelModule
)
{
panelCtrlPromise
=
importPluginModule
(
panelInfo
.
module
).
then
(
panelModule
=>
{
return
panelModule
.
PanelCtrl
;
});
}
return
panelCtrlPromise
.
then
(
function
(
PanelCtrl
:
any
)
{
return
panelCtrlPromise
.
then
(
(
PanelCtrl
:
any
)
=>
{
componentInfo
.
Component
=
PanelCtrl
;
if
(
!
PanelCtrl
||
PanelCtrl
.
registered
)
{
...
...
@@ -128,7 +128,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
}
// Annotations
case
'annotations-query-ctrl'
:
{
return
importPluginModule
(
scope
.
ctrl
.
currentDatasource
.
meta
.
module
).
then
(
function
(
dsModule
)
{
return
importPluginModule
(
scope
.
ctrl
.
currentDatasource
.
meta
.
module
).
then
(
dsModule
=>
{
return
{
baseUrl
:
scope
.
ctrl
.
currentDatasource
.
meta
.
baseUrl
,
name
:
'annotations-query-ctrl-'
+
scope
.
ctrl
.
currentDatasource
.
meta
.
id
,
...
...
@@ -144,7 +144,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
// Datasource ConfigCtrl
case
'datasource-config-ctrl'
:
{
const
dsMeta
=
scope
.
ctrl
.
datasourceMeta
;
return
importPluginModule
(
dsMeta
.
module
).
then
(
function
(
dsModule
):
any
{
return
importPluginModule
(
dsMeta
.
module
).
then
(
(
dsModule
):
any
=>
{
if
(
!
dsModule
.
ConfigCtrl
)
{
return
{
notFound
:
true
};
}
...
...
@@ -161,7 +161,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
// AppConfigCtrl
case
'app-config-ctrl'
:
{
const
model
=
scope
.
ctrl
.
model
;
return
importPluginModule
(
model
.
module
).
then
(
function
(
appModule
)
{
return
importPluginModule
(
model
.
module
).
then
(
appModule
=>
{
return
{
baseUrl
:
model
.
baseUrl
,
name
:
'app-config-'
+
model
.
id
,
...
...
@@ -174,7 +174,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
// App Page
case
'app-page'
:
{
const
appModel
=
scope
.
ctrl
.
appModel
;
return
importPluginModule
(
appModel
.
module
).
then
(
function
(
appModule
)
{
return
importPluginModule
(
appModel
.
module
).
then
(
appModule
=>
{
return
{
baseUrl
:
appModel
.
baseUrl
,
name
:
'app-page-'
+
appModel
.
id
+
'-'
+
scope
.
ctrl
.
page
.
slug
,
...
...
@@ -206,9 +206,9 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
elem
.
empty
();
// let a binding digest cycle complete before adding to dom
setTimeout
(
function
()
{
setTimeout
(
()
=>
{
elem
.
append
(
child
);
scope
.
$applyAsync
(
function
()
{
scope
.
$applyAsync
(
()
=>
{
scope
.
$broadcast
(
'component-did-mount'
);
scope
.
$broadcast
(
'refresh'
);
});
...
...
@@ -239,9 +239,9 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
return
{
restrict
:
'E'
,
link
:
function
(
scope
,
elem
,
attrs
)
{
link
:
(
scope
,
elem
,
attrs
)
=>
{
getModule
(
scope
,
attrs
)
.
then
(
function
(
componentInfo
)
{
.
then
(
componentInfo
=>
{
registerPluginComponent
(
scope
,
elem
,
attrs
,
componentInfo
);
})
.
catch
(
err
=>
{
...
...
public/app/features/templating/all.ts
View file @
72ab24f3
...
...
@@ -10,7 +10,7 @@ import { CustomVariable } from './custom_variable';
import
{
ConstantVariable
}
from
'./constant_variable'
;
import
{
AdhocVariable
}
from
'./adhoc_variable'
;
coreModule
.
factory
(
'templateSrv'
,
function
()
{
coreModule
.
factory
(
'templateSrv'
,
()
=>
{
return
templateSrv
;
});
...
...
public/app/features/templating/custom_variable.ts
View file @
72ab24f3
...
...
@@ -39,7 +39,7 @@ export class CustomVariable implements Variable {
updateOptions
()
{
// extract options in comma separated string
this
.
options
=
_
.
map
(
this
.
query
.
split
(
/
[
,
]
+/
),
function
(
text
)
{
this
.
options
=
_
.
map
(
this
.
query
.
split
(
/
[
,
]
+/
),
text
=>
{
return
{
text
:
text
.
trim
(),
value
:
text
.
trim
()
};
});
...
...
public/app/features/templating/editor_ctrl.ts
View file @
72ab24f3
...
...
@@ -30,31 +30,31 @@ export class VariableEditorCtrl {
$scope
.
hideOptions
=
[{
value
:
0
,
text
:
''
},
{
value
:
1
,
text
:
'Label'
},
{
value
:
2
,
text
:
'Variable'
}];
$scope
.
init
=
function
()
{
$scope
.
init
=
()
=>
{
$scope
.
mode
=
'list'
;
$scope
.
variables
=
variableSrv
.
variables
;
$scope
.
reset
();
$scope
.
$watch
(
'mode'
,
function
(
val
)
{
$scope
.
$watch
(
'mode'
,
val
=>
{
if
(
val
===
'new'
)
{
$scope
.
reset
();
}
});
};
$scope
.
setMode
=
function
(
mode
)
{
$scope
.
setMode
=
mode
=>
{
$scope
.
mode
=
mode
;
};
$scope
.
add
=
function
()
{
$scope
.
add
=
()
=>
{
if
(
$scope
.
isValid
())
{
variableSrv
.
addVariable
(
$scope
.
current
);
$scope
.
update
();
}
};
$scope
.
isValid
=
function
()
{
$scope
.
isValid
=
()
=>
{
if
(
!
$scope
.
ctrl
.
form
.
$valid
)
{
return
false
;
}
...
...
@@ -84,7 +84,7 @@ export class VariableEditorCtrl {
return
true
;
};
$scope
.
validate
=
function
()
{
$scope
.
validate
=
()
=>
{
$scope
.
infoText
=
''
;
if
(
$scope
.
current
.
type
===
'adhoc'
&&
$scope
.
current
.
datasource
!==
null
)
{
$scope
.
infoText
=
'Adhoc filters are applied automatically to all queries that target this datasource'
;
...
...
@@ -96,7 +96,7 @@ export class VariableEditorCtrl {
}
};
$scope
.
runQuery
=
function
()
{
$scope
.
runQuery
=
()
=>
{
$scope
.
optionsLimit
=
20
;
return
variableSrv
.
updateOptions
(
$scope
.
current
).
catch
(
err
=>
{
if
(
err
.
data
&&
err
.
data
.
message
)
{
...
...
@@ -106,23 +106,23 @@ export class VariableEditorCtrl {
});
};
$scope
.
edit
=
function
(
variable
)
{
$scope
.
edit
=
variable
=>
{
$scope
.
current
=
variable
;
$scope
.
currentIsNew
=
false
;
$scope
.
mode
=
'edit'
;
$scope
.
validate
();
};
$scope
.
duplicate
=
function
(
variable
)
{
$scope
.
duplicate
=
variable
=>
{
const
clone
=
_
.
cloneDeep
(
variable
.
getSaveModel
());
$scope
.
current
=
variableSrv
.
createVariableFromModel
(
clone
);
$scope
.
current
.
name
=
'copy_of_'
+
variable
.
name
;
variableSrv
.
addVariable
(
$scope
.
current
);
};
$scope
.
update
=
function
()
{
$scope
.
update
=
()
=>
{
if
(
$scope
.
isValid
())
{
$scope
.
runQuery
().
then
(
function
()
{
$scope
.
runQuery
().
then
(
()
=>
{
$scope
.
reset
();
$scope
.
mode
=
'list'
;
templateSrv
.
updateTemplateData
();
...
...
@@ -130,18 +130,18 @@ export class VariableEditorCtrl {
}
};
$scope
.
reset
=
function
()
{
$scope
.
reset
=
()
=>
{
$scope
.
currentIsNew
=
true
;
$scope
.
current
=
variableSrv
.
createVariableFromModel
({
type
:
'query'
});
// this is done here in case a new data source type variable was added
$scope
.
datasources
=
_
.
filter
(
datasourceSrv
.
getMetricSources
(),
function
(
ds
)
{
$scope
.
datasources
=
_
.
filter
(
datasourceSrv
.
getMetricSources
(),
ds
=>
{
return
!
ds
.
meta
.
mixed
&&
ds
.
value
!==
null
;
});
$scope
.
datasourceTypes
=
_
(
$scope
.
datasources
)
.
uniqBy
(
'meta.id'
)
.
map
(
function
(
ds
)
{
.
map
(
ds
=>
{
return
{
text
:
ds
.
meta
.
name
,
value
:
ds
.
meta
.
id
};
})
.
value
();
...
...
@@ -164,11 +164,11 @@ export class VariableEditorCtrl {
$scope
.
validate
();
};
$scope
.
removeVariable
=
function
(
variable
)
{
$scope
.
removeVariable
=
variable
=>
{
variableSrv
.
removeVariable
(
variable
);
};
$scope
.
showMoreOptions
=
function
()
{
$scope
.
showMoreOptions
=
()
=>
{
$scope
.
optionsLimit
+=
20
;
};
}
...
...
public/app/features/templating/interval_variable.ts
View file @
72ab24f3
...
...
@@ -65,7 +65,7 @@ export class IntervalVariable implements Variable {
updateOptions
()
{
// extract options between quotes and/or comma
this
.
options
=
_
.
map
(
this
.
query
.
match
(
/
([
"'
])(
.*
?)\1
|
\w
+/g
),
function
(
text
)
{
this
.
options
=
_
.
map
(
this
.
query
.
match
(
/
([
"'
])(
.*
?)\1
|
\w
+/g
),
text
=>
{
text
=
text
.
replace
(
/
[
"'
]
+/g
,
''
);
return
{
text
:
text
.
trim
(),
value
:
text
.
trim
()
};
});
...
...
public/app/features/templating/query_variable.ts
View file @
72ab24f3
...
...
@@ -106,8 +106,8 @@ export class QueryVariable implements Variable {
getValuesForTag
(
tagKey
)
{
return
this
.
datasourceSrv
.
get
(
this
.
datasource
).
then
(
datasource
=>
{
const
query
=
this
.
tagValuesQuery
.
replace
(
'$tag'
,
tagKey
);
return
this
.
metricFindQuery
(
datasource
,
query
).
then
(
function
(
results
)
{
return
_
.
map
(
results
,
function
(
value
)
{
return
this
.
metricFindQuery
(
datasource
,
query
).
then
(
results
=>
{
return
_
.
map
(
results
,
value
=>
{
return
value
.
text
;
});
});
...
...
public/app/features/templating/template_srv.ts
View file @
72ab24f3
...
...
@@ -77,7 +77,7 @@ export class TemplateSrv {
if
(
value
instanceof
Array
&&
value
.
length
===
0
)
{
return
'__empty__'
;
}
const
quotedValues
=
_
.
map
(
value
,
function
(
val
)
{
const
quotedValues
=
_
.
map
(
value
,
val
=>
{
return
'"'
+
luceneEscape
(
val
)
+
'"'
;
});
return
'('
+
quotedValues
.
join
(
' OR '
)
+
')'
;
...
...
@@ -248,7 +248,7 @@ export class TemplateSrv {
}
fillVariableValuesForUrl
(
params
,
scopedVars
)
{
_
.
each
(
this
.
variables
,
function
(
variable
)
{
_
.
each
(
this
.
variables
,
variable
=>
{
if
(
scopedVars
&&
scopedVars
[
variable
.
name
]
!==
void
0
)
{
if
(
scopedVars
[
variable
.
name
].
skipUrlSync
)
{
return
;
...
...
@@ -264,7 +264,7 @@ export class TemplateSrv {
}
distributeVariable
(
value
,
variable
)
{
value
=
_
.
map
(
value
,
function
(
val
,
index
)
{
value
=
_
.
map
(
value
,
(
val
,
index
)
=>
{
if
(
index
!==
0
)
{
return
variable
+
'='
+
val
;
}
else
{
...
...
public/app/features/templating/variable_srv.ts
View file @
72ab24f3
...
...
@@ -175,10 +175,10 @@ export class VariableSrv {
selected
=
variable
.
options
[
0
];
}
else
{
selected
=
{
value
:
_
.
map
(
selected
,
function
(
val
)
{
value
:
_
.
map
(
selected
,
val
=>
{
return
val
.
value
;
}),
text
:
_
.
map
(
selected
,
function
(
val
)
{
text
:
_
.
map
(
selected
,
val
=>
{
return
val
.
text
;
}).
join
(
' + '
),
};
...
...
@@ -250,7 +250,7 @@ export class VariableSrv {
const
params
=
this
.
$location
.
search
();
// remove variable params
_
.
each
(
params
,
function
(
value
,
key
)
{
_
.
each
(
params
,
(
value
,
key
)
=>
{
if
(
key
.
indexOf
(
'var-'
)
===
0
)
{
delete
params
[
key
];
}
...
...
public/app/routes/ReactContainer.tsx
View file @
72ab24f3
...
...
@@ -50,7 +50,7 @@ export function reactContainer(
ReactDOM
.
render
(
WrapInProvider
(
store
,
component
,
props
),
elem
[
0
]);
scope
.
$on
(
'$destroy'
,
function
()
{
scope
.
$on
(
'$destroy'
,
()
=>
{
ReactDOM
.
unmountComponentAtNode
(
elem
[
0
]);
});
},
...
...
public/app/routes/dashboard_loaders.ts
View file @
72ab24f3
...
...
@@ -7,7 +7,7 @@ export class LoadDashboardCtrl {
$scope
.
appEvent
(
'dashboard-fetch-start'
);
if
(
!
$routeParams
.
uid
&&
!
$routeParams
.
slug
)
{
backendSrv
.
get
(
'/api/dashboards/home'
).
then
(
function
(
homeDash
)
{
backendSrv
.
get
(
'/api/dashboards/home'
).
then
(
homeDash
=>
{
if
(
homeDash
.
redirectUri
)
{
const
newUrl
=
locationUtil
.
stripBaseFromUrl
(
homeDash
.
redirectUri
);
$location
.
path
(
newUrl
);
...
...
@@ -30,7 +30,7 @@ export class LoadDashboardCtrl {
return
;
}
dashboardLoaderSrv
.
loadDashboard
(
$routeParams
.
type
,
$routeParams
.
slug
,
$routeParams
.
uid
).
then
(
function
(
result
)
{
dashboardLoaderSrv
.
loadDashboard
(
$routeParams
.
type
,
$routeParams
.
slug
,
$routeParams
.
uid
).
then
(
result
=>
{
if
(
result
.
meta
.
url
)
{
const
url
=
locationUtil
.
stripBaseFromUrl
(
result
.
meta
.
url
);
...
...
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