From f8e48df71540b268ceac058d32b8ee848fc2ab6b Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Tue, 06 Sep 2011 12:35:14 -0400 Subject: [PATCH] - Merge devel-saved_search branch (Addressbook Saved Searches) --- program/steps/addressbook/func.inc | 165 +++++++++++++++++++++++++++++++++++------------------- 1 files changed, 106 insertions(+), 59 deletions(-) diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index a895b61..b290bbb 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -23,36 +23,36 @@ // general definition of contact coltypes $CONTACT_COLTYPES = array( - 'name' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('name'), 'category' => 'main'), - 'firstname' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('firstname'), 'category' => 'main'), - 'surname' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('surname'), 'category' => 'main'), - 'email' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('email'), 'subtypes' => array('home','work','other'), 'category' => 'main'), - 'middlename' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('middlename'), 'category' => 'main'), - 'prefix' => array('type' => 'text', 'size' => 8, 'limit' => 1, 'label' => rcube_label('nameprefix'), 'category' => 'main'), - 'suffix' => array('type' => 'text', 'size' => 8, 'limit' => 1, 'label' => rcube_label('namesuffix'), 'category' => 'main'), - 'nickname' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('nickname'), 'category' => 'main'), - 'jobtitle' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('jobtitle'), 'category' => 'main'), - 'organization' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('organization'), 'category' => 'main'), - 'department' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('department'), 'category' => 'main'), + 'name' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('name'), 'category' => 'main'), + 'firstname' => array('type' => 'text', 'size' => 19, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('firstname'), 'category' => 'main'), + 'surname' => array('type' => 'text', 'size' => 19, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('surname'), 'category' => 'main'), + 'email' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'label' => rcube_label('email'), 'subtypes' => array('home','work','other'), 'category' => 'main'), + 'middlename' => array('type' => 'text', 'size' => 19, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('middlename'), 'category' => 'main'), + 'prefix' => array('type' => 'text', 'size' => 8, 'maxlength' => 20, 'limit' => 1, 'label' => rcube_label('nameprefix'), 'category' => 'main'), + 'suffix' => array('type' => 'text', 'size' => 8, 'maxlength' => 20, 'limit' => 1, 'label' => rcube_label('namesuffix'), 'category' => 'main'), + 'nickname' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('nickname'), 'category' => 'main'), + 'jobtitle' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('jobtitle'), 'category' => 'main'), + 'organization' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('organization'), 'category' => 'main'), + 'department' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('department'), 'category' => 'main'), 'gender' => array('type' => 'select', 'limit' => 1, 'label' => rcube_label('gender'), 'options' => array('male' => rcube_label('male'), 'female' => rcube_label('female')), 'category' => 'personal'), - 'maidenname' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('maidenname'), 'category' => 'personal'), - 'phone' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('phone'), 'subtypes' => array('home','home2','work','work2','mobile','main','homefax','workfax','car','pager','video','assistant','other'), 'category' => 'main'), + 'maidenname' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('maidenname'), 'category' => 'personal'), + 'phone' => array('type' => 'text', 'size' => 40, 'maxlength' => 20, 'label' => rcube_label('phone'), 'subtypes' => array('home','home2','work','work2','mobile','main','homefax','workfax','car','pager','video','assistant','other'), 'category' => 'main'), 'address' => array('type' => 'composite', 'label' => rcube_label('address'), 'subtypes' => array('home','work','other'), 'childs' => array( - 'street' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('street'), 'category' => 'main'), - 'locality' => array('type' => 'text', 'size' => 28, 'label' => rcube_label('locality'), 'category' => 'main'), - 'zipcode' => array('type' => 'text', 'size' => 8, 'label' => rcube_label('zipcode'), 'category' => 'main'), - 'region' => array('type' => 'text', 'size' => 12, 'label' => rcube_label('region'), 'category' => 'main'), - 'country' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('country'), 'category' => 'main'), + 'street' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'label' => rcube_label('street'), 'category' => 'main'), + 'locality' => array('type' => 'text', 'size' => 28, 'maxlength' => 50, 'label' => rcube_label('locality'), 'category' => 'main'), + 'zipcode' => array('type' => 'text', 'size' => 8, 'maxlength' => 15, 'label' => rcube_label('zipcode'), 'category' => 'main'), + 'region' => array('type' => 'text', 'size' => 12, 'maxlength' => 50, 'label' => rcube_label('region'), 'category' => 'main'), + 'country' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'label' => rcube_label('country'), 'category' => 'main'), ), 'category' => 'main'), - 'birthday' => array('type' => 'date', 'size' => 12, 'label' => rcube_label('birthday'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col', 'category' => 'personal'), - 'anniversary' => array('type' => 'date', 'size' => 12, 'label' => rcube_label('anniversary'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col', 'category' => 'personal'), - 'website' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('website'), 'subtypes' => array('homepage','work','blog','other'), 'category' => 'main'), - 'im' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('instantmessenger'), 'subtypes' => array('aim','icq','msn','yahoo','jabber','skype','other'), 'category' => 'main'), - 'notes' => array('type' => 'textarea', 'size' => 40, 'rows' => 15, 'label' => rcube_label('notes'), 'limit' => 1), + 'birthday' => array('type' => 'date', 'size' => 12, 'maxlength' => 16, 'label' => rcube_label('birthday'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col', 'category' => 'personal'), + 'anniversary' => array('type' => 'date', 'size' => 12, 'maxlength' => 16, 'label' => rcube_label('anniversary'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col', 'category' => 'personal'), + 'website' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'label' => rcube_label('website'), 'subtypes' => array('homepage','work','blog','profile','other'), 'category' => 'main'), + 'im' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'label' => rcube_label('instantmessenger'), 'subtypes' => array('aim','icq','msn','yahoo','jabber','skype','other'), 'category' => 'main'), + 'notes' => array('type' => 'textarea', 'size' => 40, 'rows' => 15, 'maxlength' => 500, 'label' => rcube_label('notes'), 'limit' => 1), 'photo' => array('type' => 'image', 'limit' => 1, 'category' => 'main'), - 'assistant' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('assistant'), 'category' => 'personal'), - 'manager' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('manager'), 'category' => 'personal'), - 'spouse' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('spouse'), 'category' => 'personal'), + 'assistant' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('assistant'), 'category' => 'personal'), + 'manager' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('manager'), 'category' => 'personal'), + 'spouse' => array('type' => 'text', 'size' => 40, 'maxlength' => 50, 'limit' => 1, 'label' => rcube_label('spouse'), 'category' => 'personal'), // TODO: define fields for vcards like GEO, KEY ); @@ -68,11 +68,17 @@ if (!strlen($source) || !isset($js_list[$source])) $source = $js_list[key($js_list)]['id']; - // count writeable sources + // count all/writeable sources $writeable = 0; - foreach ($js_list as $s) { + $count = 0; + foreach ($js_list as $sid => $s) { + $count++; if (!$s['readonly']) { $writeable++; + } + // unset hidden sources + if ($s['hidden']) { + unset($js_list[$sid]); } } @@ -82,21 +88,25 @@ $OUTPUT->set_env('writable_source', $writeable); $OUTPUT->set_pagetitle(rcube_label('addressbook')); - $_SESSION['addressbooks_count'] = count($js_list); + $_SESSION['addressbooks_count'] = $count; $_SESSION['addressbooks_count_writeable'] = $writeable; + + if (!strlen($source)) + $source = strval(key($js_list)); $CONTACTS = rcmail_contact_source($source, true); } // remove undo information... if ($undo = $_SESSION['contact_undo']) { - // ...after 30 seconds - if ($undo['ts'] < time() - 30) + // ...after timeout + $undo_time = $RCMAIL->config->get('undo_timeout', 0); + if ($undo['ts'] < time() - $undo_time) $RCMAIL->session->remove('contact_undo'); } // instantiate a contacts object according to the given source -function rcmail_contact_source($source=null, $init_env=false) +function rcmail_contact_source($source=null, $init_env=false, $writable=false) { global $RCMAIL, $OUTPUT, $CONFIG, $CONTACT_COLTYPES; @@ -104,12 +114,8 @@ $source = get_input_value('_source', RCUBE_INPUT_GPC); } - if (!strlen($source)) { - return null; - } - // Get object - $CONTACTS = $RCMAIL->get_address_book($source); + $CONTACTS = $RCMAIL->get_address_book($source, $writable); $CONTACTS->set_pagesize($CONFIG['pagesize']); // set list properties and session vars @@ -150,10 +156,24 @@ global $RCMAIL; // get list of address sources - $list = $RCMAIL->get_address_sources($writable); + $first = reset($RCMAIL->get_address_sources($writable)); // use first directory by default - return $list[key($list)]['id']; + return $first['id']; +} + +function rcmail_set_sourcename($abook) +{ + global $OUTPUT; + + // get address book name (for display) + if ($abook && $_SESSION['addressbooks_count'] > 1) { + $name = $abook->get_name(); + if (!$name && $source == 0) { + $name = rcube_label('personaladrbook'); + } + $OUTPUT->set_env('sourcename', $name); + } } @@ -179,11 +199,9 @@ // currently selected source $current = get_input_value('_source', RCUBE_INPUT_GPC); - if (!strlen($current) || !isset($sources[$source])) - $current = strval(key($sources)); foreach ($sources as $j => $source) { - $id = strval($source['id'] ? $source['id'] : $j); + $id = strval(strlen($source['id']) ? $source['id'] : $j); $js_id = JQ($id); // set class name(s) @@ -209,8 +227,35 @@ $out = $groupdata['out']; } - $OUTPUT->set_env('contactgroups', $jsdata); + $line_templ = html::tag('li', array( + 'id' => 'rcmliS%s', 'class' => '%s'), + html::a(array('href' => '#', 'rel' => 'S%s', + 'onclick' => "return ".JS_OBJECT_NAME.".command('listsearch', '%s', this)"), '%s')); + + // Saved searches + $sources = $RCMAIL->user->list_searches(rcube_user::SEARCH_ADDRESSBOOK); + foreach ($sources as $j => $source) { + $id = $source['id']; + $js_id = JQ($id); + + // set class name(s) + $class_name = 'contactsearch'; + if ($current === $id) + $class_name .= ' selected'; + if ($source['class_name']) + $class_name .= ' ' . $source['class_name']; + + $out .= sprintf($line_templ, + html_identifier($id), + $class_name, + $id, + $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id))); + } + + $OUTPUT->set_env('contactgroups', $jsdata); $OUTPUT->add_gui_object('folderlist', $attrib['id']); + // add some labels to client + $OUTPUT->add_label('deletegroupconfirm', 'groupdeleting', 'addingmember', 'removingmember'); return html::tag('ul', $attrib, $out, html::$common_attrib); } @@ -246,7 +291,7 @@ } -// return the message list as HTML table +// return the contacts list as HTML table function rcmail_contacts_list($attrib) { global $CONTACTS, $OUTPUT; @@ -254,24 +299,20 @@ // define list of cols to be displayed $a_show_cols = array('name'); - // count contacts for this user - $result = $CONTACTS->list_records($a_show_cols); - // add id to message list table if not specified if (!strlen($attrib['id'])) $attrib['id'] = 'rcmAddressList'; // create XHTML table - $out = rcube_table_output($attrib, $result->records, $a_show_cols, $CONTACTS->primary_key); + $out = rcube_table_output($attrib, array(), $a_show_cols, $CONTACTS->primary_key); // set client env $OUTPUT->add_gui_object('contactslist', $attrib['id']); $OUTPUT->set_env('current_page', (int)$CONTACTS->list_page); - $OUTPUT->set_env('pagecount', ceil($result->count/$CONTACTS->page_size)); $OUTPUT->include_script('list.js'); // add some labels to client - $OUTPUT->add_label('deletecontactconfirm'); + $OUTPUT->add_label('deletecontactconfirm', 'copyingcontact'); return $out; } @@ -296,8 +337,14 @@ } // format each col - foreach ($a_show_cols as $col) - $a_row_cols[$col] = Q($row[$col]); + foreach ($a_show_cols as $col) { + $val = $row[$col]; + if ($val == '' && $col == 'name') { + $val = rcube_addressbook::compose_display_name($row, true); + } + + $a_row_cols[$col] = Q($val); + } $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols); } @@ -330,7 +377,7 @@ $OUTPUT->add_gui_object('countdisplay', $attrib['id']); - return html::span($attrib, rcmail_get_rowcount_text()); + return html::span($attrib, rcube_label('loading')); } @@ -341,9 +388,6 @@ // read nr of contacts if (!$result) { $result = $CONTACTS->get_result(); - } - if (!$result) { - $result = $CONTACTS->count(); } if ($result->count == 0) @@ -419,7 +463,7 @@ if ($section == 'head') { $content = ''; - // unset display name if it is composed from name parts (same composition function as in save.inc) + // unset display name if it is composed from name parts if ($record['name'] == rcube_addressbook::compose_display_name(array('name' => '') + (array)$record)) unset($record['name']); @@ -428,7 +472,9 @@ 'names' => array('prefix','firstname','middlename','surname','suffix'), 'displayname' => array('name'), 'nickname' => array('nickname'), - 'jobnames' => array('organization','department','jobtitle'), + 'organization' => array('organization'), + 'department' => array('department'), + 'jobtitle' => array('jobtitle'), ); foreach ($field_blocks as $blockname => $colnames) { $fields = ''; @@ -719,10 +765,11 @@ $RCMAIL->register_action_map(array( 'add' => 'edit.inc', 'photo' => 'show.inc', - 'upload-photo' => 'save.inc', 'group-create' => 'groups.inc', 'group-rename' => 'groups.inc', 'group-delete' => 'groups.inc', 'group-addmembers' => 'groups.inc', 'group-delmembers' => 'groups.inc', + 'search-create' => 'search.inc', + 'search-delete' => 'search.inc', )); -- Gitblit v1.9.1