merged addressbook document templates (incl. contacts calendar), sitemgr contact-form and modified calendar edit dialog (bigger categories selection)

This commit is contained in:
Ralf Becker 2007-06-21 19:22:47 +00:00
commit 4e4d257f7e
16 changed files with 1264 additions and 58 deletions

View File

@ -0,0 +1,142 @@
<?php
/**
* Addressbook - Sitemgr contact form
*
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package addressbook
* @copyright (c) 2007 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
require_once(EGW_INCLUDE_ROOT.'/etemplate/inc/class.uietemplate.inc.php');
/**
* SiteMgr contact form for the addressbook
*
*/
class addressbook_contactform
{
/**
* Shows the contactform and stores the submitted data
*
* @param array $content=null submitted eTemplate content
* @param int $addressbook=null int owner-id of addressbook to save contacts too
* @param array $fields=null field-names to show
* @param string $msg=null message to show after submitting the form
* @param string $email=null comma-separated email addresses
* @param string $tpl_name=null custom etemplate to use
* @param string $subject=null subject for email
* @return string html content
*/
function display($content=null,$addressbook=null,$fields=null,$msg=null,$email=null,$tpl_name=null,$subject=null)
{
//echo "<p>addressbook_contactform::display($content,$addressbook,".print_r($fields,true).",$msg)</p>\n";
$tpl = new etemplate($tpl_name ? $tpl_name : 'addressbook.contactform');
if (is_array($content))
{
if ($content['captcha'] != $content['captcha_result'])
{
$tpl->set_validation_error('captcha',lang('Wrong - try again ...'));
}
elseif ($content['submitit'])
{
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.bocontacts.inc.php');
$contact = new bocontacts();
if ($content['owner']) // save the contact in the addressbook
{
if ($content['email_contactform']) // only necessary as long addressbook is not doing this itself
{
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.addressbook_tracking.inc.php');
$tracking = new addressbook_tracking($contact);
}
if ($contact->save($content))
{
unset($content['modified']); unset($content['modifier']); // not interesting for new entries
$tracking->do_notifications($content,null); // only necessary as long addressbook is not doing this itself
return '<p align="center">'.$content['msg'].'</p>';
}
else
{
return '<p align="center">'.lang('There was an error saving your data :-(').'<br />'.
lang('The anonymous user has probably no add rights for this addressbook.').'</p>';
}
}
else // this is only called, if we send only email and dont save it
{
if ($contact['email_contactform'])
{
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.addressbook_tracking.inc.php');
$tracking = new addressbook_tracking($contact);
}
if ($tracking->do_notifications($content,null))
{
return '<p align="center">'.$content['msg'].'</p>';
}
else
{
return '<p align="center">'.lang('There was an error saving your data :-(').'<br />'.
lang('Either the configured email addesses are wrong or the mail configuration.').'</p>';
}
}
}
}
else
{
$preserv['owner'] = $addressbook;
$preserv['msg'] = $msg;
$preserv['is_contactform'] = true;
$preserv['email_contactform'] = $email;
$preserv['subject_contactform'] = $subject;
if (!$fields) $fields = array('org_name','n_fn','email','tel_work','url','note','captcha');
$custom = 1;
foreach($fields as $name)
{
if ($name{0} == '#') // custom field
{
static $contact;
if (is_null($contact))
{
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.bocontacts.inc.php');
$contact = new bocontacts();
}
$content['show']['custom'.$custom] = true;
$content['customfield'][$custom] = $name;
$content['customlabel'][$custom] = $contact->customfields[substr($name,1)]['label'];
++$custom;
}
elseif($name == 'adr_one_locality')
{
if (!($content['show'][$name] = $GLOBALS['egw_info']['user']['preferences']['addressbook']['addr_format']))
{
$content['show'][$name] = 'postcode_city';
}
}
else
{
$content['show'][$name] = true;
}
}
}
$content['addr_format'] = $GLOBALS['egw_info']['user']['preferences']['addressbook']['addr_format'];
if ($addressbook) $preserv['owner'] = $addressbook;
if ($msg) $preserv['msg'] = $msg;
// a simple calculation captcha
$num1 = rand(1,99);
$num2 = rand(1,99);
if ($num2 > $num1) // keep the result positive
{
$n = $num1; $num1 = $num2; $num2 = $n;
}
$content['captcha_task'] = sprintf('%d - %d =',$num1,$num2);
$preserv['captcha_result'] = $num1-$num2;
return $tpl->exec('addressbook.addressbook_contactform.display',$content,$sel_options,$readonlys,$preserv);
}
}

View File

@ -0,0 +1,327 @@
<?php
/**
* Addressbook - document merge
*
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package addressbook
* @copyright (c) 2007 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
require_once(EGW_API_INC.'/class.vfs.inc.php');
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.bocontacts.inc.php');
/**
* Addressbook - document merge object
*/
class addressbook_merge // extends bo_merge
{
/**
* Functions that can be called via menuaction
*
* @var array
*/
var $public_functions = array('show_replacements' => true);
/**
* Instance of the vfs class
*
* @var vfs
*/
var $vfs;
/**
* Instance of the bocontacts class
*
* @var bocontacts
*/
var $contacts;
/**
* Constructor
*
* @return addressbook_merge
*/
function addressbook_merge()
{
$this->vfs =& new vfs();
$this->contacts =& new bocontacts();
}
/**
* Return replacements for a contact
*
* @param int/string/array $contact contact-array or id
* @param string $prefix='' prefix like eg. 'user'
* @return array
*/
function contact_replacements($contact,$prefix='')
{
if (!is_array($contact))
{
$contact = $this->contacts->read($contact);
}
if (!is_array($contact)) return array();
$replacements = array();
foreach($contact as $name => $value)
{
switch($name)
{
case 'created': case 'modified':
$value = date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'].' '.
($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i a':'H:i'));
break;
case 'bday':
if ($value)
{
list($y,$m,$d) = explode('-',$value);
$contact[$name] = $GLOBALS['egw']->common->dateformatorder($y,$m,$d,true);
}
break;
case 'owner': case 'creator': case 'modifier':
$value = $GLOBALS['egw']->common->grab_owner_name($value);
break;
case 'cat_id':
if ($value)
{
if (!is_object($GLOBALS['egw']->cats))
{
require_once(EGW_API_INC.'/class.categories.inc.php');
$GLOBALS['egw']->cats =& new categories;
}
$cats = array();
foreach(is_array($value) ? $value : explode(',',$value) as $cat_id)
{
$cats[] = $GLOBALS['egw']->cats->id2name($cat_id);
}
$value = implode(', ',$cats);
}
break;
case 'jpegphoto': // returning a link might make more sense then the binary photo
if ($contact['photo'])
{
$value = ($GLOBALS['egw_info']['server']['webserver_url']{0} == '/' ?
($_SERVER['HTTPS'] ? 'https://' : 'http://').$_SERVER['HTTP_HOST'] : '').
$GLOBALS['egw']->link('/index.php',$contact['photo']);
}
break;
case 'tel_prefer':
if ($value && $contact[$value])
{
$value = $contact[$value];
}
break;
case 'account_id':
if ($value)
{
$replacements['$$'.($prefix ? $prefix.'/':'').'account_lid$$'] = $GLOBALS['egw']->accounts->id2name($value);
}
break;
}
if ($name != 'photo') $replacements['$$'.($prefix ? $prefix.'/':'').$name.'$$'] = $value;
}
return $replacements;
}
/**
* Return replacements for the calendar (next events) of a contact
*
* ToDo: not yet implemented!!!
*
* @param int $contact contact-id
* @return array
*/
function calendar_replacements($id)
{
require_once(EGW_INCLUDE_ROOT.'/calendar/inc/class.bocalupdate.inc.php');
$calendar =& new bocalupdate();
$replacements = array(); $n = 1;
foreach($calendar->search(array(
'start' => $calendar->now_su,
'users' => 'c'.$id,
'offset' => 0,
'num_rows' => 20,
'order' => 'cal_start',
)) as $event)
{
foreach($calendar->event2array($event) as $name => $data)
{
if (substr($name,-4) == 'date') $name = substr($name,0,-4);
$replacements['$$calendar/'.$n.'/'.$name.'$$'] = is_array($data['data']) ? implode(', ',$data['data']) : $data['data'];
}
foreach(array('start','end') as $what)
{
foreach(array(
'date' => $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],
'day' => 'l',
'time' => $GLOBALS['egw_info']['user']['preferences']['common']['timeformat'] == 12 ? 'h:i a' : 'H:i',
) as $name => $format)
{
$value = date($format,$event[$what]);
if ($format == 'l') $value = lang($value);
$replacements['$$calendar/'.$n.'/'.$what.$name.'$$'] = $value;
}
}
$duration = ($event['end'] - $event['start'])/60;
$replacements['$$calendar/'.$n.'/duration$$'] = floor($duration/60).lang('h').($duration%60 ? $duration%60 : '');
++$n;
}
return $replacements;
}
/**
* Merges a given document with contact data
*
* @param string $document vfs-path of document
* @param array $ids array with contact id(s)
* @param string &$err error-message on error
* @return string/boolean merged document or false on error
*/
function merge($document,$ids,&$err)
{
if (count($ids) > 1)
{
$err = 'Inserting more then one contact in a document is not yet implemented!';
return false;
}
$id = $ids[0];
if (!($content = $this->vfs->read(array(
'string' => $document,
'relatives' => RELATIVE_ROOT,
))))
{
$err = lang("Document '%1' does not exist or is not readable for you!",$document);
return false;
}
// generate replacements
if (!($replacements = $this->contact_replacements($id)))
{
$err = lang('Contact not found!');
return false;
}
if (strpos($content,'$$user/') !== null && ($user = $GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id')))
{
$replacements += $this->contact_replacements($user,'user');
}
if (strpos($content,'$$calendar/') !== null)
{
$replacements += $this->calendar_replacements($id);
}
$replacements['$$date$$'] = date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],time()+$this->contacts->tz_offset_s);
if ($this->contacts->prefs['csv_charset']) // if we have an export-charset defined, use it here to
{
$replacements = $GLOBALS['egw']->translation->convert($replacements,$GLOBALS['egw']->translation->charset(),$this->contacts->prefs['csv_charset']);
}
$content = str_replace(array_keys($replacements),array_values($replacements),$content);
if (strpos($content,'$$calendar/') !== null) // remove not existing event-replacements
{
$content = preg_replace('/\$\$calendar\/[0-9]+\/[a-z_]+\$\$/','',$content);
}
return $content;
}
/**
* Download document merged with contact(s)
*
* @param string $document vfs-path of document
* @param array $ids array with contact id(s)
* @return string with error-message on error, otherwise it does NOT return
*/
function download($document,$ids)
{
if (!($merged = $this->merge($document,$ids,$err)))
{
return $err;
}
$mime_type = $this->vfs->file_type(array(
'string' => $document,
'relatives' => RELATIVE_ROOT,
));
ExecMethod2('phpgwapi.browser.content_header',basename($document),$mime_type);
echo $merged;
$GLOBALS['egw']->common->egw_exit();
}
/**
* Generate table with replacements for the preferences
*
*/
function show_replacements()
{
$GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Replacements for inserting contacts into documents');
$GLOBALS['egw_info']['flags']['nonavbar'] = false;
$GLOBALS['egw']->common->egw_header();
echo "<table width='90%' align='center'>\n";
echo '<tr><td colspan="4"><h3>'.lang('Contact fields:')."</h3></td></tr>";
$n = 0;
foreach($this->contacts->contact_fields as $name => $label)
{
if (in_array($name,array('tid','label','geo'))) continue; // dont show them, as they are not used in the UI atm.
if (in_array($name,array('email','org_name','tel_work','url')) && $n&1) // main values, which should be in the first column
{
echo "</tr>\n";
$n++;
}
if (!($n&1)) echo '<tr>';
echo '<td>$$'.$name.'$$</td><td>'.$label.'</td>';
if ($n&1) echo "</tr>\n";
$n++;
}
echo '<tr><td colspan="4"><h3>'.lang('General fields:')."</h3></td></tr>";
foreach(array(
'date' => lang('Date'),
'user/n_fn' => lang('Name of current user, all other contact fields are valid too'),
'user/account_lid' => lang('Username'),
) as $name => $label)
{
echo '<tr><td>$$'.$name.'$$</td><td colspan="3">'.$label."</td></tr>\n";
}
$GLOBALS['egw']->translation->add_app('calendar');
echo '<tr><td colspan="4"><h3>'.lang('Calendar fields:')." # = 1, 2, ..., 20</h3></td></tr>";
foreach(array(
'title' => lang('Title'),
'description' => lang('Description'),
'participants' => lang('Participants'),
'category' => lang('Location'),
'start' => lang('Start').': '.lang('Date').'+'.lang('Time'),
'startday' => lang('Start').': '.lang('Weekday'),
'startdate'=> lang('Start').': '.lang('Date'),
'starttime'=> lang('Start').': '.lang('Time'),
'end' => lang('End').': '.lang('Date').'+'.lang('Time'),
'endday' => lang('End').': '.lang('Weekday'),
'enddate' => lang('End').': '.lang('Date'),
'endtime' => lang('End').': '.lang('Time'),
'duration' => lang('Duration'),
'owner' => lang('Owner'),
'priority' => lang('Priority'),
'updated' => lang('Updated'),
'recur_type' => lang('Repetition'),
'access' => lang('Access').': '.lang('public').', '.lang('private'),
) as $name => $label)
{
if (in_array($name,array('start','end')) && $n&1) // main values, which should be in the first column
{
echo "</tr>\n";
$n++;
}
if (!($n&1)) echo '<tr>';
echo '<td>$$calendar/#/'.$name.'$$</td><td>'.$label.'</td>';
if ($n&1) echo "</tr>\n";
$n++;
}
echo "</table>\n";
$GLOBALS['egw']->common->egw_footer();
}
}

View File

@ -0,0 +1,237 @@
<?php
/**
* Addressbook - history and notifications
*
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package addressbook
* @copyright (c) 2007 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
require_once(EGW_INCLUDE_ROOT.'/etemplate/inc/class.bo_tracking.inc.php');
/**
* Addressbook - tracking object
*/
class addressbook_tracking extends bo_tracking
{
/**
* Application we are tracking (required!)
*
* @var string
*/
var $app = 'addressbook';
/**
* Name of the id-field, used as id in the history log (required!)
*
* @var string
*/
var $id_field = 'id';
/**
* Name of the field with the creator id, if the creator of an entry should be notified
*
* @var string
*/
var $creator_field = 'creator';
/**
* Name of the field with the id(s) of assinged users, if they should be notified
*
* @var string
*/
var $assigned_field;
/**
* Translate field-name to 2-char history status
*
* @var array
*/
var $field2history = array(
);
/**
* Should the user (passed to the track method or current user if not passed) be used as sender or get_config('sender')
*
* @var boolean
*/
var $prefer_user_as_sender = true;
/**
* Instance of the bocontacts class calling us
*
* @access private
* @var bocontacts
*/
var $contacts;
/**
* Constructor
*
* @param bocontacts &$bocontacts
* @return tracker_tracking
*/
function addressbook_tracking(&$bocontacts)
{
$this->bo_tracking(); // calling the constructor of the extended class
$this->contacts =& $bocontacts;
}
/**
* Get a notification-config value
*
* @param string $what
* - 'copy' array of email addresses notifications should be copied too, can depend on $data
* - 'lang' string lang code for copy mail
* - 'sender' string send email address
* @param array $data current entry
* @param array $old=null old/last state of the entry or null for a new entry
* @return mixed
*/
function get_config($name,$data,$old)
{
//echo "<p>addressbook_tracking::get_config($name,".print_r($data,true).",...)</p>\n";
switch($name)
{
case 'copy':
if ($data['is_contactform'])
{
return split(', ?',$data['email_contactform']);
}
break;
case 'sender':
if ($data['is_contactform'])
{
//echo "<p>addressbook_tracking::get_config($name,...) email={$data['email']}, n_given={$data['n_given']}, n_family={$data['n_family']}</p>\n";
return $data['email'] ? $data['n_given'].' '.$data['n_family'].' <'.$data['email'].'>' : null;
}
break;
}
return null;
}
/**
* Get the modified / new message (1. line of mail body) for a given entry, can be reimplemented
*
* @param array $data
* @param array $old
* @return string
*/
function get_message($data,$old)
{
if (!$data['modified'] || !$old)
{
return lang('New contact submitted by %1 at %2',
$GLOBALS['egw']->common->grab_owner_name($data['creator']),
$this->datetime($data['created']-$this->tracker->tz_offset_s));
}
return lang('Contact modified by %1 at %2',
$GLOBALS['egw']->common->grab_owner_name($data['modifier']),
$this->datetime($data['modified']-$this->tracker->tz_offset_s));
}
/**
* Get the subject of the notification
*
* @param array $data
* @param array $old
* @return string
*/
function get_subject($data,$old)
{
if ($data['is_contactform'])
{
$prefix = ($data['subject_contactform'] ? $data['subject_contactform'] : lang('Contactform')).': ';
}
return $prefix.$this->contacts->link_title($data);
}
/**
* Get the details of an entry
*
* @param array $data
* @param string $datetime_format of user to notify, eg. 'Y-m-d H:i'
* @param int $tz_offset_s offset in sec to be add to server-time to get the user-time of the user to notify
* @return array of details as array with values for keys 'label','value','type'
*/
function get_details($data)
{
foreach($this->contacts->contact_fields as $name => $label)
{
if (!$data[$name] && $name != 'owner') continue;
switch($name)
{
case 'n_prefix': case 'n_given': case 'n_middle': case 'n_family': case 'n_suffix': // already in n_fn
case 'n_fileas': case 'id': case 'tid':
break;
case 'created': case 'modified':
$details[$name] = array(
'label' => $label,
'value' => $this->datetime($data[$name]-$this->contacts->tz_offset_s),
);
break;
case 'bday':
if ($data[$name])
{
list($y,$m,$d) = explode('-',$data[$name]);
$details[$name] = array(
'label' => $label,
'value' => $GLOBALS['egw']->common->dateformatorder($y,$m,$d,true),
);
}
break;
case 'owner': case 'creator': case 'modifier':
$details[$name] = array(
'label' => $label,
'value' => $GLOBALS['egw']->common->grab_owner_name($data[$name]),
);
break;
case 'cat_id':
if ($data[$name])
{
$cats = array();
foreach(is_array($data[$name]) ? $data[$name] : explode(',',$data[$name]) as $cat_id)
{
$cats[] = $GLOBALS['egw']->cats->id2name($cat_id);
}
$details[$name] = array(
'label' => $label,
'value' => explode(', ',$cats),
);
}
case 'note':
$details[$name] = array(
'label' => $label,
'value' => $data[$name],
'type' => 'multiline',
);
break;
default:
$details[$name] = array(
'label' => $label,
'value' => $data[$name],
);
break;
}
}
if ($this->contacts->customfields)
{
foreach($this->contacts->customfields as $name => $custom)
{
if (!$header_done)
{
$details['custom'] = array(
'value' => lang('Custom fields').':',
'type' => 'reply',
);
$header_done = true;
}
$details['#'.$name] = array(
'label' => $custom['label'],
'value' => $data['#'.$name],
);
}
}
return $details;
}
}

View File

@ -791,9 +791,36 @@ class bocontacts extends socontacts
{
return array(
'type' => 'c',// one char type-identifiy for this resources
'info' => 'addressbook.bocontacts.calendar_info',// info method, returns array with id, type & name for a given id
);
}
/**
* returns info about contacts for calender
*
* @param int/array $ids single contact-id or array of id's
* @return array
*/
function calendar_info($ids)
{
if (!$ids) return null;
$data = array();
foreach(!is_array($ids) ? array($ids) : $ids as $id)
{
if (!($contact = $this->read($id))) continue;
$data[] = array(
'res_id' => $id,
'email' => $contact['email'] ? $contact['email'] : $contact['email_home'],
'rights' => EGW_ACL_READ_FOR_PARTICIPANTS,
'name' => $this->link_title($contact),
);
}
//echo "<p>calendar_info(".print_r($ids,true).")="; _debug_array($data);
return $data;
}
/**
* Called by delete-account hook, when an account get deleted --> deletes/moves the personal addressbook
*

View File

@ -224,7 +224,33 @@ class contacts_admin_prefs
'xmlrpc' => True,
'admin' => false,
);
if ($GLOBALS['egw_info']['user']['apps']['filemanager'])
{
$link = $GLOBALS['egw']->link('/index.php','menuaction=addressbook.addressbook_merge.show_replacements');
$GLOBALS['settings']['default_document'] = array(
'type' => 'input',
'size' => 60,
'label' => 'Default document to insert contacts',
'name' => 'default_document',
'help' => lang('If you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. That icon allows to download the specified document with the contact data inserted.').' '.
lang('The document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2).','<a href="'.$link.'" target="_blank">','</a>').' '.
lang('At the moment the following document-types are supported:').'*.rtf, *.txt',
'xmlrpc' => True,
'admin' => False,
);
$GLOBALS['settings']['document_dir'] = array(
'type' => 'input',
'size' => 60,
'label' => 'Directory with documents to insert contacts',
'name' => 'document_dir',
'help' => lang('If you specify a directory (full vfs path) here, addressbook displays an action for each document. That action allows to download the specified document with the contact data inserted.').' '.
lang('The document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2).','<a href="'.$link.'" target="_blank">','</a>').' '.
lang('At the moment the following document-types are supported:').'*.rtf, *.txt',
'xmlrpc' => True,
'admin' => False,
);
}
return true; // otherwise prefs say it cant find the file ;-)
}

View File

@ -107,6 +107,12 @@ class uicontacts extends bocontacts
$content['action'] = 'delete';
$content['nm']['rows']['checked'] = array($id);
}
if (isset($content['nm']['rows']['document'])) // handle insert in default document button like an action
{
list($id) = @each($content['nm']['rows']['document']);
$content['action'] = 'document';
$content['nm']['rows']['checked'] = array($id);
}
if ($content['action'] !== '')
{
if (!count($content['nm']['rows']['checked']) && !$content['use_all'] && $content['action'] != 'delete_list')
@ -264,7 +270,10 @@ class uicontacts extends bocontacts
$sel_options['action']['remove_from_list'] = lang('Remove selected contacts from distribution list');
$sel_options['action']['delete_list'] = lang('Delete selected distribution list!');
}
if ($this->prefs['document_dir'])
{
$sel_options['action'] += $this->get_document_actions();
}
if (!array_key_exists('importexport',$GLOBALS['egw_info']['user']['apps'])) unset($sel_options['action']['export']);
// dont show tid-selection if we have only one content_type
@ -469,6 +478,11 @@ class uicontacts extends bocontacts
$to_list = (int)substr($action,8);
$action = 'to_list';
}
if (substr($action,0,9) == 'document-')
{
$document = substr($action,9);
$action = 'document';
}
// Security: stop non-admins to export more then the configured number of contacts
if (in_array($action,array('csv','vcard')) && (int)$this->config['contact_export_limit'] &&
!isset($GLOBALS['egw_info']['user']['apps']['admin']) && count($checked) > $this->config['contact_export_limit'])
@ -542,6 +556,10 @@ class uicontacts extends bocontacts
$GLOBALS['egw']->session->appsession($session_name,'addressbook',$query);
}
return false;
case 'document':
$msg = $this->download_document($checked,$document);
return false;
}
foreach($checked as $id)
{
@ -933,6 +951,8 @@ class uicontacts extends bocontacts
}
}
}
$readonlys["document[$row[id]]"] = !$this->prefs['default_document'];
// hide region for address format 'postcode_city'
if (($row['addr_format'] = $this->addr_format_by_country($row['adr_one_countryname']))=='postcode_city') unset($row['adr_one_region']);
if (($row['addr_format2'] = $this->addr_format_by_country($row['adr_two_countryname']))=='postcode_city') unset($row['adr_two_region']);
@ -1831,6 +1851,71 @@ $readonlys['button[vcard]'] = true;
}
$GLOBALS['egw']->common->egw_footer();
}
/**
* Download a document with inserted contact(s)
*
* @param array $ids contact-ids
* @param string $document vfs-path of document
* @return string error-message or error, otherwise the function does NOT return!
*/
function download_document($ids,$document='')
{
if (!$document) $document = $this->prefs['default_document'];
require_once(EGW_API_INC.'/class.vfs.inc.php');
$vfs =& new vfs();
if (!$document || $document != $this->prefs['default_document'] &&
substr($document,0,1+strlen($this->prefs['document_dir'])) != $this->prefs['document_dir'].'/' ||
!$vfs->acl_check(array(
'string' => $document,
'relatives' => RELATIVE_ROOT,
'operation' => EGW_ACL_READ,
'must_exist' => true,
)))
{
return lang("Document '%1' does not exist or is not readable for you!",$document);
}
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.addressbook_merge.inc.php');
$document_merge =& new addressbook_merge();
return $document_merge->download($document,$ids);
}
/**
* Returning document actions / files from the document_dir
*
* @return array
*/
function get_document_actions()
{
if (!$this->prefs['document_dir']) return array();
if (!is_array($actions = $GLOBALS['egw']->session->appsession('document_actions','addressbook')))
{
require_once(EGW_API_INC.'/class.vfs.inc.php');
$vfs =& new vfs;
$actions = array();
if (($files = $vfs->ls(array(
'string' => $this->prefs['document_dir'],
'relatives' => RELATIVE_ROOT,
))))
{
foreach($files as $file)
{
// return only the mime-types we support
if ($file['mime_type'] != 'application/rtf' && substr($file['mime_type'],0,5) != 'text/') continue;
// As browsers not always return the right mime_type, you could use a negative list instead
//if ($file['mime_type'] == 'Directory' || substr($file['mime_type'],0,6) == 'image/') continue;
$actions['document-'.$file['directory'].'/'.$file['name']] = lang('Insert in document').': '.$file['name'];
}
}
$GLOBALS['egw']->session->appsession('document_actions','addressbook',$actions);
}
return $actions;
}
}
if (!function_exists('array_intersect_key')) // php5.1 function

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,7 @@
%1 records imported addressbook de %1 Datensätze importiert
%1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook de %1 Datensätze gelesen (noch nicht importiert, sie können %2zurück%3 gehen und Test-Import auschalten)
%1 starts with '%2' addressbook de %1 beginnt mit '%2'
%s please calculate the result addressbook de %s Bitte berechnen Sie das Ergebnis
(e.g. 1969) addressbook de (z.B. 1966)
<b>no conversion type &lt;none&gt; could be located.</b> please choose a conversion type from the list addressbook de <b>Kein Übersetzungstyp <none> konnte gefunden werden.</b> Bitte wählen Sie einen Übersetzungstyp aus der Liste
@-eval() is only availible to admins!!! addressbook de @-eval() ist nur verfügbar für Administratoren!!!
@ -45,6 +46,7 @@ are you shure you want to delete this contact? addressbook de Diesen Kontakt l
are you sure you want to delete this field? addressbook de Sind Sie sicher, dass Sie dieses Feld löschen wollen?
assistent addressbook de Assistent
assistent phone addressbook de Telefon Assistent
at the moment the following document-types are supported: addressbook de Im Moment werden die folgenden Dokumenttypen unterstützt:
birthday common de Geburtstag
birthdays common de Geburtstage
blank addressbook de Leer
@ -58,6 +60,7 @@ business phone addressbook de Tel. gesch
business state addressbook de Bundesland geschäftl.
business street addressbook de Straße geschäftl.
business zip code addressbook de PLZ geschäftl.
calendar fields: addressbook de Kalender Felder:
calendar uri addressbook de Kalender URI
can be changed via setup >> configuration admin de Kann über Setup >> Konfiguration geändert werden
car phone addressbook de Autotelefon
@ -68,6 +71,8 @@ charset for the csv export addressbook de Zeichensatz f
charset of file addressbook de Zeichensatz der Datei
check all addressbook de Alle auswählen
choose an icon for this contact type admin de Wählen Sie ein Icon für diesen Kontakt Typ
choose owner of imported data addressbook de Wählen Sie den Besitzer der importierten Daten
choose seperator and charset addressbook de Wählen Sie ein Trennzeichen und den Zeichensatz
chosse an etemplate for this contact type admin de Wählen Sie ein eTemplate für diesen Kontakt Typ
city common de Stadt
company common de Firma
@ -77,10 +82,15 @@ contact common de Kontakt
contact application admin de Kontakt Anwendung
contact copied addressbook de Kontakt kopiert
contact deleted addressbook de Kontakt gelöscht
contact fields to show addressbook de Kontaktfelder die angezeigt werden sollen
contact fields: addressbook de Kontaktfelder:
contact id addressbook de Kontakt ID
contact modified by %1 at %2 addressbook de Kontakt geändert von %1 am %2
contact not found! addressbook de Kontakt nicht gefunden!
contact repository admin de Speicherort Kontakte
contact saved addressbook de Kontakt gespeichert
contact settings admin de Kontakt Einstellungen
contactform addressbook de Kontaktformular
contacts and account contact-data to ldap admin de Kontakte und Kontaktdaten der Benutzer nach LDAP
contacts to ldap admin de Kontakte nach LDAP
contacts to ldap, account contact-data to sql admin de Kontakte nach LDAP, Kontaktdaten der Benutzer nach SQL
@ -89,11 +99,12 @@ copied by %1, from record #%2. addressbook de Kopiert von %1, vom Datensatz Nr.
copy a contact and edit the copy addressbook de Kopiert einen Kontakt und bearbeitet dann die Kopie
country common de Land
create new links addressbook de Neue Verknüpfung erstellen
created addressbook de Angelegt von
created addressbook de Angelegt
credit addressbook de Darlehen
csv-fieldname addressbook de CSV-Feldname
csv-filename addressbook de CSV-Dateiname
custom addressbook de Benutzerdefiniert
custom etemplate for the contactform addressbook de Eigenes eTemplate für das Kontaktformular
custom fields addressbook de Benutzerdefinierte Felder
debug output in browser addressbook de Debugausgaben in Browser
default address format addressbook de Vorgabe für Format der Adresse
@ -112,6 +123,7 @@ distribution list deleted addressbook de Verteiler gel
distribution lists addressbook de Verteilerlisten
do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook de Wollen Sie ein privates Adressbuch, dass nicht von Benutzern einsehbar ist, denen Sie Zugriff auf Ihr persönliches Adressbuch gegeben haben?
do your really want to delete this contact? addressbook de Wollen sie diesen Kontakt wirklich löschen?
document '%1' does not exist or is not readable for you! addressbook de Dokument '%1' existiert nicht oder ist für Sie nicht lesbar!
doesn't matter addressbook de egal
domestic addressbook de Wohnung
don't hide empty columns addressbook de Leere Spalten nicht ausblenden
@ -122,7 +134,9 @@ edit custom field addressbook de Benutzerdefiniertes Feld bearbeiten
edit custom fields admin de Benutzerdefinierte Felder bearbeiten
edit extra account-data in the addressbook admin de Zusätzliche Benutzerdaten im Adressbuch bearbeiten.
edit phonenumbers - addressbook de Telefonnummern bearbeiten
either the configured email addesses are wrong or the mail configuration. addressbook de Entweder die konfigurierte Email Adresse ist falsch oder die Mail Konfiguration.
email & internet addressbook de E-Mail & Internet
email addresses (comma separated) to send the contact data addressbook de Email Adressen (Komma getrennt) zum Senden der Kontaktdaten
empty for all addressbook de leer für alle
enable an extra private addressbook addressbook de Privates Adressbuch einschalten
enter the path to the exported file here addressbook de Bitte geben Sie den Pfad für die exportierte Datei an
@ -153,6 +167,7 @@ for read only ldap admin de f
freebusy uri addressbook de Freebusy URI
full name addressbook de vollständiger Name
general addressbook de Allgemein
general fields: addressbook de Allgemeine Felder:
geo addressbook de GEO
global categories addressbook de Globale Kategorien
grant addressbook access common de Berechtigungen
@ -171,6 +186,8 @@ home zip code addressbook de PLZ privat
how many contacts should non-admins be able to export (empty = no limit) admin de Wieviele Kontakte sollen nicht-Adminstratoren exportieren können (leer = keine Begrenzung)
icon addressbook de Icon
if accounts are already in ldap admin de wenn die Benutzer bereits im LDAP sind
if you specify a directory (full vfs path) here, addressbook displays an action for each document. that action allows to download the specified document with the contact data inserted. addressbook de Wenn Sie hier ein Verzeichnis (kompletter VFS Pfad) angeben, zeigt das Adressbuch einen Befehl für jedes Dokument darin. Diese Befehler erlauben das angegebene Dokumnet mit Kontaktdaten eingefügt herunterzuladen.
if you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. that icon allows to download the specified document with the contact data inserted. addressbook de Wenn Sie hier ein Dokument (kompletter VFS Pfad) angeben, zeigt das Adressbuch ein extranes Dokument Icon. Diese Icon erlaubt das Dokumnet mit Kontaktdaten eingefügt herunterzuladen.
import addressbook de Import
import contacts addressbook de Kontakte importieren
import csv-file into addressbook addressbook de Import CSV-Datei ins Adressbuch
@ -181,8 +198,10 @@ import from outlook addressbook de Aus Outlook importieren
import multiple vcard addressbook de Import mehrere VCards
import next set addressbook de Nächsten Satz importieren
import_instructions addressbook de In Netscape, öffnen Sie das Adressbuch und wählen Sie <b>Exportieren</b> aus dem Datei Menü aus. Die Dateien werden im LDIF Formaz exportiert.<p> In Outlook wählen Sie den Ordner Kontakte aus, wählen Sie <b>Importieren und Exportieren...</p> aus dem <b>Datei</b> Menü aus und Exportieren Sie die Kontakte als eine CSV Datei.<p> In Palm Desktop 4.0 oder größer, öffnen Sie Ihr Adressbuch und wählen Sie <b>Export</b> aus dem Datei-Menü aus. Die Datei wird im VCard-Format exportiert.
imports contacts into your addressbook from a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook de Importiert Kontakte aus einer CSV Datei in Ihr Adressbuch. CSV bedeutet Komma getrennte Werte. Sie können in dem Reiter Einstellungen auch ein anderes Trennzeichen wählen.
in %1 days (%2) is %3's birthday. addressbook de In %1 Tagen (%2) ist der Geburtstag von %3.
income addressbook de Einkommen
insert in document addressbook de Einfügen in Dokument
insufficent rights to delete this list! addressbook de Keine Rechte diese Liste zu löschen!
international addressbook de International
label addressbook de Adressetikett
@ -197,14 +216,17 @@ link title for contacts show addressbook de Titel der Verkn
links addressbook de Verknüpfungen
list all categories addressbook de Liste alle Kategorien
list all customfields addressbook de Liste alle benutzerdefinierten Felder
list already exists! addressbook de Liste existiert bereits!
list already exists! addressbook de Die Liste existiert bereits!
list created addressbook de Verteiler erzeugt
list creation failed, no rights! addressbook de Verteiler erzeugen fehlgeschlagen, keine Rechte!
load sample file addressbook de Beispieldatei laden
load vcard addressbook de VCard laden
locations addressbook de Standorte
manage mapping addressbook de Zuordnungen verwalten
mark records as private addressbook de Eintrag als Privat kennzeichnen
merge into first or account, deletes all other! addressbook de Vereinige im ersten oder Benutzerkonto, löscht alle anderen!
merged addressbook de vereinigt
message after submitting the form addressbook de Nachricht nach dem Abschicken des Formulars
message phone addressbook de Anrufbeantworter
middle name addressbook de Zweiter Vorname
migration finished addressbook de Migration beendet
@ -217,7 +239,9 @@ move to addressbook: addressbook de Verschiebe ins Adressbuch:
moved addressbook de verschoben
multiple vcard addressbook de Mehrere VCards
name for the distribution list addressbook de Name für die Verteilerliste
name of current user, all other contact fields are valid too addressbook de Name des aktuellen Benutzers, auch alle anderen Kontaktfelder sind erlaubt
name, address addressbook de Name, Adresse
new contact submitted by %1 at %2 addressbook de Neuer Kontakt eingetragen von %1 am %2
no vcard addressbook de Keine VCard
number addressbook de Nummer
number of records to read (%1) addressbook de Anzahl der einzulesenden Datensätze (%1)
@ -252,6 +276,8 @@ record access addressbook de Zugriffsrechte
record owner addressbook de Datensatzeigentümer
remove selected contacts from distribution list addressbook de Ausgewählte Kontakte vom Verteiler löschen
removed from distribution list addressbook de vom Verteiler gelöscht
replacements for inserting contacts into documents addressbook de Platzhalter für das Einfügen von Kontakten in Dokumente
required fields * addressbook de unbedingt auszufüllende Felder *
role addressbook de Funktion
room addressbook de Raum
search for '%1' addressbook de Suche nach '%1'
@ -277,12 +303,19 @@ start admin de Starten
startrecord addressbook de Startdatensatz
state common de Bundesland
street common de Straße
subject for email addressbook de Betreff der Email
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
telephony integration admin de Telefonie Integration
test import (show importable records <u>only</u> in browser) addressbook de Test-Import (zeigt importierbare Datensätze <u>nur</u> im Browser an)
thank you for contacting us. addressbook de Danke das Sie uns kontaktierten.
that field name has been used already ! addressbook de Dieser Feldname wird bereits benutzt!
the anonymous user has probably no add rights for this addressbook. addressbook de Der anonyme Benutzer hat vermutlich keine Hinzufügen Rechte für diese Adressbuch.
the anonymous user needs add rights for it! addressbook de Der anonyme Benutzer benötigt Hinzufügen Rechte dafür!
the document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2). addressbook de Das Dokument kann Platzhalter wie $$n_fn$$ enthalten, die mit den Kontaktdaten ersetzt werden (%1komplette Liste der Platzhalter%2).
there was an error saving your data :-( addressbook de Beim Speichern ihrer Daten ist ein Fehler aufgetreten :-(
this module displays a contactform, that stores direct into the addressbook. addressbook de Diese Module ist ein Kontaktformular, das direkt in das Adressbuch speichert.
this person's first name was not in the address book. addressbook de Der Vorname dieser Person ist nicht im Adressbuch.
this person's last name was not in the address book. addressbook de Der Nachname dieser Person ist nicht im Adressbuch.
timezone addressbook de Zeitzone
@ -301,6 +334,7 @@ used for links and for the own sorting of the list addressbook de wird f
vcard common de VCard
vcards require a first name entry. addressbook de VCards benötigen einen Vornamen.
vcards require a last name entry. addressbook de VCards benötigen einen Nachnamen.
verification addressbook de Verifikation
view linked infolog entries addressbook de Verknüpfte InfoLog Einträge anzeigen
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!
warning: all contacts found will be deleted! addressbook de WARNUNG: Alle gefundenen Kontakte werden gelöscht!
@ -313,6 +347,7 @@ which fields should be exported. all means every field stored in the addressbook
whole query addressbook de gesamte Abfrage
work phone addressbook de Tel dienstl.
write (update or add) a single entry by passing the fields. addressbook de Schreibt (aktualiseren oder zufügen) eines einzelnen Eintrags durch Übergabe der Felder
wrong - try again ... addressbook de Falsch - nochmal versuchen ...
yes, for the next three days addressbook de Ja, für die nächsten drei Tage
yes, for the next two weeks addressbook de Ja, für die nächsten zwei Wochen
yes, for the next week addressbook de Ja, für die nächste Woche
@ -322,6 +357,7 @@ you are not permittet to delete this contact addressbook de Sie haben nicht die
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 can only use ldap as contact repository if the accounts are stored in ldap too! admin de Sie können LDAP nur dann zum Speichern von Kontakten verwenden, wenn die Benutzerkonten auch in LDAP gespeichert sind!
you can respond by visiting: addressbook de Link zum Anzeigen:
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
you need to select a distribution list addressbook de Sie müssen eine Verteilerliste auswählen

View File

@ -5,6 +5,7 @@
%1 records imported addressbook en %1 records imported
%1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook en %1 records read (not yet imported, you may go %2back%3 and uncheck Test Import)
%1 starts with '%2' addressbook en %1 starts with '%2'
%s please calculate the result addressbook en %s please calculate the result
(e.g. 1969) addressbook en (e.g. 1969)
<b>no conversion type &lt;none&gt; could be located.</b> please choose a conversion type from the list addressbook en <b>No conversion type &lt;none&gt; could be located.</b> Please choose a conversion type from the list
@-eval() is only availible to admins!!! addressbook en @-eval() is only availible to admins!!!
@ -45,6 +46,7 @@ are you shure you want to delete this contact? addressbook en Are you shure you
are you sure you want to delete this field? addressbook en Are you sure you want to delete this field?
assistent addressbook en Assistent
assistent phone addressbook en assistent phone
at the moment the following document-types are supported: addressbook en At the moment the following document-types are supported:
birthday common en Birthday
birthdays common en Birthdays
blank addressbook en Blank
@ -58,6 +60,7 @@ business phone addressbook en Business Phone
business state addressbook en Business State
business street addressbook en Business Street
business zip code addressbook en Business Postal Code
calendar fields: addressbook en Calendar fields:
calendar uri addressbook en Calendar URI
can be changed via setup >> configuration admin en Can be changed via Setup >> Configuration
car phone addressbook en Car Phone
@ -68,6 +71,8 @@ charset for the csv export addressbook en Charset for the CSV export
charset of file addressbook en Charset of file
check all addressbook en Check all
choose an icon for this contact type admin en Choose an icon for this contact type
choose owner of imported data addressbook en Choose owner of imported data
choose seperator and charset addressbook en Choose seperator and charset
chosse an etemplate for this contact type admin en Chosse an eTemplate for this contact type
city common en City
company common en Company
@ -77,10 +82,15 @@ contact common en Contact
contact application admin en Contact application
contact copied addressbook en Contact copied
contact deleted addressbook en Contact deleted
contact fields to show addressbook en Contact fields to show
contact fields: addressbook en Contact fields:
contact id addressbook en Contact ID
contact modified by %1 at %2 addressbook en Contact modified by %1 at %2
contact not found! addressbook en Contact not found!
contact repository admin en Contact repository
contact saved addressbook en Contact saved
contact settings admin en Contact Settings
contactform addressbook en Contactform
contacts and account contact-data to ldap admin en contacts and account contact-data to LDAP
contacts to ldap admin en contacts to LDAP
contacts to ldap, account contact-data to sql admin en contacts to LDAP, account contact-data to SQL
@ -94,6 +104,7 @@ credit addressbook en Credit
csv-fieldname addressbook en CSV-Fieldname
csv-filename addressbook en CSV-Filename
custom addressbook en Custom
custom etemplate for the contactform addressbook en Custom eTemplate for the contactform
custom fields addressbook en Custom Fields
debug output in browser addressbook en Debug output in browser
default address format addressbook en Default address format
@ -112,6 +123,7 @@ distribution list deleted addressbook en Distribution list deleted
distribution lists addressbook en Distribution lists
do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook en Do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook?
do your really want to delete this contact? addressbook en Do your really want to delete this contact?
document '%1' does not exist or is not readable for you! addressbook en Document '%1' does not exist or is not readable for you!
doesn't matter addressbook en doesn't matter
domestic addressbook en Domestic
don't hide empty columns addressbook en Don't hide empty columns
@ -122,7 +134,9 @@ edit custom field addressbook en Edit Custom Field
edit custom fields admin en Edit Custom Fields
edit extra account-data in the addressbook admin en Edit extra account-data in the addressbook
edit phonenumbers - addressbook en Edit Phonenumbers -
either the configured email addesses are wrong or the mail configuration. addressbook en Either the configured email addesses are wrong or the mail configuration.
email & internet addressbook en Email & Internet
email addresses (comma separated) to send the contact data addressbook en Email addresses (comma separated) to send the contact data
empty for all addressbook en empty for all
enable an extra private addressbook addressbook en Enable an extra private addressbook
enter the path to the exported file here addressbook en Enter the path to the exported file here
@ -153,6 +167,7 @@ for read only ldap admin en for read only LDAP
freebusy uri addressbook en Freebusy URI
full name addressbook en Full Name
general addressbook en General
general fields: addressbook en General fields:
geo addressbook en GEO
global categories addressbook en Global Categories
grant addressbook access common en Grant Addressbook Access
@ -171,6 +186,8 @@ home zip code addressbook en Home ZIP Code
how many contacts should non-admins be able to export (empty = no limit) admin en How many contacts should non-admins be able to export (empty = no limit)
icon addressbook en Icon
if accounts are already in ldap admin en if accounts are already in LDAP
if you specify a directory (full vfs path) here, addressbook displays an action for each document. that action allows to download the specified document with the contact data inserted. addressbook en If you specify a directory (full vfs path) here, addressbook displays an action for each document. That action allows to download the specified document with the contact data inserted.
if you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. that icon allows to download the specified document with the contact data inserted. addressbook en If you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. That icon allows to download the specified document with the contact data inserted.
import addressbook en Import
import contacts addressbook en Import Contacts
import csv-file into addressbook addressbook en Import CSV-File into Addressbook
@ -181,8 +198,10 @@ 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.
imports contacts into your addressbook from a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook en Imports contacts into your Addressbook from a CSV File. CSV means 'Comma Seperated Values'. However in the options Tab you can also choose other seperators.
in %1 days (%2) is %3's birthday. addressbook en In %1 days (%2) is %3's birthday.
income addressbook en Income
insert in document addressbook en Insert in document
insufficent rights to delete this list! addressbook en Insufficent rights to delete this list!
international addressbook en International
label addressbook en Label
@ -200,11 +219,14 @@ list all customfields addressbook en List all customfields
list already exists! addressbook en List already exists!
list created addressbook en List created
list creation failed, no rights! addressbook en List creation failed, no rights!
load sample file addressbook en Load Sample file
load vcard addressbook en Load VCard
locations addressbook en locations
manage mapping addressbook en Manage mapping
mark records as private addressbook en Mark records as private
merge into first or account, deletes all other! addressbook en Merge into first or account, deletes all other!
merged addressbook en merged
message after submitting the form addressbook en Message after submitting the form
message phone addressbook en Message Phone
middle name addressbook en Middle Name
migration finished addressbook en Migration finished
@ -217,7 +239,9 @@ move to addressbook: addressbook en Move to addressbook:
moved addressbook en moved
multiple vcard addressbook en Multiple VCard
name for the distribution list addressbook en Name for the distribution list
name of current user, all other contact fields are valid too addressbook en Name of current user, all other contact fields are valid too
name, address addressbook en Name, Address
new contact submitted by %1 at %2 addressbook en New contact submitted by %1 at %2
no vcard addressbook en No VCard
number addressbook en Number
number of records to read (%1) addressbook en Number of records to read (%1)
@ -252,6 +276,8 @@ record access addressbook en Record Access
record owner addressbook en Record owner
remove selected contacts from distribution list addressbook en Remove selected contacts from distribution list
removed from distribution list addressbook en removed from distribution list
replacements for inserting contacts into documents addressbook en Replacements for inserting contacts into documents
required fields * addressbook en required fields *
role addressbook en Role
room addressbook en Room
search for '%1' addressbook en Search for '%1'
@ -277,12 +303,19 @@ start admin en Start
startrecord addressbook en Startrecord
state common en State
street common en Street
subject for email addressbook en Subject for email
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
telephony integration admin en Telephony integration
test import (show importable records <u>only</u> in browser) addressbook en Test Import (show importable records <u>only</u> in browser)
thank you for contacting us. addressbook en Thank you for contacting us.
that field name has been used already ! addressbook en That field name has been used already !
the anonymous user has probably no add rights for this addressbook. addressbook en The anonymous user has probably no add rights for this addressbook.
the anonymous user needs add rights for it! addressbook en The anonymous user needs add rights for it!
the document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2). addressbook en The document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2).
there was an error saving your data :-( addressbook en There was an error saving your data :-(
this module displays a contactform, that stores direct into the addressbook. addressbook en This module displays a contactform, that stores direct into the addressbook.
this person's first name was not in the address book. addressbook en This person's first name was not in the address book.
this person's last name was not in the address book. addressbook en This person's last name was not in the address book.
timezone addressbook en Timezone
@ -301,6 +334,7 @@ used for links and for the own sorting of the list addressbook en used for links
vcard common en VCard
vcards require a first name entry. addressbook en VCards require a first name entry.
vcards require a last name entry. addressbook en Vcards require a last name entry.
verification addressbook en Verification
view linked infolog entries addressbook en View linked InfoLog entries
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!
warning: all contacts found will be deleted! addressbook en WARNING: All contacts found will be deleted!
@ -313,6 +347,7 @@ which fields should be exported. all means every field stored in the addressbook
whole query addressbook en whole query
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.
wrong - try again ... addressbook en Wrong - try again ...
yes, for the next three days addressbook en Yes, for the next three days
yes, for the next two weeks addressbook en Yes, for the next two weeks
yes, for the next week addressbook en Yes, for the next week
@ -322,6 +357,7 @@ you are not permittet to delete this contact addressbook en You are not permitte
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 can only use ldap as contact repository if the accounts are stored in ldap too! admin en You can only use LDAP as contact repository if the accounts are stored in LDAP too!
you can respond by visiting: addressbook en To view it visit:
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
you need to select a distribution list addressbook en You need to select a distribution list

View File

@ -0,0 +1,116 @@
<?php
/**
* Addressbook - Sitemgr contact form
*
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package addressbook
* @copyright (c) 2007 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
require_once(EGW_INCLUDE_ROOT.'/etemplate/inc/class.sitemgr_module.inc.php');
/**
* SiteMgr contact form for the addressbook
*
*/
class module_addressbook_contactform extends sitemgr_module
{
/**
* Constructor
*
* @return module_addressbook_contactform
*/
function module_addressbook_contactform()
{
$this->arguments = array(); // get's set in get_user_interface
$this->title = lang('Contactform');
$this->description = lang('This module displays a contactform, that stores direct into the addressbook.');
$this->etemplate_method = 'addressbook.addressbook_contactform.display';
}
/**
* Reimplemented to add the addressbook translations and fetch the addressbooks only if needed for the user-interface
*
* @return array
*/
function get_user_interface()
{
$GLOBALS['egw']->translation->add_app('addressbook');
require_once(EGW_INCLUDE_ROOT.'/addressbook/inc/class.uicontacts.inc.php');
$uicontacts = new uicontacts();
$default = $fields = array(
'org_name' => lang('Company'),
'org_unit' => lang('Department'),
'n_fn' => lang('Prefix').', '.lang('Firstname').' + '.lang('Lastname'),
'sep1' => '----------------------------',
'email' => lang('email'),
'tel_work' => lang('work phone'),
'tel_cell' => lang('mobile phone'),
'tel_fax' => lang('fax'),
'tel_home' => lang('home phone'),
'url' => lang('url'),
'sep2' => '----------------------------',
'adr_one_street' => lang('street'),
'adr_one_street2' => lang('address line 2'),
'adr_one_locality' => lang('city').' + '.lang('zip code'),
'sep3' => '----------------------------',
);
foreach($uicontacts->customfields as $name => $data)
{
$fields['#'.$name] = $data['label'];
}
$fields += array(
'sep4' => '----------------------------',
'note' => lang('message'),
'sep5' => '----------------------------',
'captcha' => lang('Verification'),
);
$this->arguments = array(
'arg1' => array(
'type' => 'select',
'label' => lang('Addressbook the contact should be saved to').' ('.lang('The anonymous user needs add rights for it!').')',
'options' => array(
'' => lang('None'),
)+$uicontacts->get_addressbooks(EGW_ACL_ADD) // add to not show the accounts!
),
'arg4' => array(
'type' => 'textfield',
'label' => lang('Email addresses (comma separated) to send the contact data'),
'params' => array('size' => 80),
),
'arg6' => array(
'type' => 'textfield',
'label' => lang('Subject for email'),
'params' => array('size' => 80),
'default' => lang('Contactform'),
),
'arg2' => array(
'type' => 'select',
'label' => lang('Contact fields to show'),
'multiple' => true,
'options' => $fields,
'default' => $default,
'params' => array('size' => 9),
),
'arg3' => array(
'type' => 'textfield',
'label' => lang('Message after submitting the form'),
'params' => array('size' => 80),
'default' => lang('Thank you for contacting us.'),
),
'arg5' => array(
'type' => 'textfield',
'label' => lang('Custom eTemplate for the contactform'),
'params' => array('size' => 40),
'default' => 'addressbook.contactform',
),
);
return parent::get_user_interface();
}
}

View File

@ -0,0 +1,153 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="addressbook.contactform" template="" lang="" group="0" version="1.5.001">
<grid border="0">
<columns>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row disabled="!@show[org_name]">
<image src="home"/>
<description value="Company"/>
<textbox size="64" maxlength="64" id="org_name" span="4"/>
<description/>
</row>
<row disabled="!@show[org_unit]">
<description/>
<description value="Department"/>
<textbox size="64" maxlength="64" span="4" id="org_unit"/>
<description/>
</row>
<row valign="top" disabled="!@show[n_fn]">
<image src="accounts"/>
<description value="Contact"/>
<textbox size="10" maxlength="64" id="n_prefix" blur="Prefix"/>
<textbox id="n_given" size="20" maxlength="64" align="center"/>
<textbox id="n_family" align="right" size="22" maxlength="64" span="2" needed="1"/>
<description class="redItalic" value="*"/>
</row>
<row disabled="!@show[sep1]">
<hrule span="all"/>
</row>
<row disabled="!@show[email]">
<image src="email.png"/>
<description value="Email"/>
<textbox size="64" maxlength="64" validator="/^[a-z0-9.-_]+@[a-z0-9-]+(\.[a-z0-9-]+)+$/i" span="4" id="email" needed="1"/>
<description class="redItalic" value="*"/>
</row>
<row disabled="!@show[tel_work]">
<image src="phone"/>
<description value="Business phone"/>
<textbox size="64" maxlength="64" span="4" id="tel_work"/>
<description/>
</row>
<row disabled="!@show[tel_cell]">
<description/>
<description value="Mobile phone"/>
<textbox size="64" maxlength="64" span="4" id="tel_cell"/>
<description/>
</row>
<row disabled="!@show[tel_fax]">
<description/>
<description value="Fax"/>
<textbox size="64" maxlength="64" span="4" id="tel_fax"/>
<description/>
</row>
<row disabled="!@show[tel_home]">
<description/>
<description value="Home phone"/>
<textbox size="64" maxlength="64" span="4" id="tel_home"/>
<description/>
</row>
<row disabled="!@show[url]">
<image src="internet"/>
<description value="Internet"/>
<textbox size="64" maxlength="64" span="4" id="url"/>
<description/>
</row>
<row disabled="!@show[sep2]">
<hrule span="all"/>
</row>
<row disabled="!@show[adr_one_street]">
<image src="home"/>
<description value="Street"/>
<textbox size="64" maxlength="64" span="4" id="adr_one_street" needed="1"/>
<description class="redItalic" value="*"/>
</row>
<row disabled="!@show[adr_one_street2]">
<description/>
<description/>
<textbox size="64" maxlength="64" span="4" id="adr_one_street2"/>
<description/>
</row>
<row valign="top" disabled="!@show[adr_one_locality]=postcode_city">
<description/>
<description value="City"/>
<textbox size="10" maxlength="64" id="adr_one_postalcode" needed="1"/>
<textbox size="48" maxlength="64" span="3" id="adr_one_locality" align="right" needed="1"/>
<description class="redItalic" value="*"/>
</row>
<row valign="top" disabled="!@show[adr_one_locality]=city_state_postcode">
<description/>
<description value="Stadt"/>
<textbox size="36" maxlength="64" span="2" id="adr_one_locality" needed="1"/>
<textbox size="8" maxlength="64" id="adr_one_region" align="center"/>
<textbox size="8" maxlength="64" id="adr_one_postalcode" align="right" needed="1"/>
<description class="redItalic" value="*"/>
</row>
<row disabled="!@show[sep3]">
<hrule span="all"/>
</row>
<row disabled="!@show[custom1]">
<image src="gear"/>
<description value="@customlabel[1]"/>
<textbox id="@customfield[1]" span="4" needed="1" size="64"/>
<description class="redItalic" value="*"/>
</row>
<row>
<description/>
<description value="@customlabel[2]"/>
<textbox id="@customfield[2]" span="4" size="64"/>
<description/>
</row>
<row disabled="!@show[sep4]">
<hrule span="all"/>
</row>
<row valign="top" disabled="!@show[note]">
<image src="edit.png"/>
<description value="Message"/>
<textbox multiline="true" rows="5" cols="45" span="4" class="width100" needed="1" id="note"/>
</row>
<row disabled="!@show[sep5]">
<hrule span="all"/>
</row>
<row disabled="!@show[captcha]">
<image src="private.png"/>
<description value="Verification"/>
<description value="@captcha_task"/>
<textbox label="%s please calculate the result" needed="1" span="3" id="captcha" size="3"/>
<description class="redItalic" value="*"/>
</row>
<row>
<description/>
<description/>
<button label="Submit" id="submitit"/>
<description span="all" class="redItalic" value="required fields *" align="right"/>
<description/>
<description/>
<description/>
</row>
</rows>
</grid>
<styles>
.width100 textarea { width: 99%; }
</styles>
</template>
</overlay>

View File

@ -10,12 +10,11 @@
<hbox>
<buttononly id="search" label="Advanced search" onclick="window.open(egw::link('/index.php','menuaction=addressbook.uicontacts.search'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;"/>
<buttononly id="add" label="Add" statustext="Add a new contact" onclick="window.open(egw::link('/index.php','menuaction=addressbook.uicontacts.edit'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" class="rightPadAdd"/>
<description id="manual" class="rightPadAdd"/>
</hbox>
<styles>
.rightPadAdd { padding-right: 40px; }
</styles>
<styles>.rightPadAdd { width: 30px; }</styles>
</template>
<template id="addressbook.index.rows" template="" lang="" group="0" version="1.3.002">
<template id="addressbook.index.rows" template="" lang="" group="0" version="1.4.001">
<grid width="100%">
<columns>
<column/>
@ -167,6 +166,7 @@
</menulist>
</vbox>
<hbox options="0" class="noPrint" orient="0">
<button id="document[$row_cont[id]]" image="new" label="Insert in document"/>
<image options="addressbook.uicontacts.view&amp;contact_id=$row_cont[id]" label="View" src="view"/>
<button image="edit" label="Edit" onclick="window.open(egw::link('/index.php','menuaction=addressbook.uicontacts.edit&amp;contact_id=$row_cont[id]'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" id="edit[$row_cont[id]]"/>
<button id="delete[$row_cont[id]]" image="delete" label="Delete" statustext="Delete this contact" onclick="return confirm('Delete this contact');"/>

View File

@ -21,6 +21,12 @@ define('HOUR_s',60*60);
define('DAY_s',24*HOUR_s);
define('WEEK_s',7*DAY_s);
/**
* Gives read access to the calendar, but all events the user is not participating are private!
* Used be the addressbook.
*/
define('EGW_ACL_READ_FOR_PARTICIPANTS',EGW_ACL_CUSTOM_1);
/**
* Class to access all calendar data
*
@ -271,7 +277,7 @@ class bocal
$users = array();
foreach($params['users'] as $user)
{
if ($params['ignore_acl'] || $this->check_perms(EGW_ACL_READ,0,$user))
if ($params['ignore_acl'] || $this->check_perms(EGW_ACL_READ|EGW_ACL_READ_FOR_PARTICIPANTS,0,$user))
{
if ($user && !in_array($user,$users)) // already added?
{

View File

@ -189,13 +189,13 @@ class uical
foreach($GLOBALS['egw']->accounts->member($owner) as $member)
{
$member = $member['account_id'];
if (!$this->bo->check_perms(EGW_ACL_READ,0,$member))
if (!$this->bo->check_perms(EGW_ACL_READ|EGW_ACL_READ_FOR_PARTICIPANTS,0,$member))
{
$no_access_group[$member] = $this->bo->participant_name($member);
}
}
}
elseif (!$this->bo->check_perms(EGW_ACL_READ,0,$owner))
elseif (!$this->bo->check_perms(EGW_ACL_READ|EGW_ACL_READ_FOR_PARTICIPANTS,0,$owner))
{
$no_access[$owner] = $this->bo->participant_name($owner);
}

View File

@ -2,7 +2,7 @@
/**
* eGroupWare - eTemplates for Application calendar
* http://www.egroupware.org
* generated by soetemplate::dump4setup() 2007-05-27 08:35
* generated by soetemplate::dump4setup() 2007-06-06 18:13
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package calendar
@ -36,7 +36,11 @@ $templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang'
$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.3.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:9:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c6";s:3:"row";s:2:"c5";s:3:"row";s:2:"c2";s:3:"row";s:2:"h4";s:2:"60";s:1:"B";s:3:"50%";}i:1;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,start";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:5:"start";s:6:"needed";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"whole_day";s:5:"label";s:9:"whole day";s:4:"help";s:31:"Event will occupy the whole day";s:4:"size";s:11:",, ,disable";}}i:2;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,duration";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:6:{s:4:"type";s:6:"select";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:7:"no_lang";s:1:"1";s:4:"help";s:23:"Duration of the meeting";s:8:"onchange";s:92:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\');";}i:2;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:3:"end";s:4:"span";s:9:",end_hide";}}s:1:"C";a:5:{s:4:"type";s:6:"button";s:5:"label";s:15:"Freetime search";s:4:"name";s:8:"freetime";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";s:7:"onclick";s:248:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,duration,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";}}i:3;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,location";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:8:"location";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,category";s:5:"label";s:8:"Category";}s:1:"B";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"3";s:4:"name";s:8:"category";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:5;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,priority";s:5:"label";s:8:"Priority";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}i:2;a:5:{s:4:"type";s:8:"checkbox";s:5:"label";s:12:"non blocking";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";}s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:6;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,public";s:5:"label";s:7:"Private";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:3:"0,1";s:4:"name";s:6:"public";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:3;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118477982',);
$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.3.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:9:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c6";s:3:"row";s:2:"c5";s:3:"row";s:2:"c2";s:3:"row";s:2:"h4";s:2:"60";s:1:"B";s:3:"50%";}i:1;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,start";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:5:"start";s:6:"needed";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"whole_day";s:5:"label";s:9:"whole day";s:4:"help";s:31:"Event will occupy the whole day";s:4:"size";s:11:",, ,disable";}}i:2;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,duration";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:6:{s:4:"type";s:6:"select";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:7:"no_lang";s:1:"1";s:4:"help";s:23:"Duration of the meeting";s:8:"onchange";s:227:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";}i:2;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:3:"end";s:4:"span";s:9:",end_hide";}}s:1:"C";a:5:{s:4:"type";s:6:"button";s:5:"label";s:15:"Freetime search";s:4:"name";s:8:"freetime";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";s:7:"onclick";s:248:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,duration,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";}}i:3;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,location";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:8:"location";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,category";s:5:"label";s:8:"Category";}s:1:"B";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"3";s:4:"name";s:8:"category";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:5;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,priority";s:5:"label";s:8:"Priority";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}i:2;a:5:{s:4:"type";s:8:"checkbox";s:5:"label";s:12:"non blocking";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";}s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:6;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,public";s:5:"label";s:7:"Private";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:3:"0,1";s:4:"name";s:6:"public";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:3;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118477982',);
$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.3.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:9:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c6";s:3:"row";s:2:"c5";s:3:"row";s:2:"c2";s:3:"row";s:2:"h4";s:2:"60";s:1:"B";s:3:"50%";}i:1;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,start";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:5:"start";s:6:"needed";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"whole_day";s:5:"label";s:9:"whole day";s:4:"help";s:31:"Event will occupy the whole day";s:4:"size";s:11:",, ,disable";}}i:2;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,duration";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:6:{s:4:"type";s:6:"select";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:7:"no_lang";s:1:"1";s:4:"help";s:23:"Duration of the meeting";s:8:"onchange";s:227:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";}i:2;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:3:"end";s:4:"span";s:9:",end_hide";}}s:1:"C";a:5:{s:4:"type";s:10:"buttononly";s:5:"label";s:15:"Freetime search";s:4:"name";s:8:"freetime";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";s:7:"onclick";s:248:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,duration,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";}}i:3;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,location";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:8:"location";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,category";s:5:"label";s:8:"Category";}s:1:"B";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"3";s:4:"name";s:8:"category";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:5;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,priority";s:5:"label";s:8:"Priority";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}i:2;a:5:{s:4:"type";s:8:"checkbox";s:5:"label";s:12:"non blocking";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";}s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:6;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,public";s:5:"label";s:7:"Private";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:3:"0,1";s:4:"name";s:6:"public";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:3;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118477982',);
$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"c1";s:3:"row";s:2:"c2";s:3:"row";s:2:"c4";s:3:"row";s:2:"c5";s:3:"row";s:2:"c6";s:3:"row";s:2:"c7";s:3:"row";}i:1;a:2:{s:1:"A";a:4:{s:5:"width";s:2:"95";s:4:"size";s:8:",,,start";s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:6:"needed";s:1:"1";s:4:"name";s:5:"start";s:4:"type";s:9:"date-time";}}i:2;a:2:{s:1:"A";a:4:{s:5:"width";s:1:"0";s:4:"size";s:11:",,,duration";s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:7:"no_lang";s:1:"1";s:8:"onchange";s:227:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:4:"type";s:6:"select";s:4:"help";s:23:"Duration of the meeting";}i:2;a:5:{s:5:"label";s:9:"whole day";s:4:"name";s:9:"whole_day";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:31:"Event will occupy the whole day";}}}i:3;a:2:{s:1:"A";a:6:{s:5:"label";s:15:"Freetime search";s:7:"onclick";s:248:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,duration,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";s:5:"width";s:1:"0";s:4:"name";s:8:"freetime";s:4:"type";s:10:"buttononly";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";}s:1:"B";a:3:{s:4:"name";s:3:"end";s:4:"type";s:9:"date-time";s:4:"span";s:9:",end_hide";}}i:4;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,location";s:4:"type";s:5:"label";s:5:"label";s:8:"Location";s:5:"width";s:1:"0";}s:1:"B";a:3:{s:4:"size";s:6:"60,255";s:4:"name";s:8:"location";s:4:"type";s:4:"text";}}i:5;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,priority";s:4:"type";s:5:"label";s:5:"label";s:8:"Priority";s:5:"width";s:1:"0";}s:1:"B";a:3:{s:4:"size";s:6:"1,,0,0";s:4:"type";s:4:"hbox";i:1;a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}}}i:6;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:12:"non blocking";s:5:"width";s:1:"0";}s:1:"B";a:4:{s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:56:"A non blocking event will not conflict with other events";}}i:7;a:2:{s:1:"A";a:3:{s:4:"size";s:9:",,,public";s:4:"type";s:5:"label";s:5:"label";s:7:"Private";}s:1:"B";a:3:{s:4:"name";s:6:"public";s:4:"size";s:3:"0,1";s:4:"type";s:8:"checkbox";}}}s:4:"cols";i:2;s:4:"rows";i:7;s:4:"size";s:8:"100%,200";}i:2;a:6:{s:5:"class";s:6:"row_on";s:5:"align";s:5:"right";s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";i:1;a:4:{s:4:"size";s:11:",,,category";s:4:"type";s:5:"label";s:5:"label";s:8:"Category";s:4:"span";s:7:",row_on";}i:2;a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:8:"category";s:4:"size";s:1:"9";}}}}','size' => '','style' => '','modified' => '1181145149',);
$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.4.002','data' => 'a:1:{i:0;a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"c1";s:3:"row";s:2:"c2";s:3:"row";s:2:"c4";s:3:"row";s:2:"c5";s:7:"row_off";s:2:"c6";s:3:"row";s:2:"c7";s:3:"row";}i:1;a:2:{s:1:"A";a:4:{s:5:"width";s:2:"95";s:4:"size";s:8:",,,start";s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:6:"needed";s:1:"1";s:4:"name";s:5:"start";s:4:"type";s:9:"date-time";}i:2;a:6:{s:5:"label";s:9:"whole day";s:4:"name";s:9:"whole_day";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:31:"Event will occupy the whole day";s:5:"align";s:6:"center";}}}i:2;a:2:{s:1:"A";a:4:{s:5:"width";s:1:"0";s:4:"size";s:11:",,,duration";s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:7:"no_lang";s:1:"1";s:8:"onchange";s:227:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:4:"type";s:6:"select";s:4:"help";s:23:"Duration of the meeting";}i:2;a:3:{s:4:"name";s:3:"end";s:4:"type";s:9:"date-time";s:4:"span";s:9:",end_hide";}}}i:3;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:6:{s:5:"label";s:15:"Freetime search";s:7:"onclick";s:248:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,duration,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";s:5:"width";s:1:"0";s:4:"name";s:8:"freetime";s:4:"type";s:10:"buttononly";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";}}i:4;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,location";s:4:"type";s:5:"label";s:5:"label";s:8:"Location";s:5:"width";s:1:"0";}s:1:"B";a:3:{s:4:"size";s:6:"60,255";s:4:"name";s:8:"location";s:4:"type";s:4:"text";}}i:5;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,priority";s:4:"type";s:5:"label";s:5:"label";s:8:"Priority";s:5:"width";s:1:"0";}s:1:"B";a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}}i:6;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Options";s:5:"width";s:1:"0";}s:1:"B";a:5:{s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:5:"label";s:12:"non blocking";}}i:7;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:4:{s:4:"name";s:6:"public";s:4:"size";s:3:"0,1";s:4:"type";s:8:"checkbox";s:5:"label";s:7:"Private";}}}s:4:"cols";i:2;s:4:"rows";i:7;s:4:"size";s:8:"100%,200";}i:2;a:6:{s:5:"class";s:6:"row_on";s:5:"align";s:5:"right";s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";i:1;a:4:{s:4:"size";s:11:",,,category";s:4:"type";s:5:"label";s:5:"label";s:10:"Categories";s:4:"span";s:7:",row_on";}i:2;a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:8:"category";s:4:"size";s:1:"9";}}}}','size' => '','style' => '','modified' => '1181145149',);
$templ_data[] = array('name' => 'calendar.edit.links','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"h1";s:6:",@view";s:2:"h2";s:6:",@view";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:17:"100%,200,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,,,,auto','style' => '','modified' => '1118758702',);

View File

@ -1,52 +1,59 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="calendar.edit.general" template="" lang="" group="0" version="1.3.002">
<grid width="100%" height="200">
<columns>
<column width="95"/>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="row">
<description options=",,,start" value="Start"/>
<date-time id="start" needed="1"/>
<checkbox id="whole_day" label="whole day" statustext="Event will occupy the whole day" options=",, ,disable"/>
</row>
<row class="row">
<description options=",,,duration" value="Duration"/>
<hbox options="0,0">
<menulist>
<menupopup id="duration" options="Use end date" no_lang="1" statustext="Duration of the meeting" onchange="set_style_by_class('table','end_hide','visibility',this.value == '' ? 'visible' : 'hidden'); if (this.value == '') document.getElementById(form::name('end[str]')).value = document.getElementById(form::name('start[str]')).value;"/>
</menulist>
<date-time id="end" class="end_hide"/>
</hbox>
<button label="Freetime search" id="freetime" statustext="Find free timeslots where the selected participants are availible for the given timespan" onclick="window.open(egw::link('/index.php','menuaction=calendar.uiforms.freetimesearch')+values2url(this.form,'start,end,duration,participants,recur_type,whole_day'),'ft_search','dependent=yes,width=700,height=500,scrollbars=yes,status=yes'); return false;"/>
</row>
<row class="row">
<description options=",,,location" value="Location"/>
<textbox size="80" maxlength="255" id="location" span="all"/>
</row>
<row class="row" valign="top" height="60">
<description options=",,,category" value="Category"/>
<listbox type="select-cat" rows="3" id="category" span="all"/>
</row>
<row class="row">
<description options=",,,priority" value="Priority"/>
<hbox options="0,0" span="all">
<template id="calendar.edit.general" template="" lang="" group="0" version="1.4.002">
<hbox options="0,0">
<grid width="100%" height="200">
<columns>
<column width="95"/>
<column/>
</columns>
<rows>
<row class="row">
<description width="95" options=",,,start" value="Start"/>
<hbox options="0,0">
<date-time needed="1" id="start"/>
<checkbox label="whole day" id="whole_day" options=",, ,disable" statustext="Event will occupy the whole day" align="center"/>
</hbox>
</row>
<row class="row">
<description width="0" options=",,,duration" value="Duration"/>
<hbox options="0,0">
<menulist>
<menupopup no_lang="1" onchange="set_style_by_class('table','end_hide','visibility',this.value == '' ? 'visible' : 'hidden'); if (this.value == '') document.getElementById(form::name('end[str]')).value = document.getElementById(form::name('start[str]')).value;" id="duration" options="Use end date" statustext="Duration of the meeting"/>
</menulist>
<date-time id="end" class="end_hide"/>
</hbox>
</row>
<row>
<description/>
<buttononly label="Freetime search" onclick="window.open(egw::link('/index.php','menuaction=calendar.uiforms.freetimesearch')+values2url(this.form,'start,end,duration,participants,recur_type,whole_day'),'ft_search','dependent=yes,width=700,height=500,scrollbars=yes,status=yes'); return false;" width="0" id="freetime" statustext="Find free timeslots where the selected participants are availible for the given timespan"/>
</row>
<row class="row">
<description options=",,,location" value="Location" width="0"/>
<textbox size="60" maxlength="255" id="location"/>
</row>
<row class="row_off">
<description options=",,,priority" value="Priority" width="0"/>
<menulist>
<menupopup type="select-priority" id="priority"/>
</menulist>
<checkbox label="non blocking" statustext="A non blocking event will not conflict with other events" id="non_blocking" options=",, ,disable"/>
</hbox>
</row>
<row class="row">
<description options=",,,public" value="Private"/>
<checkbox options="0,1" id="public" span="all"/>
</row>
</rows>
</grid>
</row>
<row class="row">
<description value="Options" width="0"/>
<checkbox id="non_blocking" options=",, ,disable" statustext="A non blocking event will not conflict with other events" label="non blocking"/>
</row>
<row class="row">
<description/>
<checkbox id="public" options="0,1" label="Private"/>
</row>
</rows>
</grid>
<vbox class="row_on" align="right" options="0,0">
<description options=",,,category" value="Categories" class="row_on"/>
<listbox type="select-cat" id="category" rows="9"/>
</vbox>
</hbox>
</template>
<template id="calendar.edit.description" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%" height="200">