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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/blazer/application.js +2 -61
- data/app/assets/javascripts/blazer/controllers/application.js.erb +2 -0
- data/app/assets/javascripts/blazer/controllers/autosubmit_controller.js +11 -0
- data/app/assets/javascripts/blazer/controllers/code_controller.js +7 -0
- data/app/assets/javascripts/blazer/controllers/datepicker_controller.js +31 -0
- data/app/assets/javascripts/blazer/controllers/daterangepicker_controller.js +49 -0
- data/app/assets/javascripts/blazer/controllers/index.js +12 -0
- data/app/assets/javascripts/blazer/controllers/navbar_padding_controller.js +7 -0
- data/app/assets/javascripts/blazer/controllers/selectize_controller.js +8 -0
- data/app/assets/javascripts/blazer/controllers/unsaved_controller.js +24 -0
- data/app/assets/javascripts/blazer/module.js +1 -0
- data/app/assets/stylesheets/blazer/application.css +17 -60
- data/app/controllers/blazer/base_controller.rb +6 -5
- data/app/controllers/blazer/queries_controller.rb +3 -1
- data/app/views/blazer/_navbar.html.erb +38 -0
- data/app/views/blazer/_variables.html.erb +9 -87
- data/app/views/blazer/checks/_form.html.erb +6 -6
- data/app/views/blazer/checks/index.html.erb +0 -19
- data/app/views/blazer/dashboards/_form.html.erb +7 -5
- data/app/views/blazer/dashboards/show.html.erb +7 -18
- data/app/views/blazer/queries/_form.html.erb +20 -14
- data/app/views/blazer/queries/home.html.erb +17 -30
- data/app/views/blazer/queries/run.html.erb +1 -1
- data/app/views/blazer/queries/show.html.erb +24 -35
- data/app/views/blazer/uploads/_form.html.erb +3 -3
- data/app/views/blazer/uploads/index.html.erb +0 -18
- data/app/views/layouts/blazer/application.html.erb +10 -10
- data/lib/blazer/engine.rb +1 -5
- data/lib/blazer/version.rb +1 -1
- data/lib/blazer.rb +12 -8
- metadata +27 -14
- data/app/assets/fonts/blazer/glyphicons-halflings-regular.eot +0 -0
- data/app/assets/fonts/blazer/glyphicons-halflings-regular.svg +0 -288
- data/app/assets/fonts/blazer/glyphicons-halflings-regular.ttf +0 -0
- data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff +0 -0
- data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff2 +0 -0
- data/app/assets/javascripts/blazer/bootstrap.js +0 -2580
- data/app/assets/javascripts/blazer/selectize.js +0 -3891
- data/app/assets/stylesheets/blazer/bootstrap-propshaft.css +0 -10
- data/app/assets/stylesheets/blazer/bootstrap-sprockets.css.erb +0 -10
- data/app/assets/stylesheets/blazer/bootstrap.css +0 -6828
- data/app/assets/stylesheets/blazer/selectize.css +0 -403
- data/app/views/blazer/_nav.html.erb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c11bf80f48ee76d4afaed581aabb6481bccd7b56a839c49b2bd61613b8e000e
|
4
|
+
data.tar.gz: f350e697db4948e3b1426961b3b26f46fdd49a2db2a3411812cb85be6510671b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6398ed311ae7de30b5f8c8b7f9ad3a3de14c793f62ceeb6bf3b35970703f5d69e5e093888bf41fef8df77945928be7aff3a911b17799bc4b3fbab48c2d221620
|
7
|
+
data.tar.gz: 25553c55eeb394fc57084d8174d408a6a4f977cf28e4333f59c3c611b6fd5bb30f0cc2288e6609cec15cef936db451cec44808ddf0b305d19ee15f88c53e5fa3
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
//= require ./stupidtable
|
6
6
|
//= require ./stupidtable-custom-settings
|
7
7
|
//= require ./jquery.stickytableheaders
|
8
|
-
//= require
|
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
|
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,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,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
|
3
|
-
*= require
|
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
|
-
|
16
|
-
|
17
|
-
|
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
|
-
.
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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
|
-
|
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],
|
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
|
|