PageRenderTime 52ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/web/search.php

https://bitbucket.org/dhobsd/mtrack
PHP | 257 lines | 232 code | 24 blank | 1 comment | 15 complexity | 74c27b2ba6354f929b9b464e936f775a MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. <?php # vim:ts=2:sw=2:et:
  2. /* For licensing and copyright terms, see the file named LICENSE */
  3. include '../inc/common.php';
  4. $q = $_GET['q'];
  5. $quick = MTrackSearchDB::expand_quick_link($q);
  6. if ($quick) {
  7. header("Location: " . $quick[1]);
  8. exit;
  9. }
  10. mtrack_head("Search");
  11. ?>
  12. <h1>Search</h1>
  13. <input type="text" id="searchq" size="50" placeholder="Type here to search">
  14. <div>
  15. <input type="checkbox" id="only_open_tickets" value="1"
  16. <?php
  17. if (isset($_GET['only_open_tickets'])) {
  18. echo "checked='checked'";
  19. }
  20. ?>
  21. >
  22. Restrict search to open tickets
  23. </div>
  24. <p>
  25. Search the full-text index.
  26. Read more about <a class='wikilink' href="<?php echo $ABSWEB ; ?>help.php/Searching">Searching</a>.
  27. <button data-toggle='collapse' data-target='#fieldsummary'
  28. type='button' class='btn'>Show Fields</button>
  29. </p>
  30. <p>
  31. You may also
  32. use the <a href="<?php echo $ABSWEB ?>query.php">Custom Ticket Query</a>
  33. page to create a report on the fly.
  34. </p>
  35. <div id='fieldsummary' class='collapse'>
  36. <p>The following fields are available for targeted searching:</p>
  37. <table>
  38. <tr>
  39. <th>Item</th>
  40. <th>Field</th>
  41. <th>Description</th>
  42. </tr>
  43. <tr>
  44. <td>Ticket</td>
  45. <td>summary</td>
  46. <td>The one-line ticket summary</td>
  47. </tr>
  48. <tr>
  49. <td>Ticket</td>
  50. <td>description</td>
  51. <td>The ticket description</td>
  52. </tr>
  53. <tr>
  54. <td>Ticket</td>
  55. <td>changelog</td>
  56. <td>The changelog field</td>
  57. </tr>
  58. <tr>
  59. <td>Ticket</td>
  60. <td>keyword</td>
  61. <td>The keyword field</td>
  62. </tr>
  63. <tr>
  64. <td>Ticket</td>
  65. <td>date</td>
  66. <td>The last-changed date</td>
  67. </tr>
  68. <tr>
  69. <td>Ticket</td>
  70. <td>who</td>
  71. <td>who last changed the ticket</td>
  72. </tr>
  73. <tr>
  74. <td>Ticket</td>
  75. <td>creator</td>
  76. <td>who opened the ticket</td>
  77. </tr>
  78. <tr>
  79. <td>Ticket</td>
  80. <td>created</td>
  81. <td>The date that the ticket was created</td>
  82. </tr>
  83. <tr>
  84. <td>Ticket</td>
  85. <td>owner</td>
  86. <td>who is responsible for the ticket</td>
  87. </tr>
  88. <tr>
  89. <td>Comment</td>
  90. <td>description</td>
  91. <td>The comment text</td>
  92. </tr>
  93. <tr>
  94. <td>Comment</td>
  95. <td>date</td>
  96. <td>Date the comment was made</td>
  97. </tr>
  98. <tr>
  99. <td>Comment</td>
  100. <td>who</td>
  101. <td>who made that comment</td>
  102. </tr>
  103. <tr>
  104. <td>Wiki</td>
  105. <td>wiki</td>
  106. <td>The content from the wiki page</td>
  107. </tr>
  108. <tr>
  109. <td>Wiki</td>
  110. <td>who</td>
  111. <td>Who last changed that wiki page</td>
  112. </tr>
  113. <tr>
  114. <td>Wiki</td>
  115. <td>date</td>
  116. <td>Date the wiki page was last changed</td>
  117. </tr>
  118. <?php
  119. $CF = MTrackTicket_CustomFields::getInstance();
  120. foreach ($CF->getFields() as $f) {
  121. echo "<tr><td>Ticket</td><td>$f->name</td><td>",
  122. htmlentities($f->label, ENT_QUOTES, 'utf-8'),
  123. "</td></tr>\n";
  124. }
  125. ?>
  126. </table>
  127. </div>
  128. </form>
  129. <?php
  130. if (strlen($q)) {
  131. $userq = $q;
  132. if (isset($_GET['only_open_tickets'])) {
  133. $q = "+type:ticket -status:closed +($q)";
  134. }
  135. $results = MTrackAPI::invoke('GET', '/search/query', null, array(
  136. 'q' => $q
  137. ))->result;
  138. } else {
  139. $results = null;
  140. $userq = "";
  141. }
  142. $results = json_encode($results);
  143. $userq = json_encode($userq);
  144. ?>
  145. <ul id="results" class="searchresults"></ul>
  146. <script type="text/template" id='obj-template'>
  147. <%= link %>
  148. <% _.each(hits, function (hit) { %>
  149. <%= hit.excerpt %>
  150. <% }); %>
  151. </script>
  152. <?php
  153. echo <<<HTML
  154. <script>
  155. $(document).ready(function () {
  156. var results = $results;
  157. var t = _.template($('#obj-template').html());
  158. function show_list(res) {
  159. var ul = $('#results');
  160. ul.empty();
  161. if (res) {
  162. _.each(res.results, function (obj) {
  163. var li = $("<li/>");
  164. li.html(t(obj));
  165. ul.append(li);
  166. });
  167. }
  168. if (!res || !res.results.length) {
  169. var li = $("<li/>");
  170. li.text("No matching results");
  171. ul.append(li);
  172. }
  173. }
  174. show_list(results);
  175. var ajax = null;
  176. function search(q) {
  177. if (!q.length) {
  178. show_list({results:[]});
  179. return;
  180. }
  181. if ($('#only_open_tickets').attr('checked')) {
  182. q = "+type:ticket -status:closed +(" + q + ")";
  183. }
  184. ajax = $.ajax({
  185. url: ABSWEB + 'api.php/search/query',
  186. dataType: 'json',
  187. data: {
  188. q: q
  189. },
  190. success: function (data) {
  191. show_list(data);
  192. },
  193. error: function (xhr, text, err) {
  194. var li = $("<li/>");
  195. li.text(err);
  196. $('#results').empty().append(li);
  197. },
  198. complete: function (xhr, text) {
  199. ajax = null;
  200. }
  201. });
  202. }
  203. var S = $('#searchq');
  204. S.val($userq);
  205. S.attr('autocomplete', 'off');
  206. var timer = null;
  207. var lastval = $userq;
  208. function trigger_search() {
  209. var q = S.val();
  210. if (ajax) {
  211. ajax.abort();
  212. ajax = null;
  213. }
  214. clearTimeout(timer);
  215. timer = setTimeout(function () {
  216. search(q);
  217. }, 250);
  218. }
  219. S.bind('keyup.mtrack', function () {
  220. var q = $(this).val();
  221. if (lastval == q) {
  222. return;
  223. }
  224. lastval = q;
  225. trigger_search();
  226. });
  227. $('#only_open_tickets').click(function () {
  228. trigger_search();
  229. });
  230. });
  231. </script>
  232. HTML;
  233. mtrack_foot();