sql-jarvis 2.0.9 → 2.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/blazer/main.js +4 -3
  3. data/app/helpers/blazer/base_helper.rb +1 -1
  4. data/app/views/blazer/_nav.html.haml +12 -0
  5. data/app/views/blazer/{_variables.html.erb → _variables.html.haml} +35 -57
  6. data/app/views/blazer/check_mailer/failing_checks.html.haml +6 -0
  7. data/app/views/blazer/check_mailer/state_change.html.haml +31 -0
  8. data/app/views/blazer/checks/_form.html.haml +51 -0
  9. data/app/views/blazer/checks/edit.html.haml +2 -0
  10. data/app/views/blazer/checks/index.html.haml +48 -0
  11. data/app/views/blazer/checks/new.html.haml +2 -0
  12. data/app/views/blazer/dashboards/_form.html.haml +64 -0
  13. data/app/views/blazer/dashboards/edit.html.haml +2 -0
  14. data/app/views/blazer/dashboards/new.html.haml +2 -0
  15. data/app/views/blazer/dashboards/show.html.haml +33 -0
  16. data/app/views/blazer/queries/{_form.html.erb → _form.html.haml} +54 -81
  17. data/app/views/blazer/queries/_tips.html.haml +92 -0
  18. data/app/views/blazer/queries/docs.html.haml +115 -0
  19. data/app/views/blazer/queries/edit.html.haml +2 -0
  20. data/app/views/blazer/queries/{home.html.erb → home.html.haml} +38 -58
  21. data/app/views/blazer/queries/new.html.haml +2 -0
  22. data/app/views/blazer/queries/run.html.haml +153 -0
  23. data/app/views/blazer/queries/schema.html.haml +43 -0
  24. data/app/views/blazer/queries/show.html.haml +50 -0
  25. data/app/views/layouts/blazer/application.html.haml +19 -0
  26. data/lib/blazer/version.rb +1 -1
  27. metadata +38 -24
  28. data/app/views/blazer/_nav.html.erb +0 -15
  29. data/app/views/blazer/check_mailer/failing_checks.html.erb +0 -6
  30. data/app/views/blazer/check_mailer/state_change.html.erb +0 -47
  31. data/app/views/blazer/checks/_form.html.erb +0 -79
  32. data/app/views/blazer/checks/edit.html.erb +0 -3
  33. data/app/views/blazer/checks/index.html.erb +0 -69
  34. data/app/views/blazer/checks/new.html.erb +0 -3
  35. data/app/views/blazer/dashboards/_form.html.erb +0 -76
  36. data/app/views/blazer/dashboards/edit.html.erb +0 -3
  37. data/app/views/blazer/dashboards/new.html.erb +0 -3
  38. data/app/views/blazer/dashboards/show.html.erb +0 -51
  39. data/app/views/blazer/queries/_tips.html.erb +0 -69
  40. data/app/views/blazer/queries/docs.html.erb +0 -131
  41. data/app/views/blazer/queries/edit.html.erb +0 -2
  42. data/app/views/blazer/queries/new.html.erb +0 -2
  43. data/app/views/blazer/queries/run.html.erb +0 -202
  44. data/app/views/blazer/queries/schema.html.erb +0 -58
  45. data/app/views/blazer/queries/show.html.erb +0 -76
  46. data/app/views/layouts/blazer/application.html.erb +0 -25
@@ -0,0 +1,43 @@
1
+ - blazer_title "Schema: #{@data_source.name}"
2
+ %h1
3
+ Schema: #{@data_source.name}
4
+ %hr/
5
+ #header
6
+ %input#search.search.form-control{:placeholder => "Start typing a table or column", :style => "width: 300px; display: inline-block;", :type => "text"}/
7
+ - @schema.each do |table|
8
+ %table.table.schema-table
9
+ %thead
10
+ %tr
11
+ %th{:colspan => "2"}
12
+ = table[:table]
13
+ - if table[:schema] != "public"
14
+ %span.text-muted{:style => "font-weight: normal;"}= table[:schema]
15
+ %tbody
16
+ - table[:columns].each do |column|
17
+ %tr
18
+ %td{:style => "width: 60%;"}= column[:name]
19
+ %td.text-muted= column[:data_type]
20
+ :javascript
21
+ $("#search").on("keyup", function() {
22
+ var value = $(this).val().toLowerCase()
23
+ $(".schema-table").filter(function() {
24
+ // if found in table name, show entire table
25
+ // if just found in rows, show row
26
+
27
+ var found = $(this).find("thead").text().toLowerCase().indexOf(value) > -1
28
+
29
+ if (found) {
30
+ $(this).find("tbody tr").toggle(true)
31
+ } else {
32
+ $(this).find("tbody tr").filter(function() {
33
+ var found2 = $(this).text().toLowerCase().indexOf(value) > -1
34
+ $(this).toggle(found2)
35
+ if (found2) {
36
+ found = true
37
+ }
38
+ })
39
+ }
40
+
41
+ $(this).toggle(found)
42
+ })
43
+ }).focus()
@@ -0,0 +1,50 @@
1
+ - blazer_title @query.name
2
+ .topbar
3
+ .container
4
+ .row{:style => "padding-top: 13px;"}
5
+ .col-sm-8
6
+ = render partial: "blazer/nav"
7
+ %h3{:style => "line-height: 34px; display: inline; margin-left: 5px;"}
8
+ = @query.name
9
+ .col-sm-4.text-right
10
+ = link_to "Edit", edit_query_path(@query, variable_params), class: "btn btn-default", disabled: !@query.editable?(blazer_user)
11
+ = 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"
12
+ - if !@error && @success
13
+ = button_to "⤓ .csv", run_queries_path(query_id: @query.id, format: "csv", forecast: params[:forecast]), params: {statement: @statement}, class: "btn btn-primary"
14
+ = button_to "⤓ .xlsx", run_queries_path(query_id: @query.id, format: "xlsx"), params: {statement: @statement}, class: "btn btn-primary"
15
+ %div{:style => "margin-bottom: 60px;"}
16
+ - if @sql_errors.any?
17
+ .alert.alert-danger
18
+ %ul
19
+ - @sql_errors.each do |message|
20
+ %li= message
21
+ - if @query.description.present?
22
+ %p= @query.description
23
+ = render partial: "blazer/variables", locals: {action: query_path(@query)}
24
+ %pre#code
25
+ %code= @statement
26
+ - if @success
27
+ #results
28
+ %p.text-muted Loading...
29
+ :javascript
30
+ function showRun(data) {
31
+ $("#results").html(data);
32
+ $("#results table").stupidtable().stickyTableHeaders({
33
+ fixedOffset: 60,
34
+ });
35
+ }
36
+
37
+ function showError(message) {
38
+ $("#results").addClass("query-error").html(message);
39
+ }
40
+
41
+ #{blazer_js_var "data", variable_params.merge(statement: @statement, query_id: @query.id, data_source: @query.data_source)}
42
+
43
+ runQuery(data, showRun, showError)
44
+ - unless %w(mongodb).include?(Blazer.data_sources[@query.data_source].adapter)
45
+ :javascript
46
+ // do not highlight really long queries
47
+ // this can lead to performance issues
48
+ if ($("code").text().length < 10000) {
49
+ hljs.highlightBlock(document.getElementById("code"));
50
+ }
@@ -0,0 +1,19 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
5
+ %title= blazer_title ? blazer_title : "Blazer"
6
+ %meta{:charset => "utf-8"}/
7
+ = favicon_link_tag "blazer/favicon.png"
8
+ = stylesheet_link_tag "blazer/application"
9
+ = javascript_include_tag "blazer/application"
10
+ :javascript
11
+ #{blazer_js_var "rootPath", root_path}
12
+ %script{:crossorigin => "anonymous", :defer => "defer", :integrity => "sha384-DJ25uNYET2XCl5ZF++U8eNxPWqcKohUUBUpKGlNLMchM7q4Wjg2CUpjHLaL8yYPH", :src => "https://use.fontawesome.com/releases/v5.8.2/js/all.js"}
13
+ - if blazer_maps?
14
+ = stylesheet_link_tag "https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.css", integrity: "sha384-o8tecBIfqi9yU5yYK2Ne/9A9hlOGFV9MBvCpmemvJH1XxqOe6h8Bl4mLxMi6PgjG", crossorigin: "anonymous"
15
+ = javascript_include_tag "https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.js", integrity: "sha384-j81LqvtvYigFzGSUgAoFijpvoq4yGoCJSOXI9DFaUEpenR029MBE3E/X5Gr+WdO0", crossorigin: "anonymous"
16
+ = csrf_meta_tags
17
+ %body
18
+ .container
19
+ = yield
@@ -1,3 +1,3 @@
1
1
  module Blazer
2
- VERSION = '2.0.9'
2
+ VERSION = '2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql-jarvis
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.9
4
+ version: '2.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-27 00:00:00.000000000 Z
11
+ date: 2019-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: haml-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: zip-zip
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -201,28 +215,28 @@ files:
201
215
  - app/models/blazer/dashboard_query.rb
202
216
  - app/models/blazer/query.rb
203
217
  - app/models/blazer/record.rb
204
- - app/views/blazer/_nav.html.erb
205
- - app/views/blazer/_variables.html.erb
206
- - app/views/blazer/check_mailer/failing_checks.html.erb
207
- - app/views/blazer/check_mailer/state_change.html.erb
208
- - app/views/blazer/checks/_form.html.erb
209
- - app/views/blazer/checks/edit.html.erb
210
- - app/views/blazer/checks/index.html.erb
211
- - app/views/blazer/checks/new.html.erb
212
- - app/views/blazer/dashboards/_form.html.erb
213
- - app/views/blazer/dashboards/edit.html.erb
214
- - app/views/blazer/dashboards/new.html.erb
215
- - app/views/blazer/dashboards/show.html.erb
216
- - app/views/blazer/queries/_form.html.erb
217
- - app/views/blazer/queries/_tips.html.erb
218
- - app/views/blazer/queries/docs.html.erb
219
- - app/views/blazer/queries/edit.html.erb
220
- - app/views/blazer/queries/home.html.erb
221
- - app/views/blazer/queries/new.html.erb
222
- - app/views/blazer/queries/run.html.erb
223
- - app/views/blazer/queries/schema.html.erb
224
- - app/views/blazer/queries/show.html.erb
225
- - app/views/layouts/blazer/application.html.erb
218
+ - app/views/blazer/_nav.html.haml
219
+ - app/views/blazer/_variables.html.haml
220
+ - app/views/blazer/check_mailer/failing_checks.html.haml
221
+ - app/views/blazer/check_mailer/state_change.html.haml
222
+ - app/views/blazer/checks/_form.html.haml
223
+ - app/views/blazer/checks/edit.html.haml
224
+ - app/views/blazer/checks/index.html.haml
225
+ - app/views/blazer/checks/new.html.haml
226
+ - app/views/blazer/dashboards/_form.html.haml
227
+ - app/views/blazer/dashboards/edit.html.haml
228
+ - app/views/blazer/dashboards/new.html.haml
229
+ - app/views/blazer/dashboards/show.html.haml
230
+ - app/views/blazer/queries/_form.html.haml
231
+ - app/views/blazer/queries/_tips.html.haml
232
+ - app/views/blazer/queries/docs.html.haml
233
+ - app/views/blazer/queries/edit.html.haml
234
+ - app/views/blazer/queries/home.html.haml
235
+ - app/views/blazer/queries/new.html.haml
236
+ - app/views/blazer/queries/run.html.haml
237
+ - app/views/blazer/queries/schema.html.haml
238
+ - app/views/blazer/queries/show.html.haml
239
+ - app/views/layouts/blazer/application.html.haml
226
240
  - config/routes.rb
227
241
  - lib/blazer.rb
228
242
  - lib/blazer/adapters/athena_adapter.rb
@@ -1,15 +0,0 @@
1
- <div class="btn-group" style="vertical-align: top; margin-right: 5px;">
2
- <%= link_to "Home", root_path, class: "btn btn-primary" %>
3
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
4
- <span class="caret"></span>
5
- <span class="sr-only">Toggle Dropdown</span>
6
- </button>
7
- <ul class="dropdown-menu">
8
- <li><%= link_to "Checks", checks_path %></li>
9
- <li role="separator" class="divider"></li>
10
- <li><%= link_to "New Query", new_query_path %></li>
11
- <li><%= link_to "New Dashboard", new_dashboard_path %></li>
12
- <% check_params = @query ? {query_id: @query.id} : {} %>
13
- <li><%= link_to "New Check", new_check_path(check_params) %></li>
14
- </ul>
15
- </div>
@@ -1,6 +0,0 @@
1
- <ul>
2
- <% @checks.each do |check| %>
3
- <li><%= link_to check.query.name, query_url(check.query_id, host: Blazer.host) %> <%= check.state %></li>
4
- <% end %>
5
- </ul>
6
- <p><%= link_to "Manage checks", checks_url(host: Blazer.host) %></p>
@@ -1,47 +0,0 @@
1
- <html>
2
- <head>
3
- </head>
4
- <body style="font-family: 'Helvetica Neue', Arial, Helvetica; font-size: 14px; color: #333;">
5
- <p><%= link_to "View", query_url(@check.query_id, host: Blazer.host) %></p>
6
- <% if @error %>
7
- <p><%= @error %></p>
8
- <% elsif @rows_count > 0 && @check_type == "bad_data" %>
9
- <p>
10
- <% if @rows_count <= 10 %>
11
- <%= pluralize(@rows_count, "row") %>
12
- <% else %>
13
- Showing 10 of <%= @rows_count %> rows
14
- <% end %>
15
- </p>
16
- <table style="width: 100%; border-spacing: 0; border-collapse: collapse;">
17
- <thead>
18
- <tr>
19
- <% @columns.first(5).each do |column| %>
20
- <th style="padding: 8px; line-height: 1.4; text-align: left; vertical-align: bottom; border-bottom: 2px solid #ddd; width: <%= (100 / @columns.size).round(2) %>%;">
21
- <%= column %>
22
- </th>
23
- <% end %>
24
- </tr>
25
- </thead>
26
- <tbody>
27
- <% @rows.first(10).each do |row| %>
28
- <tr>
29
- <% @columns.first(5).each_with_index do |column, i| %>
30
- <td style="padding: 8px; line-height: 1.4; vertical-align: top; border-top: 1px solid #ddd;">
31
- <% value = row[i] %>
32
- <% if @column_types[i] == "time" && value.to_s.length > 10 %>
33
- <% value = Time.parse(value).in_time_zone(Blazer.time_zone) rescue value %>
34
- <% end %>
35
- <%= value %>
36
- </td>
37
- <% end %>
38
- </tr>
39
- <% end %>
40
- </tbody>
41
- </table>
42
- <% if @columns.size > 5 %>
43
- <p style="color: #999;">Only first 5 columns shown</p>
44
- <% end %>
45
- <% end %>
46
- </body>
47
- </html>
@@ -1,79 +0,0 @@
1
- <%= form_for @check, html: {class: "small-form"} do |f| %>
2
- <% unless @check.respond_to?(:check_type) || @check.respond_to?(:invert) %>
3
- <p class="text-muted">Checks are designed to identify bad data. A check fails if there are any results.</p>
4
- <% end %>
5
-
6
- <% if @check.errors.any? %>
7
- <div class="alert alert-danger"><%= @check.errors.full_messages.first %></div>
8
- <% end %>
9
-
10
- <div class="form-group">
11
- <%= f.label :query_id, "Query" %>
12
- <div class="hide">
13
- <%= f.select :query_id, [], {include_blank: true} %>
14
- </div>
15
- <script>
16
- <%= blazer_js_var "queries", Blazer::Query.named.order(:name).select("id, name").map { |q| {text: q.name, value: q.id} } %>
17
- <%= blazer_js_var "items", [@check.query_id].compact %>
18
-
19
- $("#check_query_id").selectize({options: queries, items: items, highlight: false, maxOptions: 100}).parents(".hide").removeClass("hide");
20
- </script>
21
- </div>
22
-
23
- <% if @check.respond_to?(:check_type) %>
24
- <div class="form-group">
25
- <%= f.label :check_type, "Alert if" %>
26
- <div class="hide">
27
- <% check_options = [["Any results (bad data)", "bad_data"], ["No results (missing data)", "missing_data"]] %>
28
- <% check_options << ["Anomaly (most recent data point)", "anomaly"] if Blazer.anomaly_checks %>
29
- <%= f.select :check_type, check_options %>
30
- </div>
31
- <script>
32
- $("#check_check_type").selectize({}).parent().removeClass("hide");
33
- </script>
34
- </div>
35
- <% elsif @check.respond_to?(:invert) %>
36
- <div class="form-group">
37
- <%= f.label :invert, "Fails if" %>
38
- <div class="hide">
39
- <%= f.select :invert, [["Any results (bad data)", false], ["No results (missing data)", true]] %>
40
- </div>
41
- <script>
42
- $("#check_invert").selectize({}).parent().removeClass("hide");
43
- </script>
44
- </div>
45
- <% end %>
46
-
47
- <% if @check.respond_to?(:schedule) && Blazer.check_schedules %>
48
- <div class="form-group">
49
- <%= f.label :schedule, "Run every" %>
50
- <div class="hide">
51
- <%= f.select :schedule, Blazer.check_schedules.map { |v| [v, v] } %>
52
- </div>
53
- <script>
54
- $("#check_schedule").selectize({}).parent().removeClass("hide");
55
- </script>
56
- </div>
57
- <% end %>
58
-
59
- <div class="form-group">
60
- <%= f.label :emails %>
61
- <%= f.text_field :emails, placeholder: "Optional, comma separated", class: "form-control" %>
62
- </div>
63
-
64
- <% if Blazer.slack? %>
65
- <div class="form-group">
66
- <%= f.label :slack_channels %>
67
- <%= f.text_field :slack_channels, placeholder: "Optional, comma separated", class: "form-control" %>
68
- </div>
69
- <% end %>
70
-
71
- <p class="text-muted">Emails <%= Blazer.slack? ? "and Slack notifications " : nil %>are sent when a check starts failing, and when it starts passing again.
72
- <p>
73
- <% if @check.persisted? %>
74
- <%= link_to "Delete", check_path(@check), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger" %>
75
- <% end %>
76
- <%= f.submit "Save", class: "btn btn-success" %>
77
- <%= link_to "Back", :back, class: "btn btn-link" %>
78
- </p>
79
- <% end %>
@@ -1,3 +0,0 @@
1
- <% blazer_title "Edit Check" %>
2
-
3
- <%= render partial: "form" %>
@@ -1,69 +0,0 @@
1
- <% blazer_title "Checks" %>
2
-
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
- <li role="separator" class="divider"></li>
14
- <li><%= link_to "New Query", new_query_path %></li>
15
- <li><%= link_to "New Dashboard", new_dashboard_path %></li>
16
- </ul>
17
- </div>
18
- </div>
19
-
20
- <input id="search" type="text" placeholder="Start typing a query or state" style="width: 300px; display: inline-block;" class="search form-control" />
21
- </div>
22
-
23
- <table id="checks" class="table">
24
- <thead>
25
- <tr>
26
- <th>Query</th>
27
- <th style="width: 10%;">State</th>
28
- <th style="width: 10%;">Run</th>
29
- <th style="width: 20%;">Notify</th>
30
- <th style="width: 15%;"></th>
31
- </tr>
32
- </thead>
33
- <tbody>
34
- <% @checks.each do |check| %>
35
- <tr>
36
- <td><%= link_to check.query.name, check.query %> <span class="text-muted"><%= check.try(:check_type).to_s.gsub("_", " ") %></span></td>
37
- <td>
38
- <% if check.state %>
39
- <small class="check-state <%= check.state.parameterize.gsub("-", "_") %>"><%= check.state.upcase %></small>
40
- <% end %>
41
- </td>
42
- <td><%= check.schedule if check.respond_to?(:schedule) %></td>
43
- <td>
44
- <ul class="list-unstyled" style="margin-bottom: 0; word-break: break-all;">
45
- <% check.split_emails.each do |email| %>
46
- <li><%= email %></li>
47
- <% end %>
48
- <% check.split_slack_channels.each do |channel| %>
49
- <li><%= channel %></li>
50
- <% end %>
51
- </ul>
52
- </td>
53
- <td style="text-align: right; padding: 1px;">
54
- <%= link_to "Edit", edit_check_path(check), class: "btn btn-info" %>
55
- <%= link_to "Run Now", query_path(check.query), class: "btn btn-primary" %>
56
- </td>
57
- </tr>
58
- <% end %>
59
- </tbody>
60
- </table>
61
-
62
- <script>
63
- $("#search").on("keyup", function() {
64
- var value = $(this).val().toLowerCase()
65
- $("#checks tbody tr").filter( function() {
66
- $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
67
- })
68
- }).focus()
69
- </script>
@@ -1,3 +0,0 @@
1
- <% blazer_title "New Check" %>
2
-
3
- <%= render partial: "form" %>
@@ -1,76 +0,0 @@
1
- <%= form_for @dashboard, url: (@dashboard.persisted? ? dashboard_path(@dashboard, variable_params) : dashboards_path(variable_params)), html: {id: "app", class: "small-form"} do |f| %>
2
- <% if @dashboard.errors.any? %>
3
- <div class="alert alert-danger"><%= @dashboard.errors.full_messages.first %></div>
4
- <% end %>
5
-
6
- <div class="form-group">
7
- <%= f.label :name %>
8
- <%= f.text_field :name, class: "form-control" %>
9
- </div>
10
- <div class="form-group" v-show="queries.length">
11
- <%= f.label :charts %>
12
- <ul id="queries" class="list-group">
13
- <li class="list-group-item" v-for="(query, index) in queries" :key="query.id" v-cloak>
14
- <span class="glyphicon glyphicon-remove" aria-hidden="true" v-on:click="remove(index)"></span>
15
- {{ query.name }}
16
- <input type="hidden" name="query_ids[]" :value="query.id">
17
- </li>
18
- </ul>
19
- </div>
20
- <div class="form-group" v-cloak>
21
- <%= f.label :query_id, "Add Chart" %>
22
- <%= select_tag :query_id, nil, {include_blank: true, placeholder: "Select chart"} %>
23
- </div>
24
- <p style="padding-bottom: 140px;" v-cloak>
25
- <% if @dashboard.persisted? %>
26
- <%= link_to "Delete", dashboard_path(@dashboard), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger"%>
27
- <% end %>
28
- <%= f.submit "Save", class: "btn btn-success" %>
29
- <%= link_to "Back", :back, class: "btn btn-link" %>
30
- </p>
31
- <% end %>
32
-
33
- <script>
34
- <%= blazer_js_var "queries", Blazer::Query.named.order(:name).select("id, name").map { |q| {text: q.name, value: q.id} } %>
35
- <%= blazer_js_var "dashboardQueries", @queries || @dashboard.dashboard_queries.order(:position).map(&:query) %>
36
-
37
- var app = new Vue({
38
- el: "#app",
39
- data: {
40
- queries: dashboardQueries
41
- },
42
- methods: {
43
- remove: function(index) {
44
- this.queries.splice(index, 1)
45
- }
46
- },
47
- mounted: function() {
48
- $("#query_id").selectize({
49
- options: queries,
50
- highlight: false,
51
- maxOptions: 100,
52
- onChange: function(val) {
53
- if (val) {
54
- var item = this.getItem(val)
55
-
56
- // if duplicate query is added, remove the first one
57
- for (var i = 0; i < app.queries.length; i++) {
58
- if (app.queries[i].id == val) {
59
- app.queries.splice(i, 1)
60
- break
61
- }
62
- }
63
-
64
- app.queries.push({id: val, name: item.text()})
65
- this.setValue("")
66
- }
67
- }
68
- })
69
- }
70
- })
71
- Sortable.create($("#queries").get(0), {
72
- onEnd: function(e) {
73
- app.queries.splice(e.newIndex, 0, app.queries.splice(e.oldIndex, 1)[0])
74
- }
75
- })
76
- </script>