From d180cf3bcde676f55e75895efc38368f3ee8b8ac Mon Sep 17 00:00:00 2001
From: Peter Rotich <protich@gmail.com>
Date: Mon, 26 Mar 2012 10:34:49 -0400
Subject: [PATCH] Add typeahead on basic ticket search

---
 include/ajax.tickets.php      | 28 +++++++++++++++-------------
 include/staff/tickets.inc.php |  2 +-
 scp/ajax.php                  |  2 +-
 scp/js/scp.js                 | 17 +++++++++++++++++
 4 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index 2eff8924b..6fb369d73 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -22,30 +22,32 @@ class TicketsAjaxAPI extends AjaxController {
    
     function search() {
 
-        $limit = isset($_GET['limit']) ? (int) $_GET['limit']:25;
+        $limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit']:25;
         $items=array();
         $ticketid=false;
-        if(isset($_GET['id'])){
-            $WHERE=' WHERE ticketID LIKE \''.db_input($_GET['id'], false).'%\'';
+        if(is_numeric($_REQUEST['q'])) {
+            $WHERE=' WHERE ticketID LIKE \''.db_input($_REQUEST['q'], false).'%\'';
             $ticketid=true;
-        }elseif(isset($_GET['email'])){
-            $WHERE=' WHERE email LIKE \''.db_input(strtolower($_GET['email']), false).'%\'';
-        }else{
-            Http::response(400, "id or email argument is required");
+        } elseif(isset($_REQUEST['q'])) {
+            $WHERE=' WHERE email LIKE \''.db_input(strtolower($_REQUEST['q']), false).'%\'';
+        } else {
+            Http::response(400, 'Query argument is required');
         }
-        $sql='SELECT DISTINCT ticketID,email,name FROM '.TICKET_TABLE.' '.$WHERE.' ORDER BY created LIMIT '.$limit;
-        $res=db_query($sql);
-        if($res && db_num_rows($res)){
+        $sql='SELECT DISTINCT ticketID, email, name '
+            .' FROM '.TICKET_TABLE.' '.$WHERE
+            .' ORDER BY created '
+            .' LIMIT '.$limit;
+
+        if(($res=db_query($sql)) && db_num_rows($res)){
             while(list($id,$email,$name)=db_fetch_row($res)) {
                 $info=($ticketid)?$email:$id;
                 $id=($ticketid)?$id:$email;
-                # TODO: Return 'name' from email address if 'email' argument
-                #       specified?
                 $items[] = array('id'=>$id, 'value'=>$id, 'info'=>$info,
                                  'name'=>$name);
             }
         }
-        return $this->encode(array('results'=>$items));
+
+        return $this->encode($items);
     }
 
     function acquireLock($tid) {
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index d0b27690e..3bfc8156a 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -254,7 +254,7 @@ $basic_display=!isset($_REQUEST['advance_search'])?true:false;
     <input type="hidden" name="a" value="search">
     <table>
         <tr>
-            <td><input type="text" id="query" name="query" size=30 value="<?php echo Format::htmlchars($_REQUEST['query']); ?>"></td>
+            <td><input type="text" id="ticket-search" name="query" size=30 value="<?php echo Format::htmlchars($_REQUEST['query']); ?>"></td>
             <td><input type="submit" name="basic_search" class="button" value="Search"></td>
         </tr>
     </table>
diff --git a/scp/ajax.php b/scp/ajax.php
index a65de32d2..7c66da27c 100644
--- a/scp/ajax.php
+++ b/scp/ajax.php
@@ -45,7 +45,7 @@ $dispatcher = patterns("",
     url("^/config/", patterns("ajax.config.php:ConfigAjaxAPI",
         url_get("^ui",'ui')
     )),
-    url_get("^/ticket$", array("ajax.tickets.php:TicketsAjaxAPI", "search")),
+    url_get("^/tickets$", array("ajax.tickets.php:TicketsAjaxAPI", "search")),
     url("^/ticket/", patterns("ajax.tickets.php:TicketsAjaxAPI",
         url_get("^(?P<tid>\d+)/preview", "previewTicket"),
         url_get("^(?P<tid>\d+)/lock", "acquireLock"),
diff --git a/scp/js/scp.js b/scp/js/scp.js
index 4f6109052..10b8d7331 100644
--- a/scp/js/scp.js
+++ b/scp/js/scp.js
@@ -185,4 +185,21 @@ $(document).ready(function(){
         }
     }
 
+    /* Typeahead init */
+    $('#ticket-search').typeahead({
+        source: function (typeahead, query) {
+            $.ajax({
+                url: "ajax.php/tickets?q="+query,
+                dataType: 'json',
+                success: function (data) {
+                    typeahead.process(data);
+                }
+            });
+        },
+        onselect: function (obj) {
+            $('#ticket-search').closest('form').submit();
+        },
+        property: "value"
+    });
+
 });
-- 
GitLab