thomascube
2011-10-10 dc6c4f4a28652f428a507b0335f418749cdbc3bd
Contact groups can have direct email addresses => distribution lists; enable 'compose' command for the selected group

5 files modified
99 ■■■■ changed files
program/include/rcube_addressbook.php 12 ●●●●● patch | view | raw | blame | history
program/include/rcube_contacts.php 33 ●●●● patch | view | raw | blame | history
program/js/app.js 9 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/mailto.inc 32 ●●●● patch | view | raw | blame | history
program/steps/mail/autocomplete.inc 13 ●●●● patch | view | raw | blame | history
program/include/rcube_addressbook.php
@@ -296,6 +296,18 @@
    }
    /**
     * Get group properties such as name and email address(es)
     *
     * @param string Group identifier
     * @return array Group properties as hash array
     */
    function get_group($group_id)
    {
        /* empty for address books don't supporting groups */
        return null;
    }
    /**
     * Create a contact group with the given name
     *
     * @param string The group name
program/include/rcube_contacts.php
@@ -164,6 +164,29 @@
    /**
     * Get group properties such as name and email address(es)
     *
     * @param string Group identifier
     * @return array Group properties as hash array
     */
    function get_group($group_id)
    {
        $sql_result = $this->db->query(
            "SELECT * FROM ".get_table_name($this->db_groups).
            " WHERE del<>1".
            " AND contactgroup_id=?".
            " AND user_id=?",
            $group_id, $this->user_id);
        if ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
            $sql_arr['ID'] = $sql_arr['contactgroup_id'];
            return $sql_arr;
        }
        return null;
    }
    /**
     * List the current set of contact records
     *
     * @param  array   List of cols to show, Null means all
@@ -774,8 +797,9 @@
        $sql_result = $this->db->query(
            "UPDATE ".get_table_name($this->db_groups).
            " SET del=1, changed=".$this->db->now().
            " WHERE contactgroup_id=?",
            $gid
            " WHERE contactgroup_id=?".
            " AND user_id=?",
            $gid, $this->user_id
        );
        $this->cache = null;
@@ -799,8 +823,9 @@
        $sql_result = $this->db->query(
            "UPDATE ".get_table_name($this->db_groups).
            " SET name=?, changed=".$this->db->now().
            " WHERE contactgroup_id=?",
            $name, $gid
            " WHERE contactgroup_id=?".
            " AND user_id=?",
            $name, $gid, $this->user_id
        );
        return $this->db->affected_rows() ? $name : false;
program/js/app.js
@@ -845,7 +845,9 @@
          }
          if (a_cids.length)
            this.http_post('mailto', {_cid: a_cids.join(','), _source: this.env.source}, true);
            this.http_post('mailto', { _cid: a_cids.join(','), _source: this.env.source}, true);
          else if (this.env.group)
            this.http_post('mailto', { _gid: this.env.group, _source: this.env.source}, true);
          break;
        }
@@ -3882,7 +3884,7 @@
      }
    }
    this.enable_command('compose', list.selection.length > 0);
    this.enable_command('compose', this.env.group || list.selection.length > 0);
    this.enable_command('edit', id && writable);
    this.enable_command('delete', list.selection.length && writable);
@@ -3968,7 +3970,8 @@
  {
    this.contact_list.clear(true);
    this.show_contentframe(false);
    this.enable_command('delete', 'compose', false);
    this.enable_command('delete', false);
    this.enable_command('compose', this.env.group ? true : false);
  };
  // load contact record
program/steps/addressbook/mailto.inc
@@ -21,6 +21,7 @@
$cids   = rcmail_get_cids();
$mailto = array();
$recipients = null;
foreach ($cids as $source => $cid)
{
@@ -31,11 +32,34 @@
        $CONTACTS->set_page(1);
        $CONTACTS->set_pagesize(count($cid) + 2); // +2 to skip counting query
        $recipients = $CONTACTS->search($CONTACTS->primary_key, $cid, false, true, true, 'email');
    }
}
        while (is_object($recipients) && ($rec = $recipients->iterate())) {
            $emails = $CONTACTS->get_col_values('email', $rec, true);
            $mailto[] = format_email_recipient($emails[0], $rec['name']);
        }
if (!empty($_REQUEST['_gid']) && isset($_REQUEST['_source']))
{
    $source = get_input_value('_source', RCUBE_INPUT_GPC);
    $CONTACTS = $RCMAIL->get_address_book($source);
    $group_id = get_input_value('_gid', RCUBE_INPUT_GPC);
    $group_data = $CONTACTS->get_group($group_id);
    // group has an email address assigned: use that
    if ($group_data['email']) {
        $mailto[] = format_email_recipient($group_data['email'][0], $group_data['name']);
    }
    else if ($CONTACTS->ready) {
        $CONTACTS->set_group($group_id);
        $CONTACTS->set_page(1);
        $CONTACTS->set_pagesize(200); // limit somehow
        $recipients = $CONTACTS->list_records();
    }
}
if ($recipients)
{
    while (is_object($recipients) && ($rec = $recipients->iterate())) {
        $emails = $CONTACTS->get_col_values('email', $rec, true);
        $mailto[] = format_email_recipient($emails[0], $rec['name']);
    }
}
program/steps/mail/autocomplete.inc
@@ -85,9 +85,18 @@
      foreach ($abook->list_groups($search) as $group) {
        $abook->reset();
        $abook->set_group($group['ID']);
        $result = $abook->count();
        $group_prop = $abook->get_group($group['ID']);
        if ($result->count) {
        // group (distribution list) with email address(es)
        if ($group_prop['email']) {
            foreach ((array)$group_prop['email'] as $email) {
                $contacts[] = format_email_recipient($email, $group['name']);
                if (count($contacts) >= $MAXNUM)
                  break 2;
            }
        }
        // show group with count
        else if (($result = $abook->count()) && $result->count) {
          $contacts[] = array('name' => $group['name'] . ' (' . intval($result->count) . ')', 'id' => $group['ID'], 'source' => $id);
          if (count($contacts) >= $MAXNUM)
            break;