sensu-dashboard 0.9.8 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +0 -0
- data/README.md +9 -0
- data/bin/sensu-dashboard +8 -7
- data/lib/sensu-dashboard.rb +3 -0
- data/lib/sensu-dashboard/assets/javascripts/app.js +38 -0
- data/lib/sensu-dashboard/assets/javascripts/application.coffee +21 -0
- data/lib/sensu-dashboard/assets/javascripts/bootstrapper.coffee +39 -0
- data/lib/sensu-dashboard/assets/javascripts/collections/base.coffee +22 -0
- data/lib/sensu-dashboard/assets/javascripts/collections/checks.coffee +8 -0
- data/lib/sensu-dashboard/assets/javascripts/collections/clients.coffee +83 -0
- data/lib/sensu-dashboard/assets/javascripts/collections/events.coffee +184 -0
- data/lib/sensu-dashboard/assets/javascripts/collections/stashes.coffee +37 -0
- data/lib/sensu-dashboard/assets/javascripts/config/states.coffee +30 -0
- data/lib/sensu-dashboard/assets/javascripts/handlebars_helpers.coffee +2 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/backbone-min.js +4 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/bootstrap.min.js +7 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/jquery-1.9.1.min.js +5 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/liquid.metal.js +107 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/lodash.underscore.min.js +34 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/retina.js +3 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/scroll.into.view.js +32 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/toastr.min.js +1 -0
- data/lib/sensu-dashboard/assets/javascripts/libs/token.field.coffee +173 -0
- data/lib/sensu-dashboard/assets/javascripts/matcher.coffee +34 -0
- data/lib/sensu-dashboard/assets/javascripts/models/check.coffee +11 -0
- data/lib/sensu-dashboard/assets/javascripts/models/client.coffee +58 -0
- data/lib/sensu-dashboard/assets/javascripts/models/event.coffee +78 -0
- data/lib/sensu-dashboard/assets/javascripts/models/info.coffee +58 -0
- data/lib/sensu-dashboard/assets/javascripts/models/metadata/events.coffee +21 -0
- data/lib/sensu-dashboard/assets/javascripts/models/stash.coffee +34 -0
- data/lib/sensu-dashboard/assets/javascripts/namespace.coffee +17 -0
- data/lib/sensu-dashboard/assets/javascripts/state.coffee +33 -0
- data/lib/sensu-dashboard/assets/javascripts/state_manager.coffee +52 -0
- data/lib/sensu-dashboard/assets/javascripts/states/main_state.coffee +6 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_check_item.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_check_token.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_client_item.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_client_token.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_query_item.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_query_token.hbs +1 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/checks/index.hbs +10 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/checks/list.hbs +12 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/checks/list_item.hbs +5 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/clients/counts.hbs +6 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/clients/index.hbs +26 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/clients/list.hbs +12 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/clients/list_item.hbs +14 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/clients/modal.hbs +30 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/empty_list.hbs +4 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/error.hbs +5 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/events/counts.hbs +9 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/events/index.hbs +33 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/events/list.hbs +11 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/events/list_item.hbs +18 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/events/modal.hbs +47 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/info/index.hbs +54 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/modal.hbs +17 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/stashes/counts.hbs +6 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/stashes/index.hbs +22 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/stashes/list.hbs +10 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/stashes/list_item.hbs +5 -0
- data/lib/sensu-dashboard/assets/javascripts/templates/stashes/modal.hbs +25 -0
- data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_field.coffee +133 -0
- data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_results.coffee +135 -0
- data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_token.coffee +31 -0
- data/lib/sensu-dashboard/assets/javascripts/views/base.coffee +16 -0
- data/lib/sensu-dashboard/assets/javascripts/views/checks/index.coffee +18 -0
- data/lib/sensu-dashboard/assets/javascripts/views/checks/list.coffee +48 -0
- data/lib/sensu-dashboard/assets/javascripts/views/checks/list_item.coffee +17 -0
- data/lib/sensu-dashboard/assets/javascripts/views/clients/counts.coffee +13 -0
- data/lib/sensu-dashboard/assets/javascripts/views/clients/index.coffee +83 -0
- data/lib/sensu-dashboard/assets/javascripts/views/clients/list.coffee +56 -0
- data/lib/sensu-dashboard/assets/javascripts/views/clients/list_item.coffee +20 -0
- data/lib/sensu-dashboard/assets/javascripts/views/clients/modal.coffee +83 -0
- data/lib/sensu-dashboard/assets/javascripts/views/error.coffee +17 -0
- data/lib/sensu-dashboard/assets/javascripts/views/events/counts.coffee +12 -0
- data/lib/sensu-dashboard/assets/javascripts/views/events/index.coffee +143 -0
- data/lib/sensu-dashboard/assets/javascripts/views/events/list.coffee +52 -0
- data/lib/sensu-dashboard/assets/javascripts/views/events/list_item.coffee +25 -0
- data/lib/sensu-dashboard/assets/javascripts/views/events/modal.coffee +129 -0
- data/lib/sensu-dashboard/assets/javascripts/views/info/index.coffee +13 -0
- data/lib/sensu-dashboard/assets/javascripts/views/list.coffee +44 -0
- data/lib/sensu-dashboard/assets/javascripts/views/list_item.coffee +14 -0
- data/lib/sensu-dashboard/assets/javascripts/views/modal.coffee +25 -0
- data/lib/sensu-dashboard/assets/javascripts/views/stashes/counts.coffee +13 -0
- data/lib/sensu-dashboard/assets/javascripts/views/stashes/index.coffee +49 -0
- data/lib/sensu-dashboard/assets/javascripts/views/stashes/list.coffee +45 -0
- data/lib/sensu-dashboard/assets/javascripts/views/stashes/list_item.coffee +28 -0
- data/lib/sensu-dashboard/assets/javascripts/views/stashes/modal.coffee +46 -0
- data/lib/sensu-dashboard/assets/stylesheets/app.css +5 -0
- data/lib/sensu-dashboard/assets/stylesheets/libs/bootstrap.min.css +717 -0
- data/lib/sensu-dashboard/assets/stylesheets/libs/font-awesome.less +537 -0
- data/lib/sensu-dashboard/assets/stylesheets/libs/toastr.min.css +1 -0
- data/lib/sensu-dashboard/assets/stylesheets/main.sass +414 -0
- data/lib/sensu-dashboard/constants.rb +7 -0
- data/lib/sensu-dashboard/public/favicon.ico +0 -0
- data/lib/sensu-dashboard/public/font/FontAwesome.otf +0 -0
- data/lib/sensu-dashboard/public/font/fontawesome-webfont.eot +0 -0
- data/lib/sensu-dashboard/public/font/fontawesome-webfont.svg +284 -0
- data/lib/sensu-dashboard/public/font/fontawesome-webfont.ttf +0 -0
- data/lib/sensu-dashboard/public/font/fontawesome-webfont.woff +0 -0
- data/lib/sensu-dashboard/public/img/favicon_114.png +0 -0
- data/lib/sensu-dashboard/public/img/favicon_144.png +0 -0
- data/lib/sensu-dashboard/public/img/favicon_57.png +0 -0
- data/lib/sensu-dashboard/public/img/favicon_64.png +0 -0
- data/lib/sensu-dashboard/public/img/favicon_72.png +0 -0
- data/lib/sensu-dashboard/public/img/glyphicons-halflings-white.png +0 -0
- data/lib/sensu-dashboard/public/img/glyphicons-halflings.png +0 -0
- data/lib/sensu-dashboard/public/img/loading.gif +0 -0
- data/lib/sensu-dashboard/public/img/logo.png +0 -0
- data/lib/sensu-dashboard/public/img/logo@2x.png +0 -0
- data/lib/sensu-dashboard/server.rb +337 -0
- data/lib/sensu-dashboard/views/layout.slim +49 -0
- data/lib/sensu-dashboard/views/main.slim +3 -0
- data/sensu-dashboard.gemspec +21 -11
- metadata +308 -120
- data/.gitignore +0 -6
- data/Gemfile +0 -4
- data/README.org +0 -4
- data/Rakefile +0 -1
- data/lib/sensu-dashboard/app.rb +0 -439
- data/lib/sensu-dashboard/public/css/autoSuggest.css +0 -217
- data/lib/sensu-dashboard/public/css/style.css +0 -177
- data/lib/sensu-dashboard/public/img/cross.png +0 -0
- data/lib/sensu-dashboard/public/img/footer_bg.png +0 -0
- data/lib/sensu-dashboard/public/img/header_bg.png +0 -0
- data/lib/sensu-dashboard/public/img/loading_circle.gif +0 -0
- data/lib/sensu-dashboard/public/img/main_content_bg.png +0 -0
- data/lib/sensu-dashboard/public/img/megaphone_icon.png +0 -0
- data/lib/sensu-dashboard/public/img/megaphone_icon_off.png +0 -0
- data/lib/sensu-dashboard/public/js/FABridge.js +0 -604
- data/lib/sensu-dashboard/public/js/functions.js +0 -367
- data/lib/sensu-dashboard/public/js/jquery-1.5.1.min.js +0 -16
- data/lib/sensu-dashboard/public/js/jquery.autoSuggest.js +0 -375
- data/lib/sensu-dashboard/public/js/jquery.leanModal.min.js +0 -1
- data/lib/sensu-dashboard/public/js/jquery.sortElements.js +0 -69
- data/lib/sensu-dashboard/public/js/jquery.tmpl.min.js +0 -1
- data/lib/sensu-dashboard/public/js/jquery.zclip.min.js +0 -12
- data/lib/sensu-dashboard/public/js/modernizr-1.7.min.js +0 -2
- data/lib/sensu-dashboard/public/js/swfobject.js +0 -4
- data/lib/sensu-dashboard/public/js/web_socket.js +0 -312
- data/lib/sensu-dashboard/public/js/webtoolkit.sha1.js +0 -174
- data/lib/sensu-dashboard/public/swf/WebSocketMain.swf +0 -0
- data/lib/sensu-dashboard/public/swf/ZeroClipboard.swf +0 -0
- data/lib/sensu-dashboard/version.rb +0 -5
- data/lib/sensu-dashboard/views/client_templates.erb +0 -67
- data/lib/sensu-dashboard/views/clients.erb +0 -36
- data/lib/sensu-dashboard/views/event_templates.erb +0 -185
- data/lib/sensu-dashboard/views/index.erb +0 -48
- data/lib/sensu-dashboard/views/layout.erb +0 -132
- data/lib/sensu-dashboard/views/sonian.sass +0 -213
- data/lib/sensu-dashboard/views/stash_templates.erb +0 -44
- data/lib/sensu-dashboard/views/stashes.erb +0 -32
@@ -0,0 +1,135 @@
|
|
1
|
+
namespace "SensuDashboard.Views", (exports) ->
|
2
|
+
|
3
|
+
class exports.AutoCompleteResults extends exports.Base
|
4
|
+
|
5
|
+
tagName: "ul"
|
6
|
+
name: "autocomplete/results"
|
7
|
+
className: "auto-complete-results"
|
8
|
+
events:
|
9
|
+
"mousedown li": (e) ->
|
10
|
+
e.preventDefault()
|
11
|
+
e.stopPropagation()
|
12
|
+
"mouseup li": "selectItem"
|
13
|
+
"mouseover li": "_mouseoverItem"
|
14
|
+
visible: false
|
15
|
+
|
16
|
+
initialize: (options) ->
|
17
|
+
super
|
18
|
+
|
19
|
+
@selectedIndex = -1
|
20
|
+
@items = []
|
21
|
+
|
22
|
+
setDelegate: (delegate) ->
|
23
|
+
@delegate = delegate
|
24
|
+
|
25
|
+
renderItem: (item, index) ->
|
26
|
+
type = if item instanceof SensuDashboard.Models.Check
|
27
|
+
"check"
|
28
|
+
else if item instanceof SensuDashboard.Models.Client
|
29
|
+
"client"
|
30
|
+
else
|
31
|
+
"query"
|
32
|
+
context = if item.toJSON then item.toJSON() else { query: item }
|
33
|
+
|
34
|
+
HandlebarsTemplates["#{@name}_#{type}_item"](context)
|
35
|
+
|
36
|
+
renderCollection: ->
|
37
|
+
@render()
|
38
|
+
|
39
|
+
@$el.empty()
|
40
|
+
for model in @collection
|
41
|
+
@$el.append($(@renderItem(model)))
|
42
|
+
|
43
|
+
@items = @$el.find("> li").toArray()
|
44
|
+
@selectedIndex = -1
|
45
|
+
@selectAtIndex(0)
|
46
|
+
|
47
|
+
this
|
48
|
+
|
49
|
+
setCollection: (collection) ->
|
50
|
+
@collection = collection
|
51
|
+
|
52
|
+
selectNext: ->
|
53
|
+
item = @selectAtIndex(@selectedIndex + 1)
|
54
|
+
item.scrollIntoViewIfNeeded(false) if item
|
55
|
+
|
56
|
+
selectPrevious: ->
|
57
|
+
item = @selectAtIndex(@selectedIndex - 1)
|
58
|
+
item.scrollIntoViewIfNeeded(true) if item
|
59
|
+
|
60
|
+
selectedObject: ->
|
61
|
+
return @collection[@selectedIndex]
|
62
|
+
|
63
|
+
selectAtIndex: (index) ->
|
64
|
+
if 0 <= index < @items.length
|
65
|
+
@$el.find(".selected").removeClass("selected")
|
66
|
+
item = @items[index]
|
67
|
+
$(item).addClass("selected")
|
68
|
+
@selectedIndex = index
|
69
|
+
return item
|
70
|
+
|
71
|
+
selectItem: ->
|
72
|
+
return unless item = @selectedObject()
|
73
|
+
@trigger("item:selected", item)
|
74
|
+
|
75
|
+
deselectAll: ->
|
76
|
+
@$el.find(".selected").removeClass("selected")
|
77
|
+
|
78
|
+
#
|
79
|
+
# Private
|
80
|
+
#
|
81
|
+
|
82
|
+
_mouseoverItem: (e) ->
|
83
|
+
index = _.indexOf(@items, e.currentTarget)
|
84
|
+
return if @selectedIndex == index
|
85
|
+
|
86
|
+
@selectAtIndex index
|
87
|
+
|
88
|
+
keyDown: (e) ->
|
89
|
+
switch e.keyCode
|
90
|
+
when 40
|
91
|
+
e.preventDefault()
|
92
|
+
@selectNext()
|
93
|
+
return false
|
94
|
+
|
95
|
+
when 38
|
96
|
+
e.preventDefault()
|
97
|
+
@selectPrevious()
|
98
|
+
return false
|
99
|
+
|
100
|
+
true
|
101
|
+
|
102
|
+
_hide: ->
|
103
|
+
if @visible
|
104
|
+
@setElement($("<ul/>"))
|
105
|
+
$(@delegate.inputTester).popover("hide")
|
106
|
+
@visible = false
|
107
|
+
|
108
|
+
_show: ->
|
109
|
+
unless @visible
|
110
|
+
$(@delegate.inputTester).popover({
|
111
|
+
html: true
|
112
|
+
content: @$el
|
113
|
+
placement: "bottom"
|
114
|
+
trigger: "manual"
|
115
|
+
}).popover("show")
|
116
|
+
@setElement(@delegate.$el.find("div.popover-content ul.auto-complete-results")[0])
|
117
|
+
@visible = true
|
118
|
+
@renderCollection()
|
119
|
+
|
120
|
+
#
|
121
|
+
# Delegate
|
122
|
+
#
|
123
|
+
|
124
|
+
autoCompleteTokenFieldEmpty: ->
|
125
|
+
@_hide()
|
126
|
+
|
127
|
+
autoCompleteTokenFieldBlur: ->
|
128
|
+
@_hide()
|
129
|
+
|
130
|
+
autoCompleteTokenFieldResults: ->
|
131
|
+
@_show()
|
132
|
+
|
133
|
+
autoCompleteTokenFieldItemSelected: ->
|
134
|
+
@_hide()
|
135
|
+
@selectedObject()
|
@@ -0,0 +1,31 @@
|
|
1
|
+
namespace "SensuDashboard.Views", (exports) ->
|
2
|
+
|
3
|
+
class exports.AutoCompleteToken extends exports.Base
|
4
|
+
|
5
|
+
tagName: "li"
|
6
|
+
className: "token"
|
7
|
+
|
8
|
+
initialize: ->
|
9
|
+
@delegate = @options.delegate
|
10
|
+
@setItem(@options.item)
|
11
|
+
|
12
|
+
setItem: (item) ->
|
13
|
+
@item = item
|
14
|
+
@type = if item instanceof SensuDashboard.Models.Check
|
15
|
+
"check"
|
16
|
+
else if item instanceof SensuDashboard.Models.Client
|
17
|
+
"client"
|
18
|
+
else
|
19
|
+
"query"
|
20
|
+
|
21
|
+
context: ->
|
22
|
+
if _.isString @item
|
23
|
+
{ query: @item }
|
24
|
+
else
|
25
|
+
@item.toJSON()
|
26
|
+
|
27
|
+
render: ->
|
28
|
+
tmpl = HandlebarsTemplates["autocomplete/results_#{@type}_token"]
|
29
|
+
@$el.html(tmpl(@context()))
|
30
|
+
|
31
|
+
return this
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace "SensuDashboard.Views", (exports) ->
|
2
|
+
|
3
|
+
class exports.Base extends Backbone.View
|
4
|
+
|
5
|
+
template: (args) ->
|
6
|
+
tmpl = HandlebarsTemplates[@name]
|
7
|
+
tmpl(args) if tmpl
|
8
|
+
|
9
|
+
assign: (view, selector) ->
|
10
|
+
view.setElement(@$(selector)).render()
|
11
|
+
|
12
|
+
dispose: ->
|
13
|
+
@remove()
|
14
|
+
@off()
|
15
|
+
@model.off(null, null , @) if @model
|
16
|
+
@collection.off(null, null, @) if @collection
|
@@ -0,0 +1,18 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Checks", (exports) ->
|
2
|
+
|
3
|
+
class exports.Index extends SensuDashboard.Views.Base
|
4
|
+
|
5
|
+
name: "checks/index"
|
6
|
+
|
7
|
+
initialize: ->
|
8
|
+
@autocomplete_view = new SensuDashboard.Views.AutoCompleteField()
|
9
|
+
@subview = new exports.List({
|
10
|
+
collection: @collection
|
11
|
+
autocomplete_view: @autocomplete_view
|
12
|
+
})
|
13
|
+
|
14
|
+
render: ->
|
15
|
+
@$el.html(@template(checks: @collection))
|
16
|
+
@assign(@subview, "#checks_container")
|
17
|
+
@$el.find("#filter").html(@autocomplete_view.render().el)
|
18
|
+
this
|
@@ -0,0 +1,48 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Checks", (exports) ->
|
2
|
+
|
3
|
+
class exports.List extends SensuDashboard.Views.List
|
4
|
+
|
5
|
+
name: "checks/list"
|
6
|
+
|
7
|
+
initialize: ->
|
8
|
+
@autocomplete_view = @options.autocomplete_view
|
9
|
+
@autocomplete_view.delegate = this
|
10
|
+
super
|
11
|
+
|
12
|
+
itemClass: ->
|
13
|
+
exports.ListItem
|
14
|
+
|
15
|
+
resolvedCollection: ->
|
16
|
+
resolved = @collection.chain()
|
17
|
+
for token in @autocomplete_view.tokens
|
18
|
+
resolved = if _.isString(token.object)
|
19
|
+
resolved.filter (record) =>
|
20
|
+
result = @matchForKeys(token.object, record,
|
21
|
+
{ key: "interval", threshold: 1 },
|
22
|
+
{ key: "name", threshold: 0.92 }
|
23
|
+
)
|
24
|
+
result || _.detect(record.get("subscribers"), (sub) =>
|
25
|
+
liquidMetal.score(sub, token.object) > 0.96) != undefined
|
26
|
+
|
27
|
+
resolved
|
28
|
+
|
29
|
+
matchForKeys: (q, record, args...) ->
|
30
|
+
result = _.detect args, (options) =>
|
31
|
+
value = record.get(options.key).toString()
|
32
|
+
score = liquidMetal.score(value, q)
|
33
|
+
score >= (options.threshold || 0.7)
|
34
|
+
|
35
|
+
!(result is undefined)
|
36
|
+
|
37
|
+
renderCollection: ->
|
38
|
+
super(_(@resolvedCollection().map().value()))
|
39
|
+
|
40
|
+
renderEmpty: ->
|
41
|
+
super(_(@resolvedCollection().map().value()))
|
42
|
+
|
43
|
+
#
|
44
|
+
# Autocomplete delegate
|
45
|
+
#
|
46
|
+
|
47
|
+
filtersUpdated: ->
|
48
|
+
@render()
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Checks", (exports) ->
|
2
|
+
|
3
|
+
class exports.ListItem extends SensuDashboard.Views.ListItem
|
4
|
+
|
5
|
+
name: "checks/list_item"
|
6
|
+
|
7
|
+
className: ->
|
8
|
+
@model.get("name")
|
9
|
+
|
10
|
+
render: ->
|
11
|
+
@$el.html(@template(@presenter()))
|
12
|
+
this
|
13
|
+
|
14
|
+
presenter: ->
|
15
|
+
_.extend(@model.toJSON(), {
|
16
|
+
standalone: @model.get("standalone") || "false"
|
17
|
+
})
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Clients", (exports) ->
|
2
|
+
|
3
|
+
class exports.Counts extends SensuDashboard.Views.Base
|
4
|
+
|
5
|
+
name: "clients/counts"
|
6
|
+
|
7
|
+
initialize: (collection) ->
|
8
|
+
@listenTo(@collection, "all", @render)
|
9
|
+
|
10
|
+
render: ->
|
11
|
+
template_data = { count: @collection.models.length }
|
12
|
+
@$el.html(@template(template_data))
|
13
|
+
this
|
@@ -0,0 +1,83 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Clients", (exports) ->
|
2
|
+
|
3
|
+
class exports.Index extends SensuDashboard.Views.Base
|
4
|
+
|
5
|
+
name: "clients/index"
|
6
|
+
|
7
|
+
events:
|
8
|
+
"click #toggle-checkboxes": "toggleSelected"
|
9
|
+
"click #select-all": "selectAll"
|
10
|
+
"click #select-none": "selectNone"
|
11
|
+
"click #select-silenced": "selectSilenced"
|
12
|
+
"click #select-unsilenced": "selectUnsilenced"
|
13
|
+
"click #silence-selected-clients": "silenceSelected"
|
14
|
+
"click #unsilence-selected-clients": "unsilenceSelected"
|
15
|
+
|
16
|
+
initialize: ->
|
17
|
+
@counts_subview = new SensuDashboard.Views.Clients.Counts(collection: @collection)
|
18
|
+
@autocomplete_view = new SensuDashboard.Views.AutoCompleteField()
|
19
|
+
@subview = new exports.List({
|
20
|
+
collection: @collection
|
21
|
+
autocomplete_view: @autocomplete_view
|
22
|
+
})
|
23
|
+
|
24
|
+
render: ->
|
25
|
+
@$el.html(@template(clients: @collection))
|
26
|
+
@assign(@counts_subview, "#counts")
|
27
|
+
@assign(@subview, "#clients_container")
|
28
|
+
@$el.find("#filter").html(@autocomplete_view.render().el)
|
29
|
+
this
|
30
|
+
|
31
|
+
toggleSelected: ->
|
32
|
+
@collection.toggleSelected()
|
33
|
+
|
34
|
+
selectAll: ->
|
35
|
+
@collection.selectAll()
|
36
|
+
|
37
|
+
selectNone: ->
|
38
|
+
@collection.selectNone()
|
39
|
+
|
40
|
+
selectSilenced: ->
|
41
|
+
@collection.selectSilenced()
|
42
|
+
|
43
|
+
selectUnsilenced: ->
|
44
|
+
@collection.selectUnsilenced()
|
45
|
+
|
46
|
+
silenceSelected: ->
|
47
|
+
@collection.silenceSelected
|
48
|
+
success: (model) ->
|
49
|
+
client_name = model.get("name")
|
50
|
+
toastr.success("Silenced client #{client_name}."
|
51
|
+
, "Success!"
|
52
|
+
, { positionClass: "toast-bottom-right" })
|
53
|
+
error: (model, xhr, opts) ->
|
54
|
+
client_name = model.get("name")
|
55
|
+
toastr.error("Error silencing client #{client_name}."
|
56
|
+
, "Silencing Error!"
|
57
|
+
, { positionClass: "toast-bottom-right" })
|
58
|
+
|
59
|
+
unsilenceSelected: ->
|
60
|
+
@collection.unsilenceSelected
|
61
|
+
success: (model) ->
|
62
|
+
client_name = model.get("name")
|
63
|
+
toastr.success("Un-silenced client #{client_name}."
|
64
|
+
, "Success!"
|
65
|
+
, { positionClass: "toast-bottom-right" })
|
66
|
+
error: (model) ->
|
67
|
+
client_name = model.get("name")
|
68
|
+
toastr.error("Error un-silencing client #{client_name}.
|
69
|
+
The client may already be un-sileneced or Sensu API is down."
|
70
|
+
, "Un-silencing Error!"
|
71
|
+
, { positionClass: "toast-bottom-right" })
|
72
|
+
|
73
|
+
removeSelected: ->
|
74
|
+
@collection.removeSelected
|
75
|
+
success: (model) ->
|
76
|
+
toastr.success("Removed client #{model.get("name")}."
|
77
|
+
, "Success!"
|
78
|
+
, { positionClass: "toast-bottom-right" })
|
79
|
+
error: (model) ->
|
80
|
+
toastr.error("Error removing client #{model.get("name")}.
|
81
|
+
The client may have already been removed or Sensu API is down."
|
82
|
+
, "Removal Error!"
|
83
|
+
, { positionClass: "toast-bottom-right" })
|
@@ -0,0 +1,56 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Clients", (exports) ->
|
2
|
+
|
3
|
+
class exports.List extends SensuDashboard.Views.List
|
4
|
+
|
5
|
+
name: "clients/list"
|
6
|
+
|
7
|
+
initialize: ->
|
8
|
+
@autocomplete_view = @options.autocomplete_view
|
9
|
+
@autocomplete_view.delegate = this
|
10
|
+
super
|
11
|
+
|
12
|
+
itemClass: ->
|
13
|
+
exports.ListItem
|
14
|
+
|
15
|
+
resolvedCollection: ->
|
16
|
+
resolved = @collection.chain()
|
17
|
+
for token in @autocomplete_view.tokens
|
18
|
+
resolved = if _.isString(token.object)
|
19
|
+
resolved.filter (record) =>
|
20
|
+
result = @matchForKeys(token.object, record,
|
21
|
+
{ key: "address", threshold: 0.85 },
|
22
|
+
{ key: "name", threshold: 0.9 }
|
23
|
+
)
|
24
|
+
result || _.detect(record.get("subscriptions"), (sub) =>
|
25
|
+
liquidMetal.score(sub, token.object) > 0.96) != undefined
|
26
|
+
|
27
|
+
resolved
|
28
|
+
|
29
|
+
matchForKeys: (q, record, args...) ->
|
30
|
+
result = _.detect args, (options) =>
|
31
|
+
value = record.get(options.key)
|
32
|
+
score = liquidMetal.score(value, q)
|
33
|
+
score >= (options.threshold || 0.7)
|
34
|
+
|
35
|
+
!(result is undefined)
|
36
|
+
|
37
|
+
resolved: ->
|
38
|
+
_(@resolvedCollection().map().value())
|
39
|
+
|
40
|
+
renderCollection: (collection) ->
|
41
|
+
super(collection || @resolved())
|
42
|
+
|
43
|
+
renderEmpty: (collection) ->
|
44
|
+
super(collection || @resolved())
|
45
|
+
|
46
|
+
#
|
47
|
+
# Autocomplete delegate
|
48
|
+
#
|
49
|
+
|
50
|
+
filtersUpdated: ->
|
51
|
+
filtered = @resolved()
|
52
|
+
@collection.each (model) ->
|
53
|
+
model.set(selected: false) unless filtered.contains(model)
|
54
|
+
|
55
|
+
@$el.html(@template())
|
56
|
+
@renderCollection(filtered)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
namespace "SensuDashboard.Views.Clients", (exports) ->
|
2
|
+
|
3
|
+
class exports.ListItem extends SensuDashboard.Views.ListItem
|
4
|
+
|
5
|
+
name: "clients/list_item"
|
6
|
+
|
7
|
+
className: ->
|
8
|
+
@model.get("name")
|
9
|
+
|
10
|
+
events:
|
11
|
+
"click td:not(.select)": "showDetails"
|
12
|
+
"click input[type=checkbox]": "toggleSelect"
|
13
|
+
|
14
|
+
toggleSelect: ->
|
15
|
+
@model.set(selected: !@model.get("selected"))
|
16
|
+
|
17
|
+
showDetails: ->
|
18
|
+
new SensuDashboard.Views.Clients.Modal
|
19
|
+
name: "clients/modal"
|
20
|
+
model: @model
|