- new add/edit dialog using tabs

- new "advanced search" function / dialog
- customfields can now be of type text, selectbox, radio and checkbox
This commit is contained in:
Cornelius Weiß 2005-11-03 23:47:52 +00:00
parent a5a22177b0
commit fd9e935e63
23 changed files with 1647 additions and 8 deletions

View File

@ -0,0 +1,236 @@
<?php
/**************************************************************************\
* eGroupWare - Adressbook - General business object *
* http://www.egroupware.org *
* Written and (c) 2005 by Cornelius_weiss <egw@von-und-zu-weiss.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.socontacts.inc.php');
/**
* General business object of the adressbook
*
* @package adressbook
* @author Cornelius Weiss <egw@von-und-zu-weiss.de>
* @copyright (c) 2005 by Cornelius Weiss <egw@von-und-zu-weiss.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class bocontacts extends socontacts
{
/**
* @var $grants array with grants
*/
var $grants;
/**
* @var $user userid of current user
*/
var $user;
function bocontacts($contact_app='addressbook')
{
$this->socontacts($contact_app);
$this->grants = $GLOBALS['egw']->acl->get_grants($contact_app);
$this->user = $GLOBALS['egw_info']['user']['account_id'];
/* foreach(array(
'so' => $appname. 'soadb',
) as $my => $app_class)
{
list(,$class) = explode('.',$app_class);
if (!is_object($GLOBALS['egw']->$class))
{
$GLOBALS['egw']->$class =& CreateObject($app_class);
}
$this->$my = &$GLOBALS['egw']->$class;
}*/
}
/**
* deletes contact in db
*
* @param array &contact contact array from etemplate::exec
* @return bool false if all went right
*/
function delete(&$contact)
{
// multiple delete from advanced search
if(isset($contact[0]))
{
foreach($contact as $single)
{
if($this->check_perms(EGW_ACL_DELETE,$single['id']))
{
if(parent::delete($single))
{
$msg .= lang('Something went wrong by deleting %1', $single['n_given'].$single['n_family']);
}
}
else
{
$msg .= lang('You are not permitted to delete contact %1', $single['n_given'].$single['n_family']);
}
}
return $msg;
}
if(isset($contact['id']) && !$this->check_perms(EGW_ACL_DELETE,$contact['id']))
{
$contact['msg'] = lang('You are not permittet to delete this contact');
return 1;
}
if(parent::delete($contact))
{
$contact['msg'] = lang('Something went wrong by deleting this contact');
return 1;
}
return;
}
/**
* saves contact to db
*
* @param array &contact contact array from etemplate::exec
* @return array $contact
* TODO make fullname format choosable at best with selectbox and javascript in edit dialoge
*/
function save(&$contact)
{
if($contact['id'] && !$this->check_perms(EGW_ACL_EDIT,$contact['id']))
{
$contact['msg'] = lang('You are not permittet to edit this contact');
return $contact;
}
// new contact
if($contact['id'] == 0)
{
$contact['owner'] = $this->user;
// we create a normal contact
$contact['tid'] = 'n';
}
// convert categories
$contact['cat_id'] = $contact['cat_id'] ? implode(',',$contact['cat_id']) : '';
// last modified
$contact['last_mod'] = time();
// only owner can set access status
$contact['access'] = $contact['owner'] == $this->user ? (!empty($contact['access']) ? $contact['access'] : 'public') : 'public';
$contact['private'] = $contact['owner'] == $this->user ? $contact['private'] : 0;
// convert bithdate format
$tmp_bday = $contact['bday'];
$contact['bday'] = $contact['bday'] ? date('m/d/Y',$contact['bday']) : '';
// create fullname
$contact['fn'] = $contact['prefix'].
($contact['n_given'] ? ' '.$contact['n_given'] : '').
($contact['n_middle'] ? ' '.$contact['n_middle'] : '').
($contact['n_family'] ? ' '.$contact['n_family'] : '').
($contact['n_suffix'] ? ' '.$contact['n_suffix'] : '');
$error_nr = parent::save($contact);
//reconvert bday as we are dealing with references
$contact['bday'] = $tmp_bday;
$contact['msg'] = $error_nr ?
lang('Something went wrong by saving this contact. Errorcode %1',$error_nr) :
lang('Contact saved');
return $contact;
}
/**
* reads contacts matched by key and puts all cols in the data array
*
* @param array $keys array with keys in form internalName => value, may be a scalar value if only one key
* @param string/array $extra_cols string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* @return array with data or errormessage
*/
function read($keys,$extra_cols='',$join='')
{
$data = parent::read($keys,$extra_cols,$join);
if (!$data)
{
return $content['msg'] = lang('something went wrong by reading this contact');
}
if(!$this->check_perms(EGW_ACL_READ,$data))
{
return $content['msg'] = lang('you are not permittet to view this contact');
}
// convert birthday format
list($m,$d,$y) = explode('/',$data['bday']);
$data['bday'] = strpos($data['bday'],'/') ? mktime(0,0,0,$m,$d,$y) : '';
// convert access into private for historical reasons
$data['private'] = $data['access'] == 'private' ? 1 : $data['private'];
$data['access'] = $data['private'] ? 'private' : 'public';
return $data;
}
/**
* searches contacts for rows matching searchcriteria
*
* @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
* @param boolean/string $only_keys=true True returns only keys, False returns all cols. comma seperated list of keys to return
* @param string $order_by='' fieldnames + {ASC|DESC} separated by colons ',', can also contain a GROUP BY (if it contains ORDER BY)
* @param string/array $extra_cols='' string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $wildcard='' appended befor and after each criteria
* @param boolean $empty=false False=empty criteria are ignored in query, True=empty have to be empty in row
* @param string $op='AND' defaults to 'AND', can be set to 'OR' too, then criteria's are OR'ed together
* @param mixed $start=false if != false, return only maxmatch rows begining with start, or array($start,$num)
* @param array $filter=null if set (!=null) col-data pairs, to be and-ed (!) into the query without wildcards
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
* @return array of matching rows (the row is an array of the cols) or False
*/
function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false)
{
// convert bday format
if(isset($criteria['bday']))
{
$criteria['bday'] = date('m/d/Y',$criteria['bday']);
}
$filter = array(
'owner' => array_keys($this->grants),
);
return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count);
}
/**
* Checks if the current user has the necessary ACL rights
*
* @param int $needed necessary ACL right: EGW_ACL_{READ|EDIT|DELETE}
* @param mixed $contact contact as array or the contact-id
* @return boolean true permission granted or false for permission denied
*/
function check_perms($needed,&$contact)
{
if (is_array($contact))
{
$owner = $contact['owner'];
$access = $contact['access'];
}
elseif (is_numeric($contact))
{
$read_contact = parent::read($contact);
$owner = $read_contact['owner'];
$access = $read_contact['access'];
}
if($owner == $this->user)
{
return true;
}
$access = $access ? $access : 'public';
return $access == 'private' ? false : $this->grants[$owner] & $needed;
}
}

View File

@ -29,9 +29,13 @@
$fields = array();
$this->so->read_repository();
while(list($name,$descr) = @each($this->so->config_data['custom_fields']))
$config_name = isset($this->so->config_data['customfields']) ? 'customfields' : 'custom_fields';
while(list($name,$descr) = @each($this->so->config_data[$config_name]))
{
if(is_array($descr))
{
$descr = $descr['label'];
}
/*
if($start < $i)
{

View File

@ -0,0 +1,134 @@
<?php
/**************************************************************************\
* eGroupWare - LDAP wrapper class for contacts *
* http://www.egroupware.org *
* Written by Cornelius Weiss <egw@von-und-zu-weiss.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
require_once(EGW_INCLUDE_ROOT.'/phpgwapi/inc/class.contacts.inc.php');
/**
* Wrapper class for phpgwapi.contacts_ldap
* This makes it compatible with vars and parameters of so_sql
* Maybe one day this becomes a generalized ldap storage object :-)
*
* @package contacts
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class so_ldap extends contacts
{
var $data;
var $db_data_cols;
var $db_key_cols;
/**
* constructor of the class
*
*/
function so_ldap()
{
parent::contacts();
$this->db_data_cols = $this->stock_contact_fields + $this->non_contact_fields;
}
/**
* reads row matched by key and puts all cols in the data array
*
* @param array $keys array with keys in form internalName => value, may be a scalar value if only one key
* @param string/array $extra_cols string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* @return array/boolean data if row could be retrived else False
*/
function read($keys,$extra_cols='',$join='')
{
$contacts = parent::read_single_entry($keys);
return $contacts[0];
}
/**
* saves the content of data to the db
*
* @param array $keys if given $keys are copied to data before saveing => allows a save as
* @return int 0 on success and errno != 0 else
*/
function save($keys=null)
{
$data =& $this->data;
// new contact
if(empty($this->data[$this->contacts_id]))
{
$ret = parent::add($data['owner'],$data,$data['access'],$data['cat_id'],$data['tid']);
}
else
{
$ret = parent::update($data[$this->contacts_id],$data['owner'],$data);
}
return $ret === false ? 1 : 0;
}
/**
* deletes row representing keys in internal data or the supplied $keys if != null
*
* @param array $keys if given array with col => value pairs to characterise the rows to delete
* @return int affected rows, should be 1 if ok, 0 if an error
*/
function delete($keys=null)
{
// single entry
if($keys[$this->contacts_id]) $keys = array( 0 => $keys);
$ret = 0;
foreach($keys as $entry)
{
if(parent::delete($entry[$this->contacts_id]) === false)
{
return 0;
}
else
{
$ret++;
}
}
return $ret;
}
/**
* searches db for rows matching searchcriteria
*
* '*' and '?' are replaced with sql-wildcards '%' and '_'
*
* @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
* @param boolean/string $only_keys=true True returns only keys, False returns all cols. comma seperated list of keys to return
* @param string $order_by='' fieldnames + {ASC|DESC} separated by colons ',', can also contain a GROUP BY (if it contains ORDER BY)
* @param string/array $extra_cols='' string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $wildcard='' appended befor and after each criteria
* @param boolean $empty=false False=empty criteria are ignored in query, True=empty have to be empty in row
* @param string $op='AND' defaults to 'AND', can be set to 'OR' too, then criteria's are OR'ed together
* @param mixed $start=false if != false, return only maxmatch rows begining with start, or array($start,$num)
* @param array $filter=null if set (!=null) col-data pairs, to be and-ed (!) into the query without wildcards
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
* @return array of matching rows (the row is an array of the cols) or False
*/
function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false)
{
$order_by = explode(',',$order_by);
$order_by = explode(' ',$order_by);
$sort = $order_by[0];
$order = $order_by[1];
$query = $criteria;
$fields = $only_keys ? ($only_keys === true ? $this->contacts_id : $only_keys) : '';
$limit = $need_full_no_count ? 0 : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'];
return parent::read($start,$limit,$fields,$query,$filter,$sort,$order);
}
}

View File

@ -0,0 +1,298 @@
<?php
/**************************************************************************\
* eGroupWare - Adressbook - General storage object *
* http://www.egroupware.org *
* Written and (c) 2005 by Cornelius_weiss <egw@von-und-zu-weiss.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
/**
* General storage object of the adressbook
*
* @package adressbook
* @author Cornelius Weiss <egw@von-und-zu-weiss.de>
* @copyright (c) 2005 by Cornelius Weiss <egw@von-und-zu-weiss.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class socontacts
{
/**
* @var string $links_table table name 'egw_links'
*/
var $links_table = 'egw_links';
/**
* @var string $extra_table name of customefields table
*/
var $extra_table = 'phpgw_addressbook_extra';
/**
* @var string $extra_id
*/
var $extra_id = 'contact_id';
/**
* @var string $extra_owner
*/
var $extra_owner = 'contact_owner';
/**
* @var string $extra_key
*/
var $extra_key = 'contact_name';
/**
* @var string $extra_value
*/
var $extra_value = 'contact_value';
function socontacts($contact_app='addressbook')
{
if($GLOBALS['egw_info']['server']['contact_repository'] == 'sql' || !isset($GLOBALS['egw_info']['server']['contact_repository']))
{
$this->somain = CreateObject('etemplate.so_sql');
$this->somain->so_sql('phpgwapi','phpgw_addressbook');
}
else
{
$this->somain = CreateObject('addressbook.so_'.$GLOBALS['egw_info']['server']['contact_repository']);
}
$this->somain->contacts_id = 'id';
$this->soextra = CreateObject('etemplate.so_sql');
$this->soextra->so_sql('phpgwapi',$this->extra_table);
$custom =& CreateObject('admin.customfields',$contact_app);
$this->customfields = $custom->get_customfields();
}
/**
* deletes contact entry including custom fields
*
* @param array &$contact contact data from etemplate::exec
* @return bool false if all went right
*/
function delete(&$contact)
{
// delete mainfields
$ok_main = $this->somain->delete(array('id' => $contact['id']));
// delete customfields
$ok_extra = $this->soextra->delete(array($this->extra_id => $contact['id']));
return !((bool)$ok_extra & (bool)$ok);
}
/**
* saves contact data including custiom felds
*
* @param array &$contact contact data from etemplate::exec
* @return bool false if all went wrong, errornumber on failure
*/
function save(&$contact)
{
// save mainfields
$this->somain->data = $contact;
$error_nr = $this->somain->save();
$contact['id'] = $this->somain->data['id'];
if($error_nr) return $error_nr_main;
// save customfields
foreach ($this->customfields as $field => $options)
{
$value = $contact['#'.$field];
$data = array(
$this->extra_id => $contact['id'],
$this->extra_owner => $contact['owner'],
$this->extra_key => $field,
$this->extra_value => $value,
);
$this->soextra->data = $data;
$error_nr = $this->soextra->save();
if($error_nr) return $error_nr;
}
return;
}
/**
* reads contact data including custom fields
*
* @param interger $contact_id contact_id
* @return array/boolean data if row could be retrived else False
*/
function read($contact_id)
{
// read main data
$contact = $this->somain->read($contact_id);
// read customfilds
$keys = array(
$this->extra_id => $contact['id'],
$this->extra_owner => $contact['owner'],
);
$customfields = $this->soextra->search($keys,false);
foreach ((array)$customfields as $field)
{
$contact['#'.$field[$this->extra_key]] = $field[$this->extra_value];
}
return $contact;
}
/**
* searches db for rows matching searchcriteria
*
* '*' and '?' are replaced with sql-wildcards '%' and '_'
*
* @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
* @param boolean/string $only_keys=true True returns only keys, False returns all cols. comma seperated list of keys to return
* @param string $order_by='' fieldnames + {ASC|DESC} separated by colons ',', can also contain a GROUP BY (if it contains ORDER BY)
* @param string/array $extra_cols='' string or array of strings to be added to the SELECT, eg. "count(*) as num"
* @param string $wildcard='' appended befor and after each criteria
* @param boolean $empty=false False=empty criteria are ignored in query, True=empty have to be empty in row
* @param string $op='AND' defaults to 'AND', can be set to 'OR' too, then criteria's are OR'ed together
* @param mixed $start=false if != false, return only maxmatch rows begining with start, or array($start,$num)
* @param array $filter=null if set (!=null) col-data pairs, to be and-ed (!) into the query without wildcards
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
* @return array of matching rows (the row is an array of the cols) or False
*/
function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false)
{
// echo 'socontacts::search->criteria:'; _debug_array($criteria);
// We just want to deal with generalized vars, to simpyfie porting of this code to so_sql later...
$this->main_id = $this->somain->contacts_id;
// seperate custom fields from main fields
foreach ($criteria as $crit_key => $crit_val)
{
if(!(isset($this->somain->db_data_cols [$crit_key]) || isset($this->somain->db_key_cols [$crit_key])))
{
if(strpos($crit_key,'#') !== false)
{
$extra_crit_key = substr($crit_key,1);
$criteria_extra[$extra_crit_key][$this->extra_key] = $extra_crit_key;
$criteria_extra[$extra_crit_key][$this->extra_value] = $extra_crit_val;
}
unset($criteria[$crit_key]);
}
}
//_debug_array($criteria);
//_debug_array($criteria_extra);
// search in custom fields
$resultextra = array();
if (count($criteria_extra) >= 1)
{
$firstrun = true;
foreach ((array)$criteria_extra as $extra_crit)
{
$result = $this->soextra->search($extra_crit,true,'','',$wildcard);
if ($op == 'OR' && $result)
{
$resultextra = array_merge_recursive((array)$result,(array)$resultextra);
}
elseif ($op == 'AND')
{
if (!$result)
{
return false;
//$resultextra = array();
//break;
}
$expr = '$result[0]';
for($i=1; $i<count($result); $i++)
{
$expr .= ',$result['.$i.']';
}
eval('$merge = array_merge_recursive('.$expr.');');
if(!is_array($merge[$this->extra_id]))
{
$merge[$this->extra_id] = (array)$merge[$this->extra_id];
}
if($firstrun)
{
$resultextra = $merge[$this->extra_id];
$firstrun = false;
}
else
{
$resultextra = array_intersect((array)$resultextra,$merge[$this->extra_id]);
}
}
}
if($op == 'OR' && $resultextra)
{
$expr = '$resultextra[0]';
for($i=1; $i<count($resultextra); $i++)
{
$expr .= ',$resultextra['.$i.']';
}
eval('$merge = array_merge_recursive('.$expr.');');
$resultextra = array_unique($merge[$this->extra_id]);
}
}
// _debug_array($resultextra);
// search in main fields
$result = array();
// include results from extrafieldsearch
if(!empty($resultextra))
{
$criteria[$this->main_id] = $resultextra;
}
if (count($criteria) >= 1)
{
$result = $this->somain->search($criteria,true,$order_by,$extra_cols,$wildcard,$empty,$op,false,$filter);
if(!is_array($result)) return false;
$expr = '$result[0]';
for($i=1; $i<count($result); $i++)
{
$expr .= ',$result['.$i.']';
}
eval('$merge = array_merge_recursive('.$expr.');');
$result = ($merge[$this->main_id]);
}
// _debug_array($result);
if(count($result) == 0) return false;
if(!is_bool($only_keys_main = $only_keys))
{
$keys_wanted = explode(',',$only_keys);
foreach ($keys_wanted as $num => $key_wanted)
{
if(!(isset($this->somain->db_data_cols [$key_wanted]) || isset($this->somain->db_key_cols [$key_wanted])))
{
unset($keys_wanted[$num]);
$keys_wanted_custom[] = $key_wanted;
}
}
$only_keys_main = implode(',',$keys_wanted);
}
$result = $this->somain->search(array($this->main_id => $result),$only_keys_main,$order_by,$extra_cols,'','','OR',$start,$filter,$join,$need_full_no_count);
// append custom fields for each row
if($only_keys === false || is_array($keys_wanted_custom))
{
foreach ($result as $num => $contact)
{
$extras = $this->soextra->search(array($this->extra_id => $contact[$this->main_id]),false);
foreach ((array)$extras as $extra)
{
if ($only_keys === false || in_array($extra[$this->extra_key],$keys_wanted_custom))
{
$result[$num][$extra[$this->extra_key]] = $extra[$this->extra_value];
}
}
}
}
return $need_full_no_count ? count($result) : $result;
}
}

View File

@ -512,6 +512,7 @@
$GLOBALS['egw']->template->set_var('action_url',$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiaddressbook.delete'));
$GLOBALS['egw']->template->set_var('lang_add',lang('Add'));
$GLOBALS['egw']->template->set_var('add_url',$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiaddressbook.add'));
$GLOBALS['egw']->template->set_var('add_onclick','window.open(\''.$GLOBALS['egw']->link('/index.php?menuaction=addressbook.uicontacts.edit').'\',\'\',\'dependent=yes,width=800,height=600,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes\');return false;');
$GLOBALS['egw']->template->set_var('lang_addvcard',lang('AddVCard'));
$GLOBALS['egw']->template->set_var('vcard_url',$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uivcard.in'));
$GLOBALS['egw']->template->set_var('lang_import',lang('Import Contacts'));
@ -613,7 +614,9 @@
))
. '"><img src="'
. $GLOBALS['egw']->common->image('addressbook','edit')
. '" border="0" title="' . lang('Edit') . '"></a> ';
. '" border="0" title="' . lang('Edit') .
'" onClick="window.open(\''.$GLOBALS['egw']->link('/index.php?menuaction=addressbook.uicontacts.edit') . '&contact_id='.$entries[$i]['id'].
'\',\'\',\'dependent=yes,width=800,height=600,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes\');return false;"></a>';
}
if($this->bo->check_perms($entries[$i],PHPGW_ACL_DELETE))

View File

@ -0,0 +1,217 @@
<?php
/**************************************************************************\
* eGroupWare - Adressbook - General user interface object *
* http://www.egroupware.org *
* Written and (c) 2005 by Cornelius_weiss <egw@von-und-zu-weiss.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.bocontacts.inc.php');
/**
* General user interface object of the adressbook
*
* @package adressbook
* @author Cornelius Weiss <egw@von-und-zu-weiss.de>
* @copyright (c) 2005 by Cornelius Weiss <egw@von-und-zu-weiss.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class uicontacts extends bocontacts
{
var $public_functions = array(
'search' => True,
'edit' => True,
);
function uicontacts($contact_app='addressbook')
{
$this->bocontacts($contact_app);
foreach(array(
'tmpl' => 'etemplate.etemplate',
) as $my => $app_class)
{
list(,$class) = explode('.',$app_class);
if (!is_object($GLOBALS['egw']->$class))
{
$GLOBALS['egw']->$class =& CreateObject($app_class);
}
$this->$my = &$GLOBALS['egw']->$class;
}
// our javascript
// to be moved in a seperate file if rewrite is over
$GLOBALS['egw_info']['flags']['java_script'] .= $this->js();
}
function edit($content='')
{
if (is_array($content))
{
if (isset($content['button']['save']))
{
$this->save($content);
$js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',
array('menuaction' => 'addressbook.uiaddressbook.index'))."';";
$js .= 'window.close();';
echo "<html><body><script>$js</script></body></html>\n";
$GLOBALS['egw']->common->egw_exit();
}
elseif (isset($content['button']['apply']))
{
$content = $this->save($content);
$GLOBALS['egw_info']['flags']['java_script'] .= "<script LANGUAGE=\"JavaScript\">opener.location.href='".
$GLOBALS['egw']->link('/index.php',array('menuaction' => 'addressbook.uiaddressbook.index'))."';</script>";
}
elseif (isset($content['button']['delete']))
{
if(!$this->delete($content));
{
$js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',
array('menuaction' => 'addressbook.uiaddressbook.index'))."';";
$js .= 'window.close();';
echo "<html><body><script>$js</script></body></html>\n";
$GLOBALS['egw']->common->egw_exit();
}
}
}
else
{
$content = array();
$content_id = $_GET['contact_id'] ? $_GET['contact_id'] : 0;
if ($content_id != 0)
{
$content = $this->read($content_id);
}
}
//_debug_array($content);
$no_button['button[delete]'] = !$this->check_perms(EGW_ACL_DELETE,$content);
$no_button['button[copy]'] = true;
$no_button['button[edit]'] = !$view;
$preserv = array(
'id' => $content['id'],
'lid' => $content['lid'],
'tid' => $content['tid'],
'owner' => $content['owner'],
'fn' => $content['fn'],
'geo' => $content['geo'],
);
for($i = -23; $i<=23; $i++) $tz[$i] = ($i > 0 ? '+' : '').$i;
$sel_options['tz'] = $tz;
$content['tz'] = $content['tz'] ? $content['tz'] : 0;
$this->tmpl->read('addressbook.edit');
return $this->tmpl->exec('addressbook.uicontacts.edit',$content,$sel_options,$no_button,$preserv,2);
}
function search($content='')
{
if(!($GLOBALS['egw_info']['server']['contact_repository'] == 'sql' || !isset($GLOBALS['egw_info']['server']['contact_repository'])))
{
$GLOBALS['egw']->common->phpgw_header();
echo parse_navbar();
echo '<p> Advanced Search is not supported for ldap storage yet. Sorry! </p>';
$GLOBALS['egw']->common->egw_exit();
}
// This is no fun yet, as we dont have a sortorder in prefs now, AND as we are not able to sort within cf.
// $prefs = $GLOBALS['egw']->preferences->read_repository();
// foreach($prefs['addressbook'] as $key => $value)
// {
// if($value == 'addressbook_on') $content['advs']['colums_to_present'][$key] = lang($key);
// }
// echo 'addressbook.uicontacts.search->content:'; _debug_array($content);
$content['advs']['hidebuttons'] = true;
$content['advs']['input_template'] = 'addressbook.edit';
$content['advs']['search_method'] = 'addressbook.bocontacts.search';
$content['advs']['search_class_constructor'] = $contact_app;
$content['advs']['colums_to_present'] = array(
'id' => 'id',
'n_given' => lang('first name'),
'n_family' => lang('last name'),
'email_home' => lang('home email'),
'email_work' => lang('work email'),
'tel_home' => lang('tel home'),
);
$content['advs']['actions'] = array(
// 'email' => array(
// 'type' => 'button',
// 'options' => array(
// 'label' => lang('email'),
// 'no_lang' => true,
// )),
'delete' => array(
'type' => 'button',
'method' => 'addressbook.bocontacts.delete',
'options' => array(
'label' => lang('delete'),
'no_lang' => true,
'onclick' => 'if(!confirm(\''. lang('Do you really want to delte this contacts?'). '\')) return false;',
)),
// 'export' => array(
// 'type' => 'button',
// 'options' => array(
// 'label' => lang('export'),
// 'no_lang' => true,
// )),
);
for($i = -23; $i<=23; $i++) $tz[$i] = ($i > 0 ? '+' : '').$i;
$sel_options['tz'] = $tz + array('' => lang('doesn\'t matter'));
$this->tmpl->read('addressbook.search');
return $this->tmpl->exec('addressbook.uicontacts.search',$content,$sel_options,$no_button,$preserv);
}
function js()
{
return '<script LANGUAGE="JavaScript">
function showphones(form){
set_style_by_class("table","editphones","display","inline");
copyvalues(form,"tel_home","tel_home2");
copyvalues(form,"tel_work","tel_work2");
copyvalues(form,"tel_cell","tel_cell2");
return;
}
function hidephones(form){
set_style_by_class("table","editphones","display","none");
copyvalues(form,"tel_home2","tel_home");
copyvalues(form,"tel_work2","tel_work");
copyvalues(form,"tel_cell2","tel_cell");
return;
}
function copyvalues(form,src,dst){
var srcelement = getElement(form,src); //ById("exec["+src+"]");
var dstelement = getElement(form,dst); //ById("exec["+dst+"]");
dstelement.value = srcelement.value;
return;
}
function getElement(form,pattern){
for (i = 0; i < form.length; i++){
if(form.elements[i].name){
var found = form.elements[i].name.search(pattern);
if (found != -1){
return form.elements[i];
}
}
}
}
</script>';
}
}

View File

@ -17,7 +17,7 @@
$title = $appname;
$file = Array(
'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname),
'Edit custom fields' => $GLOBALS['egw']->link('/index.php','menuaction=addressbook.uifields.index'),
'Edit custom fields' => $GLOBALS['egw']->link('/index.php','menuaction=admin.customfields.edit&appname='. $appname),
'Global Categories' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uicategories.index&appname=addressbook')
);
//Do not modify below this line

View File

@ -24,8 +24,17 @@
*/
$menu_title = $GLOBALS['egw_info']['apps'][$appname]['title'];
$file = Array(
'Add'=>$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiaddressbook.add'),
array(
'text' => '<a class="textSidebox" href="'.$GLOBALS['egw']->link('/index.php',array('menuaction' => 'addressbook.uicontacts.edit')).
'" onclick="window.open(this.href,\'_blank\',\'dependent=yes,width=800,height=600,scrollbars=yes,status=yes\');
return false;">'.lang('Add').'</a>',
'no_lang' => true,
'link' => false
),
// 'Add'=>$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiaddressbook.add'),
'Advances search'=>$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uicontacts.search'),
'_NewLine_', // give a newline
'import contacts' => $GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiXport.import'),
'export contacts' => $GLOBALS['egw']->link('/index.php','menuaction=addressbook.uiXport.export')
@ -49,7 +58,7 @@
$menu_title = lang('Administration');
$file = Array(
'Configuration'=>$GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=addressbook'),
'Custom Fields'=>$GLOBALS['egw']->link('/index.php','menuaction=addressbook.uifields.index'),
'Custom Fields'=>$GLOBALS['egw']->link('/index.php','menuaction=admin.customfields.edit&appname=addressbook'),
'Global Categories' =>$GLOBALS['egw']->link('/index.php','menuaction=admin.uicategories.index&appname=addressbook')
);
display_sidebox($appname,$menu_title,$file);

File diff suppressed because one or more lines are too long

View File

@ -16,6 +16,7 @@ addressbook common de Adressbuch
addressbook preferences addressbook de Adressbuch Einstellungen
addressbook-fieldname addressbook de Adressbuch Feldname
addvcard addressbook de VCard hinzufügen
advances search addressbook de Erweiterte Suche
alt. csv import addressbook de Alt. CSV Import
are you sure you want to delete this field? addressbook de Sind Sie sicher, dass Sie dieses Feld löschen wollen?
bbs phone addressbook de BBS
@ -42,6 +43,7 @@ company name common de Firmenname
configuration common de Konfiguration
contact common de Kontakt
contact application admin de Kontakt Anwendung
contact saved addressbook de Kontakt gespeichert
contact settings admin de Kontakt Einstellungen
copied by %1, from record #%2. addressbook de Kopiert von %1, vom Datensatz Nr. %2.
country common de Land
@ -53,13 +55,17 @@ debug output in browser addressbook de Debugausgaben in Browser
default filter addressbook de Standardfilter
delete a single entry by passing the id. addressbook de Löscht einen einzelnen Eintrag durch Übergabe seiner ID.
department common de Abteilung
do you really want to delte this contacts? addressbook de Wollen sie diesen Kontakt wirklich löschen?
doesn't matter addressbook de egal
domestic addressbook de Wohnung
download addressbook de Herunterladen
download export file (uncheck to debug output in browser) addressbook de Download Export-Datei (zur Vorschau im Browser Ankreuzfeld frei lassen)
edit custom field addressbook de Benutzerdefiniertes Feld bearbeiten
edit custom fields admin de Benutzerdefinierte Felder bearbeiten
edit phonenumbers - addressbook de Telefonnummern bearbeiten
empty for all addressbook de leer für alle
enter the path to the exported file here addressbook de Bitte geben Sie den Pfad für die exportierte Datei an
export addressbook de Export
export contacts addressbook de Kontakte exportieren
export file name addressbook de Dateiname zum Exportieren
export from addressbook addressbook de Export vom Adressbuch
@ -97,12 +103,15 @@ import_instructions addressbook de In Netscape,
international addressbook de International
isdn phone addressbook de ISDN-Tel.
label addressbook de Adressetikett
last modified addressbook de Letzte Änderung
ldap context for contacts admin de LDAP-Kontext für Kontakte
ldap host for contacts admin de LDAP-Host für Kontakte
ldap root dn for contacts admin de LDAP-rootdn für Kontakte
ldap root pw for contacts admin de LDAP-Passwort für Kontakte
ldif addressbook de LDIF
line 2 addressbook de Zeile 2
list all categories addressbook de Liste alle Kategorien
list all customfields addressbook de Liste alle benutzerdefinierten Felder
load vcard addressbook de VCard laden
mark records as private addressbook de Eintrag als Privat kennzeichnen
message phone addressbook de Anrufbeantworter
@ -110,9 +119,12 @@ middle name addressbook de Zweiter Vorname
mobile addressbook de Mobil
mobile phone addressbook de Mobiltelefon
modem phone addressbook de Modem
more phonenumbers addressbook de Weitere Telefonnummern
multiple vcard addressbook de Mehrere VCards
no vcard addressbook de Keine VCard
number addressbook de Nummer
number of records to read (%1) addressbook de Anzahl der einzulesenden Datensätze (%1)
organisation addressbook de Organisation
other number addressbook de andere Nr.
other phone addressbook de anderes Telefon
pager common de Pager
@ -124,6 +136,7 @@ postal common de Postanschrift
pref addressbook de präf
prefix addressbook de Präfix
public key addressbook de öffentlicher Schlüssel
read a list / search for entries. addressbook de Lese die Liste / Suche nach Einträgen
read a list of entries. addressbook de Liest eine Liste von Einträgen.
read a single entry by passing the id and fieldlist. addressbook de Liest einen einzelnen Eintrag über seine ID und Feldliste.
record access addressbook de Zugriffsrechte
@ -133,12 +146,18 @@ select all addressbook de Alles ausw
select the type of conversion addressbook de Typ der Umwandlung auswählen
select the type of conversion: addressbook de Typ der Umwandlung auswählen:
select where you want to store admin de Auswählen wo Sie speichern wollen
show addressbook de Anzeigen
show birthday reminders on main screen addressbook de Geburtstagserinnerungen auf der Startseite anzeigen
something went wrong by deleting %1 addressbook de Beim Löschen von %1 trat ein Fehler auf
something went wrong by deleting this contact addressbook de Beim Löschen dieses Kontaktes trat ein Fehler auf
something went wrong by reading this contact addressbook de Bein Laden des Kontaktes trat ein Fehler auf
something went wrong by saving this contact. errorcode %1 addressbook de Beim Speichern dieses Kontaktes trat ein Fehler auf. Errocode %1
startrecord addressbook de Startdatensatz
state common de Bundesland
street common de Straße
successfully imported %1 records into your addressbook. addressbook de %1 Kontakte wurden erfolgreich in Ihr Adressbuch importiert
suffix addressbook de Zusatz
tel home addressbook de Telefon privat
test import (show importable records <u>only</u> in browser) addressbook de Test-Import (zeigt importierbare Datensätze <u>nur</u> im Browser an)
that field name has been used already ! addressbook de Dieser Feldname wird bereits benutzt!
this person's first name was not in the address book. addressbook de Der Vorname dieser Person ist nicht im Adressbuch.
@ -156,6 +175,10 @@ video phone addressbook de Bildtelefon
voice phone addressbook de Telefon
warning!! ldap is valid only if you are not using contacts for accounts storage! admin de WARNUNG!! LDAP darf nur verwendet werden, wenn sie die Benutzerkonten nicht im Adressbuch speichern!
work phone addressbook de Tel dienstl.
you are not permitted to delete contact %1 addressbook de Sie haben nicht die Berechtigungen um den Kontakt %1 zu löschen
you are not permittet to delete this contact addressbook de Sie haben nicht die Berechtigung diesen Kontakt zu löschen
you are not permittet to edit this contact addressbook de Sie haben nicht die Berechtigung diesen Kontakt zu bearbeiten
you are not permittet to view this contact addressbook de Sie haben nicht die Berechtigung diesen Kontakt zu betrachen
you must select a vcard. (*.vcf) addressbook de Sie müssen eine VCard auswählen (*.vcf)
you must select at least 1 column to display addressbook de Sie müssen mindestens eine Spalte zum Anzeigen auswählen
zip code common de PLZ

View File

@ -16,6 +16,7 @@ addressbook common en Addressbook
addressbook preferences addressbook en Addressbook preferences
addressbook-fieldname addressbook en Addressbook-Fieldname
addvcard addressbook en Add VCard
advances search addressbook en Advances search
alt. csv import addressbook en Alt. CSV Import
are you sure you want to delete this field? addressbook en Are you sure you want to delete this field?
bbs phone addressbook en BBS Phone
@ -42,6 +43,7 @@ company name common en Company Name
configuration common en Configuration
contact common en Contact
contact application admin en Contact application
contact saved addressbook en Contact saved
contact settings admin en Contact Settings
copied by %1, from record #%2. addressbook en Copied by %1, from record #%2.
country common en Country
@ -53,13 +55,17 @@ debug output in browser addressbook en Debug output in browser
default filter addressbook en Default Filter
delete a single entry by passing the id. addressbook en Delete a single entry by passing the id.
department common en Department
do you really want to delte this contacts? addressbook en Do you really want to delte this contacts?
doesn't matter addressbook en doesn't matter
domestic addressbook en Domestic
download addressbook en Download
download export file (uncheck to debug output in browser) addressbook en Download export file (Uncheck to debug output in browser)
edit custom field addressbook en Edit Custom Field
edit custom fields admin en Edit Custom Fields
edit phonenumbers - addressbook en Edit Phonenumbers -
empty for all addressbook en empty for all
enter the path to the exported file here addressbook en Enter the path to the exported file here
export addressbook en export
export contacts addressbook en Export Contacts
export file name addressbook en Export file name
export from addressbook addressbook en Export from Addressbook
@ -89,20 +95,23 @@ import contacts addressbook en Import Contacts
import csv-file into addressbook addressbook en Import CSV-File into Addressbook
import file addressbook en Import File
import from addressbook en Import from
import multiple vcard addressbook en Import Multiple VCard
import from ldif, csv, or vcard addressbook en Import from LDIF, CSV, or VCard
import from outlook addressbook en Import from Outlook
import multiple vcard addressbook en Import Multiple VCard
import next set addressbook en Import next set
import_instructions addressbook en In Netscape, open the Addressbook and select <b>Export</b> from the <b>File</b> menu. The file exported will be in LDIF format.<p>Or, in Outlook, select your Contacts folder, select <b>Import and Export...</b> from the <b>File</b> menu and export your contacts into a comma separated text (CSV) file. <p>Or, in Palm Desktop 4.0 or greater, visit your addressbook and select <b>Export</b> from the <b>File</b> menu. The file exported will be in VCard format.
international addressbook en International
isdn phone addressbook en ISDN Phone
label addressbook en Label
last modified addressbook en last modified
ldap context for contacts admin en LDAP context for contacts
ldap host for contacts admin en LDAP host for contacts
ldap root dn for contacts admin en LDAP root dn for contacts
ldap root pw for contacts admin en LDAP root pw for contacts
ldif addressbook en LDIF
line 2 addressbook en Line 2
list all categories addressbook en List all categories
list all customfields addressbook en List all customfields
load vcard addressbook en Load VCard
mark records as private addressbook en Mark records as private
message phone addressbook en Message Phone
@ -110,9 +119,12 @@ middle name addressbook en Middle Name
mobile addressbook en Mobile
mobile phone addressbook en Mobile Phone
modem phone addressbook en Modem Phone
more phonenumbers addressbook en more phonenumbers
multiple vcard addressbook en Multiple VCard
no vcard addressbook en No VCard
number addressbook en Number
number of records to read (%1) addressbook en Number of records to read (%1)
organisation addressbook en organisation
other number addressbook en Other Number
other phone addressbook en Other Phone
pager common en Pager
@ -124,6 +136,7 @@ postal common en Postal
pref addressbook en pref
prefix addressbook en Prefix
public key addressbook en Public Key
read a list / search for entries. addressbook en Read a list / search for entries.
read a list of entries. addressbook en Read a list of entries.
read a single entry by passing the id and fieldlist. addressbook en Read a single entry by passing the id and fieldlist.
record access addressbook en Record Access
@ -133,12 +146,18 @@ select all addressbook en Select all
select the type of conversion addressbook en Select the type of conversion
select the type of conversion: addressbook en Select the type of conversion:
select where you want to store admin en Select where you want to store
show addressbook en Show
show birthday reminders on main screen addressbook en Show birthday reminders on main screen
something went wrong by deleting %1 addressbook en Something went wrong by deleting %1
something went wrong by deleting this contact addressbook en Something went wrong by deleting this contact
something went wrong by reading this contact addressbook en something went wrong by reading this contact
something went wrong by saving this contact. errorcode %1 addressbook en Something went wrong by saving this contact. Errorcode %1
startrecord addressbook en Startrecord
state common en State
street common en Street
successfully imported %1 records into your addressbook. addressbook en Successfully imported %1 record(s) into your addressbook.
suffix addressbook en Suffix
tel home addressbook en tel home
test import (show importable records <u>only</u> in browser) addressbook en Test Import (show importable records <u>only</u> in browser)
that field name has been used already ! addressbook en That field name has been used already !
this person's first name was not in the address book. addressbook en This person's first name was not in the address book.
@ -156,6 +175,11 @@ video phone addressbook en Video Phone
voice phone addressbook en Voice Phone
warning!! ldap is valid only if you are not using contacts for accounts storage! admin en WARNING!! LDAP is valid only if you are NOT using contacts for accounts storage!
work phone addressbook en Work Phone
write (update or add) a single entry by passing the fields. addressbook en Write (update or add) a single entry by passing the fields.
you are not permitted to delete contact %1 addressbook en You are not permitted to delete contact %1
you are not permittet to delete this contact addressbook en You are not permittet to delete this contact
you are not permittet to edit this contact addressbook en You are not permittet to edit this contact
you are not permittet to view this contact addressbook en you are not permittet to view this contact
you must select a vcard. (*.vcf) addressbook en You must select a vcard. (*.vcf)
you must select at least 1 column to display addressbook en You must select at least 1 column to display
zip code common en ZIP Code

View File

@ -0,0 +1,488 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="addressbook.edit.personal" template="" lang="" group="0" version="">
<grid height="320">
<columns>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<image src="personal"/>
<description value="prefix"/>
<textbox id="prefix" size="40"/>
<description/>
<description value="time zone"/>
<menulist>
<menupopup 1="label" 2="label" id="tz" no_lang="1"/>
</menulist>
</row>
<row>
<description/>
<description value="first name"/>
<textbox id="n_given" size="40"/>
<image src="kaddressbook"/>
<description value="home phone"/>
<textbox id="tel_home" size="30"/>
</row>
<row>
<description/>
<description value=" middle name"/>
<textbox id="n_middle" size="40"/>
<description/>
<description value="business phone"/>
<textbox id="tel_work" size="30"/>
</row>
<row>
<description/>
<description value="last name"/>
<textbox id="n_family" size="40"/>
<description/>
<description value="mobile phone"/>
<textbox id="tel_cell" size="30"/>
</row>
<row>
<description/>
<description value="suffix"/>
<textbox id="n_suffix" size="40"/>
<description/>
<description/>
<button label="more phonenumbers" onclick="showphones(this.form); return false;"/>
</row>
<row>
<description/>
<description/>
<description/>
<image src="email"/>
<description value="home email"/>
<textbox id="email_home" size="30"/>
</row>
<row>
<description/>
<description value=" birthday"/>
<date 1="label" id="bday"/>
<description/>
<description value="business email"/>
<textbox id="business email" size="30"/>
</row>
<row>
<description/>
<description/>
<description/>
<description/>
<description/>
<description/>
</row>
<row valign="top">
<image src="folder"/>
<description value="category"/>
<listbox type="select-cat" id="cat_id" rows="3"/>
<image src="package_network"/>
<description value="url"/>
<textbox id="url" size="30"/>
</row>
<row>
<image src="password"/>
<description value="private"/>
<checkbox id="private"/>
<description/>
<description/>
<description/>
</row>
<row height="100%">
<description/>
<description/>
<description/>
<description/>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
<template id="addressbook.edit.organisation" template="" lang="" group="0" version="">
<grid height="320">
<columns>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<image src="gear"/>
<description value="title"/>
<textbox size="40" id="title"/>
<description/>
</row>
<row>
<description/>
<description value="department"/>
<textbox id="org_unit" size="40"/>
<description/>
</row>
<row>
<description/>
<description/>
<description/>
<description/>
</row>
<row>
<image src="gohome"/>
<description value="company name"/>
<textbox size="40" id="org_name"/>
<description/>
</row>
<row>
<description/>
<description value="business street"/>
<textbox size="40" id="adr_one_street"/>
<description/>
</row>
<row>
<description/>
<description value="address line 2"/>
<textbox size="40" id="address2"/>
<description/>
</row>
<row>
<description/>
<description value="address line 3"/>
<textbox size="40" id="address3"/>
<description/>
</row>
<row>
<description/>
<description value="business city"/>
<textbox size="40" id="adr_one_locality"/>
<description/>
</row>
<row>
<description/>
<description value="business zip code"/>
<textbox size="40" id="adr_one_postalcode"/>
<description/>
</row>
<row>
<description/>
<description value="business state"/>
<textbox size="40" id="adr_one_region"/>
<description/>
</row>
<row>
<description/>
<description value="business country"/>
<textbox size="40" id="adr_one_countryname"/>
<description/>
</row>
<row height="100%">
<description/>
<description/>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
<template id="addressbook.edit.home" template="" lang="" group="0" version="">
<grid height="320">
<columns>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<image src="gohome"/>
<description value="home street"/>
<textbox size="40" id="adr_two_street"/>
</row>
<row>
<description/>
<description value="home city"/>
<textbox size="40" id="adr_two_locality"/>
</row>
<row>
<description/>
<description value="home zip code"/>
<textbox size="40" id="adr_two_postalcode"/>
</row>
<row>
<description/>
<description value="home state"/>
<textbox size="40" id="adr_two_locality"/>
</row>
<row>
<description/>
<description value="home country"/>
<textbox size="40" id="adr_two_countryname"/>
</row>
<row valign="baseline" height="100%">
<description/>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
<template id="addressbook.edit.details" template="" lang="" group="0" version="">
<grid height="320">
<columns>
<column/>
<column/>
<column/>
</columns>
<rows>
<row valign="top">
<description/>
<description value="notes"/>
<textbox multiline="true" rows="4" cols="80" id="note"/>
</row>
<row valign="top">
<description/>
<description value=" label"/>
<textbox multiline="true" rows="4" cols="80" id="label"/>
</row>
<row valign="top">
<description/>
<description value="public key"/>
<textbox multiline="true" rows="4" cols="80" id="pubkey"/>
</row>
<row height="100%">
<description/>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
<template id="addressbook.edit.custom" template="" lang="" group="0" version="">
<grid height="320">
<columns>
<column/>
</columns>
<rows>
<row>
<customfields/>
</row>
<row height="100%">
<description/>
</row>
</rows>
</grid>
</template>
<template id="addressbook.editphones" template="" lang="" group="0" version="">
<grid class="editphones">
<columns>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<hbox span="all" class="windowheader">
<hbox align="center">
<description value="Edit Phonenumbers - " align="right"/>
<description no_lang="1" id="fn"/>
</hbox>
</hbox>
<description/>
<description/>
<description/>
</row>
<row>
<description span="all" class="redItalic" id="msg"/>
<description/>
<description/>
<description/>
</row>
<row class="th">
<description/>
<description value="Description"/>
<description value="Number"/>
<description value="pref"/>
</row>
<row>
<description/>
<description value="home phone"/>
<textbox size="30" id="tel_home2"/>
<radio options="tel_home" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="business phone"/>
<textbox size="30" id="tel_work2"/>
<radio options="tel_work" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="mobile phone"/>
<textbox size="30" id="tel_cell2"/>
<radio options="tel_cell" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="fax"/>
<textbox size="30" id="tel_fax"/>
<radio options="tel_fax" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="car phone"/>
<textbox size="30" id="tel_car"/>
<radio options="tel_car" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="video phone"/>
<textbox size="30" id="tel_video"/>
<radio options="tel_video" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="pager"/>
<textbox size="30" id="tel_pager"/>
<radio options="tel_pager" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="voice phone"/>
<textbox size="30" id="tel_voice"/>
<radio options="tel_voice" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="message phone"/>
<textbox size="30" id="tel_msg"/>
<radio options="tel_msg" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="bbs phone"/>
<textbox size="30" id="tel_bbs"/>
<radio options="tel_bbs" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="modem phone"/>
<textbox size="30" id="tel_modem"/>
<radio options="tel_modem" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="isdn phone"/>
<textbox size="30" id="tel_isdn"/>
<radio options="tel_isdn" id="tel_prefer"/>
</row>
<row>
<description/>
<description value=" Other Phone"/>
<textbox size="30" id="ophone"/>
<radio options="ophone" id="tel_prefer"/>
</row>
<row>
<description/>
<description/>
<description/>
<description/>
</row>
<row>
<description/>
<hbox span="3">
<button label="Ok" onclick="hidephones(this.form); return false;"/>
</hbox>
</row>
</rows>
</grid>
<styles>
.editphones{
position: fixed;
top: 50px;
left: 240px;
display:none;
border: 1px solid #000000;
background-color: #ffffff;
}
.windowheader{
background-image:url(http://solomon/egroupware/phpgwapi/templates/idots/images/appbox-header-background.png);
background-repeat:repeat-x;
height: 20px;
border-spacing: 0px;
border-collapse:collapse;
border-bottom: #9c9c9c 1px solid;
}
</styles>
</template>
<template id="addressbook.edit" template="" lang="" group="0" version="">
<grid>
<columns>
<column width="750"/>
</columns>
<rows>
<row>
<description span="all" class="redItalic" id="msg" no_lang="1"/>
</row>
<row>
<textbox id="fn" readonly="true" span="all"/>
</row>
<row valign="top" height="350">
<tabbox span="all">
<tabs>
<tab label="personal" statustext=""/>
<tab label="organisation" statustext=""/>
<tab label="home" statustext=""/>
<tab label="details" statustext=""/>
<tab label="custom" statustext=""/>
</tabs>
<tabpanels>
<template id="addressbook.edit.personal"/>
<template id="addressbook.edit.organisation"/>
<template id="addressbook.edit.home"/>
<template id="addressbook.edit.details"/>
<template id="addressbook.edit.custom"/>
</tabpanels>
</tabbox>
</row>
<row disabled="!@id">
<hbox>
<hbox>
<description value="owner"/>
<menulist>
<menupopup type="select-account" id="owner" readonly="true"/>
</menulist>
</hbox>
<hbox align="right">
<description value="last modified"/>
<date-time id="last_mod" readonly="true"/>
</hbox>
</hbox>
</row>
<row disabled="@hidebuttons">
<hbox>
<hbox>
<button label="Edit" id="button[edit]"/>
<button label="Copy" id="button[copy]"/>
<button label="Save" id="button[save]"/>
<button label="Apply" id="button[apply]"/>
<button label="Cancel" id="button[cancel]" onclick="self.close(); return false;"/>
</hbox>
<button label="Delete" id="button[delete]" onclick="return confirm('Are you shure you want to delete this contact?');" align="right"/>
</hbox>
</row>
<row>
<template id="addressbook.editphones"/>
</row>
</rows>
</grid>
<styles>
.redItalic { color: red; font-style: italic; }
</styles>
</template>
</overlay>

View File

@ -0,0 +1,148 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="addressbook.editphones" template="" lang="" group="0" version="">
<grid class="editphones">
<columns>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<hbox span="all" class="windowheader">
<hbox align="center">
<description value="Edit Phonenumbers - " align="right"/>
<description no_lang="1" id="fn"/>
</hbox>
</hbox>
<description/>
<description/>
<description/>
</row>
<row>
<description span="all" class="redItalic" id="msg"/>
<description/>
<description/>
<description/>
</row>
<row class="th">
<description/>
<description value="Description"/>
<description value="Number"/>
<description value="pref"/>
</row>
<row>
<description/>
<description value="home phone"/>
<textbox size="30" id="tel_home2"/>
<radio options="tel_home" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="business phone"/>
<textbox size="30" id="tel_work2"/>
<radio options="tel_work" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="mobile phone"/>
<textbox size="30" id="tel_cell2"/>
<radio options="tel_cell" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="fax"/>
<textbox size="30" id="tel_fax"/>
<radio options="tel_fax" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="car phone"/>
<textbox size="30" id="tel_car"/>
<radio options="tel_car" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="video phone"/>
<textbox size="30" id="tel_video"/>
<radio options="tel_video" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="pager"/>
<textbox size="30" id="tel_pager"/>
<radio options="tel_pager" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="voice phone"/>
<textbox size="30" id="tel_voice"/>
<radio options="tel_voice" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="message phone"/>
<textbox size="30" id="tel_msg"/>
<radio options="tel_msg" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="bbs phone"/>
<textbox size="30" id="tel_bbs"/>
<radio options="tel_bbs" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="modem phone"/>
<textbox size="30" id="tel_modem"/>
<radio options="tel_modem" id="tel_prefer"/>
</row>
<row>
<description/>
<description value="isdn phone"/>
<textbox size="30" id="tel_isdn"/>
<radio options="tel_isdn" id="tel_prefer"/>
</row>
<row>
<description/>
<description value=" Other Phone"/>
<textbox size="30" id="ophone"/>
<radio options="ophone" id="tel_prefer"/>
</row>
<row>
<description/>
<description/>
<description/>
<description/>
</row>
<row>
<description/>
<hbox span="3">
<button label="Ok" onclick="hidephones(this.form); return false;"/>
</hbox>
</row>
</rows>
</grid>
<styles>
.editphones{
position: fixed;
top: 50px;
left: 240px;
display:none;
border: 1px solid #000000;
background-color: #ffffff;
}
.windowheader{
background-image:url(http://solomon/egroupware/phpgwapi/templates/idots/images/appbox-header-background.png);
background-repeat:repeat-x;
height: 20px;
border-spacing: 0px;
border-collapse:collapse;
border-bottom: #9c9c9c 1px solid;
}
</styles>
</template>
</overlay>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1015 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

View File

@ -75,7 +75,7 @@ function check_all(which)
</table>
<table border="0" cellspacing="0" cellpadding="2">
<tr class="th">
<form action="{add_url}" method="post"><td><input type="submit" name="Add" value="{lang_add}" /></td></form>
<form action="{add_url}" method="post"><td><input type="submit" name="Add" value="{lang_add}" onclick="{add_onclick}"/></td></form>
<form action="{vcard_url}" method="post"><td><input type="submit" name="AddVcard" value="{lang_addvcard}" /></td></form>
<form action="{import_url}" method="post"><td><input type="submit" name="Import" value="{lang_import}" /></td></form>
</tr>

View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="addressbook.search" template="" lang="" group="0" version="">
<grid width="100%">
<columns>
<column/>
</columns>
<rows>
<row>
<advancedsearch id="advs"/>
</row>
</rows>
</grid>
</template>
</overlay>