home.html.erb 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <div id="queries">
  2. <div id="header" style="margin-bottom: 20px;">
  3. <div class="pull-right">
  4. <% if blazer_user %>
  5. <%= link_to "All", root_path, class: !params[:filter] ? "active" : nil, style: "margin-right: 40px;" %>
  6. <% if Blazer.audit %>
  7. <%= link_to "Viewed", root_path(filter: "viewed"), class: params[:filter] == "viewed" ? "active" : nil, style: "margin-right: 40px;" %>
  8. <% end %>
  9. <%= link_to "Mine", root_path(filter: "mine"), class: params[:filter] == "mine" ? "active" : nil, style: "margin-right: 40px;" %>
  10. <% end %>
  11. <div class="btn-group">
  12. <%= link_to "New Query", new_query_path, class: "btn btn-info" %>
  13. <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  14. <span class="caret"></span>
  15. <span class="sr-only">Toggle Dropdown</span>
  16. </button>
  17. <ul class="dropdown-menu">
  18. <li><%= link_to "Dashboards", dashboards_path %></li>
  19. <li><%= link_to "Checks", checks_path %></li>
  20. <li role="separator" class="divider"></li>
  21. <li><%= link_to "New Dashboard", new_dashboard_path %></li>
  22. <li><%= link_to "New Check", new_check_path %></li>
  23. </ul>
  24. </div>
  25. </div>
  26. <input type="text" v-model="searchTerm" placeholder="Start typing a query or person" style="width: 300px; display: inline-block;" autofocus=true class="search form-control" />
  27. </div>
  28. <table class="table">
  29. <thead>
  30. <tr>
  31. <th>Name</th>
  32. <th style="width: 20%; text-align: right;">Mastermind</th>
  33. </tr>
  34. </thead>
  35. <tbody class="list" v-cloak>
  36. <tr v-for="query in visibleItems">
  37. <td>
  38. <a :href="itemPath(query)" :class="{ dashboard: query.dashboard }">{{ query.name }}</a>
  39. <span class="vars">{{ query.vars }}</span>
  40. </td>
  41. <td class="creator">{{ query.creator }}</td>
  42. </tr>
  43. </tbody>
  44. </table>
  45. <p v-if="more" class="text-muted">Loading...</p>
  46. </div>
  47. <script>
  48. <%= blazer_js_var "dashboards", @dashboards %>
  49. <%= blazer_js_var "queries", @queries %>
  50. <%= blazer_js_var "more", @more %>
  51. var prepareSearch = function (list) {
  52. var i, q, searchStr
  53. for (i = 0; i < list.length; i++) {
  54. q = list[i]
  55. searchStr = q.name + q.creator
  56. if (q.creator === "You") {
  57. searchStr += "mine me"
  58. }
  59. q.searchStr = prepareQuery(searchStr)
  60. }
  61. }
  62. var prepareQuery = function (str) {
  63. return str.toLowerCase().replace(/\W+/g, "")
  64. }
  65. var app = new Vue({
  66. el: "#queries",
  67. data: {
  68. searchTerm: "",
  69. more: more,
  70. updateCounter: 0
  71. },
  72. created: function() {
  73. this.listItems = dashboards.concat(queries)
  74. prepareSearch(this.listItems)
  75. this.queryIds = {}
  76. for (i = 0; i < queries.length; i++) {
  77. this.queryIds[queries[i].id] = true
  78. }
  79. if (this.more) {
  80. var _this = this
  81. $.getJSON(Routes.queries_path(), function (data) {
  82. var i, j, newValues, val, size = 500;
  83. var newValues = []
  84. for (j = 0; j < data.length; j++) {
  85. val = data[j]
  86. if (val && !_this.queryIds[val.id]) {
  87. newValues.push(val)
  88. }
  89. }
  90. prepareSearch(newValues)
  91. _this.listItems = _this.listItems.concat(newValues)
  92. _this.more = false
  93. // hack to get to update
  94. _this.updateCounter++
  95. })
  96. }
  97. },
  98. computed: {
  99. visibleItems: function () {
  100. // hack to get to update
  101. this.updateCounter
  102. var pageSize = 200
  103. var q, i
  104. if (this.searchTerm.length > 0) {
  105. var term = prepareQuery(this.searchTerm)
  106. var items = []
  107. var fuzzyItems = []
  108. for (i = 0; i < this.listItems.length; i++) {
  109. q = this.listItems[i]
  110. if (q.searchStr.indexOf(term) !== -1) {
  111. items.push(q)
  112. if (items.length == pageSize) {
  113. break
  114. }
  115. } else if (fuzzysearch(term, q.searchStr)) {
  116. fuzzyItems.push(q)
  117. }
  118. }
  119. return items.concat(fuzzyItems).slice(0, pageSize)
  120. } else {
  121. return this.listItems.slice(0, pageSize)
  122. }
  123. }
  124. },
  125. methods: {
  126. itemPath: function (item) {
  127. if (item.dashboard) {
  128. return Routes.dashboard_path(item.to_param)
  129. } else {
  130. return Routes.query_path(item.to_param)
  131. }
  132. }
  133. }
  134. })
  135. </script>