_form.html.erb 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <% if @dashboard.errors.any? %>
  2. <div class="alert alert-danger"><%= @dashboard.errors.full_messages.first %></div>
  3. <% end %>
  4. <%= form_for @dashboard, url: (@dashboard.persisted? ? dashboard_path(@dashboard, variable_params) : dashboards_path(variable_params)), html: {id: "app"} do |f| %>
  5. <div class="form-group">
  6. <%= f.label :name %>
  7. <%= f.text_field :name, class: "form-control" %>
  8. </div>
  9. <div class="form-group">
  10. <%= f.label :charts %>
  11. <ul id="queries" class="list-group">
  12. <li class="list-group-item" v-for="(query, index) in queries" :key="query.id" v-cloak>
  13. <span class="glyphicon glyphicon-remove" aria-hidden="true" v-on:click="remove(index)"></span>
  14. {{ query.name }}
  15. <input type="hidden" name="query_ids[]" :value="query.id">
  16. </li>
  17. </ul>
  18. </div>
  19. <div class="form-group" v-cloak>
  20. <%= f.label :query_id, "Add Chart" %>
  21. <%= select_tag :query_id, nil, {include_blank: true, placeholder: "Select chart"} %>
  22. </div>
  23. <p style="padding-bottom: 140px;">
  24. <% if @dashboard.persisted? %>
  25. <%= link_to "Delete", dashboard_path(@dashboard), method: :delete, "data-confirm" => "Are you sure?", class: "btn btn-danger"%>
  26. <% end %>
  27. <%= f.submit "Save", class: "btn btn-success" %>
  28. <%= link_to "Back", :back, class: "btn btn-link" %>
  29. </p>
  30. <% end %>
  31. <script>
  32. <%= blazer_js_var "queries", Blazer::Query.named.order(:name).select("id, name").map { |q| {text: q.name, value: q.id} } %>
  33. <%= blazer_js_var "dashboardQueries", @queries || @dashboard.dashboard_queries.order(:position).map(&:query) %>
  34. var app = new Vue({
  35. el: "#app",
  36. data: {
  37. queries: dashboardQueries
  38. },
  39. methods: {
  40. remove: function(index) {
  41. this.queries.splice(index, 1)
  42. }
  43. },
  44. mounted: function() {
  45. $("#query_id").selectize({
  46. options: queries,
  47. highlight: false,
  48. maxOptions: 100,
  49. onChange: function(val) {
  50. if (val) {
  51. var item = this.getItem(val)
  52. // if duplicate query is added, remove the first one
  53. for (var i = 0; i < app.queries.length; i++) {
  54. if (app.queries[i].id == val) {
  55. app.queries.splice(i, 1)
  56. break
  57. }
  58. }
  59. app.queries.push({id: val, name: item.text()})
  60. this.setValue("")
  61. }
  62. }
  63. })
  64. }
  65. })
  66. Sortable.create($("#queries").get(0), {
  67. onEnd: function(e) {
  68. app.queries.splice(e.newIndex, 0, app.queries.splice(e.oldIndex, 1)[0])
  69. }
  70. })
  71. </script>