From e9a9f2f6c52e41f3e85fc3ab0ee93afecd080892 Mon Sep 17 00:00:00 2001 From: alecpl Date: Fri, 3 Jun 2011 11:03:13 +0000 Subject: - Added addressbook advanced search --- program/steps/addressbook/func.inc | 66 ++++++------- program/steps/addressbook/list.inc | 2 +- program/steps/addressbook/search.inc | 177 ++++++++++++++++++++++++++++------- 3 files changed, 179 insertions(+), 66 deletions(-) (limited to 'program/steps') diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index 545f140bf..df86fced2 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -62,36 +62,36 @@ if (!$OUTPUT->ajax_call) { // general definition of contact coltypes $CONTACT_COLTYPES = array( - 'name' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('name')), - 'firstname' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('firstname')), - 'surname' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('surname')), - 'middlename' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('middlename')), - 'prefix' => array('type' => 'text', 'size' => 8, 'limit' => 1, 'label' => rcube_label('nameprefix')), - 'suffix' => array('type' => 'text', 'size' => 8, 'limit' => 1, 'label' => rcube_label('namesuffix')), - 'nickname' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('nickname')), - 'jobtitle' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('jobtitle')), - 'organization' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('organization')), - 'department' => array('type' => 'text', 'size' => 19, 'limit' => 1, 'label' => rcube_label('department')), - 'gender' => array('type' => 'select', 'limit' => 1, 'label' => rcube_label('gender'), 'options' => array('male' => rcube_label('male'), 'female' => rcube_label('female'))), - 'maidenname' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('maidenname')), - 'email' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('email'), 'subtypes' => array('home','work','other')), - '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')), + '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'), + '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'), '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')), - 'locality' => array('type' => 'text', 'size' => 28, 'label' => rcube_label('locality')), - 'zipcode' => array('type' => 'text', 'size' => 8, 'label' => rcube_label('zipcode')), - 'region' => array('type' => 'text', 'size' => 12, 'label' => rcube_label('region')), - 'country' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('country')), - )), - 'birthday' => array('type' => 'date', 'size' => 12, 'label' => rcube_label('birthday'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col'), - 'anniversary' => array('type' => 'date', 'size' => 12, 'label' => rcube_label('anniversary'), 'limit' => 1, 'render_func' => 'rcmail_format_date_col'), - 'website' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('website'), 'subtypes' => array('homepage','work','blog','other')), - 'im' => array('type' => 'text', 'size' => 40, 'label' => rcube_label('instantmessenger'), 'subtypes' => array('aim','icq','msn','yahoo','jabber','skype','other')), + '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'), + ), '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), - 'photo' => array('type' => 'image', 'limit' => 1), - 'assistant' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('assistant')), - 'manager' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('manager')), - 'spouse' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('spouse')), + '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'), // TODO: define fields for vcards like GEO, KEY ); @@ -225,10 +225,10 @@ function rcmail_js_contacts_list($result, $prefix='') // define list of cols to be displayed $a_show_cols = array('name'); - + while ($row = $result->next()) { $a_row_cols = array(); - + // format each col foreach ($a_show_cols as $col) $a_row_cols[$col] = Q($row[$col]); @@ -324,7 +324,7 @@ function rcmail_contact_form($form, $record, $attrib = null) // get default coltypes $coltypes = $GLOBALS['CONTACT_COLTYPES']; - $coltype_lables = array(); + $coltype_labels = array(); foreach ($coltypes as $col => $prop) { if ($prop['subtypes']) { @@ -335,7 +335,7 @@ function rcmail_contact_form($form, $record, $attrib = null) } if ($prop['childs']) { foreach ($prop['childs'] as $childcol => $cp) - $coltype_lables[$childcol] = array('label' => $cp['label']); + $coltype_labels[$childcol] = array('label' => $cp['label']); } } @@ -548,7 +548,7 @@ function rcmail_contact_form($form, $record, $attrib = null) } if ($edit_mode) { - $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_lables); + $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_labels); $RCMAIL->output->set_env('delbutton', $del_button); $RCMAIL->output->add_label('delete'); } diff --git a/program/steps/addressbook/list.inc b/program/steps/addressbook/list.inc index 234e1a633..0eb4b806a 100644 --- a/program/steps/addressbook/list.inc +++ b/program/steps/addressbook/list.inc @@ -28,7 +28,7 @@ $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text($rowcount)); // create javascript list rcmail_js_contacts_list($result); - + // send response $OUTPUT->send(); diff --git a/program/steps/addressbook/search.inc b/program/steps/addressbook/search.inc index fe7099fac..fff6bd66c 100644 --- a/program/steps/addressbook/search.inc +++ b/program/steps/addressbook/search.inc @@ -6,58 +6,171 @@ | | | This file is part of the Roundcube Webmail client | | Copyright (C) 2005-2011, The Roundcube Dev Team | + | Copyright (C) 2011, Kolab Systems AG | | Licensed under the GNU GPL | | | | PURPOSE: | - | Search step for address book contacts | + | Search action (and form) for address book contacts | | | +-----------------------------------------------------------------------+ | Author: Thomas Bruederli | + | Author: Aleksander Machniak | +-----------------------------------------------------------------------+ $Id: search.inc 456 2007-01-10 12:34:33Z thomasb $ */ -$CONTACTS->set_page(1); -$_SESSION['page'] = 1; +if (!isset($_GET['_form'])) { + rcmail_contact_search(); +} -// get input -$search = trim(get_input_value('_q', RCUBE_INPUT_GET, true)); -$fields = explode(',', get_input_value('_headers', RCUBE_INPUT_GET)); +$OUTPUT->add_handler('searchform', 'rcmail_contact_search_form'); +$OUTPUT->send('contactsearch'); -if (empty($fields)) { - $fields = $SEARCH_MODS_DEFAULT; -} -$search_request = md5('addr'.$search.implode($fields, ',')); +function rcmail_contact_search() +{ + global $RCMAIL, $OUTPUT, $CONTACTS, $CONTACT_COLTYPES, $SEARCH_MODS_DEFAULT; -// update search_mods setting -$search_mods = array_fill_keys($fields, 1); -$RCMAIL->user->save_prefs(array('addressbook_search_mods' => $search_mods)); + $adv = isset($_POST['_adv']); -if ($fields['all'] || count($fields) == count($SEARCH_MODS_DEFAULT)) { - $fields = '*'; -} + // get fields/values from advanced search form + if ($adv) { + foreach ($CONTACT_COLTYPES as $col => $colprop) { + $s = trim(get_input_value('_'.$col, RCUBE_INPUT_POST, true)); + if (strlen($s)) { + $search[] = $s; + $fields[] = $col; + } + } -// get contacts for this user -$result = $CONTACTS->search($fields, $search); + if (empty($fields)) { + // do nothing, show the form again + return; + } + } + // quick-search + else { + $search = trim(get_input_value('_q', RCUBE_INPUT_GET, true)); + $fields = explode(',', get_input_value('_headers', RCUBE_INPUT_GET)); -// save search settings in session -$_SESSION['search'][$search_request] = $CONTACTS->get_search_set(); + if (empty($fields)) { + $fields = $SEARCH_MODS_DEFAULT; + } -if ($result->count > 0) { - // create javascript list - rcmail_js_contacts_list($result); -} -else { - $OUTPUT->show_message('nocontactsfound', 'notice'); + // update search_mods setting + $old_mods = $RCMAIL->config->get('addressbook_search_mods'); + $search_mods = array_fill_keys($fields, 1); + if ($old_mods != $search_mods) { + $RCMAIL->user->save_prefs(array('addressbook_search_mods' => $search_mods)); + } + + if ($fields['*'] || count($fields) == count($SEARCH_MODS_DEFAULT)) { + $fields = '*'; + } + } + + // search request ID + $search_request = md5('addr'.implode($fields, ',') + .(is_array($search) ? implode($search, ',') : $search)); + + // reset page + $CONTACTS->set_page(1); + $_SESSION['page'] = 1; + + // get contacts for this user + $result = $CONTACTS->search($fields, $search); + + // save search settings in session + $_SESSION['search'][$search_request] = $CONTACTS->get_search_set(); + + if ($adv) + $OUTPUT->command('list_contacts_clear'); + + if ($result->count > 0) { + // create javascript list + rcmail_js_contacts_list($result); + } + else { + $OUTPUT->show_message('nocontactsfound', 'notice'); + } + + // update message count display + $OUTPUT->command('set_env', 'search_request', $search_request); + $OUTPUT->command('set_env', 'pagecount', ceil($result->count / $CONTACTS->page_size)); + $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text()); + + // send response + $OUTPUT->send($adv ? 'iframe' : null); } -// update message count display -$OUTPUT->set_env('search_request', $search_request); -$OUTPUT->set_env('pagecount', ceil($result->count / $CONTACTS->page_size)); -$OUTPUT->command('set_rowcount', rcmail_get_rowcount_text()); +function rcmail_contact_search_form($attrib) +{ + global $RCMAIL, $CONTACTS, $CONTACT_COLTYPES; -// send response -$OUTPUT->send(); + $i_size = !empty($attrib['size']) ? $attrib['size'] : 30; + + $form = array( + 'main' => array( + 'name' => rcube_label('contactproperties'), + 'content' => array( + ), + ), + 'personal' => array( + 'name' => rcube_label('personalinfo'), + 'content' => array( + ), + ), + 'other' => array( + 'name' => rcube_label('other'), + 'content' => array( + ), + ), + ); + + foreach ($CONTACT_COLTYPES as $col => $colprop) + { + if ($colprop['type'] != 'image' && !$colprop['nosearch']) + { + $ftype = $colprop['type'] == 'select' ? 'select' : 'text'; + $label = isset($colprop['label']) ? $colprop['label'] : rcube_label($col); + $category = $colprop['category'] ? $colprop['category'] : 'other'; + + if ($ftype == 'text') + $colprop['size'] = $i_size; + + $content = html::div('row', html::div('contactfieldlabel label', Q($label)) + . html::div('contactfieldcontent', rcmail_get_edit_field($col, '', $colprop, $ftype))); + + $form[$category]['content'][] = $content; + } + } + + $hiddenfields = new html_hiddenfield(array( + 'name' => '_source', 'value' => get_input_value('_source', RCUBE_INPUT_GPC))); + $hiddenfields->add(array('name' => '_gid', 'value' => $CONTACTS->group_id)); + $hiddenfields->add(array('name' => '_adv', 'value' => 1)); + + $out = $RCMAIL->output->request_form(array( + 'name' => 'form', 'method' => 'post', + 'task' => $RCMAIL->task, 'action' => 'search', + 'noclose' => true) + $attrib, $hiddenfields->show()); + + $RCMAIL->output->add_gui_object('editform', $attrib['id']); + + unset($attrib['name']); + unset($attrib['id']); + + foreach ($form as $f) { + if (!empty($f['content'])) { + $content = html::div('contactfieldgroup', join("\n", $f['content'])); + + $out .= html::tag('fieldset', $attrib, + html::tag('legend', null, Q($f['name'])) + . $content) . "\n"; + } + } + + return $out . ''; +} -- cgit v1.2.3