Make email recipients separator configurable + suppress dupes in auto-completion

pull/1/head
thomascube 13 years ago
parent 9230525d98
commit 62c8618744

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Make email recipients separator configurable
- Fix so folders with \Noinferiors attribute aren't listed in parent selector - Fix so folders with \Noinferiors attribute aren't listed in parent selector
- Fix handling of curly brackets in URLs (#1488168) - Fix handling of curly brackets in URLs (#1488168)
- Fix handling of dates (birthday/anniversary) in contact data (#1488147) - Fix handling of dates (birthday/anniversary) in contact data (#1488147)

@ -5,7 +5,7 @@
| Main configuration file | | Main configuration file |
| | | |
| This file is part of the Roundcube Webmail client | | This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2010, The Roundcube Dev Team | | Copyright (C) 2005-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL | | Licensed under the GNU GPL |
| | | |
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
@ -460,6 +460,9 @@ $rcmail_config['spellcheck_ignore_nums'] = false;
// Makes that words with symbols will be ignored (e.g. g@@gle) // Makes that words with symbols will be ignored (e.g. g@@gle)
$rcmail_config['spellcheck_ignore_syms'] = false; $rcmail_config['spellcheck_ignore_syms'] = false;
// Use this char/string to separate recipients when composing a new message
$rcmail_config['recipients_separator'] = ',';
// don't let users set pagesize to more than this value if set // don't let users set pagesize to more than this value if set
$rcmail_config['max_pagesize'] = 200; $rcmail_config['max_pagesize'] = 200;

@ -20,7 +20,7 @@
function rcube_webmail() function rcube_webmail()
{ {
this.env = {}; this.env = { recipients_separator:',', recipients_delimiter:', ' };
this.labels = {}; this.labels = {};
this.buttons = {}; this.buttons = {};
this.buttons_sel = {}; this.buttons_sel = {};
@ -2926,6 +2926,8 @@ function rcube_webmail()
this.init_address_input_events = function(obj, props) this.init_address_input_events = function(obj, props)
{ {
this.env.recipients_delimiter = this.env.recipients_separator + ' ';
obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); }) obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); })
.attr('autocomplete', 'off'); .attr('autocomplete', 'off');
}; };
@ -3590,13 +3592,13 @@ function rcube_webmail()
// insert all members of a group // insert all members of a group
if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) { if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) {
insert += this.env.contacts[id].name + ', '; insert += this.env.contacts[id].name + this.env.recipients_delimiter;
this.group2expand = $.extend({}, this.env.contacts[id]); this.group2expand = $.extend({}, this.env.contacts[id]);
this.group2expand.input = this.ksearch_input; this.group2expand.input = this.ksearch_input;
this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false); this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false);
} }
else if (typeof this.env.contacts[id] === 'string') { else if (typeof this.env.contacts[id] === 'string') {
insert = this.env.contacts[id] + ', '; insert = this.env.contacts[id] + this.env.recipients_delimiter;
trigger = true; trigger = true;
} }
@ -3633,7 +3635,7 @@ function rcube_webmail()
// get string from current cursor pos to last comma // get string from current cursor pos to last comma
var cpos = this.get_caret_pos(this.ksearch_input), var cpos = this.get_caret_pos(this.ksearch_input),
p = inp_value.lastIndexOf(',', cpos-1), p = inp_value.lastIndexOf(this.env.recipients_separator, cpos-1),
q = inp_value.substring(p+1, cpos), q = inp_value.substring(p+1, cpos),
min = this.env.autocomplete_min_length, min = this.env.autocomplete_min_length,
ac = this.ksearch_data; ac = this.ksearch_data;

@ -32,7 +32,8 @@ if ($RCMAIL->action == 'group-expand') {
$members[] = format_email_recipient($email, $sql_arr['name']); $members[] = format_email_recipient($email, $sql_arr['name']);
} }
$OUTPUT->command('replace_group_recipients', $gid, join(', ', $members)); $separator = trim($RCMAIL->config->get('recipients_separator', ',')) . ' ';
$OUTPUT->command('replace_group_recipients', $gid, join($separator, array_unique($members)));
} }
$OUTPUT->send(); $OUTPUT->send();
@ -70,8 +71,8 @@ if (!empty($book_types) && strlen($search)) {
if ($email_cnt > 1 && stripos($contact, $search) === false) { if ($email_cnt > 1 && stripos($contact, $search) === false) {
continue; continue;
} }
// when we've got more than one book, we need to skip duplicates // skip duplicates
if ($books_num == 1 || !in_array($contact, $contacts)) { if (!in_array($contact, $contacts)) {
$contacts[] = $contact; $contacts[] = $contact;
if (count($contacts) >= $MAXNUM) if (count($contacts) >= $MAXNUM)
break 2; break 2;

@ -5,7 +5,7 @@
| program/steps/mail/compose.inc | | program/steps/mail/compose.inc |
| | | |
| This file is part of the Roundcube Webmail client | | This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2009, The Roundcube Dev Team | | Copyright (C) 2005-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL | | Licensed under the GNU GPL |
| | | |
| PURPOSE: | | PURPOSE: |
@ -122,8 +122,9 @@ if (!empty($CONFIG['drafts_mbox'])) {
} }
// set current mailbox in client environment // set current mailbox in client environment
$OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name()); $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
$OUTPUT->set_env('sig_above', $CONFIG['sig_above']); $OUTPUT->set_env('sig_above', $RCMAIL->config->get('sig_above', false));
$OUTPUT->set_env('top_posting', $CONFIG['top_posting']); $OUTPUT->set_env('top_posting', $RCMAIL->config->get('top_posting', false));
$OUTPUT->set_env('recipients_separator', trim($RCMAIL->config->get('recipients_separator', ',')));
// get reference message and set compose mode // get reference message and set compose mode
if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) { if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) {
@ -324,6 +325,7 @@ else if (count($MESSAGE->identities)) {
// Set other headers // Set other headers
$a_recipients = array(); $a_recipients = array();
$parts = array('to', 'cc', 'bcc', 'replyto', 'followupto'); $parts = array('to', 'cc', 'bcc', 'replyto', 'followupto');
$separator = trim($RCMAIL->config->get('recipients_separator', ',')) . ' ';
foreach ($parts as $header) { foreach ($parts as $header) {
$fvalue = ''; $fvalue = '';
@ -367,7 +369,7 @@ foreach ($parts as $header) {
if ($v = $MESSAGE->headers->to) if ($v = $MESSAGE->headers->to)
$fvalue .= $v; $fvalue .= $v;
if ($v = $MESSAGE->headers->cc) if ($v = $MESSAGE->headers->cc)
$fvalue .= (!empty($fvalue) ? ', ' : '') . $v; $fvalue .= (!empty($fvalue) ? $separator : '') . $v;
} }
} }
else if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) { else if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) {
@ -410,7 +412,7 @@ foreach ($parts as $header) {
} }
} }
$fvalue = implode(', ', $fvalue); $fvalue = implode($separator, $fvalue);
} }
$MESSAGE->compose[$header] = $fvalue; $MESSAGE->compose[$header] = $fvalue;

@ -5,7 +5,7 @@
| program/steps/mail/sendmail.inc | | program/steps/mail/sendmail.inc |
| | | |
| This file is part of the Roundcube Webmail client | | This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2010, The Roundcube Dev Team | | Copyright (C) 2005-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL | | Licensed under the GNU GPL |
| | | |
| PURPOSE: | | PURPOSE: |
@ -138,22 +138,30 @@ function rcmail_fix_emoticon_paths(&$mime_message)
return $body; return $body;
} }
// parse email address input (and count addresses) /**
* Parse and cleanup email address input (and count addresses)
*
* @param string Address input
* @param boolean Do count recipients (saved in global $RECIPIENT_COUNT)
* @param boolean Validate addresses (errors saved in global $EMAIL_FORMAT_ERROR)
* @return string Canonical recipients string separated by comma
*/
function rcmail_email_input_format($mailto, $count=false, $check=true) function rcmail_email_input_format($mailto, $count=false, $check=true)
{ {
global $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT; global $RCMAIL, $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT;
// simplified email regexp, supporting quoted local part // simplified email regexp, supporting quoted local part
$email_regexp = '(\S+|("[^"]+"))@\S+'; $email_regexp = '(\S+|("[^"]+"))@\S+';
$regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m', '/;/', '/(\S{1})(<'.$email_regexp.'>)/U'); $delim = trim($RCMAIL->config->get('recipients_separator', ','));
$replace = array(', ', ', ', '', ',', '\\1 \\2'); $regexp = array("/[,;$delim]\s*[\r\n]+/", '/[\r\n]+/', "/[,;$delim]\s*\$/m", '/;/', '/(\S{1})(<'.$email_regexp.'>)/U');
$replace = array($delim.' ', ', ', '', $delim, '\\1 \\2');
// replace new lines and strip ending ', ', make address input more valid // replace new lines and strip ending ', ', make address input more valid
$mailto = trim(preg_replace($regexp, $replace, $mailto)); $mailto = trim(preg_replace($regexp, $replace, $mailto));
$result = array(); $result = array();
$items = rcube_explode_quoted_string(',', $mailto); $items = rcube_explode_quoted_string($delim, $mailto);
foreach($items as $item) { foreach($items as $item) {
$item = trim($item); $item = trim($item);
@ -168,16 +176,9 @@ function rcmail_email_input_format($mailto, $count=false, $check=true)
// address with name (handle name) // address with name (handle name)
} else if (preg_match('/<*'.$email_regexp.'>*$/', $item, $matches)) { } else if (preg_match('/<*'.$email_regexp.'>*$/', $item, $matches)) {
$address = $matches[0]; $address = $matches[0];
$name = str_replace($address, '', $item); $name = trim(str_replace($address, '', $item), '" ');
$name = trim($name);
if ($name && ($name[0] != '"' || $name[strlen($name)-1] != '"')
&& preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name)) {
$name = '"'.addcslashes($name, '"').'"';
}
$address = rcube_idn_to_ascii(trim($address, '<>')); $address = rcube_idn_to_ascii(trim($address, '<>'));
$address = '<' . $address . '>'; $result[] = format_email_recipient($address, $name);
$result[] = $name.' '.$address;
$item = $address; $item = $address;
} else if (trim($item)) { } else if (trim($item)) {
continue; continue;

Loading…
Cancel
Save