diff options
| -rw-r--r-- | CHANGELOG | 1 | ||||
| -rw-r--r-- | program/js/app.js | 11 | ||||
| -rw-r--r-- | program/lib/Roundcube/rcube_addressbook.php | 50 | ||||
| -rw-r--r-- | program/lib/Roundcube/rcube_contacts.php | 25 | ||||
| -rw-r--r-- | program/lib/Roundcube/rcube_ldap.php | 17 | ||||
| -rw-r--r-- | program/steps/addressbook/search.inc | 6 | 
6 files changed, 65 insertions, 45 deletions
| @@ -1,6 +1,7 @@  CHANGELOG Roundcube Webmail  =========================== +- Fix searching by date in address book (#1488888)  - Improve charset detection by prioritizing charset according to user language (#1485669)  - Fix handling of escaped separator in vCard file (#1488896)  - Fix #countcontrols issue in IE<=8 when text is very long (#1488890) diff --git a/program/js/app.js b/program/js/app.js index 5b8c2cd2f..c627983f4 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -361,7 +361,7 @@ function rcube_webmail()          if (this.gui_objects.editform) {            this.enable_command('save', true); -          if (this.env.action == 'add' || this.env.action == 'edit') +          if (this.env.action == 'add' || this.env.action == 'edit' || this.env.action == 'search')                this.init_contact_form();          } @@ -4396,10 +4396,11 @@ function rcube_webmail()    {      var ref = this, col; -    this.set_photo_actions($('#ff_photo').val()); - -    for (col in this.env.coltypes) -      this.init_edit_field(col, null); +    if (this.env.coltypes) { +      this.set_photo_actions($('#ff_photo').val()); +      for (col in this.env.coltypes) +        this.init_edit_field(col, null); +    }      $('.contactfieldgroup .row a.deletebutton').click(function() {        ref.delete_edit_field(this); diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 98d8f98ee..ffe35097a 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -46,6 +46,7 @@ abstract class rcube_addressbook      public $sort_order = 'ASC';      public $coltypes = array('name' => array('limit'=>1), 'firstname' => array('limit'=>1), 'surname' => array('limit'=>1), 'email' => array('limit'=>1)); +    protected $date_types = array();      protected $error;      /** @@ -222,7 +223,6 @@ abstract class rcube_addressbook          return true;      } -      /**       * Create a new contact record       * @@ -407,7 +407,6 @@ abstract class rcube_addressbook          return array();      } -      /**       * Utility function to return all values of a certain data column       * either as flat list or grouped by subtype @@ -440,7 +439,6 @@ abstract class rcube_addressbook          return $out;      } -      /**       * Normalize the given string for fulltext search.       * Currently only optimized for Latin-1 characters; to be extended @@ -488,7 +486,6 @@ abstract class rcube_addressbook          return $fn;      } -      /**       * Compose the name to display in the contacts list for the given contact record.       * This respects the settings parameter how to list conacts. @@ -526,5 +523,50 @@ abstract class rcube_addressbook          return $fn;      } +    /** +     * Compare search value with contact data +     * +     * @param string       $colname Data name +     * @param string|array $value   Data value +     * @param string       $search  Search value +     * @param int          $mode    Search mode +     * +     * @return bool Comparision result +     */ +    protected function compare_search_value($colname, $value, $search, $mode) +    { +        // The value is a date string, for date we'll +        // use only strict comparison (mode = 1) +        // @TODO: partial search, e.g. match only day and month +        if (in_array($colname, $this->date_types)) { +            return (($value = rcube_utils::strtotime($value)) +                && ($search = rcube_utils::strtotime($search)) +                && date('Ymd', $value) == date('Ymd', $search)); +        } + +        // composite field, e.g. address +        foreach ((array)$value as $val) { +            $val = mb_strtolower($val); +            switch ($mode) { +            case 1: +                $got = ($val == $search); +                break; + +            case 2: +                $got = ($search == substr($val, 0, strlen($search))); +                break; + +            default: +                $got = (strpos($val, $search) !== false); +            } + +            if ($got) { +                return true; +            } +        } + +        return false; +    } +  } diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php index a98b13865..062bd1e19 100644 --- a/program/lib/Roundcube/rcube_contacts.php +++ b/program/lib/Roundcube/rcube_contacts.php @@ -45,6 +45,7 @@ class rcube_contacts extends rcube_addressbook      private $fulltext_cols = array('name', 'firstname', 'surname', 'middlename', 'nickname',        'jobtitle', 'organization', 'department', 'maidenname', 'email', 'phone',        'address', 'street', 'locality', 'zipcode', 'region', 'country', 'website', 'im', 'notes'); +    protected $date_types = array('birthday', 'anniversary');      // public properties      public $primary_key = 'contact_id'; @@ -401,32 +402,16 @@ class rcube_contacts extends rcube_addressbook              for ($i=0; $i<$pages; $i++) {                  $this->list_records(null, $i, true);                  while ($row = $this->result->next()) { -                    $id = $row[$this->primary_key]; +                    $id    = $row[$this->primary_key];                      $found = array();                      foreach (preg_grep($regexp, array_keys($row)) as $col) {                          $pos     = strpos($col, ':');                          $colname = $pos ? substr($col, 0, $pos) : $col;                          $search  = $post_search[$colname];                          foreach ((array)$row[$col] as $value) { -                            // composite field, e.g. address -                            foreach ((array)$value as $val) { -                                $val = mb_strtolower($val); -                                switch ($mode) { -                                case 1: -                                    $got = ($val == $search); -                                    break; -                                case 2: -                                    $got = ($search == substr($val, 0, strlen($search))); -                                    break; -                                default: -                                    $got = (strpos($val, $search) !== false); -                                    break; -                                } - -                                if ($got) { -                                    $found[$colname] = true; -                                    break 2; -                                } +                            if ($this->compare_search_value($colname, $value, $search, $mode)) { +                                $found[$colname] = true; +                                break 2;                              }                          }                      } diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index d4bc669fd..700c6f60c 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -794,27 +794,14 @@ class rcube_ldap extends rcube_addressbook              $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)");              // get all entries of this page and post-filter those that really match the query -            $search = mb_strtolower($value); +            $search  = mb_strtolower($value);              $entries = ldap_get_entries($this->conn, $this->ldap_result);              for ($i = 0; $i < $entries['count']; $i++) {                  $rec = $this->_ldap2result($entries[$i]);                  foreach ($fields as $f) {                      foreach ((array)$rec[$f] as $val) { -                        $val = mb_strtolower($val); -                        switch ($mode) { -                        case 1: -                            $got = ($val == $search); -                            break; -                        case 2: -                            $got = ($search == substr($val, 0, strlen($search))); -                            break; -                        default: -                            $got = (strpos($val, $search) !== false); -                            break; -                        } - -                        if ($got) { +                        if ($this->compare_search_value($f, $val, $search, $mode)) {                              $this->result->add($rec);                              $this->result->count++;                              break 2; diff --git a/program/steps/addressbook/search.inc b/program/steps/addressbook/search.inc index 851325070..bbd9b9a76 100644 --- a/program/steps/addressbook/search.inc +++ b/program/steps/addressbook/search.inc @@ -300,9 +300,13 @@ function rcmail_contact_search_form($attrib)              $label    = isset($colprop['label']) ? $colprop['label'] : rcube_label($col);              $category = $colprop['category'] ? $colprop['category'] : 'other'; -            if ($ftype == 'text') +            // load jquery UI datepicker for date fields  +            if ($colprop['type'] == 'date') +                $colprop['class'] .= ($colprop['class'] ? ' ' : '') . 'datepicker'; +            else if ($ftype == 'text')                  $colprop['size'] = $i_size; +              $content  = html::div('row', html::div('contactfieldlabel label', Q($label))                  . html::div('contactfieldcontent', rcmail_get_edit_field('search_'.$col, '', $colprop, $ftype))); | 
