- new add/edit dialog using tabs
- new "advanced search" function / dialog - customfields can now be of type text, selectbox, radio and checkbox
236
addressbook/inc/class.bocontacts.inc.php
Executable 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;
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
||||
|
134
addressbook/inc/class.so_ldap.inc.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
298
addressbook/inc/class.socontacts.inc.php
Executable 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;
|
||||
}
|
||||
}
|
@ -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))
|
||||
|
217
addressbook/inc/class.uicontacts.inc.php
Normal 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>';
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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);
|
||||
|
39
addressbook/setup/etemplates.inc.php
Executable 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
|
||||
|
@ -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
|
||||
|
488
addressbook/templates/default/edit.xet
Normal 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>
|
148
addressbook/templates/default/editphones.xet
Normal 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>
|
BIN
addressbook/templates/default/images/email.png
Executable file
After Width: | Height: | Size: 1015 B |
BIN
addressbook/templates/default/images/folder.png
Executable file
After Width: | Height: | Size: 731 B |
BIN
addressbook/templates/default/images/gear.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
addressbook/templates/default/images/gohome.png
Executable file
After Width: | Height: | Size: 754 B |
BIN
addressbook/templates/default/images/kaddressbook.png
Executable file
After Width: | Height: | Size: 299 B |
BIN
addressbook/templates/default/images/package_network.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
addressbook/templates/default/images/password.png
Executable file
After Width: | Height: | Size: 635 B |
BIN
addressbook/templates/default/images/personal.png
Executable file
After Width: | Height: | Size: 962 B |
@ -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>
|
||||
|
16
addressbook/templates/default/search.xet
Normal 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>
|