mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-28 01:29:05 +01:00
merged addressbook document templates (incl. contacts calendar), sitemgr contact-form and modified calendar edit dialog (bigger categories selection)
This commit is contained in:
commit
4e4d257f7e
142
addressbook/inc/class.addressbook_contactform.inc.php
Normal file
142
addressbook/inc/class.addressbook_contactform.inc.php
Normal 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);
|
||||
}
|
||||
}
|
327
addressbook/inc/class.addressbook_merge.inc.php
Normal file
327
addressbook/inc/class.addressbook_merge.inc.php
Normal 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();
|
||||
}
|
||||
}
|
237
addressbook/inc/class.addressbook_tracking.inc.php
Normal file
237
addressbook/inc/class.addressbook_tracking.inc.php
Normal 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;
|
||||
}
|
||||
}
|
@ -791,8 +791,35 @@ 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
|
||||
|
@ -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 ;-)
|
||||
}
|
||||
|
||||
|
@ -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'])
|
||||
@ -541,7 +555,11 @@ class uicontacts extends bocontacts
|
||||
unset($query['filter2']);
|
||||
$GLOBALS['egw']->session->appsession($session_name,'addressbook',$query);
|
||||
}
|
||||
return false;
|
||||
return false;
|
||||
|
||||
case 'document':
|
||||
$msg = $this->download_document($checked,$document);
|
||||
return false;
|
||||
}
|
||||
foreach($checked as $id)
|
||||
{
|
||||
@ -608,7 +626,7 @@ class uicontacts extends bocontacts
|
||||
$Ok = $this->add2list($id,$to_list) !== false;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default: // move to an other addressbook
|
||||
if (!(int)$action || !($this->grants[(string) (int) $action] & EGW_ACL_EDIT)) // might be ADD in the future
|
||||
{
|
||||
@ -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
@ -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 <none> 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
|
||||
|
@ -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 <none> could be located.</b> please choose a conversion type from the list addressbook en <b>No conversion type <none> 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
|
||||
|
116
addressbook/sitemgr/class.module_addressbook_contactform.inc.php
Normal file
116
addressbook/sitemgr/class.module_addressbook_contactform.inc.php
Normal 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();
|
||||
}
|
||||
}
|
153
addressbook/templates/default/contactform.xet
Normal file
153
addressbook/templates/default/contactform.xet
Normal 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>
|
@ -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&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&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');"/>
|
||||
|
@ -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?
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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',);
|
||||
|
||||
|
@ -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">
|
||||
|
Loading…
Reference in New Issue
Block a user