run.html.erb 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <% if @error %>
  2. <div class="alert alert-danger"><%= @error %></div>
  3. <% elsif !@success %>
  4. <% if @only_chart %>
  5. <p class="text-muted">Select variables</p>
  6. <% else %>
  7. <div class="alert alert-info">Can’t preview queries with variables...yet!</div>
  8. <% end %>
  9. <% else %>
  10. <% unless @only_chart %>
  11. <% if @cached_at || @data_source.cache %>
  12. <p class="text-muted" style="float: right;">
  13. <% if @cached_at %>
  14. Cached <%= time_ago_in_words(@cached_at, include_seconds: true) %> ago
  15. <% elsif !params[:data_source] %>
  16. Cached just now
  17. <% end %>
  18. <% if @query && !params[:data_source] %>
  19. <%= link_to "Refresh", refresh_query_path(@query, variable_params), method: :post %>
  20. <% end %>
  21. </p>
  22. <% end %>
  23. <p class="text-muted"><%= pluralize(@rows.size, "row") %></p>
  24. <% end %>
  25. <% if @rows.any? %>
  26. <% values = @rows.first.values %>
  27. <% chart_id = SecureRandom.hex %>
  28. <% column_types = blazer_column_types(@columns, @rows, @boom) %>
  29. <% chart_options = {id: chart_id, min: nil} %>
  30. <% if (target_index = @columns.keys.map(&:downcase).index("target")) %>
  31. <% chart_options[:library] = {series: {(target_index - 1) => {pointSize: 0, lineWidth: 3, color: "#109618"}}} %>
  32. <% end %>
  33. <% if blazer_maps? && @markers.any? %>
  34. <div id="map" style="height: <%= @only_chart ? 300 : 500 %>px;"></div>
  35. <script>
  36. L.mapbox.accessToken = '<%= ENV["MAPBOX_ACCESS_TOKEN"] %>';
  37. var map = L.mapbox.map('map', 'ankane.ioo8nki0');
  38. var markers = <%= blazer_json_escape(@markers.to_json).html_safe %>;
  39. var featureLayer = L.mapbox.featureLayer().addTo(map);
  40. var geojson = [];
  41. for (var i = 0; i < markers.length; i++) {
  42. var marker = markers[i];
  43. geojson.push({
  44. type: 'Feature',
  45. geometry: {
  46. type: 'Point',
  47. coordinates: [
  48. marker.longitude,
  49. marker.latitude
  50. ]
  51. },
  52. properties: {
  53. description: marker.title,
  54. 'marker-color': '#f86767',
  55. 'marker-size': 'medium'
  56. }
  57. });
  58. }
  59. featureLayer.setGeoJSON(geojson);
  60. map.fitBounds(featureLayer.getBounds());
  61. </script>
  62. <% elsif values.size >= 2 && column_types.compact == ["time"] + (column_types.compact.size - 1).times.map { "numeric" } %>
  63. <% time_k = @columns.keys.first %>
  64. <%= line_chart @columns.keys[1..-1].map{|k| {name: k, data: @rows.map{|r| [r[time_k], r[k]] }} }, chart_options %>
  65. <% elsif values.size == 3 && column_types == ["time", "string", "numeric"] %>
  66. <% keys = @columns.keys %>
  67. <%= line_chart @rows.group_by { |r| k = keys[1]; v = r[k]; (@boom[k] || {})[v.to_s] || v }.map { |name, v| {name: name, data: v.map { |v2| [v2[keys[0]], v2[keys[2]]] } } }, chart_options %>
  68. <% elsif values.size >= 2 && column_types == ["string"] + (values.size - 1).times.map { "numeric" } %>
  69. <% keys = @columns.keys %>
  70. <%= column_chart (values.size - 1).times.map { |i| name = @columns.keys[i + 1]; {name: name, data: @rows.first(20).map { |r| [(@boom[keys[0]] || {})[r[keys[0]].to_s] || r[keys[0]], r[keys[i + 1]]] } } }, id: chart_id %>
  71. <% elsif @only_chart %>
  72. <% if @rows.size == 1 && @rows.first.size == 1 %>
  73. <p style="font-size: 160px;"><%= blazer_format_value(@rows.first.keys.first, @rows.first.values.first) %></p>
  74. <% else %>
  75. <% @no_chart = true %>
  76. <% end %>
  77. <% end %>
  78. <% unless @only_chart && !@no_chart %>
  79. <% header_width = 100 / @rows.first.keys.size.to_f %>
  80. <div class="results-container">
  81. <table class="table results-table" style="margin-bottom: 0;">
  82. <thead>
  83. <tr>
  84. <% @columns.each do |key, type| %>
  85. <th style="width: <%= header_width %>%;" data-sort="<%= type %>">
  86. <div style="min-width: <%= @min_width_types.include?(key) ? 180 : 60 %>px;">
  87. <%= key %>
  88. </div>
  89. </th>
  90. <% end %>
  91. </tr>
  92. </thead>
  93. <tbody>
  94. <% @rows.each do |row| %>
  95. <tr>
  96. <% row.each do |k, v| %>
  97. <td>
  98. <% if v.is_a?(Time) %>
  99. <% v = v.in_time_zone(Blazer.time_zone) %>
  100. <% end %>
  101. <% unless v.nil? %>
  102. <% if v == "" %>
  103. <div class="text-muted">empty string</div>
  104. <% elsif @linked_columns[k] %>
  105. <%= link_to blazer_format_value(k, v), @linked_columns[k].gsub("{value}", u(v.to_s)), target: "_blank" %>
  106. <% else %>
  107. <%= blazer_format_value(k, v) %>
  108. <% end %>
  109. <% if v2 = (@boom[k] || {})[v.to_s] %>
  110. <div class="text-muted"><%= v2 %></div>
  111. <% end %>
  112. <% end %>
  113. </td>
  114. <% end %>
  115. </tr>
  116. <% end %>
  117. </tbody>
  118. </table>
  119. </div>
  120. <% end %>
  121. <% elsif @only_chart %>
  122. <p class="text-muted">No rows</p>
  123. <% end %>
  124. <% end %>