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,83 @@
1
+ namespace "SensuDashboard.Views.Clients", (exports) ->
2
+
3
+ class exports.Modal extends SensuDashboard.Views.Modal
4
+
5
+ name: "clients/modal"
6
+
7
+ events:
8
+ "click #silence_client": "silenceClient"
9
+ "click #remove_client": "removeClient"
10
+
11
+ initialize: ->
12
+ @$el.on("hidden", => @remove())
13
+ @listenTo(@model, "change", @render)
14
+ @listenTo(@model, "destroy", @remove)
15
+ @render()
16
+
17
+ render: ->
18
+ template_data = @model.toJSON()
19
+ if @$el.html() == ""
20
+ @$el.html(@template(template_data))
21
+ @$el.appendTo("body")
22
+ @$el.modal("show")
23
+ else
24
+ @$el.html(@template(template_data))
25
+
26
+ silenceClient: (ev) ->
27
+ tag_name = $(ev.target).prop("tagName")
28
+ if tag_name == "SPAN" || tag_name == "I"
29
+ parent = $(ev.target).parent()
30
+ else
31
+ parent = $(ev.target)
32
+ icon = parent.find("i").first()
33
+ text = parent.find("span").first()
34
+ if @model.get("silenced")
35
+ icon.removeClass("icon-volume-off").addClass("icon-spinner icon-spin")
36
+ text.html("Un-silencing...")
37
+ @model.unsilence
38
+ success: (model) ->
39
+ client_name = model.get("name")
40
+ toastr.success("Un-silenced client #{client_name}."
41
+ , "Success!"
42
+ , { positionClass: "toast-bottom-right" })
43
+ error: (model) ->
44
+ client_name = model.get("name")
45
+ toastr.error("Error un-silencing client #{client_name}.
46
+ The client may already be un-sileneced or Sensu API is down."
47
+ , "Un-silencing Error!"
48
+ , { positionClass: "toast-bottom-right" })
49
+ else
50
+ icon.removeClass("icon-volume-up").addClass("icon-spinner icon-spin")
51
+ text.html("Silencing...")
52
+ @model.silence
53
+ success: (model) ->
54
+ client_name = model.get("name")
55
+ toastr.success("Silenced client #{client_name}."
56
+ , "Success!"
57
+ , { positionClass: "toast-bottom-right" })
58
+ error: (model, xhr, opts) ->
59
+ client_name = model.get("name")
60
+ toastr.error("Error silencing client #{client_name}."
61
+ , "Silencing Error!"
62
+ , { positionClass: "toast-bottom-right" })
63
+
64
+ removeClient: (ev) ->
65
+ tag_name = $(ev.target).prop("tagName")
66
+ if tag_name == "SPAN" || tag_name == "I"
67
+ parent = $(ev.target).parent()
68
+ else
69
+ parent = $(ev.target)
70
+ icon = parent.find("i").first()
71
+ text = parent.find("span").first()
72
+ icon.removeClass("icon-remove").addClass("icon-spinner icon-spin")
73
+ text.html("Removing...")
74
+ @model.remove
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,17 @@
1
+ namespace "SensuDashboard.Views", (exports) ->
2
+
3
+ class exports.Error extends SensuDashboard.Views.Base
4
+
5
+ el: $("#main")
6
+
7
+ name: "error"
8
+
9
+ initialize: ->
10
+ @template_data =
11
+ title: "Oh no!" ? @options.title
12
+ message: "Something isn't right. Try refreshing." ? @options.message
13
+ @render()
14
+
15
+ render: ->
16
+ @$el.html(@template(@template_data))
17
+ this
@@ -0,0 +1,12 @@
1
+ namespace "SensuDashboard.Views.Events", (exports) ->
2
+
3
+ class exports.Counts extends SensuDashboard.Views.Base
4
+
5
+ name: "events/counts"
6
+
7
+ initialize: (model) ->
8
+ @listenTo(@model, "all", @render)
9
+
10
+ render: ->
11
+ @$el.html(@template(@model.toJSON()))
12
+ return this
@@ -0,0 +1,143 @@
1
+ namespace "SensuDashboard.Views.Events", (exports) ->
2
+
3
+ class exports.Index extends SensuDashboard.Views.Base
4
+
5
+ name: "events/index"
6
+
7
+ events:
8
+ "click #toggle-checkboxes": "toggleSelected"
9
+ "click #select-all": "selectAll"
10
+ "click #select-none": "selectNone"
11
+ "click #select-critical": "selectCritical"
12
+ "click #select-unknown": "selectUnknown"
13
+ "click #select-warning": "selectWarning"
14
+ "click #select-silenced-clients": "selectSilencedClients"
15
+ "click #select-unsilenced-clients": "selectUnsilencedClients"
16
+ "click #select-silenced-checks": "selectSilencedChecks"
17
+ "click #select-unsilenced-checks": "selectUnsilencedChecks"
18
+ "click #resolve-selected": "resolveSelected"
19
+ "click #silence-selected-clients": "silenceSelectedClients"
20
+ "click #silence-selected-checks": "silenceSelectedChecks"
21
+ "click #unsilence-selected-clients": "unsilenceSelectedClients"
22
+ "click #unsilence-selected-checks": "unsilenceSelectedChecks"
23
+
24
+ initialize: ->
25
+ @events_collection = @model.get("events")
26
+ @counts_subview = new SensuDashboard.Views.Events.Counts(model: @model)
27
+ @autocomplete_view = new SensuDashboard.Views.AutoCompleteField({
28
+ sources: [SensuDashboard.Clients, SensuDashboard.Checks]
29
+ })
30
+ @list_subview = new SensuDashboard.Views.Events.List({
31
+ collection: @events_collection
32
+ autocomplete_view: @autocomplete_view
33
+ })
34
+
35
+ render: ->
36
+ @$el.html(@template())
37
+ @assign(@counts_subview, "#counts")
38
+ @assign(@list_subview, "#list")
39
+ @$el.find("#filter").html(@autocomplete_view.render().el)
40
+ return this
41
+
42
+ toggleSelected: ->
43
+ @events_collection.toggleSelected()
44
+
45
+ selectAll: ->
46
+ @events_collection.selectAll()
47
+
48
+ selectNone: ->
49
+ @events_collection.selectNone()
50
+
51
+ selectCritical: ->
52
+ @events_collection.selectCritical()
53
+
54
+ selectUnknown: ->
55
+ @events_collection.selectUnknown()
56
+
57
+ selectWarning: ->
58
+ @events_collection.selectWarning()
59
+
60
+ selectSilencedClients: ->
61
+ @events_collection.selectSilencedClients()
62
+
63
+ selectUnsilencedClients: ->
64
+ @events_collection.selectUnsilencedClients()
65
+
66
+ selectSilencedChecks: ->
67
+ @events_collection.selectSilenced()
68
+
69
+ selectUnsilencedChecks: ->
70
+ events_selected = @events_collection.getSelected().length
71
+ @events_collection.selectUnsilenced
72
+ success: ->
73
+ toastr.success("Unsilenced #{events_selected} events"
74
+ , "Success!"
75
+ , { positionClass: "toast-bottom-right" })
76
+
77
+ resolveSelected: ->
78
+ @events_collection.resolveSelected
79
+ success: (model) ->
80
+ event_name = "#{model.get("client")}_#{model.get("check")}"
81
+ toastr.success("Resolved event #{event_name}."
82
+ , "Success!"
83
+ , { positionClass: "toast-bottom-right" })
84
+ error: (model) ->
85
+ event_name = "#{model.get("client")}_#{model.get("check")}"
86
+ toastr.error("Error resolving event #{event_name}. Is Sensu API running?"
87
+ , "Resolving Error"
88
+ , { positionClass: "toast-bottom-right" })
89
+
90
+
91
+ silenceSelectedClients: ->
92
+ @events_collection.silenceSelectedClients
93
+ success: (model) ->
94
+ client_name = model.get("name")
95
+ toastr.success("Silenced client #{client_name}."
96
+ , "Success!"
97
+ , { positionClass: "toast-bottom-right" })
98
+ error: (model, xhr, opts) ->
99
+ client_name = model.get("name")
100
+ toastr.error("Error silencing client #{client_name}."
101
+ , "Silencing Error!"
102
+ , { positionClass: "toast-bottom-right" })
103
+
104
+ silenceSelectedChecks: ->
105
+ @events_collection.silenceSelectedChecks
106
+ success: (model) ->
107
+ check_name = model.get("check")
108
+ toastr.success("Silenced check #{check_name}."
109
+ , "Success!"
110
+ , { positionClass: "toast-bottom-right" })
111
+ error: (model) ->
112
+ check_name = model.get("check")
113
+ toastr.error("Error silencing check #{check_name}."
114
+ , "Silencing Error!"
115
+ , { positionClass: "toast-bottom-right" })
116
+
117
+ unsilenceSelectedClients: ->
118
+ @events_collection.unsilenceSelectedClients
119
+ success: (model) ->
120
+ client_name = model.get("name")
121
+ toastr.success("Un-silenced client #{client_name}"
122
+ , "Success!"
123
+ , { positionClass: "toast-bottom-right" })
124
+ error: (model) ->
125
+ client_name = model.get("name")
126
+ toastr.error("Error un-silencing client #{client_name}.
127
+ The client may already be un-sileneced or Sensu API is down."
128
+ , "Un-silencing Error!"
129
+ , { positionClass: "toast-bottom-right" })
130
+
131
+ unsilenceSelectedChecks: ->
132
+ @events_collection.unsilenceSelectedChecks
133
+ success: (model) ->
134
+ check_name = model.get("check")
135
+ toastr.success("Un-silenced check #{check_name}."
136
+ , "Success!"
137
+ , { positionClass: "toast-bottom-right" })
138
+ error: (model) ->
139
+ check_name = model.get("check")
140
+ toastr.error("Error un-silencing check #{check_name}.
141
+ The check may already be un-sileneced or Sensu API is down."
142
+ , "Un-silencing Error!"
143
+ , { positionClass: "toast-bottom-right" })
@@ -0,0 +1,52 @@
1
+ namespace "SensuDashboard.Views.Events", (exports) ->
2
+
3
+ class exports.List extends SensuDashboard.Views.List
4
+
5
+ name: "events/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
+ model = token.object
19
+ resolved = if model instanceof SensuDashboard.Models.Check
20
+ resolved.filter (record) ->
21
+ record.get("check") == model.get("name")
22
+ else if model instanceof SensuDashboard.Models.Client
23
+ resolved.filter (record) ->
24
+ record.get("client") == model.get("name")
25
+ else if _.isString(model)
26
+ resolved.filter (record) ->
27
+ output = record.get("output").toLowerCase()
28
+ result = output.indexOf(model.toLowerCase()) != -1
29
+ result || record.get("check").toLowerCase() == model.toLowerCase()
30
+
31
+ resolved
32
+
33
+ resolved: ->
34
+ _(@resolvedCollection().map().value())
35
+
36
+ renderCollection: (collection) ->
37
+ super(collection || @resolved())
38
+
39
+ renderEmpty: (collection) ->
40
+ super(collection || @resolved())
41
+
42
+ #
43
+ # Autocomplete delegate
44
+ #
45
+
46
+ filtersUpdated: ->
47
+ filtered = @resolved()
48
+ @collection.each (model) ->
49
+ model.set(selected: false) unless filtered.contains(model)
50
+
51
+ @$el.html(@template())
52
+ @renderCollection(filtered)
@@ -0,0 +1,25 @@
1
+ namespace "SensuDashboard.Views.Events", (exports) ->
2
+
3
+ class exports.ListItem extends SensuDashboard.Views.ListItem
4
+
5
+ name: "events/list_item"
6
+
7
+ className: ->
8
+ @model.get("status_name")
9
+
10
+ events:
11
+ "click td:not(.select)": "showDetails"
12
+ "click input[type=checkbox]": "toggleSelect"
13
+
14
+ initialize: ->
15
+ @client = SensuDashboard.Clients.get(@model.get("client"))
16
+ @listenTo(@client, "remove", @remove)
17
+ super
18
+
19
+ toggleSelect: ->
20
+ @model.set(selected: !@model.get("selected"))
21
+
22
+ showDetails: ->
23
+ new SensuDashboard.Views.Events.Modal
24
+ event: @model
25
+ client: @client
@@ -0,0 +1,129 @@
1
+ namespace "SensuDashboard.Views.Events", (exports) ->
2
+
3
+ class exports.Modal extends SensuDashboard.Views.Modal
4
+
5
+ name: "events/modal"
6
+
7
+ events:
8
+ "click #silence_client": "silenceClient"
9
+ "click #silence_check": "silenceCheck"
10
+ "click #resolve_check": "resolveCheck"
11
+
12
+ initialize: ->
13
+ @$el.on("hidden", => @remove())
14
+ @event = @options.event
15
+ @client = @options.client
16
+ @listenTo(@event, "change", @render)
17
+ @listenTo(@event, "destroy", @remove)
18
+ @listenTo(@client, "change", @render)
19
+ @listenTo(@client, "destroy", @remove)
20
+ @render()
21
+
22
+ render: ->
23
+ template_data =
24
+ event: @event.toJSON()
25
+ client: @client.toJSON()
26
+ if @$el.html() == ""
27
+ @$el.html(@template(template_data))
28
+ @$el.appendTo("body")
29
+ @$el.modal("show")
30
+ else
31
+ @$el.html(@template(template_data))
32
+
33
+ silenceClient: (ev) ->
34
+ tag_name = $(ev.target).prop("tagName")
35
+ if tag_name == "SPAN" || tag_name == "I"
36
+ parent = $(ev.target).parent()
37
+ else
38
+ parent = $(ev.target)
39
+ icon = parent.find("i").first()
40
+ text = parent.find("span").first()
41
+ if @client.get("silenced")
42
+ icon.removeClass("icon-volume-off").addClass("icon-spinner icon-spin")
43
+ text.html("Un-silencing...")
44
+ @client.unsilence
45
+ success: (model) ->
46
+ client_name = model.get("name")
47
+ toastr.success("Un-silenced client #{client_name}."
48
+ , "Success!"
49
+ , { positionClass: "toast-bottom-right" })
50
+ error: (model) ->
51
+ client_name = model.get("name")
52
+ toastr.error("Error un-silencing client #{client_name}.
53
+ The client may already be un-sileneced or Sensu API is down."
54
+ , "Un-silencing Error!"
55
+ , { positionClass: "toast-bottom-right" })
56
+ else
57
+ icon.removeClass("icon-volume-up").addClass("icon-spinner icon-spin")
58
+ text.html("Silencing...")
59
+ @client.silence
60
+ success: (model) ->
61
+ client_name = model.get("name")
62
+ toastr.success("Silenced client #{client_name}."
63
+ , "Success!"
64
+ , { positionClass: "toast-bottom-right" })
65
+ error: (model, xhr, opts) ->
66
+ client_name = model.get("name")
67
+ toastr.error("Error silencing client #{client_name}."
68
+ , "Silencing Error!"
69
+ , { positionClass: "toast-bottom-right" })
70
+
71
+ silenceCheck: (ev) ->
72
+ tag_name = $(ev.target).prop("tagName")
73
+ if tag_name == "SPAN" || tag_name == "I"
74
+ parent = $(ev.target).parent()
75
+ else
76
+ parent = $(ev.target)
77
+ icon = parent.find("i").first()
78
+ text = parent.find("span").first()
79
+ if @event.get("silenced")
80
+ icon.removeClass("icon-volume-off").addClass("icon-spinner icon-spin")
81
+ text.html("Un-silencing...")
82
+ @event.unsilence
83
+ success: (model) ->
84
+ check_name = model.get("check")
85
+ toastr.success("Un-silenced check #{check_name}."
86
+ , "Success!"
87
+ , { positionClass: "toast-bottom-right" })
88
+ error: (model) ->
89
+ check_name = model.get("check")
90
+ toastr.error("Error un-silencing check #{check_name}.
91
+ The check may already be un-sileneced or Sensu API is down."
92
+ , "Un-silencing Error!"
93
+ , { positionClass: "toast-bottom-right" })
94
+ else
95
+ icon.removeClass("icon-volume-up").addClass("icon-spinner icon-spin")
96
+ text.html("Silencing...")
97
+ @event.silence
98
+ success: (model) ->
99
+ check_name = model.get("check")
100
+ toastr.success("Silenced check #{check_name}."
101
+ , "Success!"
102
+ , { positionClass: "toast-bottom-right" })
103
+ error: (model) ->
104
+ check_name = model.get("check")
105
+ toastr.error("Error silencing check #{check_name}."
106
+ , "Silencing Error!"
107
+ , { positionClass: "toast-bottom-right" })
108
+
109
+ resolveCheck: (ev) ->
110
+ tag_name = $(ev.target).prop("tagName")
111
+ if tag_name == "SPAN" || tag_name == "I"
112
+ parent = $(ev.target).parent()
113
+ else
114
+ parent = $(ev.target)
115
+ icon = parent.find("i").first()
116
+ text = parent.find("span").first()
117
+ icon.removeClass("icon-ok").addClass("icon-spinner icon-spin")
118
+ text.html("Resolving...")
119
+ @event.resolve
120
+ success: (model) ->
121
+ event_name = "#{model.get("client")}_#{model.get("check")}"
122
+ toastr.success("Resolved event #{event_name}."
123
+ , "Success!"
124
+ , { positionClass: "toast-bottom-right" })
125
+ error: (model) ->
126
+ event_name = "#{model.get("client")}_#{model.get("check")}"
127
+ toastr.error("Error resolving event #{event_name}. Is Sensu API running?"
128
+ , "Resolving Error"
129
+ , { positionClass: "toast-bottom-right" })