finery 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/javascripts/blazer/application.js +2 -61
  4. data/app/assets/javascripts/blazer/controllers/application.js.erb +2 -0
  5. data/app/assets/javascripts/blazer/controllers/autosubmit_controller.js +11 -0
  6. data/app/assets/javascripts/blazer/controllers/code_controller.js +7 -0
  7. data/app/assets/javascripts/blazer/controllers/datepicker_controller.js +31 -0
  8. data/app/assets/javascripts/blazer/controllers/daterangepicker_controller.js +49 -0
  9. data/app/assets/javascripts/blazer/controllers/index.js +12 -0
  10. data/app/assets/javascripts/blazer/controllers/navbar_padding_controller.js +7 -0
  11. data/app/assets/javascripts/blazer/controllers/selectize_controller.js +8 -0
  12. data/app/assets/javascripts/blazer/controllers/unsaved_controller.js +24 -0
  13. data/app/assets/javascripts/blazer/module.js +1 -0
  14. data/app/assets/stylesheets/blazer/application.css +17 -60
  15. data/app/controllers/blazer/base_controller.rb +6 -5
  16. data/app/controllers/blazer/queries_controller.rb +3 -1
  17. data/app/views/blazer/_navbar.html.erb +38 -0
  18. data/app/views/blazer/_variables.html.erb +9 -87
  19. data/app/views/blazer/checks/_form.html.erb +6 -6
  20. data/app/views/blazer/checks/index.html.erb +0 -19
  21. data/app/views/blazer/dashboards/_form.html.erb +7 -5
  22. data/app/views/blazer/dashboards/show.html.erb +7 -18
  23. data/app/views/blazer/queries/_form.html.erb +20 -14
  24. data/app/views/blazer/queries/home.html.erb +17 -30
  25. data/app/views/blazer/queries/run.html.erb +1 -1
  26. data/app/views/blazer/queries/show.html.erb +24 -35
  27. data/app/views/blazer/uploads/_form.html.erb +3 -3
  28. data/app/views/blazer/uploads/index.html.erb +0 -18
  29. data/app/views/layouts/blazer/application.html.erb +10 -10
  30. data/lib/blazer/engine.rb +1 -5
  31. data/lib/blazer/version.rb +1 -1
  32. data/lib/blazer.rb +12 -8
  33. metadata +27 -14
  34. data/app/assets/fonts/blazer/glyphicons-halflings-regular.eot +0 -0
  35. data/app/assets/fonts/blazer/glyphicons-halflings-regular.svg +0 -288
  36. data/app/assets/fonts/blazer/glyphicons-halflings-regular.ttf +0 -0
  37. data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff +0 -0
  38. data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff2 +0 -0
  39. data/app/assets/javascripts/blazer/bootstrap.js +0 -2580
  40. data/app/assets/javascripts/blazer/selectize.js +0 -3891
  41. data/app/assets/stylesheets/blazer/bootstrap-propshaft.css +0 -10
  42. data/app/assets/stylesheets/blazer/bootstrap-sprockets.css.erb +0 -10
  43. data/app/assets/stylesheets/blazer/bootstrap.css +0 -6828
  44. data/app/assets/stylesheets/blazer/selectize.css +0 -403
  45. data/app/views/blazer/_nav.html.erb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e078ca59bdbb5792903b2a057557b43165d682a2c7a5e31980fc7b3f8db04a8
4
- data.tar.gz: de20ac5f79093919a5241ca654368bfe40cebbee45d52b87626d05227a87a80f
3
+ metadata.gz: 4c11bf80f48ee76d4afaed581aabb6481bccd7b56a839c49b2bd61613b8e000e
4
+ data.tar.gz: f350e697db4948e3b1426961b3b26f46fdd49a2db2a3411812cb85be6510671b
5
5
  SHA512:
6
- metadata.gz: 9ff36e58770bcfcb9aad2e699c69ee92dc1f2fffa2c87ab880f693eff439d48c915c43f0eeb4dc5fa06dc6baaaed71118a9b8bd60ae5d2d2f37b562be4c1107d
7
- data.tar.gz: aacececa615434984234722176cf89b11ded36cc8923d6235f754f7537ce9cb2bd6db09c36157a3173dd7ca1083fedd4744702df40de1a27d95f7fe4303db4c5
6
+ metadata.gz: 6398ed311ae7de30b5f8c8b7f9ad3a3de14c793f62ceeb6bf3b35970703f5d69e5e093888bf41fef8df77945928be7aff3a911b17799bc4b3fbab48c2d221620
7
+ data.tar.gz: 25553c55eeb394fc57084d8174d408a6a4f977cf28e4333f59c3c611b6fd5bb30f0cc2288e6609cec15cef936db451cec44808ddf0b305d19ee15f88c53e5fa3
data/README.md CHANGED
@@ -53,7 +53,7 @@ gem "finery"
53
53
  Run:
54
54
 
55
55
  ```sh
56
- rails generate finery:install
56
+ rails generate blazer:install
57
57
  rails db:migrate
58
58
  ```
59
59
 
@@ -5,7 +5,7 @@
5
5
  //= require ./stupidtable
6
6
  //= require ./stupidtable-custom-settings
7
7
  //= require ./jquery.stickytableheaders
8
- //= require ./selectize
8
+ //= require selectize.min
9
9
  //= require ./highlight.min
10
10
  //= require ./moment
11
11
  //= require ./moment-timezone-with-data
@@ -17,71 +17,12 @@
17
17
  //= require ./chartjs-plugin-annotation.min
18
18
  //= require ./ace
19
19
  //= require ./Sortable
20
- //= require ./bootstrap
20
+ //= require bootstrap.bundle.min
21
21
  //= require ./vue.global.prod
22
22
  //= require ./routes
23
23
  //= require ./queries
24
24
  //= require ./fuzzysearch
25
25
 
26
- $(document).on('mouseenter', '.dropdown-toggle', function () {
27
- $(this).parent().addClass('open')
28
- })
29
-
30
- $(document).on("change", "#bind input, #bind select", function () {
31
- submitIfCompleted($(this).closest("form"))
32
- })
33
-
34
- $(document).on("click", "#code", function () {
35
- $(this).addClass("expanded")
36
- })
37
-
38
26
  $(document).on("click", "a[disabled]", function (e) {
39
27
  e.preventDefault()
40
28
  })
41
-
42
- function submitIfCompleted($form) {
43
- var completed = true
44
- $form.find("input[name], select").each( function () {
45
- if ($(this).val() == "") {
46
- completed = false
47
- }
48
- })
49
- if (completed) {
50
- $form.submit()
51
- }
52
- }
53
-
54
- // Prevent backspace from navigating backwards.
55
- // Adapted from Biff MaGriff: http://stackoverflow.com/a/7895814/1196499
56
- function preventBackspaceNav() {
57
- $(document).keydown(function (e) {
58
- var preventKeyPress
59
- if (e.keyCode == 8) {
60
- var d = e.srcElement || e.target
61
- switch (d.tagName.toUpperCase()) {
62
- case 'TEXTAREA':
63
- preventKeyPress = d.readOnly || d.disabled
64
- break
65
- case 'INPUT':
66
- preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0)
67
- break
68
- case 'DIV':
69
- preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true")
70
- break
71
- default:
72
- preventKeyPress = true
73
- break
74
- }
75
- }
76
- else {
77
- preventKeyPress = false
78
- }
79
-
80
- if (preventKeyPress) {
81
- e.preventDefault()
82
- }
83
- })
84
- }
85
-
86
- preventBackspaceNav()
87
-
@@ -0,0 +1,2 @@
1
+ import { Application, Controller } from "<%= javascript_url "stimulus.min" %>"
2
+ window.Stimulus = Application.start()
@@ -0,0 +1,11 @@
1
+ Stimulus.register("autosubmit", class extends Controller {
2
+ call(event) {
3
+ for (let e of this.element.elements) {
4
+ if (e.name && $(e).val() == "") {
5
+ return
6
+ }
7
+ }
8
+
9
+ this.element.requestSubmit()
10
+ }
11
+ })
@@ -0,0 +1,7 @@
1
+ Stimulus.register("code", class extends Controller {
2
+ connect() {
3
+ if (code.innerText.length < 10000) {
4
+ hljs.highlightElement(this.element)
5
+ }
6
+ }
7
+ })
@@ -0,0 +1,31 @@
1
+ Stimulus.register("datepicker", class extends Controller {
2
+ static targets = [ "input", "span" ]
3
+
4
+ connect() {
5
+ const now = moment.tz(timeZone)
6
+ const format = "YYYY-MM-DD"
7
+
8
+ function toDate(time) {
9
+ return moment.tz(time.format(format), timeZone)
10
+ }
11
+
12
+ const datePicker = $(this.element).daterangepicker({
13
+ singleDatePicker: true,
14
+ locale: { format: format },
15
+ autoUpdateInput: false,
16
+ autoApply: true,
17
+ startDate: this.inputTarget.value.length > 0 ? moment.tz(this.inputTarget.value, timeZone) : now
18
+ })
19
+
20
+ // hack to start with empty date
21
+ datePicker.on("apply.daterangepicker", (ev, picker) => {
22
+ this.spanTarget.innerHTML = toDate(picker.startDate).format("MMMM D, YYYY")
23
+ this.inputTarget.value = toDate(picker.startDate).utc().format()
24
+ this.element.dispatchEvent(new Event("change", { bubbles: true }))
25
+ })
26
+
27
+ if (this.inputTarget.value.length > 0) {
28
+ this.spanTarget.innerHTML = toDate(datePicker.data("daterangepicker").startDate).format("MMMM D, YYYY")
29
+ }
30
+ }
31
+ })
@@ -0,0 +1,49 @@
1
+ Stimulus.register("daterangepicker", class extends Controller {
2
+ connect() {
3
+ const now = moment.tz(timeZone)
4
+ const format = "YYYY-MM-DD"
5
+
6
+ function toDate(time) {
7
+ return moment.tz(time.format(format), timeZone)
8
+ }
9
+ function dateStr(daysAgo) {
10
+ return now.clone().subtract(daysAgo || 0, "days").format(format)
11
+ }
12
+ function setTimeInputs(start, end) {
13
+ $("#start_time").val(toDate(start).utc().format())
14
+ $("#end_time").val(toDate(end).endOf("day").utc().format())
15
+ }
16
+
17
+ const datePicker = $(this.element).daterangepicker({
18
+ ranges: {
19
+ "Today": [dateStr(), dateStr()],
20
+ "Last 7 Days": [dateStr(6), dateStr()],
21
+ "Last 30 Days": [dateStr(29), dateStr()]
22
+ },
23
+ locale: {
24
+ format: format
25
+ },
26
+ startDate: dateStr(29),
27
+ endDate: dateStr(),
28
+ opens: "right",
29
+ alwaysShowCalendars: true
30
+ },
31
+ function(start, end) {
32
+ setTimeInputs(start, end)
33
+ this.element.dispatchEvent(new Event("change", { bubbles: true }))
34
+ }.bind(this)).on("apply.daterangepicker", function(ev, picker) {
35
+ setTimeInputs(picker.startDate, picker.endDate)
36
+ $("#reportrange span").html(toDate(picker.startDate).format("MMMM D, YYYY") + " - " + toDate(picker.endDate).format("MMMM D, YYYY"))
37
+ })
38
+
39
+ const picker = datePicker.data("daterangepicker")
40
+ if ($("#start_time").val().length > 0) {
41
+ picker.setStartDate(moment.tz($("#start_time").val(), timeZone))
42
+ picker.setEndDate(moment.tz($("#end_time").val(), timeZone))
43
+ $(this.element).trigger("apply.daterangepicker", picker)
44
+ } else {
45
+ $(this.element).trigger("apply.daterangepicker", picker)
46
+ this.element.dispatchEvent(new Event("change", { bubbles: true }))
47
+ }
48
+ }
49
+ })
@@ -0,0 +1,12 @@
1
+ // This file is auto-generated by ./bin/rails stimulus:manifest:update
2
+ // Run that command whenever you add a new controller or create them with
3
+ // ./bin/rails generate stimulus controllerName
4
+
5
+ //= require ./application
6
+ //= require ./autosubmit_controller
7
+ //= require ./code_controller
8
+ //= require ./datepicker_controller
9
+ //= require ./daterangepicker_controller
10
+ //= require ./navbar_padding_controller
11
+ //= require ./selectize_controller
12
+ //= require ./unsaved_controller
@@ -0,0 +1,7 @@
1
+ Stimulus.register("navbar-padding", class extends Controller {
2
+ static targets = [ "navbar" ]
3
+
4
+ connect() {
5
+ this.element.style.paddingTop = (this.navbarTarget.clientHeight || 0) + "px"
6
+ }
7
+ })
@@ -0,0 +1,8 @@
1
+ Stimulus.register("selectize", class extends Controller {
2
+ connect() {
3
+ $(this.element).selectize({
4
+ create: true,
5
+ onChange: function() { this.$input[0].dispatchEvent(new Event("change", { bubbles: true })) },
6
+ })
7
+ }
8
+ })
@@ -0,0 +1,24 @@
1
+ Stimulus.register("unsaved", class extends Controller {
2
+ changed = false
3
+
4
+ check(event) {
5
+ if (this.changed) {
6
+ event.preventDefault()
7
+ return (event.returnValue = "")
8
+ }
9
+ }
10
+
11
+ clear(event) {
12
+ if (this.changed) {
13
+ window.removeEventListener("beforeunload", this.check.bind(this), { capture: true })
14
+ this.changed = false
15
+ }
16
+ }
17
+
18
+ set(event) {
19
+ if (!this.changed) {
20
+ window.addEventListener("beforeunload", this.check.bind(this), { capture: true })
21
+ this.changed = true
22
+ }
23
+ }
24
+ })
@@ -0,0 +1 @@
1
+ //= require ./controllers
@@ -1,20 +1,26 @@
1
1
  /*
2
- *= require ./bootstrap-sprockets
3
- *= require ./bootstrap
4
- *= require ./selectize
2
+ *= require bootstrap.min
3
+ *= require selectize.bootstrap5
5
4
  *= require ./github
6
5
  *= require ./daterangepicker
7
6
  *= require_self
8
7
  */
9
8
 
9
+ .hide {
10
+ display: none !important;
11
+ }
12
+
10
13
  pre {
11
14
  border: none;
12
15
  border-radius: 0;
13
16
  }
14
17
 
15
- body {
16
- padding-top: 15px;
17
- padding-bottom: 15px;
18
+ .text-pre-line {
19
+ white-space: pre-line;
20
+ }
21
+
22
+ body.with-navbar {
23
+ padding-top: 3.5rem;
18
24
  }
19
25
 
20
26
  table.results-table {
@@ -52,6 +58,10 @@ input.search:focus {
52
58
  outline: none;
53
59
  }
54
60
 
61
+ .selectize-control {
62
+ min-width: 10em;
63
+ }
64
+
55
65
  .form-inline .selectize-control, .text-right .selectize-control {
56
66
  display: inline-block;
57
67
  vertical-align: middle;
@@ -157,35 +167,10 @@ input.search:focus {
157
167
  background-color: #fff;
158
168
  }
159
169
 
160
- .glyphicon-remove {
161
- cursor: pointer;
162
- color: #d9534f;
163
- display: none;
164
- float: right;
165
- margin-top: 3px;
166
- }
167
-
168
- .list-group li:hover .glyphicon-remove {
169
- display: inline;
170
- }
171
-
172
- .list-group {
170
+ #queries.list-group {
173
171
  cursor: move;
174
172
  }
175
173
 
176
- #header a.active {
177
- color: #999;
178
- }
179
-
180
- #code {
181
- max-height: 236px;
182
- overflow: hidden;
183
- }
184
-
185
- #code.expanded {
186
- max-height: none;
187
- }
188
-
189
174
  [v-cloak] {
190
175
  display: none;
191
176
  }
@@ -206,34 +191,6 @@ input.search:focus {
206
191
  color: red;
207
192
  }
208
193
 
209
- .small-form {
210
- margin-right: auto;
211
- margin-left: auto;
212
- max-width: 400px;
213
- }
214
-
215
- .alert {
216
- padding-top: 8px;
217
- padding-bottom: 8px;
218
- }
219
-
220
- h1, h2, h3, h4, p, hr, .table, .navbar, #header, .alert, .form-group {
221
- margin-top: 0;
222
- margin-bottom: 15px;
223
- }
224
-
225
- .double-margin, .chart-container {
226
- margin-bottom: 30px;
227
- }
228
-
229
- h1 {
230
- font-size: 24px;
231
- }
232
-
233
- h2 {
234
- font-size: 20px;
235
- }
236
-
237
194
  .schema-table {
238
195
  max-width: 500px;
239
196
  }
@@ -22,11 +22,11 @@ module Blazer
22
22
  before_action Blazer.before_action.to_sym
23
23
  end
24
24
 
25
- # if Blazer.override_csp
26
- # after_action do
27
- # response.headers['Content-Security-Policy'] = "default-src 'self' https: 'unsafe-inline' 'unsafe-eval' data: blob:"
28
- # end
29
- # end
25
+ if Blazer.override_csp
26
+ after_action do
27
+ response.headers['Content-Security-Policy'] = "default-src 'self' https: 'unsafe-inline' 'unsafe-eval' data: blob:"
28
+ end
29
+ end
30
30
 
31
31
  layout "blazer/application"
32
32
 
@@ -103,6 +103,7 @@ module Blazer
103
103
  end
104
104
 
105
105
  def variable_params(resource, var_params = nil)
106
+ return {} unless resource.present?
106
107
  permitted_keys = resource.variables
107
108
  var_params ||= request.query_parameters
108
109
  var_params.slice(*permitted_keys)
@@ -273,7 +273,9 @@ module Blazer
273
273
  raise Error, @error if @error && Rails.env.test?
274
274
 
275
275
  data = csv_data(@columns, @rows, @data_source)
276
- filename = "#{@query.try(:name).try(:parameterize).presence || 'query'}.csv"
276
+ query_params = variable_params(@query).select { |k| @query.variables.include?(k) }
277
+ name = @query.try(:name).presence || "query"
278
+ filename = "#{name}-#{query_params.to_query}".parameterize + ".csv"
277
279
  send_data data, type: "text/csv; charset=utf-8", disposition: "attachment", filename: filename
278
280
  end
279
281
  end
@@ -0,0 +1,38 @@
1
+ <nav class="navbar navbar-expand-md fixed-top bg-body-tertiary" data-navbar-padding-target="navbar">
2
+ <div class="container flex-nowrap">
3
+ <span class="navbar-brand d-none d-sm-inline">Finery</span>
4
+ <button class="navbar-toggler me-3" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
5
+ <span class="navbar-toggler-icon"></span>
6
+ </button>
7
+ <span class="navbar-brand d-sm-none text-truncate"><%= blazer_title || "Finery" %></span>
8
+ <div class="collapse navbar-collapse" id="navbarCollapse">
9
+ <ul class="navbar-nav me-auto mb-2 mb-md-0">
10
+ <li class="nav-item">
11
+ <%= link_to "Home", blazer.root_path, class: "nav-link" %>
12
+ </li>
13
+ <li class="nav-item">
14
+ <%= link_to "Checks", blazer.checks_path, class: "nav-link" %>
15
+ </li>
16
+ <% if Blazer.uploads? %>
17
+ <li class="nav-item">
18
+ <%= link_to "Uploads", blazer.uploads_path, class: "nav-link" %>
19
+ </li>
20
+ <% end %>
21
+ <li class="nav-item dropdown">
22
+ <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
23
+ New
24
+ </a>
25
+ <ul class="dropdown-menu">
26
+ <li><%= link_to "Query", blazer.new_query_path, class: "dropdown-item" %></li>
27
+ <li><%= link_to "Dashboard", blazer.new_dashboard_path, class: "dropdown-item" %></li>
28
+ <li><%= link_to "Check", blazer.new_check_path(query_id: @query&.id), class: "dropdown-item" %></li>
29
+ <% if Blazer.uploads? %>
30
+ <%= link_to "Upload", blazer.new_upload_path, class: "dropdown-item" %>
31
+ <% end %>
32
+ </ul>
33
+ </li>
34
+ </ul>
35
+ <%= yield(:nav) %>
36
+ </div>
37
+ </div>
38
+ </nav>
@@ -2,14 +2,8 @@
2
2
  <% var_params = request.query_parameters %>
3
3
  <script>
4
4
  <%= blazer_js_var "timeZone", Blazer.time_zone.tzinfo.name %>
5
- var now = moment.tz(timeZone)
6
- var format = "YYYY-MM-DD"
7
-
8
- function toDate(time) {
9
- return moment.tz(time.format(format), timeZone)
10
- }
11
5
  </script>
12
- <form id="bind" method="get" action="<%= action %>" class="form-inline" style="margin-bottom: 15px;">
6
+ <form id="bind" method="get" action="<%= action %>" class="form-inline" style="margin-bottom: 15px;" data-controller="autosubmit" data-action="change->autosubmit#call">
13
7
  <% date_vars = ["start_time", "end_time"] %>
14
8
  <% if (date_vars - @bind_vars).empty? %>
15
9
  <% @bind_vars = @bind_vars - date_vars %>
@@ -18,49 +12,23 @@
18
12
  <% end %>
19
13
 
20
14
  <% @bind_vars.each_with_index do |var, i| %>
15
+ <div class="form-group">
21
16
  <%= label_tag var, var %>
22
17
  <% if (data = @smart_vars[var]) %>
23
- <%= select_tag var, options_for_select([[nil, nil]] + data, selected: var_params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
24
- <script>
25
- $("#<%= var %>").selectize({
26
- create: true
27
- });
28
- </script>
18
+ <%= select_tag var, options_for_select([[nil, nil]] + data, selected: var_params[var]), data: { controller: "selectize" }, style: "margin-right: 20px; width: 200px; display: none;" %>
29
19
  <% elsif var.end_with?("_at") || var == "start_time" || var == "end_time" %>
30
- <%= hidden_field_tag var, var_params[var] %>
31
20
 
32
21
  <div class="selectize-control single" style="width: 200px;">
33
- <div id="<%= var %>-select" class="selectize-input" style="display: inline-block;">
34
- <span>Select a date</span>
22
+ <div id="<%= var %>-select" class="selectize-input" style="display: inline-block;" data-controller="datepicker">
23
+ <%= hidden_field_tag var, var_params[var], data: { datepicker_target: "input" } %>
24
+ <span data-datepicker-target="span">Select a date</span>
35
25
  </div>
36
26
  </div>
37
27
 
38
- <script>
39
- (function() {
40
- var input = $("#<%= var %>")
41
- var datePicker = $("#<%= var %>-select")
42
- datePicker.daterangepicker({
43
- singleDatePicker: true,
44
- locale: {format: format},
45
- autoUpdateInput: false,
46
- autoApply: true,
47
- startDate: input.val().length > 0 ? moment.tz(input.val(), timeZone) : now
48
- })
49
- // hack to start with empty date
50
- datePicker.on("apply.daterangepicker", function(ev, picker) {
51
- datePicker.find("span").html(toDate(picker.startDate).format("MMMM D, YYYY"))
52
- input.val(toDate(picker.startDate).utc().format())
53
- submitIfCompleted($("#<%= var %>").closest("form"))
54
- })
55
- if (input.val().length > 0) {
56
- var picker = datePicker.data("daterangepicker")
57
- datePicker.find("span").html(toDate(picker.startDate).format("MMMM D, YYYY"))
58
- }
59
- })()
60
- </script>
61
28
  <% else %>
62
- <%= text_field_tag var, var_params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !var_params[var], class: "form-control" %>
29
+ <%= text_field_tag var, var_params[var], autofocus: i == 0 && !var.end_with?("_at") && !var_params[var], class: "form-control" %>
63
30
  <% end %>
31
+ </div>
64
32
  <% end %>
65
33
 
66
34
  <% if date_vars %>
@@ -70,56 +38,10 @@
70
38
 
71
39
  <%= label_tag nil, date_vars.join(" & ") %>
72
40
  <div class="selectize-control single" style="width: 300px;">
73
- <div id="reportrange" class="selectize-input" style="display: inline-block;">
41
+ <div id="reportrange" class="selectize-input" style="display: inline-block;" data-controller="daterangepicker">
74
42
  <span>Select a time range</span>
75
43
  </div>
76
44
  </div>
77
-
78
- <script>
79
- function dateStr(daysAgo) {
80
- return now.clone().subtract(daysAgo || 0, "days").format(format)
81
- }
82
-
83
- function setTimeInputs(start, end) {
84
- $("#start_time").val(toDate(start).utc().format())
85
- $("#end_time").val(toDate(end).endOf("day").utc().format())
86
- }
87
-
88
- $("#reportrange").daterangepicker(
89
- {
90
- ranges: {
91
- "Today": [dateStr(), dateStr()],
92
- "Last 7 Days": [dateStr(6), dateStr()],
93
- "Last 30 Days": [dateStr(29), dateStr()]
94
- },
95
- locale: {
96
- format: format
97
- },
98
- startDate: dateStr(29),
99
- endDate: dateStr(),
100
- opens: "right",
101
- alwaysShowCalendars: true
102
- },
103
- function(start, end) {
104
- setTimeInputs(start, end)
105
- submitIfCompleted($("#start_time").closest("form"))
106
- }
107
- ).on("apply.daterangepicker", function(ev, picker) {
108
- setTimeInputs(picker.startDate, picker.endDate)
109
- $("#reportrange span").html(toDate(picker.startDate).format("MMMM D, YYYY") + " - " + toDate(picker.endDate).format("MMMM D, YYYY"))
110
- })
111
-
112
- if ($("#start_time").val().length > 0) {
113
- var picker = $("#reportrange").data("daterangepicker")
114
- picker.setStartDate(moment.tz($("#start_time").val(), timeZone))
115
- picker.setEndDate(moment.tz($("#end_time").val(), timeZone))
116
- $("#reportrange").trigger("apply.daterangepicker", picker)
117
- } else {
118
- var picker = $("#reportrange").data("daterangepicker")
119
- $("#reportrange").trigger("apply.daterangepicker", picker)
120
- submitIfCompleted($("#start_time").closest("form"))
121
- }
122
- </script>
123
45
  <% end %>
124
46
 
125
47
  <input type="submit" class="btn btn-success" value="Run" style="vertical-align: top;" />
@@ -7,7 +7,7 @@
7
7
  <div class="alert alert-danger"><%= @check.errors.full_messages.first %></div>
8
8
  <% end %>
9
9
 
10
- <div class="form-group">
10
+ <div class="form-group mb-3">
11
11
  <%= f.label :query_id, "Query" %>
12
12
  <div class="hide">
13
13
  <%= f.select :query_id, [], {include_blank: true} %>
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
 
23
23
  <% if @check.respond_to?(:check_type) %>
24
- <div class="form-group">
24
+ <div class="form-group mb-3">
25
25
  <%= f.label :check_type, "Alert if" %>
26
26
  <div class="hide">
27
27
  <% check_options = [["Any results (bad data)", "bad_data"], ["No results (missing data)", "missing_data"]] %>
@@ -33,7 +33,7 @@
33
33
  </script>
34
34
  </div>
35
35
  <% elsif @check.respond_to?(:invert) %>
36
- <div class="form-group">
36
+ <div class="form-group mb-3">
37
37
  <%= f.label :invert, "Fails if" %>
38
38
  <div class="hide">
39
39
  <%= f.select :invert, [["Any results (bad data)", false], ["No results (missing data)", true]] %>
@@ -45,7 +45,7 @@
45
45
  <% end %>
46
46
 
47
47
  <% if @check.respond_to?(:schedule) && Blazer.check_schedules %>
48
- <div class="form-group">
48
+ <div class="form-group mb-3">
49
49
  <%= f.label :schedule, "Run every" %>
50
50
  <div class="hide">
51
51
  <%= f.select :schedule, Blazer.check_schedules.map { |v| [v, v] } %>
@@ -56,13 +56,13 @@
56
56
  </div>
57
57
  <% end %>
58
58
 
59
- <div class="form-group">
59
+ <div class="form-group mb-3">
60
60
  <%= f.label :emails %>
61
61
  <%= f.text_field :emails, placeholder: "Optional, comma separated", class: "form-control" %>
62
62
  </div>
63
63
 
64
64
  <% if Blazer.slack? %>
65
- <div class="form-group">
65
+ <div class="form-group mb-3">
66
66
  <%= f.label :slack_channels %>
67
67
  <%= f.text_field :slack_channels, placeholder: "Optional, comma separated", class: "form-control" %>
68
68
  </div>
@@ -1,25 +1,6 @@
1
1
  <% blazer_title "Checks" %>
2
2
 
3
3
  <div id="header">
4
- <div class="pull-right" style="line-height: 34px;">
5
- <div class="btn-group">
6
- <%= link_to "New Check", new_check_path, class: "btn btn-info" %>
7
- <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
8
- <span class="caret"></span>
9
- <span class="sr-only">Toggle Dropdown</span>
10
- </button>
11
- <ul class="dropdown-menu">
12
- <li><%= link_to "Home", root_path %></li>
13
- <% if Blazer.uploads? %>
14
- <li><%= link_to "Uploads", uploads_path %></li>
15
- <% end %>
16
- <li role="separator" class="divider"></li>
17
- <li><%= link_to "New Query", new_query_path %></li>
18
- <li><%= link_to "New Dashboard", new_dashboard_path %></li>
19
- </ul>
20
- </div>
21
- </div>
22
-
23
4
  <input id="search" type="text" placeholder="Start typing a query or state" style="width: 300px; display: inline-block;" class="search form-control" />
24
5
  </div>
25
6