diff --git a/plugins/libkolab/js/folderlist.js b/plugins/libkolab/js/folderlist.js index 274d57f9..00882a8f 100644 --- a/plugins/libkolab/js/folderlist.js +++ b/plugins/libkolab/js/folderlist.js @@ -36,6 +36,7 @@ function kolab_folderlist(node, p) var search_results_widget; var search_results_container; var listsearch_request; + var search_messagebox; var Q = rcmail.quote_html; @@ -164,8 +165,29 @@ function kolab_folderlist(node, p) } search_results = {}; + if (search_messagebox) + rcmail.hide_message(search_messagebox); + // send search request(s) to server if (search.query && search.execute) { + // require a minimum length for the search string + if (rcmail.env.autocomplete_min_length && search.query.length < rcmail.env.autocomplete_min_length) { + search_messagebox = rcmail.display_message( + rcmail.get_label('autocompletechars').replace('$min', rcmail.env.autocomplete_min_length)); + return; + } + + if (listsearch_request) { + // ignore, let the currently runnung sequest finish + if (listsearch_request.query == search.query) { + return; + } + else { // cancel previous search request + rcmail.multi_thread_request_abort(listsearch_request.id); + listsearch_request = null; + } + } + var sources = p.search_sources || [ 'folders' ]; var reqid = rcmail.multi_thread_http_request({ items: sources, @@ -173,10 +195,15 @@ function kolab_folderlist(node, p) action: p.search_action || 'listsearch', postdata: { action:'search', q:search.query, source:'%s' }, lock: rcmail.display_message(rcmail.get_label('searching'), 'loading'), - onresponse: render_search_results + onresponse: render_search_results, + whendone: function(e){ listsearch_request = null; } }); - listsearch_request = { id:reqid, sources:sources.slice(), num:sources.length }; + listsearch_request = { id:reqid, query:search.query }; + } + else if (!search.query && listsearch_request) { + rcmail.multi_thread_request_abort(listsearch_request.id); + listsearch_request = null; } }); diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php index 1cbdd762..74c0ed36 100644 --- a/plugins/libkolab/lib/kolab_storage.php +++ b/plugins/libkolab/lib/kolab_storage.php @@ -1318,11 +1318,12 @@ class kolab_storage * @param mixed $query Search value (or array of field => value pairs) * @param int $mode Matching mode: 0 - partial (*abc*), 1 - strict (=), 2 - prefix (abc*) * @param array $required List of fields that shall ot be empty - * @param int $limit Number of records + * @param int $limit Maximum number of records + * @param int $count Returns the number of records found * * @return array List or false on error */ - public static function search_users($query, $mode = 1, $required = array(), $limit = 0) + public static function search_users($query, $mode = 1, $required = array(), $limit = 0, &$count = 0) { // requires a working LDAP setup if (!self::ldap()) { @@ -1330,7 +1331,12 @@ class kolab_storage } // search users using the configured attributes - $results = self::$ldap->search(self::$config->get('kolab_users_search_attrib', array('cn','mail','alias')), $query, $mode, $required, $limit); + $results = self::$ldap->dosearch(self::$config->get('kolab_users_search_attrib', array('cn','mail','alias')), $query, $mode, $required, $limit, $count); + + // exclude myself + if ($_SESSION['kolab_dn']) { + unset($results[$_SESSION['kolab_dn']]); + } // resolve to IMAP folder name $root = self::namespace_root('other'); @@ -1391,6 +1397,9 @@ class kolab_storage $path_len = count(explode($delimiter, $other_ns)); foreach ((array)self::list_folders($other_ns, '*', '', $subscribed) as $foldername) { + if ($foldername == 'INBOX') // skip INBOX which is added by default + continue; + // truncate folder path to top-level folders of the 'other' namespace $path = explode($delimiter, $foldername); $foldername = join($delimiter, array_slice($path, 0, $path_len + 1));