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
a6c60947
Commit
a6c60947
authored
Jul 22, 2016
by
Torkel Ödegaard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(alerting): started reworking notifications
parent
7eb2d2cf
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
100 additions
and
337 deletions
+100
-337
'
+0
-200
pkg/api/alerting.go
+10
-12
pkg/api/dtos/alerting.go
+2
-2
pkg/models/alert_notifications.go
+21
-25
pkg/models/annotations.go
+22
-0
pkg/services/sqlstore/alert_notification.go
+36
-79
public/app/features/alerting/notification_edit_ctrl.ts
+1
-4
public/app/features/alerting/partials/notification_edit.html
+8
-15
No files found.
'
deleted
100644 → 0
View file @
7eb2d2cf
/** Created by: Alex Wendland (me@alexwendland.com), 2014-08-06
*
* angular-json-tree
*
* Directive for creating a tree-view out of a JS Object. Only loads
* sub-nodes on demand in order to improve performance of rendering large
* objects.
*
* Attributes:
* - object (Object, 2-way): JS object to build the tree from
* - start-expanded (Boolean, 1-way, ?=true): should the tree default to expanded
*
* Usage:
* // In the controller
* scope.someObject = {
* test: 'hello',
* array: [1,1,2,3,5,8]
* };
* // In the html
* <json-tree object="someObject"></json-tree>
*
* Dependencies:
* - utils (json-tree.js)
* - ajsRecursiveDirectiveHelper (json-tree.js)
*
* Test: json-tree-test.js
*/
import angular from 'angular';
import coreModule from 'app/core/core_module';
var utils = {
/* See link for possible type values to check against.
* http://stackoverflow.com/questions/4622952/json-object-containing-array
*
* Value Class Type
* -------------------------------------
* "foo" String string
* new String("foo") String object
* 1.2 Number number
* new Number(1.2) Number object
* true Boolean boolean
* new Boolean(true) Boolean object
* new Date() Date object
* new Error() Error object
* [1,2,3] Array object
* new Array(1, 2, 3) Array object
* new Function("") Function function
* /abc/g RegExp object (function in Nitro/V8)
* new RegExp("meow") RegExp object (function in Nitro/V8)
* {} Object object
* new Object() Object object
*/
is: function is(obj, clazz) {
return Object.prototype.toString.call(obj).slice(8, -1) === clazz;
},
// See above for possible values
whatClass: function whatClass(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
},
// Iterate over an objects keyset
forKeys: function forKeys(obj, f) {
for (var key in obj) {
if (obj.hasOwnProperty(key) && typeof obj[key] !== 'function') {
if (f(key, obj[key])) {
break;
}
}
}
}
};
coreModule.directive('jsonTree', [function jsonTreeDirective() {
return {
restrict: 'E',
scope: {
object: '=',
startExpanded: '=',
rootName: '@',
},
template: '<json-node key="rootName" value="object" start-expanded="startExpanded"></json-node>'
};
}]);
coreModule.directive('jsonNode', ['ajsRecursiveDirectiveHelper', function jsonNodeDirective(ajsRecursiveDirectiveHelper) {
return {
restrict: 'E',
scope: {
key: '=',
value: '=',
startExpanded: '='
},
compile: function jsonNodeDirectiveCompile(elem) {
return ajsRecursiveDirectiveHelper.compile(elem, this);
},
template: ' <span class="json-tree-key" ng-click="toggleExpanded()">{{key}}</span>' +
' <span class="json-tree-leaf-value" ng-if="!isExpandable">{{value}}</span>' +
' <span class="json-tree-branch-preview" ng-if="isExpandable" ng-show="!isExpanded" ng-click="toggleExpanded()">' +
' {preview}}</span>' +
' <ul class="json-tree-branch-value" ng-if="isExpandable && shouldRender" ng-show="isExpanded">' +
' <li ng-repeat="(subkey,subval) in value">' +
' <json-node key="subkey" value="subval"></json-node>' +
' </li>' +
' </ul>',
pre: function jsonNodeDirectiveLink(scope, elem, attrs) {
// Set value's type as Class for CSS styling
elem.addClass(utils.whatClass(scope.value).toLowerCase());
// If the value is an Array or Object, use expandable view type
if (utils.is(scope.value, 'Object') || utils.is(scope.value, 'Array')) {
scope.isExpandable = true;
// Add expandable class for CSS usage
elem.addClass('expandable');
// Setup preview text
var isArray = utils.is(scope.value, 'Array');
scope.preview = isArray ? '[ ' : '{ ';
utils.forKeys(scope.value, function jsonNodeDirectiveLinkForKeys(key, value) {
if (isArray) {
scope.preview += value + ', ';
} else {
scope.preview += key + ': ' + value + ', ';
}
});
scope.preview = scope.preview.substring(0, scope.preview.length - (scope.preview.length > 2 ? 2 : 0)) + (isArray ? ' ]' : ' }');
// If directive initially has isExpanded set, also set shouldRender to true
if (scope.startExpanded) {
scope.shouldRender = true;
elem.addClass('expanded');
}
// Setup isExpanded state handling
scope.isExpanded = scope.startExpanded ? scope.startExpanded() : false;
scope.toggleExpanded = function jsonNodeDirectiveToggleExpanded() {
scope.isExpanded = !scope.isExpanded;
if (scope.isExpanded) {
elem.addClass('expanded');
} else {
elem.removeClass('expanded');
}
// For delaying subnode render until requested
scope.shouldRender = true;
};
} else {
scope.isExpandable = false;
// Add expandable class for CSS usage
elem.addClass('not-expandable');
}
}
};
}]);
/** Added by: Alex Wendland (me@alexwendland.com), 2014-08-09
* Source: http://stackoverflow.com/questions/14430655/recursion-in-angular-directives
*
* Used to allow for recursion within directives
*/
coreModule.factory('ajsRecursiveDirectiveHelper', ['$compile', function RecursiveDirectiveHelper($compile) {
return {
/**
* Manually compiles the element, fixing the recursion loop.
* @param element
* @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
* @returns An object containing the linking functions.
*/
compile: function RecursiveDirectiveHelperCompile(element, link) {
// Normalize the link parameter
if (angular.isFunction(link)) {
link = {
post: link
};
}
// Break the recursion loop by removing the contents
var contents = element.contents().remove();
var compiledContents;
return {
pre: (link && link.pre) ? link.pre : null,
/**
* Compiles and re-adds the contents
*/
post: function RecursiveDirectiveHelperCompilePost(scope, element) {
// Compile the contents
if (!compiledContents) {
compiledContents = $compile(contents);
}
// Re-add the compiled contents to the element
compiledContents(scope, function (clone) {
element.append(clone);
});
// Call the post-linking function, if any
if (link && link.post) {
link.post.apply(null, arguments);
}
}
};
}
};
}]);
pkg/api/alerting.go
View file @
a6c60947
...
...
@@ -39,10 +39,10 @@ func GetAlerts(c *middleware.Context) Response {
}
dashboardIds
:=
make
([]
int64
,
0
)
alertDTOs
:=
make
([]
*
dtos
.
AlertRule
DTO
,
0
)
alertDTOs
:=
make
([]
*
dtos
.
AlertRule
,
0
)
for
_
,
alert
:=
range
query
.
Result
{
dashboardIds
=
append
(
dashboardIds
,
alert
.
DashboardId
)
alertDTOs
=
append
(
alertDTOs
,
&
dtos
.
AlertRule
DTO
{
alertDTOs
=
append
(
alertDTOs
,
&
dtos
.
AlertRule
{
Id
:
alert
.
Id
,
DashboardId
:
alert
.
DashboardId
,
PanelId
:
alert
.
PanelId
,
...
...
@@ -176,18 +176,16 @@ func DelAlert(c *middleware.Context) Response {
// }
func
GetAlertNotifications
(
c
*
middleware
.
Context
)
Response
{
query
:=
&
models
.
GetAlertNotificationQuery
{
OrgID
:
c
.
OrgId
,
}
query
:=
&
models
.
GetAlertNotificationsQuery
{
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
query
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to get alert notifications"
,
err
)
}
var
result
[]
dtos
.
AlertNotification
DTO
var
result
[]
dtos
.
AlertNotification
for
_
,
notification
:=
range
query
.
Result
{
result
=
append
(
result
,
dtos
.
AlertNotification
DTO
{
result
=
append
(
result
,
dtos
.
AlertNotification
{
Id
:
notification
.
Id
,
Name
:
notification
.
Name
,
Type
:
notification
.
Type
,
...
...
@@ -200,8 +198,8 @@ func GetAlertNotifications(c *middleware.Context) Response {
}
func
GetAlertNotificationById
(
c
*
middleware
.
Context
)
Response
{
query
:=
&
models
.
GetAlertNotificationQuery
{
OrgI
D
:
c
.
OrgId
,
query
:=
&
models
.
GetAlertNotification
s
Query
{
OrgI
d
:
c
.
OrgId
,
Id
:
c
.
ParamsInt64
(
"notificationId"
),
}
...
...
@@ -213,7 +211,7 @@ func GetAlertNotificationById(c *middleware.Context) Response {
}
func
CreateAlertNotification
(
c
*
middleware
.
Context
,
cmd
models
.
CreateAlertNotificationCommand
)
Response
{
cmd
.
OrgI
D
=
c
.
OrgId
cmd
.
OrgI
d
=
c
.
OrgId
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to create alert notification"
,
err
)
...
...
@@ -223,7 +221,7 @@ func CreateAlertNotification(c *middleware.Context, cmd models.CreateAlertNotifi
}
func
UpdateAlertNotification
(
c
*
middleware
.
Context
,
cmd
models
.
UpdateAlertNotificationCommand
)
Response
{
cmd
.
OrgI
D
=
c
.
OrgId
cmd
.
OrgI
d
=
c
.
OrgId
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to update alert notification"
,
err
)
...
...
@@ -242,5 +240,5 @@ func DeleteAlertNotification(c *middleware.Context) Response {
return
ApiError
(
500
,
"Failed to delete alert notification"
,
err
)
}
return
Json
(
200
,
map
[
string
]
interface
{}{
"notificationId"
:
cmd
.
Id
}
)
return
ApiSuccess
(
"Notification deleted"
)
}
pkg/api/dtos/alerting.go
View file @
a6c60947
...
...
@@ -7,7 +7,7 @@ import (
m
"github.com/grafana/grafana/pkg/models"
)
type
AlertRule
DTO
struct
{
type
AlertRule
struct
{
Id
int64
`json:"id"`
DashboardId
int64
`json:"dashboardId"`
PanelId
int64
`json:"panelId"`
...
...
@@ -19,7 +19,7 @@ type AlertRuleDTO struct {
DashbboardUri
string
`json:"dashboardUri"`
}
type
AlertNotification
DTO
struct
{
type
AlertNotification
struct
{
Id
int64
`json:"id"`
Name
string
`json:"name"`
Type
string
`json:"type"`
...
...
pkg/models/alert_notifications.go
View file @
a6c60947
...
...
@@ -7,34 +7,31 @@ import (
)
type
AlertNotification
struct
{
Id
int64
`json:"id"`
OrgId
int64
`json:"-"`
Name
string
`json:"name"`
Type
string
`json:"type"`
AlwaysExecute
bool
`json:"alwaysExecute"`
Settings
*
simplejson
.
Json
`json:"settings"`
Created
time
.
Time
`json:"created"`
Updated
time
.
Time
`json:"updated"`
Id
int64
`json:"id"`
OrgId
int64
`json:"-"`
Name
string
`json:"name"`
Type
string
`json:"type"`
Settings
*
simplejson
.
Json
`json:"settings"`
Created
time
.
Time
`json:"created"`
Updated
time
.
Time
`json:"updated"`
}
type
CreateAlertNotificationCommand
struct
{
Name
string
`json:"name" binding:"Required"`
Type
string
`json:"type" binding:"Required"`
AlwaysExecute
bool
`json:"alwaysExecute"`
OrgID
int64
`json:"-"`
Settings
*
simplejson
.
Json
`json:"settings"`
Name
string
`json:"name" binding:"Required"`
Type
string
`json:"type" binding:"Required"`
Settings
*
simplejson
.
Json
`json:"settings"`
OrgId
int64
`json:"-"`
Result
*
AlertNotification
}
type
UpdateAlertNotificationCommand
struct
{
Id
int64
`json:"id" binding:"Required"`
Name
string
`json:"name" binding:"Required"`
Type
string
`json:"type" binding:"Required"`
AlwaysExecute
bool
`json:"alwaysExecute"`
OrgID
int64
`json:"-"`
Settings
*
simplejson
.
Json
`json:"settings" binding:"Required"`
Id
int64
`json:"id" binding:"Required"`
Name
string
`json:"name" binding:"Required"`
Type
string
`json:"type" binding:"Required"`
Settings
*
simplejson
.
Json
`json:"settings" binding:"Required"`
OrgId
int64
`json:"-"`
Result
*
AlertNotification
}
...
...
@@ -43,12 +40,11 @@ type DeleteAlertNotificationCommand struct {
OrgId
int64
}
type
GetAlertNotificationQuery
struct
{
Name
string
Id
int64
Ids
[]
int64
OrgID
int64
IncludeAlwaysExecute
bool
type
GetAlertNotificationsQuery
struct
{
Name
string
Id
int64
Ids
[]
int64
OrgId
int64
Result
[]
*
AlertNotification
}
pkg/models/annotations.go
0 → 100644
View file @
a6c60947
package
models
import
(
"time"
"github.com/grafana/grafana/pkg/components/simplejson"
)
type
AnnotationType
string
type
AnnotationEvent
struct
{
Id
int64
OrgId
int64
Type
AnnotationType
Title
string
Text
string
AlertId
int64
UserId
int64
Timestamp
time
.
Time
Data
*
simplejson
.
Json
}
pkg/services/sqlstore/alert_notification.go
View file @
a6c60947
...
...
@@ -3,7 +3,6 @@ package sqlstore
import
(
"bytes"
"fmt"
"strconv"
"time"
"github.com/go-xorm/xorm"
...
...
@@ -31,11 +30,11 @@ func DeleteAlertNotification(cmd *m.DeleteAlertNotificationCommand) error {
})
}
func
AlertNotificationQuery
(
query
*
m
.
GetAlertNotificationQuery
)
error
{
func
AlertNotificationQuery
(
query
*
m
.
GetAlertNotification
s
Query
)
error
{
return
getAlertNotifications
(
query
,
x
.
NewSession
())
}
func
getAlertNotifications
(
query
*
m
.
GetAlertNotificationQuery
,
sess
*
xorm
.
Session
)
error
{
func
getAlertNotifications
(
query
*
m
.
GetAlertNotification
s
Query
,
sess
*
xorm
.
Session
)
error
{
var
sql
bytes
.
Buffer
params
:=
make
([]
interface
{},
0
)
...
...
@@ -43,16 +42,15 @@ func getAlertNotifications(query *m.GetAlertNotificationQuery, sess *xorm.Sessio
alert_notification.id,
alert_notification.org_id,
alert_notification.name,
alert_notification.type,
alert_notification.type,
alert_notification.created,
alert_notification.updated,
alert_notification.settings,
alert_notification.always_execute
alert_notification.updated,
alert_notification.settings
FROM alert_notification
`
)
sql
.
WriteString
(
` WHERE alert_notification.org_id = ?`
)
params
=
append
(
params
,
query
.
OrgI
D
)
params
=
append
(
params
,
query
.
OrgI
d
)
if
query
.
Name
!=
""
{
sql
.
WriteString
(
` AND alert_notification.name = ?`
)
...
...
@@ -61,60 +59,26 @@ func getAlertNotifications(query *m.GetAlertNotificationQuery, sess *xorm.Sessio
if
query
.
Id
!=
0
{
sql
.
WriteString
(
` AND alert_notification.id = ?`
)
params
=
append
(
params
,
strconv
.
Itoa
(
int
(
query
.
Id
))
)
params
=
append
(
params
,
query
.
Id
)
}
if
len
(
query
.
Ids
)
>
0
{
sql
.
WriteString
(
` AND (`
)
for
i
,
id
:=
range
query
.
Ids
{
if
i
!=
0
{
sql
.
WriteString
(
` OR`
)
}
sql
.
WriteString
(
` alert_notification.id = ?`
)
params
=
append
(
params
,
id
)
}
sql
.
WriteString
(
`)`
)
sql
.
WriteString
(
` AND alert_notification.id IN (?)`
)
params
=
append
(
params
,
query
.
Ids
)
}
var
searches
[]
*
m
.
AlertNotification
if
err
:=
sess
.
Sql
(
sql
.
String
(),
params
...
)
.
Find
(
&
searche
s
);
err
!=
nil
{
results
:=
make
([]
*
m
.
AlertNotification
,
0
)
if
err
:=
sess
.
Sql
(
sql
.
String
(),
params
...
)
.
Find
(
&
result
s
);
err
!=
nil
{
return
err
}
var
result
[]
*
m
.
AlertNotification
var
def
[]
*
m
.
AlertNotification
if
query
.
IncludeAlwaysExecute
{
if
err
:=
sess
.
Where
(
"org_id = ? AND always_execute = 1"
,
query
.
OrgID
)
.
Find
(
&
def
);
err
!=
nil
{
return
err
}
result
=
append
(
result
,
def
...
)
}
for
_
,
s
:=
range
searches
{
canAppend
:=
true
for
_
,
d
:=
range
result
{
if
d
.
Id
==
s
.
Id
{
canAppend
=
false
break
}
}
if
canAppend
{
result
=
append
(
result
,
s
)
}
}
query
.
Result
=
result
query
.
Result
=
results
return
nil
}
func
CreateAlertNotificationCommand
(
cmd
*
m
.
CreateAlertNotificationCommand
)
error
{
return
inTransaction
(
func
(
sess
*
xorm
.
Session
)
error
{
existingQuery
:=
&
m
.
GetAlertNotification
Query
{
OrgID
:
cmd
.
OrgID
,
Name
:
cmd
.
Name
,
IncludeAlwaysExecute
:
fals
e
}
existingQuery
:=
&
m
.
GetAlertNotification
sQuery
{
OrgId
:
cmd
.
OrgId
,
Name
:
cmd
.
Nam
e
}
err
:=
getAlertNotifications
(
existingQuery
,
sess
)
if
err
!=
nil
{
...
...
@@ -126,18 +90,15 @@ func CreateAlertNotificationCommand(cmd *m.CreateAlertNotificationCommand) error
}
alertNotification
:=
&
m
.
AlertNotification
{
OrgId
:
cmd
.
OrgID
,
Name
:
cmd
.
Name
,
Type
:
cmd
.
Type
,
Created
:
time
.
Now
(),
Settings
:
cmd
.
Settings
,
Updated
:
time
.
Now
(),
AlwaysExecute
:
cmd
.
AlwaysExecute
,
OrgId
:
cmd
.
OrgId
,
Name
:
cmd
.
Name
,
Type
:
cmd
.
Type
,
Settings
:
cmd
.
Settings
,
Created
:
time
.
Now
(),
Updated
:
time
.
Now
(),
}
_
,
err
=
sess
.
Insert
(
alertNotification
)
if
err
!=
nil
{
if
_
,
err
=
sess
.
Insert
(
alertNotification
);
err
!=
nil
{
return
err
}
...
...
@@ -148,38 +109,34 @@ func CreateAlertNotificationCommand(cmd *m.CreateAlertNotificationCommand) error
func
UpdateAlertNotification
(
cmd
*
m
.
UpdateAlertNotificationCommand
)
error
{
return
inTransaction
(
func
(
sess
*
xorm
.
Session
)
(
err
error
)
{
current
:=
&
m
.
AlertNotification
{}
_
,
err
=
sess
.
Id
(
cmd
.
Id
)
.
Get
(
current
)
current
:=
m
.
AlertNotification
{}
if
err
!=
nil
{
if
_
,
err
=
sess
.
Id
(
cmd
.
Id
)
.
Get
(
&
current
);
err
!=
nil
{
return
err
}
alertNotification
:=
&
m
.
AlertNotification
{
Id
:
cmd
.
Id
,
OrgId
:
cmd
.
OrgID
,
Name
:
cmd
.
Name
,
Type
:
cmd
.
Type
,
Settings
:
cmd
.
Settings
,
Updated
:
time
.
Now
(),
Created
:
current
.
Created
,
AlwaysExecute
:
cmd
.
AlwaysExecute
,
// check if name exists
sameNameQuery
:=
&
m
.
GetAlertNotificationsQuery
{
OrgId
:
cmd
.
OrgId
,
Name
:
cmd
.
Name
}
if
err
:=
getAlertNotifications
(
sameNameQuery
,
sess
);
err
!=
nil
{
return
err
}
sess
.
UseBool
(
"always_execute"
)
if
len
(
sameNameQuery
.
Result
)
>
0
&&
sameNameQuery
.
Result
[
0
]
.
Id
!=
current
.
Id
{
return
fmt
.
Errorf
(
"Alert notification name %s already exists"
,
cmd
.
Name
)
}
var
affected
int64
affected
,
err
=
sess
.
Id
(
alertNotification
.
Id
)
.
Update
(
alertNotification
)
current
.
Updated
=
time
.
Now
()
current
.
Settings
=
cmd
.
Settings
current
.
Name
=
cmd
.
Name
current
.
Type
=
cmd
.
Type
if
err
!=
nil
{
if
affected
,
err
:=
sess
.
Id
(
cmd
.
Id
)
.
Update
(
current
);
err
!=
nil
{
return
err
}
if
affected
==
0
{
}
else
if
affected
==
0
{
return
fmt
.
Errorf
(
"Could not find alert notification"
)
}
cmd
.
Result
=
alertNotification
cmd
.
Result
=
&
current
return
nil
})
}
public/app/features/alerting/notification_edit_ctrl.ts
View file @
a6c60947
...
...
@@ -15,10 +15,7 @@ export class AlertNotificationEditCtrl {
this
.
loadNotification
(
$routeParams
.
notificationId
);
}
else
{
this
.
notification
=
{
settings
:
{
sendCrit
:
true
,
sendWarn
:
true
,
}
type
:
'email'
,
};
}
}
...
...
public/app/features/alerting/partials/notification_edit.html
View file @
a6c60947
...
...
@@ -6,14 +6,14 @@
<h1>
Alert notification
</h1>
</div>
<div
class=
"gf-form-group
section
"
>
<div
class=
"gf-form-group"
>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-8"
>
Name
</span>
<input
type=
"text"
class=
"gf-form-input max-width-1
2"
ng-model=
"ctrl.notification.name"
></input>
<input
type=
"text"
class=
"gf-form-input max-width-1
5"
ng-model=
"ctrl.notification.name"
required
></input>
</div>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-8"
>
Type
</span>
<div
class=
"gf-form-select-wrapper width-1
2
"
>
<div
class=
"gf-form-select-wrapper width-1
5
"
>
<select
class=
"gf-form-input"
ng-model=
"ctrl.notification.type"
ng-options=
"t for t in ['webhook', 'email']"
...
...
@@ -21,17 +21,10 @@
</select>
</div>
</div>
<div
class=
"gf-form"
>
<gf-form-switch
class=
"gf-form"
label-class=
"width-8"
label=
"Always execute"
checked=
"ctrl.notification.alwaysExecute"
on-change=
""
></gf-form-switch>
</div>
<div
class=
"gf-form"
>
<gf-form-switch
class=
"gf-form"
label-class=
"width-8"
label=
"Send Warning"
checked=
"ctrl.notification.settings.sendWarn"
on-change=
""
></gf-form-switch>
</div>
<div
class=
"gf-form"
>
<gf-form-switch
class=
"gf-form"
label-class=
"width-8"
label=
"Send Critical"
checked=
"ctrl.notification.settings.sendCrit"
on-change=
""
></gf-form-switch>
</div>
</div>
<div
class=
"gf-form-group section"
ng-show=
"ctrl.notification.type === 'webhook'"
>
<div
class=
"gf-form-group"
ng-show=
"ctrl.notification.type === 'webhook'"
>
<h3
class=
"page-heading"
>
Webhook settings
</h3>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-6"
>
Url
</span>
<input
type=
"text"
class=
"gf-form-input max-width-26"
ng-model=
"ctrl.notification.settings.url"
></input>
...
...
@@ -48,9 +41,9 @@
</div>
</div>
<div
class=
"gf-form-group section"
ng-show=
"ctrl.notification.type === 'email'"
>
<h3
class=
"page-heading"
>
Email addresses
</h3>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-8"
>
To
</span>
<input
type=
"text"
class=
"gf-form-input max-width-26"
ng-model=
"ctrl.notification.settings.to"
>
<textarea
rows=
"7"
class=
"gf-form-input width-25"
ng-ctrl=
"ctrl.notification.settings.addresses"
></textarea>
</div>
</div>
...
...
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