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.
Files changed (153) hide show
  1. data/CHANGELOG.md +0 -0
  2. data/README.md +9 -0
  3. data/bin/sensu-dashboard +8 -7
  4. data/lib/sensu-dashboard.rb +3 -0
  5. data/lib/sensu-dashboard/assets/javascripts/app.js +38 -0
  6. data/lib/sensu-dashboard/assets/javascripts/application.coffee +21 -0
  7. data/lib/sensu-dashboard/assets/javascripts/bootstrapper.coffee +39 -0
  8. data/lib/sensu-dashboard/assets/javascripts/collections/base.coffee +22 -0
  9. data/lib/sensu-dashboard/assets/javascripts/collections/checks.coffee +8 -0
  10. data/lib/sensu-dashboard/assets/javascripts/collections/clients.coffee +83 -0
  11. data/lib/sensu-dashboard/assets/javascripts/collections/events.coffee +184 -0
  12. data/lib/sensu-dashboard/assets/javascripts/collections/stashes.coffee +37 -0
  13. data/lib/sensu-dashboard/assets/javascripts/config/states.coffee +30 -0
  14. data/lib/sensu-dashboard/assets/javascripts/handlebars_helpers.coffee +2 -0
  15. data/lib/sensu-dashboard/assets/javascripts/libs/backbone-min.js +4 -0
  16. data/lib/sensu-dashboard/assets/javascripts/libs/bootstrap.min.js +7 -0
  17. data/lib/sensu-dashboard/assets/javascripts/libs/jquery-1.9.1.min.js +5 -0
  18. data/lib/sensu-dashboard/assets/javascripts/libs/liquid.metal.js +107 -0
  19. data/lib/sensu-dashboard/assets/javascripts/libs/lodash.underscore.min.js +34 -0
  20. data/lib/sensu-dashboard/assets/javascripts/libs/retina.js +3 -0
  21. data/lib/sensu-dashboard/assets/javascripts/libs/scroll.into.view.js +32 -0
  22. data/lib/sensu-dashboard/assets/javascripts/libs/toastr.min.js +1 -0
  23. data/lib/sensu-dashboard/assets/javascripts/libs/token.field.coffee +173 -0
  24. data/lib/sensu-dashboard/assets/javascripts/matcher.coffee +34 -0
  25. data/lib/sensu-dashboard/assets/javascripts/models/check.coffee +11 -0
  26. data/lib/sensu-dashboard/assets/javascripts/models/client.coffee +58 -0
  27. data/lib/sensu-dashboard/assets/javascripts/models/event.coffee +78 -0
  28. data/lib/sensu-dashboard/assets/javascripts/models/info.coffee +58 -0
  29. data/lib/sensu-dashboard/assets/javascripts/models/metadata/events.coffee +21 -0
  30. data/lib/sensu-dashboard/assets/javascripts/models/stash.coffee +34 -0
  31. data/lib/sensu-dashboard/assets/javascripts/namespace.coffee +17 -0
  32. data/lib/sensu-dashboard/assets/javascripts/state.coffee +33 -0
  33. data/lib/sensu-dashboard/assets/javascripts/state_manager.coffee +52 -0
  34. data/lib/sensu-dashboard/assets/javascripts/states/main_state.coffee +6 -0
  35. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_check_item.hbs +1 -0
  36. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_check_token.hbs +1 -0
  37. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_client_item.hbs +1 -0
  38. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_client_token.hbs +1 -0
  39. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_query_item.hbs +1 -0
  40. data/lib/sensu-dashboard/assets/javascripts/templates/autocomplete/results_query_token.hbs +1 -0
  41. data/lib/sensu-dashboard/assets/javascripts/templates/checks/index.hbs +10 -0
  42. data/lib/sensu-dashboard/assets/javascripts/templates/checks/list.hbs +12 -0
  43. data/lib/sensu-dashboard/assets/javascripts/templates/checks/list_item.hbs +5 -0
  44. data/lib/sensu-dashboard/assets/javascripts/templates/clients/counts.hbs +6 -0
  45. data/lib/sensu-dashboard/assets/javascripts/templates/clients/index.hbs +26 -0
  46. data/lib/sensu-dashboard/assets/javascripts/templates/clients/list.hbs +12 -0
  47. data/lib/sensu-dashboard/assets/javascripts/templates/clients/list_item.hbs +14 -0
  48. data/lib/sensu-dashboard/assets/javascripts/templates/clients/modal.hbs +30 -0
  49. data/lib/sensu-dashboard/assets/javascripts/templates/empty_list.hbs +4 -0
  50. data/lib/sensu-dashboard/assets/javascripts/templates/error.hbs +5 -0
  51. data/lib/sensu-dashboard/assets/javascripts/templates/events/counts.hbs +9 -0
  52. data/lib/sensu-dashboard/assets/javascripts/templates/events/index.hbs +33 -0
  53. data/lib/sensu-dashboard/assets/javascripts/templates/events/list.hbs +11 -0
  54. data/lib/sensu-dashboard/assets/javascripts/templates/events/list_item.hbs +18 -0
  55. data/lib/sensu-dashboard/assets/javascripts/templates/events/modal.hbs +47 -0
  56. data/lib/sensu-dashboard/assets/javascripts/templates/info/index.hbs +54 -0
  57. data/lib/sensu-dashboard/assets/javascripts/templates/modal.hbs +17 -0
  58. data/lib/sensu-dashboard/assets/javascripts/templates/stashes/counts.hbs +6 -0
  59. data/lib/sensu-dashboard/assets/javascripts/templates/stashes/index.hbs +22 -0
  60. data/lib/sensu-dashboard/assets/javascripts/templates/stashes/list.hbs +10 -0
  61. data/lib/sensu-dashboard/assets/javascripts/templates/stashes/list_item.hbs +5 -0
  62. data/lib/sensu-dashboard/assets/javascripts/templates/stashes/modal.hbs +25 -0
  63. data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_field.coffee +133 -0
  64. data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_results.coffee +135 -0
  65. data/lib/sensu-dashboard/assets/javascripts/views/auto_complete/auto_complete_token.coffee +31 -0
  66. data/lib/sensu-dashboard/assets/javascripts/views/base.coffee +16 -0
  67. data/lib/sensu-dashboard/assets/javascripts/views/checks/index.coffee +18 -0
  68. data/lib/sensu-dashboard/assets/javascripts/views/checks/list.coffee +48 -0
  69. data/lib/sensu-dashboard/assets/javascripts/views/checks/list_item.coffee +17 -0
  70. data/lib/sensu-dashboard/assets/javascripts/views/clients/counts.coffee +13 -0
  71. data/lib/sensu-dashboard/assets/javascripts/views/clients/index.coffee +83 -0
  72. data/lib/sensu-dashboard/assets/javascripts/views/clients/list.coffee +56 -0
  73. data/lib/sensu-dashboard/assets/javascripts/views/clients/list_item.coffee +20 -0
  74. data/lib/sensu-dashboard/assets/javascripts/views/clients/modal.coffee +83 -0
  75. data/lib/sensu-dashboard/assets/javascripts/views/error.coffee +17 -0
  76. data/lib/sensu-dashboard/assets/javascripts/views/events/counts.coffee +12 -0
  77. data/lib/sensu-dashboard/assets/javascripts/views/events/index.coffee +143 -0
  78. data/lib/sensu-dashboard/assets/javascripts/views/events/list.coffee +52 -0
  79. data/lib/sensu-dashboard/assets/javascripts/views/events/list_item.coffee +25 -0
  80. data/lib/sensu-dashboard/assets/javascripts/views/events/modal.coffee +129 -0
  81. data/lib/sensu-dashboard/assets/javascripts/views/info/index.coffee +13 -0
  82. data/lib/sensu-dashboard/assets/javascripts/views/list.coffee +44 -0
  83. data/lib/sensu-dashboard/assets/javascripts/views/list_item.coffee +14 -0
  84. data/lib/sensu-dashboard/assets/javascripts/views/modal.coffee +25 -0
  85. data/lib/sensu-dashboard/assets/javascripts/views/stashes/counts.coffee +13 -0
  86. data/lib/sensu-dashboard/assets/javascripts/views/stashes/index.coffee +49 -0
  87. data/lib/sensu-dashboard/assets/javascripts/views/stashes/list.coffee +45 -0
  88. data/lib/sensu-dashboard/assets/javascripts/views/stashes/list_item.coffee +28 -0
  89. data/lib/sensu-dashboard/assets/javascripts/views/stashes/modal.coffee +46 -0
  90. data/lib/sensu-dashboard/assets/stylesheets/app.css +5 -0
  91. data/lib/sensu-dashboard/assets/stylesheets/libs/bootstrap.min.css +717 -0
  92. data/lib/sensu-dashboard/assets/stylesheets/libs/font-awesome.less +537 -0
  93. data/lib/sensu-dashboard/assets/stylesheets/libs/toastr.min.css +1 -0
  94. data/lib/sensu-dashboard/assets/stylesheets/main.sass +414 -0
  95. data/lib/sensu-dashboard/constants.rb +7 -0
  96. data/lib/sensu-dashboard/public/favicon.ico +0 -0
  97. data/lib/sensu-dashboard/public/font/FontAwesome.otf +0 -0
  98. data/lib/sensu-dashboard/public/font/fontawesome-webfont.eot +0 -0
  99. data/lib/sensu-dashboard/public/font/fontawesome-webfont.svg +284 -0
  100. data/lib/sensu-dashboard/public/font/fontawesome-webfont.ttf +0 -0
  101. data/lib/sensu-dashboard/public/font/fontawesome-webfont.woff +0 -0
  102. data/lib/sensu-dashboard/public/img/favicon_114.png +0 -0
  103. data/lib/sensu-dashboard/public/img/favicon_144.png +0 -0
  104. data/lib/sensu-dashboard/public/img/favicon_57.png +0 -0
  105. data/lib/sensu-dashboard/public/img/favicon_64.png +0 -0
  106. data/lib/sensu-dashboard/public/img/favicon_72.png +0 -0
  107. data/lib/sensu-dashboard/public/img/glyphicons-halflings-white.png +0 -0
  108. data/lib/sensu-dashboard/public/img/glyphicons-halflings.png +0 -0
  109. data/lib/sensu-dashboard/public/img/loading.gif +0 -0
  110. data/lib/sensu-dashboard/public/img/logo.png +0 -0
  111. data/lib/sensu-dashboard/public/img/logo@2x.png +0 -0
  112. data/lib/sensu-dashboard/server.rb +337 -0
  113. data/lib/sensu-dashboard/views/layout.slim +49 -0
  114. data/lib/sensu-dashboard/views/main.slim +3 -0
  115. data/sensu-dashboard.gemspec +21 -11
  116. metadata +308 -120
  117. data/.gitignore +0 -6
  118. data/Gemfile +0 -4
  119. data/README.org +0 -4
  120. data/Rakefile +0 -1
  121. data/lib/sensu-dashboard/app.rb +0 -439
  122. data/lib/sensu-dashboard/public/css/autoSuggest.css +0 -217
  123. data/lib/sensu-dashboard/public/css/style.css +0 -177
  124. data/lib/sensu-dashboard/public/img/cross.png +0 -0
  125. data/lib/sensu-dashboard/public/img/footer_bg.png +0 -0
  126. data/lib/sensu-dashboard/public/img/header_bg.png +0 -0
  127. data/lib/sensu-dashboard/public/img/loading_circle.gif +0 -0
  128. data/lib/sensu-dashboard/public/img/main_content_bg.png +0 -0
  129. data/lib/sensu-dashboard/public/img/megaphone_icon.png +0 -0
  130. data/lib/sensu-dashboard/public/img/megaphone_icon_off.png +0 -0
  131. data/lib/sensu-dashboard/public/js/FABridge.js +0 -604
  132. data/lib/sensu-dashboard/public/js/functions.js +0 -367
  133. data/lib/sensu-dashboard/public/js/jquery-1.5.1.min.js +0 -16
  134. data/lib/sensu-dashboard/public/js/jquery.autoSuggest.js +0 -375
  135. data/lib/sensu-dashboard/public/js/jquery.leanModal.min.js +0 -1
  136. data/lib/sensu-dashboard/public/js/jquery.sortElements.js +0 -69
  137. data/lib/sensu-dashboard/public/js/jquery.tmpl.min.js +0 -1
  138. data/lib/sensu-dashboard/public/js/jquery.zclip.min.js +0 -12
  139. data/lib/sensu-dashboard/public/js/modernizr-1.7.min.js +0 -2
  140. data/lib/sensu-dashboard/public/js/swfobject.js +0 -4
  141. data/lib/sensu-dashboard/public/js/web_socket.js +0 -312
  142. data/lib/sensu-dashboard/public/js/webtoolkit.sha1.js +0 -174
  143. data/lib/sensu-dashboard/public/swf/WebSocketMain.swf +0 -0
  144. data/lib/sensu-dashboard/public/swf/ZeroClipboard.swf +0 -0
  145. data/lib/sensu-dashboard/version.rb +0 -5
  146. data/lib/sensu-dashboard/views/client_templates.erb +0 -67
  147. data/lib/sensu-dashboard/views/clients.erb +0 -36
  148. data/lib/sensu-dashboard/views/event_templates.erb +0 -185
  149. data/lib/sensu-dashboard/views/index.erb +0 -48
  150. data/lib/sensu-dashboard/views/layout.erb +0 -132
  151. data/lib/sensu-dashboard/views/sonian.sass +0 -213
  152. data/lib/sensu-dashboard/views/stash_templates.erb +0 -44
  153. 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