big InfoLog update:

- using popups for editing
- renamed filter my to responsible
- warning if a log entry has been updated, while you edit it
- improved referer handling
- optimisations for so class, less DB accesses
This commit is contained in:
Ralf Becker 2005-11-12 13:25:59 +00:00
parent 8fa2337beb
commit 95a3e604b0
14 changed files with 683 additions and 562 deletions

View File

@ -2,7 +2,7 @@
/**************************************************************************\
* eGroupWare - InfoLog Admin-, Preferences- and SideboxMenu-Hooks *
* http://www.eGroupWare.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> *
* Written and (c) by Ralf Becker <RalfBecker@outdoor-training.de> *
* ------------------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
@ -16,8 +16,9 @@
* Class containing admin, preferences and sidebox-menus (used as hooks)
*
* @package infolog
* @author RalfBecker-At-outdoor-training.de
* @copyright GPL - GNU General Public License
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class admin_prefs_sidebox_hooks
{

View File

@ -2,7 +2,7 @@
/**************************************************************************\
* eGroupWare - InfoLog *
* http://www.egroupware.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> *
* Written and (c) by Ralf Becker <RalfBecker@outdoor-training.de> *
* originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
@ -14,16 +14,16 @@
/* $Id$ */
include_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.soinfolog.inc.php');
include_once(EGW_API_INC.'/class.bolink.inc.php');
/**
* This class is the BO-layer of InfoLog, it also handles xmlrpc requests
*
* @package infolog
* @author RalfBecker-At-outdoor-training.de
* @copyright GPL - GNU General Public License
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class boinfolog // BO: buiseness objects: internal logic
class boinfolog
{
var $enums;
var $so;
@ -70,7 +70,13 @@
*/
var $config;
function boinfolog( $info_id = 0)
/**
* Constructor Infolog BO
*
* @param int $info_id
* @param boolean $instanciate_link=true should the link class be instanciated, used by the link-registry to prevent infinit recursion
*/
function boinfolog($info_id = 0,$instanciate_link=true)
{
$this->enums = $this->stock_enums = array(
'priority' => array (
@ -107,7 +113,12 @@
));
$this->so =& new soinfolog();
$this->link =& new bolink();
if (!is_object($GLOBALS['egw']->link) && $instanciate_link)
{
$GLOBALS['egw']->link =& CreateObject('phpgwapi.bolink');
}
$this->link =& $GLOBALS['egw']->link;
$this->config =& CreateObject('phpgwapi.config');
$this->config->read_repository();
@ -184,19 +195,21 @@
/**
* check's if user has the requiered rights on entry $info_id
*
* @param int $info_id id of infolog entry to check
* @param int/array $info data or info_id of infolog entry to check
* @param int $required_rights EGW_ACL_{READ|EDIT|ADD|DELETE}
* @return boolean
*/
function check_access( $info_id,$required_rights )
function check_access( $info,$required_rights )
{
static $cache = array();
$info_id = is_array($info) ? $info['info_id'] : $info;
if (isset($cache[$info_id][$required_rights]))
{
return $cache[$info_id][$required_rights];
}
return $cache[$info_id][$required_rights] = $this->so->check_access( $info_id,$required_rights );
return $cache[$info_id][$required_rights] = $this->so->check_access( $info,$required_rights );
}
/**
@ -232,15 +245,18 @@
{
return False;
}
$info['info_link_view'] = $this->link->view($link['link_app'.$nr],$link['link_id'.$nr]);
$info['info_link_title'] = !empty($info['info_from']) ? $info['info_from'] : $title;
$info['info_link'] = array(
'app' => $link['link_app'.$nr],
'id' => $link['link_id'.$nr],
'title' => (!empty($info['info_from']) ? $info['info_from'] : $title),
);
//echo " title='$title'</p>\n";
return $info['blur_title'] = $title;
}
else
{
$info['info_link_title'] = $info['info_from'];
$info['info_link'] = array('title' => $info['info_from']);
$info['info_link_id'] = 0; // link might have been deleted
}
return False;
@ -352,12 +368,13 @@
*
* checks and asures ACL
*
* @param array $values values to write, if contains values for check_defaults and touch_modified, they have precedens over the parameters
* @param array &$values values to write, if contains values for check_defaults and touch_modified,
* they have precedens over the parameters. The
* @param boolean $check_defaults=true check and set certain defaults
* @param boolean $touch_modified=true touch the modification data and sets the modiefier's user-id
* @return int/boolean info_id on a successfull write or false
*/
function write($values,$check_defaults=True,$touch_modified=True)
function write(&$values,$check_defaults=True,$touch_modified=True)
{
//echo "boinfolog::write()values="; _debug_array($values);
// allow to (un)set check_defaults and touch_modified via values, eg. via xmlrpc
@ -369,6 +386,7 @@
unset($values[$var]);
}
}
// fix old names
foreach($values as $key => $val)
{
if ($key[0] != '#' && substr($key,0,5) != 'info_')
@ -408,9 +426,12 @@
$set_enddate = !$values['info_enddate'] && // set enddate of finished job, only if its not already set
($values['info_status'] == 'done' || $values['info_status'] == 'billed');
$backup_values = $values; // to return the full values
$values = array(
'info_id' => $values['info_id'],
'info_id' => $values['info_id'],
'info_status' => $values['info_status'],
'info_owner' => $values['info_owner'],
'info_datemodified' => $values['info_datemodified'],
);
if ($set_enddate)
{
@ -444,18 +465,21 @@
}
if ($touch_modified || !$values['info_datemodified'])
{
$check_modified = $values['info_datemodified'] ? $values['info_datemodified']-$this->tz_offset_s : false;
$values['info_datemodified'] = $this->user_time_now;
}
if ($touch_modified || !$values['info_modifier'])
{
$values['info_modifier'] = $this->so->user;
}
$to_write = $values;
if ($status_only) $values = array_merge($backup_values,$values);
// convert user- to system-time
foreach(array('info_startdate','info_enddate','info_datemodified') as $time)
{
if ($values[$time]) $values[$time] -= $this->tz_offset_s;
if ($to_write[$time]) $to_write[$time] -= $this->tz_offset_s;
}
if($info_id = $this->so->write($values))
if(($info_id = $this->so->write($to_write,$check_modified)))
{
if (!isset($values['info_type']) || $status_only)
{
@ -477,10 +501,11 @@
$info_id, 'add', time()
);
}
$values['info_id'] = $info_id;
// notify the link-class about the update, as other apps may be subscribt to it
$this->link->notify_update('infolog',$info_id,$values);
}
return $info_id;
}
@ -537,13 +562,39 @@
return $ret;
}
/**
* Hook called by link-class to include infolog in the appregistry of the linkage
*
* @param array/string $location location and other parameters (not used)
* @return array with method-names
*/
function search_link($location)
{
return array(
'query' => 'infolog.boinfolog.link_query',
'title' => 'infolog.boinfolog.link_title',
'view' => array(
'menuaction' => 'infolog.uiinfolog.index',
'action' => 'sp'
),
'view_id' => 'action_id',
'add' => array(
'menuaction' => 'infolog.uiinfolog.edit',
'type' => 'task'
),
'add_app' => 'action',
'add_id' => 'action_id',
'add_popup' => '750x550',
);
}
/**
* get title for an infolog entry identified by $info
*
* Is called as hook to participate in the linking
*
* @param int/array $info int info_id or array with infolog entry
* @param string the title
* @return string the title
*/
function link_title( $info )
{

View File

@ -0,0 +1,37 @@
<?php
/**************************************************************************\
* eGroupWare - InfoLog *
* http://www.egroupware.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> *
* originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
include_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.boinfolog.inc.php');
/**
* This class returns the link-registry for infolog
*
* To prevent an invinit recursion, it has to be outside the boinfolog class,
* which itself instanciats the link class by default.
*
* @package infolog
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by RalfBecker-At-outdoor-training.de
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class infolog_link_registry
{
function search_link($location)
{
$bo =& new boinfolog(0,false); // false = dont instanciate the link class
return $bo->search_link($location);
}
}

View File

@ -22,8 +22,9 @@
* and for pgSql 7.3 compatibility
*
* @package infolog
* @author RalfBecker-At-outdoor-training.de
* @copyright GPL - GNU General Public License
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class soinfolog // DB-Layer
{
@ -54,24 +55,28 @@
/**
* checks if user has the $required_rights to access $info_id (private access is handled too)
*
* @param $info_id Id of InfoLog entry
* @param $required_rights EGW_ACL_xyz anded together
* @param array/int $info data or info_id of InfoLog entry
* @param int $required_rights EGW_ACL_xyz anded together
* @return boolean True if access is granted else False
*/
function check_access( $info_id,$required_rights )
function check_access( $info,$required_rights )
{
if ($info_id != $this->data['info_id']) // already loaded?
if (is_array($info))
{
}
elseif ((int) $info != $this->data['info_id']) // already loaded?
{
// dont change our own internal data,
// dont use new as it changes $phpgw->db
$private_info = $this;
$info = $private_info->read($info_id);
$info = $private_info->read($info);
}
else
{
$info = $this->data;
}
if (!$info || !$info_id)
if (!$info)
{
return False;
}
@ -344,11 +349,12 @@
* writes the given $values to InfoLog, a new entry gets created if info_id is not set or 0
*
* @param array $values with the data of the log-entry
* @return int the info_id
* @param int $check_modified=0 old modification date to check before update (include in WHERE)
* @return int/boolean info_id, false on error or 0 if the entry has been updated in the meantime
*/
function write($values) // did _not_ ensure ACL
function write($values,$check_modified=0) // did _not_ ensure ACL
{
//echo "soinfolog::write()values="; _debug_array($values);
//echo "soinfolog::write(,$check_modified) values="; _debug_array($values);
$info_id = (int) $values['info_id'];
if (isset($values['info_responsible']))
@ -366,14 +372,20 @@
}
if (($this->data['info_id'] = $info_id))
{
$this->db->update($this->info_table,$to_write,array('info_id'=>$info_id),__LINE__,__FILE__);
$where = array('info_id' => $info_id);
if ($check_modified) $where['info_datemodified'] = $check_modified;
if (!$this->db->update($this->info_table,$to_write,$where,__LINE__,__FILE__))
{
return false; // Error
}
if ($this->db->affected_rows() < 1) return 0; // someone else updated the modtime or deleted the entry
}
else
{
if (!isset($to_write['info_id_parent'])) $to_write['info_id_parent'] = 0; // must not be null
$this->db->insert($this->info_table,$to_write,false,__LINE__,__FILE__);
$this->data['info_id']=$this->db->get_last_insert_id($this->info_table,'info_id');
$this->data['info_id'] = $this->db->get_last_insert_id($this->info_table,'info_id');
}
//echo "<p>soinfolog.write values= "; _debug_array($values);
@ -401,6 +413,8 @@
/**
* count the sub-entries of $info_id
*
* This is done now be search too (in key info_anz_subs), if DB can use sub-queries
*
* @param $info_id id of log-entry
* @return int the number of sub-entries
*/
@ -423,6 +437,8 @@
/**
* searches InfoLog for a certain pattern in $query
*
* If DB can use sub-queries, the number of subs are under the key info_anz_subs.
*
* @param $query[order] column-name to sort after
* @param $query[sort] sort-order DESC or ASC
* @param $query[filter] string with combination of acl-, date- and status-filters, eg. 'own-open-today' or ''
@ -450,7 +466,7 @@
if (count($links))
{
$link_extra = ($action == 'sp' ? 'OR' : 'AND')." $this->info_table.info_id IN (".implode(',',$links).')';
$link_extra = ($action == 'sp' ? 'OR' : 'AND')." main.info_id IN (".implode(',',$links).')';
}
}
if (!empty($query['order']) && eregi('^[a-z_0-9, ]+$',$query['order']) && (empty($query['sort']) || eregi('^(DESC|ASC)$',$query['sort'])))
@ -460,9 +476,11 @@
{
$val = trim($val);
$val = (substr($val,0,5) != 'info_' ? 'info_' : '').$val;
if ($val == 'info_des' && $this->db->Type == 'mssql')
if ($val == 'info_des' && $this->db->capabilities['order_on_text'] !== true)
{
$val = "CAST($val AS varchar)";
if (!$this->db->capabilities['order_on_text']) continue;
$val = sprintf($this->db->capabilities['order_on_text'],$val);
}
$order[] = $val;
}
@ -472,7 +490,7 @@
{
$ordermethod = 'ORDER BY info_datemodified DESC'; // newest first
}
$filtermethod = $this->aclFilter($query['filter']);
$acl_filter = $filtermethod = $this->aclFilter($query['filter']);
$filtermethod .= $this->statusFilter($query['filter']);
$filtermethod .= $this->dateFilter($query['filter']);
@ -509,24 +527,20 @@
$cats = $GLOBALS['egw']->categories->return_all_children((int)$query['cat_id']);
$filtermethod .= ' AND info_cat'.(count($cats)>1? ' IN ('.implode(',',$cats).') ' : '='.(int)$query['cat_id']);
}
$join = '';
$join = $distinct = $count_subs = '';
if ($query['query']) $query['search'] = $query['query']; // allow both names
if ($query['search']) // we search in _from, _subject, _des and _extra_value for $query
{
$pattern = $this->db->quote('%'.$query['search'].'%');
$columns = array('info_from','info_subject','info_extra_value');
switch($this->db->Type)
{
case 'sapdb':
case 'maxdb':
// at the moment MaxDB 7.5 cant cast nor search text columns, it's suppost to change in 7.6
break;
default:
$columns[] = 'info_des';
}
// at the moment MaxDB 7.5 cant cast nor search text columns, it's suppost to change in 7.6
if ($this->db->capabilities['like_on_text']) $columns[] = 'info_des';
$sql_query = 'AND ('.implode(" LIKE $pattern OR ",$columns)." LIKE $pattern) ";
$join = "LEFT JOIN $this->extra_table ON $this->info_table.info_id=$this->extra_table.info_id";
$join = "LEFT JOIN $this->extra_table ON main.info_id=$this->extra_table.info_id";
// mssql and others cant use DISTICT if text columns (info_des) are involved
$distinct = $this->db->capabilities['distinct_on_text'] ? 'DISTINCT' : '';
}
$pid = 'AND info_id_parent='.($action == 'sp' ? $query['action_id'] : 0);
@ -538,26 +552,20 @@
$ids = array( );
if ($action == '' || $action == 'sp' || count($links))
{
$sql_query = "FROM $this->info_table $join WHERE ($filtermethod $pid $sql_query) $link_extra";
switch($this->db->Type)
{
// mssql and others cant use DISTICT if text columns (info_des) are involved
case 'mssql':
case 'sapdb':
case 'maxdb':
$distinct = '';
break;
default:
$distinct = 'DISTINCT';
}
$this->db->query($sql="SELECT $distinct $this->info_table.info_id ".$sql_query,__LINE__,__FILE__);
$sql_query = "FROM $this->info_table main $join WHERE ($filtermethod $pid $sql_query) $link_extra";
$this->db->query($sql="SELECT $distinct main.info_id ".$sql_query,__LINE__,__FILE__);
$query['total'] = $this->db->num_rows();
if (!$query['start'] || $query['start'] > $query['total'])
{
$query['start'] = 0;
}
$this->db->limit_query($sql="SELECT $distinct $this->info_table.* $sql_query $ordermethod",$query['start'],__LINE__,__FILE__);
if ($this->db->capabilities['sub_queries'])
{
$count_subs = ",(SELECT count(*) FROM $this->info_table sub WHERE sub.info_id_parent=main.info_id AND $acl_filter) AS info_anz_subs";
}
$this->db->limit_query($sql="SELECT $distinct main.* $count_subs $sql_query $ordermethod",$query['start'],__LINE__,__FILE__);
//echo "<p>sql='$sql'</p>\n";
while (($info =& $this->db->row(true)))
{

View File

@ -1,8 +1,8 @@
<?php
/**************************************************************************\
* eGroupWare - InfoLog: Custom fields, typ and status *
* eGroupWare - InfoLog: Administration of custom fields, type and status *
* http://www.egroupware.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> *
* Written and (c) by Ralf Becker <RalfBecker@outdoor-training.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
@ -12,6 +12,14 @@
/* $Id$ */
/**
* Administration of custom fields, type and status
*
* @package infolog
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class uicustomfields
{
var $public_functions = array
@ -30,12 +38,11 @@
}
/**
* @author ralfbecker
* Edit/Create an InfoLog Custom fields, typ and status
*
* @param $content Content from the eTemplate Exec
* @param array $content Content from the eTemplate Exec
*/
function edit($content = 0)
function edit($content=null)
{
$GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Custom fields, typ and status');
if (is_array($content))

View File

@ -1,8 +1,8 @@
<?php
/**************************************************************************\
* eGroupWare - InfoLog *
* http://www.egroupware.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> *
* http://www.egroupware.org *
* Written and copyright by Ralf Becker <RalfBecker@outdoor-training.de> *
* originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
@ -19,8 +19,9 @@
* This class is the UI-layer (user interface) of InfoLog
*
* @package infolog
* @author RalfBecker-At-outdoor-training.de
* @copyright GPL - GNU General Public License
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class uiinfolog
{
@ -68,10 +69,10 @@
$this->filters = array(
'none' => 'no Filter',
'done' => 'done',
'my' => 'my',
'my-open-today' => 'my open',
'my-open-overdue' => 'my overdue',
'my-upcoming' => 'my upcoming',
'my' => 'responsible',
'my-open-today' => 'responsible open',
'my-open-overdue' => 'responsible overdue',
'my-upcoming' => 'responsible upcoming',
'own' => 'own',
'own-open-today' => 'own open',
'own-open-overdue' => 'own overdue',
@ -91,7 +92,7 @@
$this->link = &$this->bo->link;
$this->tmpl =& CreateObject('etemplate.etemplate');
$this->html = &$this->tmpl->html;
$this->html =& $this->tmpl->html;
$this->user = $GLOBALS['egw_info']['user']['account_id'];
@ -111,14 +112,14 @@
{
$info['end_class'] = 'overdue';
}
$info['info_anz_subs'] = $this->bo->anzSubs($id);
if (!isset($info['info_anz_subs'])) $info['info_anz_subs'] = $this->bo->anzSubs($id);
$this->bo->link_id2from($info,$action,$action_id); // unset from for $action:$action_id
$readonlys["edit[$id]"] = !$this->bo->check_access($id,EGW_ACL_EDIT);
$readonlys["close[$id]"] = $done || ($readonlys["edit_status[$id]"] = !($this->bo->check_access($id,EGW_ACL_EDIT) ||
$readonlys["edit[$id]"] = !$this->bo->check_access($info,EGW_ACL_EDIT);
$readonlys["close[$id]"] = $done || ($readonlys["edit_status[$id]"] = !($this->bo->check_access($info,EGW_ACL_EDIT) ||
in_array($this->user, (array)$info['info_responsible'])));
$readonlys["delete[$id]"] = !$this->bo->check_access($id,EGW_ACL_DELETE);
$readonlys["sp[$id]"] = !$this->bo->check_access($id,EGW_ACL_ADD);
$readonlys["delete[$id]"] = !$this->bo->check_access($info,EGW_ACL_DELETE);
$readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD);
$readonlys["view[$id]"] = $info['info_anz_subs'] < 1;
$readonlys['view[0]'] = True; // no parent
@ -190,24 +191,49 @@
}
$rows[] = $info;
}
if ($query['no_actions']) $rows['no_actions'] = true;
//echo "<p>readonlys = "; _debug_array($readonlys);
//echo "rows=<pre>".print_r($rows,True)."</pre>\n";
return $query['total'];
}
function index($values = 0,$action='',$action_id='',$referer=0,$extra_app_header=False,$return_html=False,$own_referer='')
/**
* Shows the infolog list
*
* @param array $values=null etemplate content
* @param string $action='' if set only entries liked to that $action:$action_id are shown
* @param string $action_id='' if set only entries liked to that $action:$action_id are shown
* @param mixed $called_as=0 this is how we got called, for a hook eg. the call-params of that page containing the hook
* @param boolean $extra_app_header=false
* @param boolean $return_html=false
* @param string $own_referer='' this is our own referer
*/
function index($values = 0,$action='',$action_id='',$called_as=0,$extra_app_header=False,$return_html=False,$own_referer='')
{
if (is_array($values))
{
$referer = $values['referer'];
$called_as = $values['called_as'];
$own_referer = $values['own_referer'];
}
elseif ($own_referer !== '')
elseif ($own_referer === '')
{
$own_referer = $GLOBALS['egw']->common->get_referer();
if (strstr($own_referer,'menuaction=infolog.uiinfolog.edit'))
{
$own_referer = $GLOBALS['egw']->session->appsession('own_session','infolog');
}
else
{
$GLOBALS['egw']->session->appsession('own_session','infolog',$own_referer);
}
}
//echo "<p>uiinfolog::index(action='$action/$action_id',referer='$referer/$values[referer]') values=\n"; _debug_array($values);
if (!$action)
{
$action = $values['action'] ? $values['action'] : get_var('action',array('POST','GET'));
$action_id = $values['action_id'] ? $values['action_id'] : get_var('action_id',array('POST','GET'));
}
//echo "<p>uiinfolog::index(action='$action/$action_id',called_as='$called_as/$values[referer]',own_referer='$own_referer') values=\n"; _debug_array($values);
if (!is_array($values))
{
$values = array('nm' => $this->read_sessiondata());
@ -221,11 +247,9 @@
$values['nm']['order'] = 'info_datemodified';
$values['nm']['sort'] = 'DESC';
}
}
if ($action == '')
{
$action = $values['action'] ? $values['action'] : get_var('action',array('POST','GET'));
$action_id = $values['action_id'] ? $values['action_id'] : get_var('action_id',array('POST','GET'));
$values['msg'] = $_GET['msg'];
$values['action'] = $action;
$values['action_id'] = $action_id;
}
if ($values['nm']['add'])
{
@ -237,7 +261,7 @@
if ($values['add'])
{
list($type) = each($values['add']);
return $this->edit(0,$action,$action_id,$type,$referer);
return $this->edit(0,$action,$action_id,$type,$called_as);
}
elseif ($values['cancel'] && $own_referer)
{
@ -247,18 +271,19 @@
{
list($do,$do_id) = isset($values['main']) ? each($values['main']) : @each($values['nm']['rows']);
list($do_id) = @each($do_id);
//echo "<p>infolog::index: do='$do/$do_id', referer="; _debug_array($referer);
//echo "<p>infolog::index: do='$do/$do_id', referer="; _debug_array($called_as);
switch($do)
{
case 'edit':
case 'edit_status':
return $this->edit($do_id,$action,$action_id,'',$referer);
return $this->edit($do_id,$action,$action_id,'',$called_as);
case 'delete':
return $this->delete($do_id,$referer);
if (!($values['msg'] = $this->delete($do_id,$called_as,'index'))) return;
break;
case 'close':
return $this->close($do_id,$referer);
return $this->close($do_id,$called_as);
case 'sp':
return $this->edit(0,'sp',$do_id,'',$referer);
return $this->edit(0,'sp',$do_id,'',$called_as);
case 'view':
$value = array();
$action = 'sp';
@ -301,7 +326,7 @@
$GLOBALS['egw_info']['user']['preferences']['infolog']['never_hide'] : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15;
$persist['action'] = $values['nm']['action'] = $action;
$persist['action_id'] = $values['nm']['action_id'] = $action_id;
$persist['referer'] = $referer;
$persist['called_as'] = $called_as;
$persist['own_referer'] = $own_referer;
$all_stati = array();
@ -325,24 +350,44 @@
if ($info_id)
{
$this->bo->write(array(
$values = array(
'info_id' => $info_id,
'info_status' => 'done',
));
);
$this->bo->write($values);
}
return $referer ? $this->tmpl->location($referer) : $this->index();
}
function delete($values=0,$referer='')
function delete($values=0,$referer='',$called_by='')
{
$info_id = (int) (is_array($values) ? $values['info_id'] : ($values ? $values : $_GET['info_id']));
$referer = is_array($values) ? $values['referer'] : $referer;
if (!is_array($values) && $info_id > 0 && !$this->bo->anzSubs($info_id)) // entries without subs get confirmed by javascript
{
$values = array('delete' => true);
}
//echo "<p>uiinfolog::delete(".print_r($values,true).",'$referer','$called_by') info_id=$info_id</p>\n";
if (is_array($values) || $info_id <= 0)
{
if ($values['delete'] && $info_id > 0 && $this->bo->check_access($info_id,EGW_ACL_DELETE))
if (($values['delete'] || $values['delete_subs']) && $info_id > 0 && $this->bo->check_access($info_id,EGW_ACL_DELETE))
{
$this->bo->delete($info_id,$values['remove_subs'],$values['info_id_parent']);
$deleted = $this->bo->delete($info_id,$values['delete_subs'],$values['info_id_parent']);
}
if ($called_by) // direct call from the same request
{
return $deleted ? lang('InfoLog entry deleted') : '';
}
if ($values['called_by'] == 'edit') // we run in the edit popup => give control back to edit
{
$this->edit(array(
'info_id' => $info_id,
'button' => array('deleted' => true), // not delete!
'referer' => $referer,
'msg' => $deleted ? lang('Infolog entry deleted') : '',
));
}
return $referer ? $this->tmpl->location($referer) : $this->index();
}
@ -351,16 +396,27 @@
$this->tmpl->read('infolog.delete');
$values['main']['no_actions'] = True;
$values['remove_subs'] = $this->bo->anzSubs($info_id) > 0;
$values['nm'] = array(
'action' => 'sp',
'action_id' => $info_id,
'options-filter' => $this->filters,
'get_rows' => 'infolog.uiinfolog.get_rows',
'no_filter2' => True,
'never_hide' => isset($GLOBALS['egw_info']['user']['preferences']['infolog']['never_hide']) ?
$GLOBALS['egw_info']['user']['preferences']['infolog']['never_hide'] :
$GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15,
);
$values['main']['no_actions'] = $values['nm']['no_actions'] = True;
$persist['info_id'] = $info_id;
$persist['referer'] = $referer;
$persist['info_id_parent'] = $values['main'][1]['info_id_parent'];
$persist['called_by'] = $called_by;
$GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Delete');
$GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => 'ManualInfologDelete');
$this->tmpl->exec('infolog.uiinfolog.delete',$values,'',$readonlys,$persist);
$this->tmpl->exec('infolog.uiinfolog.delete',$values,'',$readonlys,$persist,$called_by == 'edit' ? 2 : 0);
}
/**
@ -381,14 +437,19 @@
$action = $content['action'];
$action_id = $content['action_id'];
$referer = $content['referer'];
$no_popup = $content['no_popup'];
$caller = $content['caller'];
if (isset($content['link_to']['primary']))
{
$content['info_link_id'] = $content['link_to']['primary'];
}
if ($content['save'] || $content['delete'] || $content['cancel'])
list($button) = @each($content['button']);
unset($content['button']);
if ($button)
{
if ($content['save'] && $info_id)
//echo "<p>uiinfolog::edit(info_id=$info_id) '$button' button pressed, content="; _debug_array($content);
if (($button == 'save' || $button == 'apply') && $info_id)
{
if (!($edit_acl = $this->bo->check_access($info_id,EGW_ACL_EDIT)))
{
@ -396,50 +457,83 @@
$status_only = in_array($this->user, $old['info_responsible']);
}
}
if ($content['save'] && (!$info_id || $edit_acl || $status_only))
if (($button == 'save' || $button == 'apply') && (!$info_id || $edit_acl || $status_only))
{
if (strstr($content['info_link_id'],':') !== False)
if (is_array($content['link_to']['to_id']) && count($content['link_to']['to_id']))
{
$info_link_id = $content['info_link_id'];
$content['info_link_id'] = 0; // as field has to be int
$first_link_to = $content['link_to']['to_id'];
if (strstr($content['info_link_id'],':') !== False)
{
$info_link_id = $content['info_link_id'];
$content['info_link_id'] = 0; // as field has to be int
}
}
if ($status_only)
if (!($info_id = $this->bo->write($content)))
{
$content = array(
'info_id' => $content['info_id'],
'info_status' => $content['info_status']
);
$content['msg'] = $info_id !== 0 || !$content['info_id'] ? lang('Error: saving the entry') :
lang('Error: the entry has been updated since you opened it for editing!').'<br />'.
lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','<a href="'.
htmlspecialchars($GLOBALS['egw']->link('/index.php',array(
'menuaction' => 'infolog.uiinfolog.edit',
'info_id' => $content['info_id'],
'no_popup' => $no_popup,
'referer' => $referer,
))).'">','</a>');
$button = ''; // not exiting edit
$info_id = $content['info_id'];
}
$this->bo->write($content);
else
{
$content['msg'] = lang('InfoLog entry saved');
$content['js'] = "opener.location.href='".$GLOBALS['egw']->link($referer,array('msg' => $content['msg']))."';";
}
if ($info_id && $first_link_to) // writing links for a new entry
{
$this->link->link('infolog',$info_id,$first_link_to);
if (!$info_id && is_array($content['link_to']['to_id'])) // writing link for new entry
{
$content['info_id'] = $this->bo->so->data['info_id'];
$this->link->link('infolog',$content['info_id'],$content['link_to']['to_id']);
if ($info_link_id)
{
list($app,$id) = explode(':',$info_link_id);
$link = $this->link->get_link('infolog',$content['info_id'],$app,$id);
$link = $this->link->get_link('infolog',$info_id,$app,$id);
$content['info_link_id'] = $link['link_id'];
$this->bo->write(array(
$to_write = array(
'info_id' => $content['info_id'],
'info_link_id' => $content['info_link_id'],
'info_from' => $content['info_from']
),False);
'info_from' => $content['info_from'],
'info_owner' => $content['info_owner'],
);
$this->bo->write($to_write,False);
}
}
}
elseif ($content['delete'] && $info_id > 0)
elseif ($button == 'delete' && $info_id > 0)
{
if (!$referer && $action) $referer = array(
'menuaction' => 'infolog.uiinfolog.index',
'action' => $action,
'action_id' => $action_id
);
return $this->delete($info_id,$referer); // checks ACL first
if (!($content['msg'] = $this->delete($info_id,$referer,'edit'))) return; // checks ACL first
$content['js'] = "opener.location.href='".$GLOBALS['egw']->link($referer,array('msg' => $content['msg']))."';";
}
return $referer ? $this->tmpl->location($referer) : $this->index(0,$action,$action_id);
// called again after delete confirmation dialog
elseif ($button == 'deleted' && $content['msg'])
{
$content['js'] = "opener.location.href='".$GLOBALS['egw']->link($referer,array('msg' => $content['msg']))."';";
}
if ($button == 'save' || $button == 'cancel' || $button == 'delete' || $button == 'deleted')
{
if ($no_popup)
{
$GLOBALS['egw']->redirect_link($referer,array('msg' => $content['msg']));
}
$content['js'] .= 'window.close();';
echo '<html><body onload="'.$content['js'].'"></body></html>';
$GLOBALS['egw']->common->egw_exit();
}
if ($content['js']) $content['js'] = '<script>'.$content['js'].'</script>';
}
}
else
@ -449,7 +543,10 @@
$action_id = $action_id ? $action_id : get_var('action_id',array('POST','GET'));
$info_id = $content ? $content : get_var('info_id', array('POST','GET'));
$type = $type ? $type : get_var('type', array('POST','GET'));
$referer = $referer !== '' ? $referer : $GLOBALS['egw']->common->get_referer();
$referer = $referer !== '' ? $referer : ($_GET['referer'] ? $_GET['referer'] :
$GLOBALS['egw']->common->get_referer('/index.php?menuaction=infolog.uiinfolog.index'));
$referer = preg_replace('/[&?]{1}msg=[^&]+/','',$referer); // remove previou/old msg from referer
$no_popup = $_GET['no_popup'];
//echo "<p>uiinfolog::edit: info_id=$info_id, action='$action', action_id='$action_id', type='$type', referer='$referer'</p>\n";
$content = $this->bo->read( $info_id || $action != 'sp' ? $info_id : $action_id );
@ -496,7 +593,7 @@
{
if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT))
{
if (in_array($this->user, $content['info_responsible']))
if (in_array($this->user, (array)$content['info_responsible']))
{
$content['status_only'] = True;
foreach($content as $name => $value)
@ -509,9 +606,18 @@
$readonlys['#'.$name] = true;
}
}
else
else // Permission denied
{
return $referer ? $this->tmpl->location($referer) : $this->index(0,$action,$action_id);
if ($no_popup)
{
$GLOBALS['egw']->common->egw_header();
parse_navbar();
echo '<p class="redItalic" align="center">'.lang('Permission denied')."</p>\n";
$GLOBALS['egw']->common->egw_exit();
}
$js = "alert('".lang('Permission denied')."'); window.close();";
echo '<html><body onload="'.$js.'"></body></html>';
$GLOBALS['egw']->common->egw_exit();
}
}
}
@ -549,6 +655,7 @@
case 'new': // new entry
$content['info_startdate'] = (int) $_GET['startdate'] ? (int) $_GET['startdate'] : $today;
$content['info_priority'] = 1; // normal
$content['info_owner'] = $this->user;
if ($type != '')
{
$content['info_type'] = $type;
@ -564,8 +671,10 @@
$content['info_type'] = 'note';
}
}
$readonlys['delete'] = !$info_id || !$this->bo->check_access($info_id,EGW_ACL_DELETE);
if (!($readonlys['delete'] = !$info_id || !$this->bo->check_access($info_id,EGW_ACL_DELETE)))
{
$content['info_anz_subs'] = $this->bo->anzSubs($info_id); // to determine js confirmation of delete or not
}
$GLOBALS['egw_info']['flags']['app_header'] = lang($this->messages[$info_id ? 'edit' : ($action == 'sp' ? 'add_sub' : 'add')]);
$this->tmpl->read('infolog.edit');
@ -576,27 +685,30 @@
}
else
{
$this->tmpl->set_cell_attribute('description|links|delegation|customfields','name','description|links|delegation');
$readonlys['description|links|delegation|customfields'] = array('customfields' => true);
}
$GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.
($content['status_only'] ? lang('Edit Status') : lang('Edit'));
$GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => ($info_id ? 'ManualInfologEdit' : 'ManualInfologAdd'));
//echo "<p>uiinfolog.edit(info_id='$info_id',action='$action',action_id='$action_id') readonlys="; print_r($readonlys); echo ", content = "; _debug_array($content);
$this->tmpl->exec('infolog.uiinfolog.edit',$content,array(
'info_type' => $this->bo->enums['type'],
'info_priority' => $this->bo->enums['priority'],
'info_confirm' => $this->bo->enums['confirm'],
'info_status' => $this->bo->status[$content['info_type']]
),$readonlys,array(
'info_id' => $info_id,
'info_id_parent' => $content['info_id_parent'],
'info_link_id' => $content['info_link_id'],
'action' => $action,
'action_id' => $action_id,
'referer' => $referer,
'link_to' => array('to_id' => $content['link_to']['to_id']) // in case tab gets not viewed
));
),$readonlys,array( // preserved values
'info_id' => $info_id,
'info_id_parent'=> $content['info_id_parent'],
'info_link_id' => $content['info_link_id'],
'info_owner' => $content['info_owner'],
'info_datemodified' => $content['info_datemodified'],
'info_modifier' => $content['info_modifier'],
'action' => $action,
'action_id' => $action_id,
'referer' => $referer,
'no_popup' => $no_popup,
'link_to' => array('to_id' => $content['link_to']['to_id']) // in case tab gets not viewed
),$no_popup ? 0 : 2);
}
function menuaction($action = 'get_list',$app='infolog')

File diff suppressed because one or more lines are too long

View File

@ -29,13 +29,11 @@ add: infolog de Hinzuf
all infolog de alle
all links and attachments infolog de alle Verknüpfungen und Anhänge
allows to set the status of an entry, eg. set a todo to done if it's finished (values depend on entry-typ) infolog de erlaubt den Status eines Eintrags zu setzen, zB. eine Aufgabe auf erledigt wenn sie beendet ist (Werte hängen vom Type des Eintrags ab)
applies the changes infolog de übernimmt die Änderungen
apply the changes infolog de Übernimmt die Änderungen
are you shure you want to delete this entry ? infolog de Sind Sie sicher, dass Sie diesen Eintrag löschen wollen?
are you sure you want to delete this entry infolog de Sind Sie sicher, dass Sie diesen Eintrag löschen wollen?
attach a file infolog de Datei anhängen
attach file infolog de Datei anhängen
back to main list infolog de Zurück zur Gesamtliste
back to projectlist infolog de Zurück zur Gesamtliste
billed infolog de abgerechnet
both infolog de Annahme+erledigt
call infolog de anrufen
@ -52,10 +50,12 @@ comment infolog de Kommentar
configuration infolog de Konfiguration
confirm infolog de Bestätigung
contact infolog de Kontakt
copy your changes to the clipboard, %1reload the entry%2 and merge them. infolog de Kopieren Sie ihre Änderungen in die Zwischenablage, %1laden den Eintrag neu%2 und fügen diese wieder ein.
create new links infolog de Neue Verknüpfung erzeugen
creates a new field infolog de erstellt ein neues Feld
creates a new status with the given values infolog de erstellt einen neuen Status mit den angegebenen Werten
creates a new typ with the given name infolog de erstellt einen neuen Typ mit dem eingegebenen Namen
creation infolog de Erstellung
csv-fieldname infolog de CSV-Feldname
csv-filename infolog de CSV-Dateiname
csv-import common de CSV-Import
@ -74,22 +74,21 @@ default filter for infolog infolog de Standard-Filter f
default status for a new log entry infolog de Vorgabe für den Status eines neuen Eintrags
delegation infolog de Delegation
delete infolog de Löschen
delete all subs (if not subs will be subs of this enties parent or have no parent) infolog de Alle Untereinträge löschen (wenn nicht werden diese Untereinträge des übergeordneten Eintrags oder sind keine Untereinträge mehr)
delete one record by passing its id. infolog de Einen Datensatz spezifiziert durch seine id löschen.
delete the entry infolog de Eintrag löschen
delete this entry infolog de diesen Eintrag löschen
delete this entry and all listed sub-entries infolog de Diesen Eintrag und all aufgelisteten Untereinträge löschen
deletes the selected typ infolog de löscht den ausgewählten Typ
deletes this field infolog de löscht dieses Feld
deletes this status infolog de löscht diesen Status
description infolog de Beschreibung
description can not exceed 8000 characters in length infolog de Beschreibung darf nicht länger als 8000 Zeichen sein
determines the order the fields are displayed infolog de legt die Reihenfolge fest in der die Felder angezeigt werden
disables a status without deleting it infolog de deaktiviert einen Status ohne ihn zu löschen
do you want a confirmation of the responsible on: accepting, finishing the task or both infolog de wollen Sie eine Bestätigung des Verantwortlichen bei: Annahme, Beendigung der Aufgabe oder bei beidem
done infolog de erledigt
download infolog de Datei laden
duration infolog de Dauer
each value is a line like <id>[=<label>] infolog de jeder Wert ist eine Zeile im Format <id>=[<angezeigter Wert>]
each value is a line like <id>[=<label>] infolog de jeder Wert ist eine Zeile im Format id=[angezeigter Wert]
edit infolog de Bearbeiten
edit or create categories for ingolog infolog de Kategorien für InfoLog bearbeiten oder neu anlegen
edit status infolog de Status ändern
@ -103,6 +102,8 @@ enter a custom phone/email, leave empty if linked entry should be used infolog d
enter a textual description of the log-entry infolog de geben Sie eine textliche Beschreibung des Eintrags ein
enter the query pattern infolog de geben Sie ein Suchmuster ein
entry and all files infolog de Eintrag und alle Dateien
error: saving the entry infolog de Fehler: beim Speichern des Eintrags
error: the entry has been updated since you opened it for editing! infolog de Fehler: der Eintrag wurde geändert seit Sie ihn zum Bearbeiten geöffnet haben!
existing links infolog de Bestehende Verknüpfungen
fax infolog de Fax
fieldseparator infolog de Feldbegrenzer
@ -122,6 +123,8 @@ infolog - import csv-file infolog de InfoLog - Import CSV-Datei
infolog - new infolog de InfoLog - Anlegen
infolog - new subproject infolog de InfoLog - Anlegen Teilprojekt
infolog - subprojects from infolog de InfoLog - Teilprojekte von
infolog entry deleted infolog de InfoLog Eintrag gelöscht
infolog entry saved infolog de InfoLog Eintrag gespeichert
infolog list infolog de InfoLog Liste
infolog preferences common de InfoLog Einstellungen
infolog-fieldname infolog de InfoLog-Feldname
@ -141,10 +144,6 @@ longer textual description infolog de l
low infolog de niedrig
max length of the input [, length of the inputfield (optional)] infolog de max. Länge der Eingabe [, Länge des Eingabefeldes (optional)]
max number of entries to display on the main screen infolog de Wieviele Einträge sollen maximal auf der Startseite angezeigt werden
my infolog de meine
my open infolog de meine offen
my overdue infolog de meine überfällig
my upcoming infolog de meine zukünftig
name must not be empty !!! infolog de Name darf nicht leer sein !!!
name of new type to create infolog de Name des neu anzulegenden Types
never hide search and filters infolog de Suche und Filter niemals ausblenden
@ -161,7 +160,7 @@ not infolog de nicht
not assigned infolog de nicht zugewiesen
note infolog de Notiz
number of records to read (%1) infolog de Anzahl Datensätze lesen (%1)
number of row for a multiline inputfield or line of a multi-select-box infolog de Anzahl Zeilen für ein Mehrzeiliges Eingabefeld oder eines mehrfachen Auswahlfeldes
number of row for a multiline inputfield or line of a multi-select-box infolog de Anzahl Zeilen für ein mehrzeiliges Eingabefeld oder eines mehrfachen Auswahlfeldes
offer infolog de Angebot
ongoing infolog de in Arbeit
only the attachments infolog de nur die Anhänge
@ -173,12 +172,13 @@ order infolog de Reihenfolge
overdue infolog de überfällig
own infolog de eigene
own open infolog de eigene offen
own overdue infolog de eigene überfällig
own overdue infolog de verantwortlich überfällig
own upcoming infolog de eigene zukünftig
path on (web-)serverside<br>eg. /var/samba/share infolog de Pfad auf (Web-)Server<br>zB. /var/samba/Share
path to user and group files has to be outside of the webservers document-root!!! infolog de Pfad zu Benutzer- und Gruppen-Dateien MUSS AUSSERHALB des Wurzelverzeichnisses des Webservers (document-root) liegen!!!
pattern for search in addressbook infolog de Muster für Suche im Adressbuch
pattern for search in projects infolog de Muster für Suche des Projekts
permission denied infolog de Zugriff verweigert
phone infolog de Anruf
phone/email infolog de Telefon/Email
phonecall infolog de Telefonanruf
@ -191,7 +191,9 @@ read one record by passing its id. infolog de Einen Datensatz spezifiziert durch
reg. expr. for local ip's<br>eg. ^192\.168\.1\. infolog de reg. Ausdr. für lokale IP's<br>^192\.168\.1\.
remark infolog de Bemerkung
remove this link (not the entry itself) infolog de Diese Verknüpfung lösen (nicht den Eintrag selbst)
responsible infolog de Verantwortlich
responsible infolog de verantwortlich
responsible open infolog de verantwortlich offen
responsible upcoming infolog de verantwortlich zufünftig
responsible user, priority, times infolog de Verantwortlicher, Priorität, Zeiten
returns a list / search for records. infolog de Liefert eine Liste von / sucht nach Datensätzen.
save infolog de Speichern
@ -202,7 +204,7 @@ search for: infolog de Suchen nach:
select infolog de Auswählen
select a category for this entry infolog de eine Kategorie für diesen Eintrag auswählen
select a priority for this task infolog de eine Priorität für diesen Eintrag auswählen
select a responsible user: a person you want to delegate this task infolog de einen Verantwortlichen auswählen: eine Person der Sie diese Aufgabe delegieren wollen
select a responsible user: a person you want to delegate this task infolog de Verantwortlichen auswählen: Person(en) der Sie diese Aufgabe delegieren wollen
select a typ to edit it's status-values or delete it infolog de einen Type auswählen um seine Statuswerte zu ändern oder ihn zu löschen
select an app to search in infolog de eine Anwendung zum Durchsuchen auswählen
select an entry to link with infolog de einen Eintrag zum Verküpfen auswählen
@ -226,6 +228,7 @@ startrecord infolog de Startdatensatz
status infolog de Status
status ... infolog de Status ...
sub infolog de Unter-<br>einträge
sub-entries become subs of the parent or main entries, if there's no parent infolog de Untereinträge gehören dann zum übergeordneten Eintrag oder werden Haupteinträge wenn es keinen übergeordneten gibt.
subject infolog de Titel
task infolog de Aufgabe
test import (show importable records <u>only</u> in browser) infolog de Test Import (zeige importierbare Datensätze <u>nur</u> im Browser)
@ -248,8 +251,6 @@ unlink infolog de Verk
upcoming infolog de zukünftig
urgency infolog de Priorität
urgent infolog de Dringend
use button to search for address infolog de Button zum Suchen der Adresse verwenden
use button to search for project infolog de Button zum Suchen des Projekts verwenden
used time infolog de benötigte Zeit
valid path on clientside<br>eg. \\server\share or e:\ infolog de gültiger Pfad clientseitig<br>zB. \\Server\Share oder e:\
values for selectbox infolog de Werte für die Auswahlbox
@ -263,6 +264,7 @@ when should the todo or phonecall be started, it shows up from that date in the
will-call infolog de ruft zurück
write (add or update) a record by passing its fields. infolog de Schreiben (zufügen oder aktualisieren) eines Datensatzes durch Angabe seiner Felder.
yes - delete infolog de Ja - Löschen
yes - delete including sub-entries infolog de Ja - Löschen einschließlich Untereinträge
you can't delete one of the stock types !!! infolog de Sie können keinen der Standardtypen löschen!!!
you have entered an invalid ending date infolog de Sie haben ein ungültiges Enddatum eingegeben
you have entered an invalid starting date infolog de Sie haben ein ungültiges Startdatum eingegeben

View File

@ -29,13 +29,11 @@ add: infolog en Add:
all infolog en All
all links and attachments infolog en all links and attachments
allows to set the status of an entry, eg. set a todo to done if it's finished (values depend on entry-typ) infolog en allows to set the status of an entry, eg. set a ToDo to done if it's finished (values depend on entry-type)
applies the changes infolog en applies the changes
apply the changes infolog en Apply the changes
are you shure you want to delete this entry ? infolog en Are you sure you want to delete this entry ?
are you sure you want to delete this entry infolog en Are you sure you want to delete this entry
attach a file infolog en Attach a file
attach file infolog en Attach file
back to main list infolog en Back to main list
back to projectlist infolog en Back to Projectlist
billed infolog en billed
both infolog en both
call infolog en call
@ -52,10 +50,12 @@ comment infolog en Comment
configuration infolog en Configuration
confirm infolog en Confirm
contact infolog en Contact
copy your changes to the clipboard, %1reload the entry%2 and merge them. infolog en Copy your changes to the clipboard, %1reload the entry%2 and merge them.
create new links infolog en Create new links
creates a new field infolog en creates a new field
creates a new status with the given values infolog en creates a new status with the given values
creates a new typ with the given name infolog en creates a new type with the given name
creation infolog en Creation
csv-fieldname infolog en CSV-Fieldname
csv-filename infolog en CSV-Filename
csv-import common en CSV-Import
@ -74,15 +74,14 @@ default filter for infolog infolog en Default Filter for InfoLog
default status for a new log entry infolog en default status for a new log entry
delegation infolog en Delegation
delete infolog en Delete
delete all subs (if not subs will be subs of this enties parent or have no parent) infolog en Delete all subs (if not subs will be subs of this enties parent or have no parent)
delete one record by passing its id. infolog en Delete one record by passing its id.
delete the entry infolog en Delete the entry
delete this entry infolog en delete this entry
delete this entry and all listed sub-entries infolog en Delete this entry and all listed sub-entries
deletes the selected typ infolog en deletes the selected type
deletes this field infolog en deletes this field
deletes this status infolog en deletes this status
description infolog en Description
description can not exceed 8000 characters in length infolog en Description can not exceed 8000 characters in length
determines the order the fields are displayed infolog en determines the order the fields are displayed
disables a status without deleting it infolog en disables a status without deleting it
do you want a confirmation of the responsible on: accepting, finishing the task or both infolog en do you want a confirmation of the responsible on: accepting, finishing the task or both
@ -103,6 +102,8 @@ enter a custom phone/email, leave empty if linked entry should be used infolog e
enter a textual description of the log-entry infolog en enter a textual description of the log-entry
enter the query pattern infolog en Enter the query pattern
entry and all files infolog en Entry and all files
error: saving the entry infolog en Error: saving the entry
error: the entry has been updated since you opened it for editing! infolog en Error: the entry has been updated since you opened it for editing!
existing links infolog en Existing links
fax infolog en Fax
fieldseparator infolog en Fieldseparator
@ -122,6 +123,8 @@ infolog - import csv-file infolog en InfoLog - Import CSV-File
infolog - new infolog en InfoLog - New
infolog - new subproject infolog en InfoLog - New Subproject
infolog - subprojects from infolog en InfoLog - Subprojects from
infolog entry deleted infolog en InfoLog entry deleted
infolog entry saved infolog en InfoLog entry saved
infolog list infolog en InfoLog list
infolog preferences common en InfoLog preferences
infolog-fieldname infolog en Info Log-Fieldname
@ -141,10 +144,6 @@ longer textual description infolog en longer textual description
low infolog en low
max length of the input [, length of the inputfield (optional)] infolog en max length of the input [, length of the inputfield (optional)]
max number of entries to display on the main screen infolog en Max number of entries to display on the main screen
my infolog en my
my open infolog en my open
my overdue infolog en my overdue
my upcoming infolog en my upcoming
name must not be empty !!! infolog en Name must not be empty !!!
name of new type to create infolog en name of new type to create
never hide search and filters infolog en Never hide search and filters
@ -179,6 +178,7 @@ path on (web-)serverside<br>eg. /var/samba/share infolog en path on (web-)server
path to user and group files has to be outside of the webservers document-root!!! infolog en Path to user and group files HAS TO BE OUTSIDE of the webservers document-root!!!
pattern for search in addressbook infolog en pattern for search in Addressbook
pattern for search in projects infolog en pattern for search in Projects
permission denied infolog en Permission denied
phone infolog en Phone Call
phone/email infolog en Phone/Email
phonecall infolog en Phone Call
@ -191,7 +191,9 @@ read one record by passing its id. infolog en Read one record by passing its id.
reg. expr. for local ip's<br>eg. ^192\.168\.1\. infolog en reg. expr. for local IP's<br>eg. ^192\.168\.1\.
remark infolog en Remark
remove this link (not the entry itself) infolog en Remove this link (not the entry itself)
responsible infolog en Responsible
responsible infolog en responsible
responsible open infolog en responsible open
responsible upcoming infolog en responsible upcoming
responsible user, priority, times infolog en responsible user, priority, times
returns a list / search for records. infolog en Returns a list / search for records.
save infolog en Save
@ -226,6 +228,7 @@ startrecord infolog en Startrecord
status infolog en Status
status ... infolog en Status ...
sub infolog en Sub
sub-entries become subs of the parent or main entries, if there's no parent infolog en Sub-entries become subs of the parent or main entries, if there's no parent
subject infolog en Subject
task infolog en ToDo
test import (show importable records <u>only</u> in browser) infolog en Test Import (show importable records <u>only</u> in browser)
@ -248,8 +251,6 @@ unlink infolog en Unlink
upcoming infolog en upcoming
urgency infolog en urgency
urgent infolog en urgent
use button to search for address infolog en use Button to search for Address
use button to search for project infolog en use Button to search for Project
used time infolog en used time
valid path on clientside<br>eg. \\server\share or e:\ infolog en valid path on clientside<br>eg. \\Server\Share or e:\
values for selectbox infolog en Values for selectbox
@ -263,6 +264,7 @@ when should the todo or phonecall be started, it shows up from that date in the
will-call infolog en will call
write (add or update) a record by passing its fields. infolog en Write (add or update) a record by passing its fields.
yes - delete infolog en Yes - Delete
yes - delete including sub-entries infolog en Yes - Delete including sub-entries
you can't delete one of the stock types !!! infolog en You can't delete one of the stock types !!!
you have entered an invalid ending date infolog en You have entered an invalid ending date
you have entered an invalid starting date infolog en You have entered an invalid starting date

View File

@ -59,6 +59,7 @@
$setup_info['infolog']['hooks']['calendar_include_events'] = 'infolog.boinfolog.cal_to_include';
$setup_info['infolog']['hooks']['calendar_include_todos'] = 'infolog.boinfolog.cal_to_include';
$setup_info['infolog']['hooks']['sidebox_menu'] = 'infolog.admin_prefs_sidebox_hooks.all_hooks';
$setup_info['infolog']['hooks']['search_link'] = 'infolog.infolog_link_registry.search_link';
/* Dependencies for this app to work */
$setup_info['infolog']['depends'][] = array(

View File

@ -0,0 +1,13 @@
/* $Id$ */
.headertext { color: black; font-size: 120%; }
.lpadding5 { padding-left: 5px; };
.redItalic { color: red; font-style: italic; }
.low,.low_done,.normal,.normal_done,.high,.high_done,.urgent,.urgent_done { font-weight: bold; }
.low,.low_done { color:#606060; }
.normal,.normal_done { color:black }
.high { color:#cc0000; }
.high_done { color:#800000; }
.urgent { color:#ff00ff; }
.urgent_done { color:#800080; }
.overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; }

View File

@ -1,118 +1,192 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<grid id="infolog.index.rows-noheader" template="" lang="" group="0" version="0.9.15.003">
<columns>
<column width="5%"/>
<column/>
<column width="8%"/>
<column width="8%"/>
<column width="8%"/>
<column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</columns>
<rows>
<row class="th">
<vbox>
<description value="Type"/>
<description value="Status"/>
</vbox>
<vbox>
<description value="Subject"/>
<description value="Description"/>
</vbox>
<vbox>
<description value="Startdate"/>
<description value="Enddate"/>
</vbox>
<vbox>
<description value="Owner"/>
<description value="Responsible"/>
</vbox>
<description value="last changed"/>
<description value="Sub"/>
<description value="Action"/>
</row>
<row class="row" valign="top">
<hbox options="2,2" align="center">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it"/>
</hbox>
<vbox options="0,0">
<description options="b,@${row}[info_link_view]" value="%s $row_cont[info_addr]" no_lang="1" id="${row}[info_link_title]" statustext="view this linked entry in its application"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
</vbox>
<vbox options="0,0">
<date id="${row}[info_startdate]" readonly="true"/>
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
</vbox>
<vbox options="0,0">
<menulist>
<menupopup type="select-account" id="${row}[info_owner]" readonly="true"/>
</menulist>
<menulist>
<menupopup type="select-account" id="${row}[info_responsible]" readonly="true"/>
</menulist>
</vbox>
<vbox options="0,0">
<date-time id="${row}[info_datemodified]" readonly="true"/>
<menulist>
<menupopup type="select-account" id="${row}[info_modifier]" readonly="true"/>
</menulist>
</vbox>
<vbox options="0,0" align="center">
<button image="new.gif" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
</vbox>
<hbox>
<button image="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry"/>
<button image="delete.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/>
<button image="addfile.gif" label="Add file" id="file[$row_cont[info_id]]" disabled="true" statustext="Attach a file"/>
</hbox>
</row>
</rows>
<styles>
.low,.low_done,.normal,.normal_done,.high,.high_done,.urgent,.urgent_done { font-weight: bold; }
.low,.low_done { color:#606060; }
.normal,.normal_done { color:black }
.high { color:#cc0000; }
.high_done { color:#800000; }
.urgent { color:#ff00ff; }
.urgent_done { color:#800080; }
.overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; }
</styles>
</grid>
<grid id="infolog.delete" template="" lang="" group="" version="0.9.15.003" width="100%" border="0" spacing="0" padding="0">
<columns>
<column/>
</columns>
<rows>
<row>
<description/>
</row>
<row>
<grid content="main" align="center" id="infolog.index.rows-noheader"/>
</row>
<row valign="bottom" height="50">
<description class="headertext" value="Are you shure you want to delete this entry ?" align="center"/>
</row>
<row height="50" disabled="!@remove_subs">
<checkbox label="Delete all subs (if not subs will be subs of this enties parent or have no parent)" align="center" id="remove_subs"/>
</row>
<row>
<hbox options="20" align="center">
<button label="Yes - Delete" align="right" id="delete" statustext="Delete the entry"/>
<button label="No - Cancel" id="cancel" statustext="Abort without deleting"/>
</hbox>
</row>
</rows>
<styles>
.headertext { color: black; font-size: 120%; }
</styles>
</grid>
<template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.0.1.002">
<grid>
<columns>
<column width="5%"/>
<column/>
<column width="8%"/>
<column width="8%"/>
<column width="12%"/>
<column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</columns>
<rows>
<row class="th">
<vbox>
<description value="Type"/>
<description value="Status"/>
</vbox>
<vbox>
<description value="Subject"/>
<description value="Description"/>
</vbox>
<vbox>
<description value="Startdate"/>
<description value="Enddate"/>
</vbox>
<vbox>
<description value="Owner"/>
<description value="Responsible"/>
</vbox>
<description value="last changed"/>
<description value="Sub"/>
<description value="Action"/>
</row>
<row class="row" valign="top">
<hbox align="center" orient="2,2">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
</vbox>
<vbox orient="0,0">
<date id="${row}[info_startdate]" readonly="true"/>
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
</vbox>
<vbox orient="0,0">
<menulist>
<menupopup type="select-account" id="${row}[info_owner]" readonly="true"/>
</menulist>
<listbox type="select-account" id="${row}[info_responsible]" readonly="true" rows="5"/>
</vbox>
<vbox orient="0,0">
<date-time id="${row}[info_datemodified]" readonly="true"/>
<menulist>
<menupopup type="select-account" id="${row}[info_modifier]" readonly="true"/>
</menulist>
</vbox>
<vbox align="center" orient="0,0">
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
</vbox>
<hbox>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="delete" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry" onclick="return $row_cont[info_anz_subs] || confirm('Delete this entry');"/>
<button image="done" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox>
</row>
</rows>
</grid>
</template>
<template id="infolog.index.rows" template="" lang="" group="0" version="1.0.1.003">
<grid>
<columns>
<column width="2%"/>
<column/>
<column width="8%"/>
<column width="8%"/>
<column width="12%"/>
<column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</columns>
<rows>
<row class="th">
<vbox orient="0,0">
<nextmatch-filterheader options="Type ..." id="info_type"/>
<nextmatch-filterheader options="Status ..." id="info_status"/>
</vbox>
<grid width="100%" spacing="0" padding="0">
<columns>
<column/>
<column/>
</columns>
<rows>
<row>
<nextmatch-sortheader label="Subject" id="info_subject"/>
<nextmatch-sortheader label="Priority" align="right" id="info_priority" options="DESC"/>
</row>
<row>
<nextmatch-sortheader label="Description" id="info_des"/>
<nextmatch-sortheader label="Creation" align="right" id="info_id" options="DESC"/>
</row>
</rows>
</grid>
<vbox>
<nextmatch-sortheader label="Startdate" id="info_startdate"/>
<nextmatch-sortheader label="Enddate" id="info_enddate"/>
</vbox>
<vbox>
<nextmatch-accountfilter id="info_owner" options="Owner" statustext="Select to filter by owner"/>
<nextmatch-accountfilter id="info_responsible" options="Responsible" statustext="Select to filter by responsible"/>
</vbox>
<nextmatch-sortheader label="last changed" id="info_datemodified" options="DESC"/>
<description value="Sub"/>
<description value="Action"/>
</row>
<row class="row" valign="top">
<hbox align="center" orient=",5">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
</vbox>
<vbox orient="0,0">
<date-time options=",8" id="${row}[info_startdate]" readonly="true"/>
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
</vbox>
<vbox orient="0,0">
<menulist>
<menupopup type="select-account" id="${row}[info_owner]" readonly="true"/>
</menulist>
<listbox type="select-account" id="${row}[info_responsible]" readonly="true" rows="5"/>
</vbox>
<vbox orient="0,0">
<date-time id="${row}[info_datemodified]" readonly="true"/>
<menulist>
<menupopup type="select-account" id="${row}[info_modifier]" readonly="true"/>
</menulist>
</vbox>
<vbox align="center" orient="0,0">
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
</vbox>
<hbox>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="delete" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry" onclick="return $row_cont[info_anz_subs] || confirm('Delete this entry');"/>
<button image="done.gif" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox>
</row>
</rows>
</grid>
</template>
<template id="infolog.delete" template="" lang="" group="0" version="1.0.1.002">
<grid width="100%" border="0" spacing="0" padding="0">
<columns>
<column/>
</columns>
<rows>
<row>
<description/>
</row>
<row>
<template content="main" align="center" id="infolog.index.rows-noheader"/>
</row>
<row valign="bottom" height="30">
<description class="headertext" value="Are you shure you want to delete this entry ?" align="center"/>
</row>
<row height="50">
<hbox align="center">
<button label="Yes - Delete" id="delete" statustext="Sub-entries become subs of the parent or main entries, if there's no parent"/>
<button label="Yes - Delete including sub-entries" id="delete_subs" statustext="Delete this entry and all listed sub-entries"/>
<button label="No - Cancel" id="cancel" statustext="Abort without deleting"/>
</hbox>
</row>
<row>
<nextmatch options="infolog.index.rows" span="all" id="nm"/>
</row>
</rows>
</grid>
</template>
</overlay>

View File

@ -2,7 +2,7 @@
<!-- $Id$ -->
<overlay>
<template id="infolog.edit.description" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%" height="260" border="0">
<grid width="100%" height="245" border="0">
<columns>
<column width="100"/>
<column/>
@ -13,13 +13,13 @@
</row>
<row class="row" valign="top">
<description/>
<textbox multiline="true" rows="15" cols="80" no_lang="1" id="info_des" statustext="enter a textual description of the log-entry"/>
<textbox multiline="true" rows="14" cols="80" no_lang="1" id="info_des" statustext="enter a textual description of the log-entry"/>
</row>
</rows>
</grid>
</template>
<template id="infolog.edit.links" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%" height="260" overflow="auto">
<grid width="100%" height="245" overflow="auto">
<columns>
<column width="100"/>
<column/>
@ -34,14 +34,14 @@
<row class="th">
<description span="all" value="Existing links"/>
</row>
<row class="row_off" valign="top" height="164">
<row class="row_off" valign="top">
<link-list span="all" id="link_to"/>
</row>
</rows>
</grid>
</template>
<template id="infolog.edit.delegation" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%" height="260">
<grid width="100%" height="245">
<columns>
<column width="100"/>
<column/>
@ -76,7 +76,7 @@
<description options=",,,info_planned_time" value="planned time"/>
<date-duration id="info_planned_time"/>
</row>
<row class="row" valign="top" height="50">
<row class="row" valign="top">
<description options=",,,info_used_time" value="used time"/>
<date-duration id="info_used_time"/>
</row>
@ -84,12 +84,15 @@
</grid>
</template>
<template id="infolog.edit.customfields" template="" lang="" group="0" version="1.0.1.001">
<grid width="100%" height="260" spacing="0" padding="0" overflow="auto">
<grid width="100%" height="245" class="row_on" spacing="0" padding="0" overflow="auto">
<columns>
<column/>
</columns>
<rows>
<row>
<row class="th" height="20">
<description value="Custom fields"/>
</row>
<row height="100%">
<customfields id="customfields"/>
</row>
</rows>
@ -99,12 +102,18 @@
<grid width="100%">
<columns>
<column width="103"/>
<column width="300"/>
<column width="100"/>
<column width="260"/>
<column width="120"/>
<column/>
</columns>
<rows>
<row class="th">
<row disabled="!@msg">
<html span="all" class="redItalic" align="center" id="msg" no_lang="1"/>
<description/>
<description/>
<description/>
</row>
<row class="th" height="28">
<description value="Type" options=",,,info_type"/>
<menulist span="all">
<menupopup id="info_type" onchange="1" statustext="Type of the log-entry: Note, Phonecall or ToDo"/>
@ -118,9 +127,9 @@
</row>
<row class="row">
<description value="Contact" options=",,,info_from"/>
<textbox size="40" maxlength="64" id="info_from" statustext="Custom contact-information, leave emtpy to use information from most recent link" blur="@blur_title"/>
<description value="Phone/Email" options=",,,info_addr"/>
<textbox size="40" maxlength="64" id="info_addr" statustext="Custom contact-address, leave empty to use information from most recent link"/>
<textbox size="35" maxlength="64" id="info_from" statustext="Custom contact-information, leave emtpy to use information from most recent link" blur="@blur_title"/>
<description value="Phone/Email" options=",,,_info_addr"/>
<textbox size="35" maxlength="64" id="info_addr" statustext="Custom contact-address, leave empty to use information from most recent link"/>
</row>
<row class="row">
<description value="Subject" options=",,,info_subject"/>
@ -142,10 +151,10 @@
</tabpanels>
</tabbox>
</row>
<row class="th">
<row class="th" disabled="1">
<description span="all" value="Dates, Status, Access"/>
</row>
<row class="row">
<row class="row_on">
<description value="Startdate" options=",,,info_startdate"/>
<date-time options=",2" id="info_startdate" statustext="when should the ToDo or Phonecall be started, it shows up from that date in the filter open or own open (startpage)"/>
<description value="Enddate" options=",,,info_enddate"/>
@ -173,16 +182,16 @@
</hbox>
</row>
<row>
<button label="Save" id="save" statustext="Saves this entry"/>
<button label="Cancel" id="cancel" statustext="leave without saveing the entry"/>
<hbox span="2">
<button label="Save" id="button[save]" statustext="Saves this entry"/>
<button id="button[apply]" label="Apply" statustext="Apply the changes"/>
<button label="Cancel" id="button[cancel]" statustext="leave without saveing the entry" onclick="window.close();"/>
<html id="js"/>
</hbox>
<description/>
<button label="Delete" align="right" id="delete" statustext="delete this entry"/>
<button label="Delete" align="right" id="button[delete]" statustext="delete this entry" onclick="return $cont[info_anz_subs] || confirm('Delete this entry');"/>
</row>
</rows>
</grid>
<styles>
.headertext { color: black; font-size: 120%; }
.lpadding5 { padding-left: 5px; };
</styles>
</template>
</overlay>

View File

@ -1,14 +1,26 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.0.1.001">
<template id="infolog.index.header_left" template="" lang="" group="0" version="1.0.1.001">
<description class="headertext bold" value="InfoLog"/>
<styles>.bold { font-weight: bold; }</styles>
</template>
<template id="infolog.index.header_right" template="" lang="" group="0" version="1.0.1.001">
<hbox>
<description class="headertext" value="Add:"/>
<button image="task" label="ToDo" id="add[task]" statustext="Add a new ToDo" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=task&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="phone" label="Phonecall" id="add[phone]" statustext="Add a new Phonecall" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=phone&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="note" label="Note" id="add[note]" statustext="Add a new Note" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=note&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
</hbox>
</template>
<template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.0.1.002">
<grid>
<columns>
<column width="5%"/>
<column/>
<column width="8%"/>
<column width="8%"/>
<column width="8%"/>
<column width="12%"/>
<column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</columns>
@ -37,10 +49,10 @@
<row class="row" valign="top">
<hbox align="center" orient="2,2">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<description options="b,@${row}[info_link_view]" value="%s $row_cont[info_addr]" no_lang="1" id="${row}[info_link_title]" statustext="view this linked entry in its application"/>
<link label="%s $row_cont[info_addr]" id="${row}[info_link]"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
@ -62,39 +74,27 @@
</menulist>
</vbox>
<vbox align="center" orient="0,0">
<button image="new.gif" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry"/>
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
</vbox>
<hbox>
<button image="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry"/>
<button image="delete.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/>
<button image="done.gif" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="delete" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry" onclick="return $row_cont[info_anz_subs] || confirm('Delete this entry');"/>
<button image="done" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox>
</row>
</rows>
</grid>
<styles>
.low,.low_done,.normal,.normal_done,.high,.high_done,.urgent,.urgent_done { font-weight: bold; }
.low,.low_done { color:#606060; }
.normal,.normal_done { color:black }
.high { color:#cc0000; }
.high_done { color:#800000; }
.urgent { color:#ff00ff; }
.urgent_done { color:#800080; }
.overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; }
</styles>
</template>
<template id="infolog.index.rows" template="" lang="" group="0" version="1.0.1.002">
<template id="infolog.index.rows" template="" lang="" group="0" version="1.0.1.003">
<grid>
<columns>
<column width="2%"/>
<column/>
<column width="8%"/>
<column width="8%"/>
<column width="9%"/>
<column width="12%"/>
<column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</columns>
@ -116,7 +116,7 @@
</row>
<row>
<nextmatch-sortheader label="Description" id="info_des"/>
<description/>
<nextmatch-sortheader label="Creation" align="right" id="info_id" options="DESC"/>
</row>
</rows>
</grid>
@ -135,10 +135,10 @@
<row class="row" valign="top">
<hbox align="center" orient=",5">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it"/>
<button image="$row_cont[info_status]" ro_image="$row_cont[info_status]" label="$row_cont[info_status]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<description options="b,@${row}[info_link_view]" value="%s $row_cont[info_addr]" no_lang="1" id="${row}[info_link_title]" statustext="view this linked entry in its application"/>
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
@ -160,47 +160,33 @@
</menulist>
</vbox>
<vbox align="center" orient="0,0">
<button image="new.gif" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry"/>
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
</vbox>
<hbox>
<button image="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry"/>
<button image="delete.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button image="delete" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry" onclick="return $row_cont[info_anz_subs] || confirm('Delete this entry');"/>
<button image="done.gif" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox>
</row>
</rows>
</grid>
<styles>
.low,.low_done,.normal,.normal_done,.high,.high_done,.urgent,.urgent_done { font-weight: bold; }
.low,.low_done { color:#606060; }
.normal,.normal_done { color:black }
.high { color:#cc0000; }
.high_done { color:#800000; }
.urgent { color:#ff00ff; }
.urgent_done { color:#800080; }
.overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; }
</styles>
</template>
<template id="infolog.index" template="" lang="" group="0" version="1.0.1.001">
<template id="infolog.index" template="" lang="" group="0" version="1.0.1.002">
<grid width="100%" border="0" spacing="0" padding="0">
<columns>
<column width="95%"/>
<column/>
<column width="90%"/>
<column/>
</columns>
<rows>
<row disabled="!@msg">
<description span="all" class="redItalic" align="center" id="msg" no_lang="1"/>
<description/>
</row>
<row disabled="1">
<description class="headertext" id="appheader"/>
<description class="headertext" value="Add:" align="right"/>
<hbox>
<button image="task" label="ToDo" align="right" id="add[task]" statustext="Add a new ToDo"/>
<button image="phone" label="Phonecall" id="add[phone]" statustext="Add a new Phonecall"/>
<button image="note" label="Note" id="add[note]" statustext="Add a new Note"/>
</hbox>
<template id="infolog.index.header_left"/>
<template id="infolog.index.header_right"/>
</row>
<row disabled="!@main">
<template content="main" span="all" id="infolog.index.rows-noheader"/>
@ -210,14 +196,11 @@
</row>
<row>
<hbox span="all">
<button label="Add" id="add[note]" statustext="Add a new Entry"/>
<button label="Add" id="add[note]" statustext="Add a new Entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=note&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=550,scrollbars=yes,status=yes'); return false;"/>
<button label="Cancel" id="cancel" statustext="Back to main list"/>
</hbox>
</row>
</rows>
</grid>
<styles>
.headertext { color: black; font-size: 120%; }
</styles>
</template>
</overlay>