Add the typeahead implementation we already use for the package search
to the merge target text field. Instead of suggesting packages, suggest
package base names.

Signed-off-by: Lukas Fleischer <[email protected]>
---
 web/html/pkgmerge.php        | 17 +++++++++++++++++
 web/lib/aurjson.class.php    | 28 ++++++++++++++++++++++++++--
 web/template/pkgreq_form.php | 13 +++++++++++++
 3 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/web/html/pkgmerge.php b/web/html/pkgmerge.php
index 6a3b3c5..df97a2a 100644
--- a/web/html/pkgmerge.php
+++ b/web/html/pkgmerge.php
@@ -36,6 +36,23 @@ if (has_credential(CRED_PKGBASE_DELETE)): ?>
                        <?php if (isset($_GET['via'])): ?>
                        <input type="hidden" name="via" value="<?= 
intval($_GET['via']) ?>" />
                        <?php endif; ?>
+                       <script type="text/javascript" 
src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js";></script>
+                       <script type="text/javascript" 
src="/js/bootstrap-typeahead.min.js"></script>
+                       <script type="text/javascript">
+                       $(document).ready(function() {
+                               $('#merge_Into').typeahead({
+                                       source: function(query, callback) {
+                                               $.getJSON('<?= get_uri('/rpc'); 
?>', {type: "suggest-pkgbase", arg: query}, function(data) {
+                                                       callback(data);
+                                               });
+                                       },
+                                       matcher: function(item) { return true; 
},
+                                       sorter: function(items) { return items; 
},
+                                       menu: '<ul 
class="pkgsearch-typeahead"></ul>',
+                                       items: 20
+                               }).attr('autocomplete', 'off');
+                       });
+                       </script>
                        <p><label for="merge_Into" ><?= __("Merge into:") 
?></label>
                        <input type="text" id="merge_Into" name="merge_Into" 
value="<?= isset($_GET['into']) ? $_GET['into'] : '' ?>" /></p>
                        <p><input type="checkbox" name="confirm_Delete" 
value="1" />
diff --git a/web/lib/aurjson.class.php b/web/lib/aurjson.class.php
index 8187bef..b31143e 100644
--- a/web/lib/aurjson.class.php
+++ b/web/lib/aurjson.class.php
@@ -13,7 +13,8 @@ class AurJSON {
        private $dbh = false;
        private $version = 1;
        private static $exposed_methods = array(
-               'search', 'info', 'multiinfo', 'msearch', 'suggest'
+               'search', 'info', 'multiinfo', 'msearch', 'suggest',
+               'suggest-pkgbase'
        );
        private static $fields_v1 = array(
                'Packages.ID', 'Packages.Name',
@@ -74,7 +75,8 @@ class AurJSON {
 
                $this->dbh = DB::connect();
 
-               $json = call_user_func(array(&$this, $http_data['type']), 
$http_data['arg']);
+               $type = str_replace('-', '_', $http_data['type']);
+               $json = call_user_func(array(&$this, $type), $http_data['arg']);
 
                $etag = md5($json);
                header("Etag: \"$etag\"");
@@ -404,5 +406,27 @@ class AurJSON {
 
                return json_encode($result_array);
        }
+
+       /*
+        * Get all package base names that start with $search.
+        *
+        * @param string $search Search string.
+        *
+        * @return string The JSON formatted response data.
+        */
+       private function suggest_pkgbase($search) {
+               $query = 'SELECT Name FROM PackageBases WHERE Name LIKE ' .
+                       $this->dbh->quote(addcslashes($search, '%_') . '%') .
+                       ' ORDER BY Name ASC LIMIT 20';
+
+               $result = $this->dbh->query($query);
+               $result_array = array();
+
+               if ($result) {
+                       $result_array = $result->fetchAll(PDO::FETCH_COLUMN, 0);
+               }
+
+               return json_encode($result_array);
+       }
 }
 
diff --git a/web/template/pkgreq_form.php b/web/template/pkgreq_form.php
index cc45f29..623c247 100644
--- a/web/template/pkgreq_form.php
+++ b/web/template/pkgreq_form.php
@@ -23,6 +23,7 @@
                                </select>
                        </p>
                        <script type="text/javascript" 
src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js";></script>
+                       <script type="text/javascript" 
src="/js/bootstrap-typeahead.min.js"></script>
                        <script type="text/javascript">
                        function showHideMergeSection() {
                                if ($('#id_type').val() == 'merge') {
@@ -34,6 +35,18 @@
 
                        $(document).ready(function() {
                                showHideMergeSection();
+
+                               $('#id_merge_into').typeahead({
+                                       source: function(query, callback) {
+                                               $.getJSON('<?= get_uri('/rpc'); 
?>', {type: "suggest-pkgbase", arg: query}, function(data) {
+                                                       callback(data);
+                                               });
+                                       },
+                                       matcher: function(item) { return true; 
},
+                                       sorter: function(items) { return items; 
},
+                                       menu: '<ul 
class="pkgsearch-typeahead"></ul>',
+                                       items: 20
+                               }).attr('autocomplete', 'off');
                        });
                        </script>
                        <p id="merge_section">
-- 
2.0.2

Reply via email to