blazer 1.7.0 → 1.7.1

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.
@@ -165,3 +165,16 @@ input.search:focus {
165
165
  #header a.active {
166
166
  color: #999;
167
167
  }
168
+
169
+ #code {
170
+ max-height: 236px;
171
+ overflow: hidden;
172
+ }
173
+
174
+ #code.expanded {
175
+ max-height: none;
176
+ }
177
+
178
+ [v-cloak] {
179
+ display: none;
180
+ }
@@ -17,7 +17,7 @@ module Blazer
17
17
  end
18
18
 
19
19
  if Blazer.before_action
20
- before_action Blazer.before_action
20
+ before_action Blazer.before_action.to_sym
21
21
  end
22
22
 
23
23
  layout "blazer/application"
@@ -35,16 +35,24 @@ module Blazer
35
35
  @bind_vars.each do |var|
36
36
  value = params[var].presence
37
37
  if value
38
+ if ["start_time", "end_time"].include?(var)
39
+ value = value.to_s.gsub(" ", "+") # fix for Quip bug
40
+ end
41
+
42
+ if var.end_with?("_at")
43
+ begin
44
+ value = Blazer.time_zone.parse(value)
45
+ rescue
46
+ # do nothing
47
+ end
48
+ end
49
+
38
50
  if value =~ /\A\d+\z/
39
51
  value = value.to_i
40
52
  elsif value =~ /\A\d+\.\d+\z/
41
53
  value = value.to_f
42
54
  end
43
55
  end
44
- if var.end_with?("_at")
45
- value = Blazer.time_zone.parse(value) rescue nil
46
- end
47
- value.gsub!(" ", "+") if ["start_time", "end_time"].include?(var) # fix for Quip bug
48
56
  statement.gsub!("{#{var}}", ActiveRecord::Base.connection.quote(value))
49
57
  end
50
58
  end
@@ -72,7 +80,7 @@ module Blazer
72
80
  helper_method :extract_vars
73
81
 
74
82
  def variable_params
75
- params.except(:controller, :action, :id, :host, :query, :dashboard, :query_id, :query_ids, :table_names, :authenticity_token, :utf8, :_method, :commit, :statement, :data_source, :name, :fork_query_id, :blazer).permit!
83
+ params.except(:controller, :action, :id, :host, :query, :dashboard, :query_id, :query_ids, :table_names, :authenticity_token, :utf8, :_method, :commit, :statement, :data_source, :name, :fork_query_id, :blazer, :run_id).permit!
76
84
  end
77
85
  helper_method :variable_params
78
86
 
@@ -80,5 +88,11 @@ module Blazer
80
88
  send(Blazer.user_method) if Blazer.user_method && respond_to?(Blazer.user_method)
81
89
  end
82
90
  helper_method :blazer_user
91
+
92
+ def render_errors(resource)
93
+ @errors = resource.errors
94
+ action = resource.persisted? ? :edit : :new
95
+ render action, status: :unprocessable_entity
96
+ end
83
97
  end
84
98
  end
@@ -19,17 +19,17 @@ module Blazer
19
19
  @check.creator = blazer_user if @check.respond_to?(:creator_id=) && blazer_user
20
20
 
21
21
  if @check.save
22
- redirect_to run_check_path(@check)
22
+ redirect_to query_path(@check.query)
23
23
  else
24
- render :new
24
+ render_errors @check
25
25
  end
26
26
  end
27
27
 
28
28
  def update
29
29
  if @check.update(check_params)
30
- redirect_to run_check_path(@check)
30
+ redirect_to query_path(@check.query)
31
31
  else
32
- render :edit
32
+ render_errors @check
33
33
  end
34
34
  end
35
35
 
@@ -19,7 +19,7 @@ module Blazer
19
19
  if update_dashboard(@dashboard)
20
20
  redirect_to dashboard_path(@dashboard)
21
21
  else
22
- render :new
22
+ render_errors @dashboard
23
23
  end
24
24
  end
25
25
 
@@ -49,7 +49,7 @@ module Blazer
49
49
  if update_dashboard(@dashboard)
50
50
  redirect_to dashboard_path(@dashboard, variable_params)
51
51
  else
52
- render :edit
52
+ render_errors @dashboard
53
53
  end
54
54
  end
55
55
 
@@ -15,12 +15,19 @@ module Blazer
15
15
  @dashboards =
16
16
  @dashboards.map do |d|
17
17
  {
18
- name: "<strong>#{view_context.link_to(d.name, d)}</strong>",
18
+ id: d.id,
19
+ name: d.name,
19
20
  creator: blazer_user && d.try(:creator) == blazer_user ? "You" : d.try(:creator).try(Blazer.user_name),
20
- hide: d.name.gsub(/\s+/, ""),
21
- vars: nil
21
+ to_param: d.to_param,
22
+ dashboard: true
22
23
  }
23
24
  end
25
+
26
+ gon.push(
27
+ dashboards: @dashboards,
28
+ queries: @queries,
29
+ more: @more
30
+ )
24
31
  end
25
32
 
26
33
  def index
@@ -45,7 +52,7 @@ module Blazer
45
52
  if @query.save
46
53
  redirect_to query_path(@query, variable_params)
47
54
  else
48
- render :new
55
+ render_errors @query
49
56
  end
50
57
  end
51
58
 
@@ -158,7 +165,7 @@ module Blazer
158
165
  if @query.errors.empty? && @query.update(query_params)
159
166
  redirect_to query_path(@query, variable_params)
160
167
  else
161
- render :edit
168
+ render_errors @query
162
169
  end
163
170
  end
164
171
 
@@ -188,7 +195,7 @@ module Blazer
188
195
  end
189
196
 
190
197
  def render_run
191
- @checks = @query ? @query.checks : []
198
+ @checks = @query ? @query.checks.order(:id) : []
192
199
 
193
200
  @first_row = @rows.first || []
194
201
  @column_types = []
@@ -250,7 +257,7 @@ module Blazer
250
257
  []
251
258
  end
252
259
 
253
- @queries = Blazer::Query.named
260
+ @queries = Blazer::Query.named.select(:id, :name, :creator_id, :statement)
254
261
  @queries = @queries.includes(:creator) if Blazer.user_class
255
262
 
256
263
  if blazer_user && params[:filter] == "mine"
@@ -272,10 +279,10 @@ module Blazer
272
279
  @queries.map do |q|
273
280
  {
274
281
  id: q.id,
275
- name: view_context.link_to(q.name, q),
282
+ name: q.name,
276
283
  creator: blazer_user && q.try(:creator) == blazer_user ? "You" : q.try(:creator).try(Blazer.user_name),
277
- hide: q.name.gsub(/\s+/, ""),
278
- vars: extract_vars(q.statement).join(", ")
284
+ vars: extract_vars(q.statement).join(", "),
285
+ to_param: q.to_param
279
286
  }
280
287
  end
281
288
  end
@@ -6,10 +6,7 @@ module Blazer
6
6
  validates :query_id, presence: true
7
7
 
8
8
  before_validation :set_state
9
-
10
- def set_state
11
- self.state ||= "new"
12
- end
9
+ before_validation :fix_emails
13
10
 
14
11
  def split_emails
15
12
  emails.to_s.downcase.split(",").map(&:strip)
@@ -65,5 +62,17 @@ module Blazer
65
62
  end
66
63
  save! if changed?
67
64
  end
65
+
66
+ private
67
+
68
+ def set_state
69
+ self.state ||= "new"
70
+ end
71
+
72
+ def fix_emails
73
+ # some people like doing ; instead of ,
74
+ # but we know what they mean, so let's fix it
75
+ self.emails = emails.gsub(";", ",") if emails.present?
76
+ end
68
77
  end
69
78
  end
@@ -0,0 +1,102 @@
1
+ <% if @bind_vars.any? %>
2
+ <form id="bind" method="get" action="<%= action %>" class="form-inline" style="margin-bottom: 10px;">
3
+ <% date_vars = ["start_time", "end_time"] %>
4
+ <% if (date_vars - @bind_vars).empty? %>
5
+ <% @bind_vars = @bind_vars - date_vars %>
6
+ <% else %>
7
+ <% date_vars = nil %>
8
+ <% end %>
9
+
10
+ <% @bind_vars.each_with_index do |var, i| %>
11
+ <%= label_tag var, var %>
12
+ <% if (data = @smart_vars[var]) %>
13
+ <%= select_tag var, options_for_select([[nil, nil]] + data, selected: params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
14
+ <script>
15
+ $("#<%= var %>").selectize({
16
+ create: true
17
+ });
18
+ </script>
19
+ <% else %>
20
+ <%= text_field_tag var, params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !params[var], class: "form-control" %>
21
+ <% if var.end_with?("_at") %>
22
+ <script>
23
+ $("#<%= var %>").daterangepicker({singleDatePicker: true, locale: {format: "YYYY-MM-DD"}, autoUpdateInput: false});
24
+ // hack to start with empty date
25
+ $("#<%= var %>").on("apply.daterangepicker", function(ev, picker) {
26
+ $(this).val(picker.startDate.format("YYYY-MM-DD"));
27
+ $(this).change();
28
+ });
29
+ </script>
30
+ <% end %>
31
+ <% end %>
32
+ <% end %>
33
+
34
+ <% if date_vars %>
35
+ <% date_vars.each do |var| %>
36
+ <%= hidden_field_tag var, params[var] %>
37
+ <% end %>
38
+
39
+ <%= label_tag nil, date_vars.join(" & ") %>
40
+ <div class="selectize-control single" style="width: 300px;">
41
+ <div id="reportrange" class="selectize-input" style="display: inline-block;">
42
+ <span>Select a time range</span>
43
+ </div>
44
+ </div>
45
+
46
+ <script>
47
+ var timeZone = "<%= Blazer.time_zone.tzinfo.name %>";
48
+ var format = "YYYY-MM-DD";
49
+ var now = moment.tz(timeZone);
50
+
51
+ function dateStr(daysAgo) {
52
+ return now.clone().subtract(daysAgo || 0, "days").format(format);
53
+ }
54
+
55
+ function toDate(time) {
56
+ return moment.tz(time.format(format), timeZone);
57
+ }
58
+
59
+ function setTimeInputs(start, end) {
60
+ $("#start_time").val(toDate(start).utc().format());
61
+ $("#end_time").val(toDate(end).endOf("day").utc().format());
62
+ }
63
+
64
+ $('#reportrange').daterangepicker(
65
+ {
66
+ ranges: {
67
+ "Today": [dateStr(), dateStr()],
68
+ "Last 7 Days": [dateStr(6), dateStr()],
69
+ "Last 30 Days": [dateStr(29), dateStr()]
70
+ },
71
+ locale: {
72
+ format: format
73
+ },
74
+ startDate: dateStr(29),
75
+ endDate: dateStr(),
76
+ opens: "right"
77
+ },
78
+ function(start, end) {
79
+ setTimeInputs(start, end);
80
+ submitIfCompleted($("#start_time").closest("form"));
81
+ }
82
+ ).on('apply.daterangepicker', function(ev, picker) {
83
+ setTimeInputs(picker.startDate, picker.endDate);
84
+ $('#reportrange span').html(toDate(picker.startDate).format('MMMM D, YYYY') + ' - ' + toDate(picker.endDate).format('MMMM D, YYYY'));
85
+ })
86
+
87
+ if ($("#start_time").val().length > 0) {
88
+ var picker = $("#reportrange").data('daterangepicker');
89
+ picker.setStartDate(moment.tz($("#start_time").val(), timeZone));
90
+ picker.setEndDate(moment.tz($("#end_time").val(), timeZone));
91
+ $("#reportrange").trigger('apply.daterangepicker', picker)
92
+ } else {
93
+ var picker = $("#reportrange").data('daterangepicker');
94
+ $("#reportrange").trigger('apply.daterangepicker', picker);
95
+ submitIfCompleted($("#start_time").closest("form"));
96
+ }
97
+ </script>
98
+ <% end %>
99
+
100
+ <input type="submit" class="btn btn-success" value="Run" style="vertical-align: top;" />
101
+ </form>
102
+ <% end %>
@@ -66,5 +66,6 @@
66
66
  <%= link_to "Delete", check_path(@check), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger" %>
67
67
  <% end %>
68
68
  <%= f.submit "Save", class: "btn btn-success" %>
69
+ <%= link_to "Back", :back, class: "btn btn-link" %>
69
70
  </p>
70
71
  <% end %>
@@ -32,7 +32,7 @@
32
32
  </td>
33
33
  <td style="text-align: right; padding: 1px;">
34
34
  <%= link_to "Edit", edit_check_path(check), class: "btn btn-info" %>
35
- <%= link_to "Run Now", run_check_path(check), target: "_blank", class: "btn btn-primary" %>
35
+ <%= link_to "Run Now", query_path(check.query), class: "btn btn-primary" %>
36
36
  </td>
37
37
  </tr>
38
38
  <% end %>
@@ -43,9 +43,10 @@
43
43
  </div>
44
44
  <p>
45
45
  <% if @dashboard.persisted? %>
46
- <%= link_to "Delete", dashboard_path(@dashboard), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger" %>
46
+ <%= link_to "Delete", dashboard_path(@dashboard), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger"%>
47
47
  <% end %>
48
48
  <%= f.submit "Save", class: "btn btn-success" %>
49
+ <%= link_to "Back", :back, class: "btn btn-link" %>
49
50
  </p>
50
51
  <% end %>
51
52
 
@@ -54,20 +55,4 @@
54
55
  $(this).parents("li:first").remove();
55
56
  });
56
57
  Sortable.create($(".list-group").get(0));
57
-
58
- // $("form").submit( function () {
59
- // var query_ids = $("li").map( function () {
60
- // return $(this).attr("data-query-id");
61
- // });
62
- // console.log(query_ids.join(","));
63
- // return false;
64
- // });
65
-
66
- // var editableList = Sortable.create($(".list-group").get(0), {
67
- // filter: '.js-remove',
68
- // onFilter: function (evt) {
69
- // var el = editableList.closest(evt.item); // get dragged item
70
- // el && el.parentNode.removeChild(el);
71
- // }
72
- // });
73
58
  </script>
@@ -25,101 +25,7 @@
25
25
  </p>
26
26
  <% end %>
27
27
 
28
- <% if @bind_vars.any? %>
29
- <form id="bind" method="get" action="<%= dashboard_path(@dashboard, variable_params) %>" class="form-inline" style="margin-bottom: 10px;">
30
- <% date_vars = ["start_time", "end_time"] %>
31
- <% if (date_vars - @bind_vars).empty? %>
32
- <% @bind_vars = @bind_vars - date_vars %>
33
- <% else %>
34
- <% date_vars = nil %>
35
- <% end %>
36
-
37
- <% @bind_vars.each_with_index do |var, i| %>
38
- <%= label_tag var, var %>
39
- <% if (data = @smart_vars[var]) %>
40
- <%= select_tag var, options_for_select([[nil, nil]] + data, selected: params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
41
- <script>
42
- $("#<%= var %>").selectize({
43
- create: true
44
- });
45
- </script>
46
- <% else %>
47
- <%= text_field_tag var, params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !params[var], class: "form-control" %>
48
- <% if var.end_with?("_at") %>
49
- <script>
50
- $("#<%= var %>").daterangepicker({singleDatePicker: true, locale: {format: "YYYY-MM-DD"}});
51
- </script>
52
- <% end %>
53
- <% end %>
54
- <% end %>
55
-
56
- <% if date_vars %>
57
- <% date_vars.each do |var| %>
58
- <%= hidden_field_tag var, params[var] %>
59
- <% end %>
60
-
61
- <%= label_tag nil, date_vars.join(" & ") %>
62
- <div class="selectize-control single" style="width: 300px;">
63
- <div id="reportrange" class="selectize-input" style="display: inline-block;">
64
- <span>Select a time range</span>
65
- </div>
66
- </div>
67
-
68
- <script>
69
- var timeZone = "<%= Blazer.time_zone.tzinfo.name %>";
70
- var format = "YYYY-MM-DD";
71
- var now = moment.tz(timeZone);
72
-
73
- function dateStr(daysAgo) {
74
- return now.clone().subtract(daysAgo || 0, "days").format(format);
75
- }
76
-
77
- function toDate(time) {
78
- return moment.tz(time.format(format), timeZone);
79
- }
80
-
81
- function setTimeInputs(start, end) {
82
- $("#start_time").val(toDate(start).utc().format());
83
- $("#end_time").val(toDate(end).endOf("day").utc().format());
84
- }
85
-
86
- $('#reportrange').daterangepicker(
87
- {
88
- ranges: {
89
- "Today": [dateStr(), dateStr()],
90
- "Last 7 Days": [dateStr(6), dateStr()],
91
- "Last 30 Days": [dateStr(29), dateStr()]
92
- },
93
- locale: {
94
- format: format
95
- },
96
- startDate: dateStr(29),
97
- endDate: dateStr(),
98
- opens: "left"
99
- },
100
- function(start, end) {
101
- setTimeInputs(start, end);
102
- submitIfCompleted($("#start_time").closest("form"));
103
- }
104
- ).on('apply.daterangepicker', function(ev, picker) {
105
- setTimeInputs(picker.startDate, picker.endDate);
106
- $('#reportrange span').html(toDate(picker.startDate).format('MMMM D, YYYY') + ' - ' + toDate(picker.endDate).format('MMMM D, YYYY'));
107
- })
108
-
109
- if ($("#start_time").val().length > 0) {
110
- var picker = $("#reportrange").data('daterangepicker');
111
- picker.setStartDate(moment.tz($("#start_time").val(), timeZone));
112
- picker.setEndDate(moment.tz($("#end_time").val(), timeZone));
113
- $("#reportrange").trigger('apply.daterangepicker', picker)
114
- } else {
115
- var picker = $("#reportrange").data('daterangepicker');
116
- $("#reportrange").trigger('apply.daterangepicker', picker);
117
- submitIfCompleted($("#start_time").closest("form"));
118
- }
119
- </script>
120
- <% end %>
121
- </form>
122
- <% end %>
28
+ <%= render partial: "blazer/variables", locals: {action: dashboard_path(@dashboard)} %>
123
29
 
124
30
  <% @queries.each_with_index do |query, i| %>
125
31
  <div style="padding-top: 10px; clear: both;">
@@ -139,9 +45,3 @@
139
45
  });
140
46
  </script>
141
47
  <% end %>
142
-
143
- <script>
144
- $(".form-inline input, .form-inline select").change( function () {
145
- submitIfCompleted($(this).closest("form"));
146
- });
147
- </script>