show.html.erb 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <% blazer_title @query.name %>
  2. <script>
  3. function submitIfCompleted($form) {
  4. var completed = true;
  5. $form.find("input[name], select").each( function () {
  6. if ($(this).val() == "") {
  7. completed = false;
  8. }
  9. });
  10. if (completed) {
  11. $form.submit();
  12. }
  13. }
  14. </script>
  15. <div style="position: fixed; top: 0; left: 0; right: 0; background-color: whitesmoke; height: 60px; z-index: 1001;">
  16. <div class="container">
  17. <div class="row" style="padding-top: 13px;">
  18. <div class="col-sm-9">
  19. <%= render partial: "blazer/nav" %>
  20. <h3 style="margin: 0; line-height: 34px; display: inline;">
  21. <%= @query.name %>
  22. </h3>
  23. </div>
  24. <div class="col-sm-3 text-right">
  25. <%= link_to "Edit", edit_query_path(@query, variable_params), class: "btn btn-default", disabled: !@query.editable?(blazer_user) %>
  26. <%= link_to "Fork", new_query_path(variable_params.merge(fork_query_id: @query.id, data_source: @query.data_source, name: @query.name)), class: "btn btn-info" %>
  27. <% if !@error && @success %>
  28. <%= button_to "Download", run_queries_path(query_id: @query.id, format: "csv"), params: {statement: @statement}, class: "btn btn-primary" %>
  29. <% end %>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. <div style="margin-bottom: 60px;"></div>
  35. <% if @sql_errors.any? %>
  36. <div class="alert alert-danger">
  37. <ul>
  38. <% @sql_errors.each do |message| %>
  39. <li><%= message %></li>
  40. <% end %>
  41. </ul>
  42. </div>
  43. <% end %>
  44. <% if @query.description.present? %>
  45. <p><%= @query.description %></p>
  46. <% end %>
  47. <% if @bind_vars.any? %>
  48. <form id="bind" method="get" action="<%= url_for(params) %>" class="form-inline" style="margin-bottom: 10px;">
  49. <% date_vars = ["start_time", "end_time"] %>
  50. <% if (date_vars - @bind_vars).empty? %>
  51. <% @bind_vars = @bind_vars - date_vars %>
  52. <% else %>
  53. <% date_vars = nil %>
  54. <% end %>
  55. <% @bind_vars.each_with_index do |var, i| %>
  56. <%= label_tag var, var %>
  57. <% if (data = @smart_vars[var]) %>
  58. <%= select_tag var, options_for_select([[nil, nil]] + data, selected: params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
  59. <script>
  60. $("#<%= var %>").selectize({
  61. create: true
  62. });
  63. </script>
  64. <% else %>
  65. <%= text_field_tag var, params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !params[var], class: "form-control" %>
  66. <% if var.end_with?("_at") %>
  67. <script>
  68. $("#<%= var %>").daterangepicker({singleDatePicker: true, locale: {format: "YYYY-MM-DD"}});
  69. </script>
  70. <% end %>
  71. <% end %>
  72. <% end %>
  73. <% if date_vars %>
  74. <% date_vars.each do |var| %>
  75. <%= hidden_field_tag var, params[var] %>
  76. <% end %>
  77. <%= label_tag nil, date_vars.join(" & ") %>
  78. <div class="selectize-control single" style="width: 300px;">
  79. <div id="reportrange" class="selectize-input" style="display: inline-block;">
  80. <span>Select a time range</span>
  81. </div>
  82. </div>
  83. <script>
  84. var timeZone = "<%= Blazer.time_zone.tzinfo.name %>";
  85. var format = "YYYY-MM-DD";
  86. var now = moment.tz(timeZone);
  87. function dateStr(daysAgo) {
  88. return now.clone().subtract(daysAgo || 0, "days").format(format);
  89. }
  90. function toDate(time) {
  91. return moment.tz(time.format(format), timeZone);
  92. }
  93. function setTimeInputs(start, end) {
  94. $("#start_time").val(toDate(start).utc().format());
  95. $("#end_time").val(toDate(end).endOf("day").utc().format());
  96. }
  97. $('#reportrange').daterangepicker(
  98. {
  99. ranges: {
  100. "Today": [dateStr(), dateStr()],
  101. "Last 7 Days": [dateStr(6), dateStr()],
  102. "Last 30 Days": [dateStr(29), dateStr()]
  103. },
  104. locale: {
  105. format: format
  106. },
  107. startDate: dateStr(29),
  108. endDate: dateStr(),
  109. opens: "right"
  110. },
  111. function(start, end) {
  112. setTimeInputs(start, end);
  113. submitIfCompleted($("#start_time").closest("form"));
  114. }
  115. ).on('apply.daterangepicker', function(ev, picker) {
  116. setTimeInputs(picker.startDate, picker.endDate);
  117. $('#reportrange span').html(toDate(picker.startDate).format('MMMM D, YYYY') + ' - ' + toDate(picker.endDate).format('MMMM D, YYYY'));
  118. })
  119. if ($("#start_time").val().length > 0) {
  120. var picker = $("#reportrange").data('daterangepicker');
  121. picker.setStartDate(moment.tz($("#start_time").val(), timeZone));
  122. picker.setEndDate(moment.tz($("#end_time").val(), timeZone));
  123. $("#reportrange").trigger('apply.daterangepicker', picker)
  124. } else {
  125. var picker = $("#reportrange").data('daterangepicker');
  126. $("#reportrange").trigger('apply.daterangepicker', picker);
  127. submitIfCompleted($("#start_time").closest("form"));
  128. }
  129. </script>
  130. <% end %>
  131. <input type="submit" class="btn btn-success" value="Run" style="vertical-align: top;" />
  132. </form>
  133. <% end %>
  134. <pre style="max-height: 236px; overflow: hidden;" onclick="this.style.maxHeight = 'none';"><code><%= @statement %></code></pre>
  135. <% if @success %>
  136. <div id="results">
  137. <p class="text-muted">Loading...</p>
  138. </div>
  139. <script>
  140. function showRun(data) {
  141. $("#results").html(data);
  142. $("#results table").stupidtable().stickyTableHeaders({fixedOffset: 60});
  143. }
  144. function showError(message) {
  145. $("#results").css("color", "red").html(message);
  146. }
  147. var data = <%= blazer_json_escape(variable_params.merge(statement: @statement, query_id: @query.id).to_json).html_safe %>;
  148. runQuery(data, showRun, showError);
  149. </script>
  150. <% end %>
  151. <script>
  152. // do not highlight really long queries
  153. // this can lead to performance issues
  154. if ($("code").text().length < 10000) {
  155. hljs.initHighlightingOnLoad();
  156. }
  157. $(".form-inline input, .form-inline select").change( function () {
  158. submitIfCompleted($(this).closest("form"));
  159. });
  160. </script>