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 * * eGroupWare - InfoLog Admin-, Preferences- and SideboxMenu-Hooks *
* http://www.eGroupWare.org * * 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 * * 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 * * 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) * Class containing admin, preferences and sidebox-menus (used as hooks)
* *
* @package infolog * @package infolog
* @author RalfBecker-At-outdoor-training.de * @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright GPL - GNU General Public License * @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 class admin_prefs_sidebox_hooks
{ {

View File

@ -2,7 +2,7 @@
/**************************************************************************\ /**************************************************************************\
* eGroupWare - InfoLog * * eGroupWare - InfoLog *
* http://www.egroupware.org * * 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> * * originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> *
* -------------------------------------------- * * -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it * * This program is free software; you can redistribute it and/or modify it *
@ -14,16 +14,16 @@
/* $Id$ */ /* $Id$ */
include_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.soinfolog.inc.php'); 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 * This class is the BO-layer of InfoLog, it also handles xmlrpc requests
* *
* @package infolog * @package infolog
* @author RalfBecker-At-outdoor-training.de * @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright GPL - GNU General Public License * @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 $enums;
var $so; var $so;
@ -70,7 +70,13 @@
*/ */
var $config; 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( $this->enums = $this->stock_enums = array(
'priority' => array ( 'priority' => array (
@ -107,7 +113,12 @@
)); ));
$this->so =& new soinfolog(); $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 =& CreateObject('phpgwapi.config');
$this->config->read_repository(); $this->config->read_repository();
@ -184,19 +195,21 @@
/** /**
* check's if user has the requiered rights on entry $info_id * 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} * @param int $required_rights EGW_ACL_{READ|EDIT|ADD|DELETE}
* @return boolean * @return boolean
*/ */
function check_access( $info_id,$required_rights ) function check_access( $info,$required_rights )
{ {
static $cache = array(); static $cache = array();
$info_id = is_array($info) ? $info['info_id'] : $info;
if (isset($cache[$info_id][$required_rights])) if (isset($cache[$info_id][$required_rights]))
{ {
return $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; return False;
} }
$info['info_link_view'] = $this->link->view($link['link_app'.$nr],$link['link_id'.$nr]); $info['info_link'] = array(
$info['info_link_title'] = !empty($info['info_from']) ? $info['info_from'] : $title; 'app' => $link['link_app'.$nr],
'id' => $link['link_id'.$nr],
'title' => (!empty($info['info_from']) ? $info['info_from'] : $title),
);
//echo " title='$title'</p>\n"; //echo " title='$title'</p>\n";
return $info['blur_title'] = $title; return $info['blur_title'] = $title;
} }
else 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 $info['info_link_id'] = 0; // link might have been deleted
} }
return False; return False;
@ -352,12 +368,13 @@
* *
* checks and asures ACL * 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 $check_defaults=true check and set certain defaults
* @param boolean $touch_modified=true touch the modification data and sets the modiefier's user-id * @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 * @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); //echo "boinfolog::write()values="; _debug_array($values);
// allow to (un)set check_defaults and touch_modified via values, eg. via xmlrpc // allow to (un)set check_defaults and touch_modified via values, eg. via xmlrpc
@ -369,6 +386,7 @@
unset($values[$var]); unset($values[$var]);
} }
} }
// fix old names
foreach($values as $key => $val) foreach($values as $key => $val)
{ {
if ($key[0] != '#' && substr($key,0,5) != 'info_') 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 $set_enddate = !$values['info_enddate'] && // set enddate of finished job, only if its not already set
($values['info_status'] == 'done' || $values['info_status'] == 'billed'); ($values['info_status'] == 'done' || $values['info_status'] == 'billed');
$backup_values = $values; // to return the full values
$values = array( $values = array(
'info_id' => $values['info_id'], 'info_id' => $values['info_id'],
'info_status' => $values['info_status'], 'info_status' => $values['info_status'],
'info_owner' => $values['info_owner'],
'info_datemodified' => $values['info_datemodified'],
); );
if ($set_enddate) if ($set_enddate)
{ {
@ -444,18 +465,21 @@
} }
if ($touch_modified || !$values['info_datemodified']) 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; $values['info_datemodified'] = $this->user_time_now;
} }
if ($touch_modified || !$values['info_modifier']) if ($touch_modified || !$values['info_modifier'])
{ {
$values['info_modifier'] = $this->so->user; $values['info_modifier'] = $this->so->user;
} }
$to_write = $values;
if ($status_only) $values = array_merge($backup_values,$values);
// convert user- to system-time // convert user- to system-time
foreach(array('info_startdate','info_enddate','info_datemodified') as $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) if (!isset($values['info_type']) || $status_only)
{ {
@ -477,10 +501,11 @@
$info_id, 'add', time() $info_id, 'add', time()
); );
} }
$values['info_id'] = $info_id;
// notify the link-class about the update, as other apps may be subscribt to it // notify the link-class about the update, as other apps may be subscribt to it
$this->link->notify_update('infolog',$info_id,$values); $this->link->notify_update('infolog',$info_id,$values);
} }
return $info_id; return $info_id;
} }
@ -537,13 +562,39 @@
return $ret; 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 * get title for an infolog entry identified by $info
* *
* Is called as hook to participate in the linking * Is called as hook to participate in the linking
* *
* @param int/array $info int info_id or array with infolog entry * @param int/array $info int info_id or array with infolog entry
* @param string the title * @return string the title
*/ */
function link_title( $info ) 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 * and for pgSql 7.3 compatibility
* *
* @package infolog * @package infolog
* @author RalfBecker-At-outdoor-training.de * @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright GPL - GNU General Public License * @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 class soinfolog // DB-Layer
{ {
@ -54,24 +55,28 @@
/** /**
* checks if user has the $required_rights to access $info_id (private access is handled too) * checks if user has the $required_rights to access $info_id (private access is handled too)
* *
* @param $info_id Id of InfoLog entry * @param array/int $info data or info_id of InfoLog entry
* @param $required_rights EGW_ACL_xyz anded together * @param int $required_rights EGW_ACL_xyz anded together
* @return boolean True if access is granted else False * @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 change our own internal data,
// dont use new as it changes $phpgw->db // dont use new as it changes $phpgw->db
$private_info = $this; $private_info = $this;
$info = $private_info->read($info_id); $info = $private_info->read($info);
} }
else else
{ {
$info = $this->data; $info = $this->data;
} }
if (!$info || !$info_id) if (!$info)
{ {
return False; 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 * 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 * @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']; $info_id = (int) $values['info_id'];
if (isset($values['info_responsible'])) if (isset($values['info_responsible']))
@ -366,14 +372,20 @@
} }
if (($this->data['info_id'] = $info_id)) 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 else
{ {
if (!isset($to_write['info_id_parent'])) $to_write['info_id_parent'] = 0; // must not be null 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->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); //echo "<p>soinfolog.write values= "; _debug_array($values);
@ -401,6 +413,8 @@
/** /**
* count the sub-entries of $info_id * 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 * @param $info_id id of log-entry
* @return int the number of sub-entries * @return int the number of sub-entries
*/ */
@ -423,6 +437,8 @@
/** /**
* searches InfoLog for a certain pattern in $query * 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[order] column-name to sort after
* @param $query[sort] sort-order DESC or ASC * @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 '' * @param $query[filter] string with combination of acl-, date- and status-filters, eg. 'own-open-today' or ''
@ -450,7 +466,7 @@
if (count($links)) 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']))) 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 = trim($val);
$val = (substr($val,0,5) != 'info_' ? 'info_' : '').$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; $order[] = $val;
} }
@ -472,7 +490,7 @@
{ {
$ordermethod = 'ORDER BY info_datemodified DESC'; // newest first $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->statusFilter($query['filter']);
$filtermethod .= $this->dateFilter($query['filter']); $filtermethod .= $this->dateFilter($query['filter']);
@ -509,24 +527,20 @@
$cats = $GLOBALS['egw']->categories->return_all_children((int)$query['cat_id']); $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']); $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['query']) $query['search'] = $query['query']; // allow both names
if ($query['search']) // we search in _from, _subject, _des and _extra_value for $query if ($query['search']) // we search in _from, _subject, _des and _extra_value for $query
{ {
$pattern = $this->db->quote('%'.$query['search'].'%'); $pattern = $this->db->quote('%'.$query['search'].'%');
$columns = array('info_from','info_subject','info_extra_value'); $columns = array('info_from','info_subject','info_extra_value');
switch($this->db->Type) // 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';
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';
}
$sql_query = 'AND ('.implode(" LIKE $pattern OR ",$columns)." LIKE $pattern) "; $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); $pid = 'AND info_id_parent='.($action == 'sp' ? $query['action_id'] : 0);
@ -538,26 +552,20 @@
$ids = array( ); $ids = array( );
if ($action == '' || $action == 'sp' || count($links)) if ($action == '' || $action == 'sp' || count($links))
{ {
$sql_query = "FROM $this->info_table $join WHERE ($filtermethod $pid $sql_query) $link_extra"; $sql_query = "FROM $this->info_table main $join WHERE ($filtermethod $pid $sql_query) $link_extra";
switch($this->db->Type)
{ $this->db->query($sql="SELECT $distinct main.info_id ".$sql_query,__LINE__,__FILE__);
// 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__);
$query['total'] = $this->db->num_rows(); $query['total'] = $this->db->num_rows();
if (!$query['start'] || $query['start'] > $query['total']) if (!$query['start'] || $query['start'] > $query['total'])
{ {
$query['start'] = 0; $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"; //echo "<p>sql='$sql'</p>\n";
while (($info =& $this->db->row(true))) while (($info =& $this->db->row(true)))
{ {

View File

@ -1,8 +1,8 @@
<?php <?php
/**************************************************************************\ /**************************************************************************\
* eGroupWare - InfoLog: Custom fields, typ and status * * eGroupWare - InfoLog: Administration of custom fields, type and status *
* http://www.egroupware.org * * 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 * * 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 * * under the terms of the GNU General Public License as published by the *
@ -12,6 +12,14 @@
/* $Id$ */ /* $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 class uicustomfields
{ {
var $public_functions = array var $public_functions = array
@ -30,12 +38,11 @@
} }
/** /**
* @author ralfbecker
* Edit/Create an InfoLog Custom fields, typ and status * 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'); $GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Custom fields, typ and status');
if (is_array($content)) if (is_array($content))

View File

@ -1,8 +1,8 @@
<?php <?php
/**************************************************************************\ /**************************************************************************\
* eGroupWare - InfoLog * * eGroupWare - InfoLog *
* http://www.egroupware.org * * http://www.egroupware.org *
* Written by Ralf Becker <RalfBecker@outdoor-training.de> * * Written and copyright by Ralf Becker <RalfBecker@outdoor-training.de> *
* originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> * * originaly based on todo written by Joseph Engo <jengo@phpgroupware.org> *
* -------------------------------------------- * * -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it * * 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 * This class is the UI-layer (user interface) of InfoLog
* *
* @package infolog * @package infolog
* @author RalfBecker-At-outdoor-training.de * @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright GPL - GNU General Public License * @copyright (c) by Ralf Becker <RalfBecker@outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/ */
class uiinfolog class uiinfolog
{ {
@ -68,10 +69,10 @@
$this->filters = array( $this->filters = array(
'none' => 'no Filter', 'none' => 'no Filter',
'done' => 'done', 'done' => 'done',
'my' => 'my', 'my' => 'responsible',
'my-open-today' => 'my open', 'my-open-today' => 'responsible open',
'my-open-overdue' => 'my overdue', 'my-open-overdue' => 'responsible overdue',
'my-upcoming' => 'my upcoming', 'my-upcoming' => 'responsible upcoming',
'own' => 'own', 'own' => 'own',
'own-open-today' => 'own open', 'own-open-today' => 'own open',
'own-open-overdue' => 'own overdue', 'own-open-overdue' => 'own overdue',
@ -91,7 +92,7 @@
$this->link = &$this->bo->link; $this->link = &$this->bo->link;
$this->tmpl =& CreateObject('etemplate.etemplate'); $this->tmpl =& CreateObject('etemplate.etemplate');
$this->html = &$this->tmpl->html; $this->html =& $this->tmpl->html;
$this->user = $GLOBALS['egw_info']['user']['account_id']; $this->user = $GLOBALS['egw_info']['user']['account_id'];
@ -111,14 +112,14 @@
{ {
$info['end_class'] = 'overdue'; $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 $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["edit[$id]"] = !$this->bo->check_access($info,EGW_ACL_EDIT);
$readonlys["close[$id]"] = $done || ($readonlys["edit_status[$id]"] = !($this->bo->check_access($id,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']))); in_array($this->user, (array)$info['info_responsible'])));
$readonlys["delete[$id]"] = !$this->bo->check_access($id,EGW_ACL_DELETE); $readonlys["delete[$id]"] = !$this->bo->check_access($info,EGW_ACL_DELETE);
$readonlys["sp[$id]"] = !$this->bo->check_access($id,EGW_ACL_ADD); $readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD);
$readonlys["view[$id]"] = $info['info_anz_subs'] < 1; $readonlys["view[$id]"] = $info['info_anz_subs'] < 1;
$readonlys['view[0]'] = True; // no parent $readonlys['view[0]'] = True; // no parent
@ -190,24 +191,49 @@
} }
$rows[] = $info; $rows[] = $info;
} }
if ($query['no_actions']) $rows['no_actions'] = true;
//echo "<p>readonlys = "; _debug_array($readonlys); //echo "<p>readonlys = "; _debug_array($readonlys);
//echo "rows=<pre>".print_r($rows,True)."</pre>\n"; //echo "rows=<pre>".print_r($rows,True)."</pre>\n";
return $query['total']; 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)) if (is_array($values))
{ {
$referer = $values['referer']; $called_as = $values['called_as'];
$own_referer = $values['own_referer']; $own_referer = $values['own_referer'];
} }
elseif ($own_referer !== '') elseif ($own_referer === '')
{ {
$own_referer = $GLOBALS['egw']->common->get_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)) if (!is_array($values))
{ {
$values = array('nm' => $this->read_sessiondata()); $values = array('nm' => $this->read_sessiondata());
@ -221,11 +247,9 @@
$values['nm']['order'] = 'info_datemodified'; $values['nm']['order'] = 'info_datemodified';
$values['nm']['sort'] = 'DESC'; $values['nm']['sort'] = 'DESC';
} }
} $values['msg'] = $_GET['msg'];
if ($action == '') $values['action'] = $action;
{ $values['action_id'] = $action_id;
$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'));
} }
if ($values['nm']['add']) if ($values['nm']['add'])
{ {
@ -237,7 +261,7 @@
if ($values['add']) if ($values['add'])
{ {
list($type) = each($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) 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,$do_id) = isset($values['main']) ? each($values['main']) : @each($values['nm']['rows']);
list($do_id) = @each($do_id); 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) switch($do)
{ {
case 'edit': case 'edit':
case 'edit_status': case 'edit_status':
return $this->edit($do_id,$action,$action_id,'',$referer); return $this->edit($do_id,$action,$action_id,'',$called_as);
case 'delete': case 'delete':
return $this->delete($do_id,$referer); if (!($values['msg'] = $this->delete($do_id,$called_as,'index'))) return;
break;
case 'close': case 'close':
return $this->close($do_id,$referer); return $this->close($do_id,$called_as);
case 'sp': case 'sp':
return $this->edit(0,'sp',$do_id,'',$referer); return $this->edit(0,'sp',$do_id,'',$called_as);
case 'view': case 'view':
$value = array(); $value = array();
$action = 'sp'; $action = 'sp';
@ -301,7 +326,7 @@
$GLOBALS['egw_info']['user']['preferences']['infolog']['never_hide'] : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15; $GLOBALS['egw_info']['user']['preferences']['infolog']['never_hide'] : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15;
$persist['action'] = $values['nm']['action'] = $action; $persist['action'] = $values['nm']['action'] = $action;
$persist['action_id'] = $values['nm']['action_id'] = $action_id; $persist['action_id'] = $values['nm']['action_id'] = $action_id;
$persist['referer'] = $referer; $persist['called_as'] = $called_as;
$persist['own_referer'] = $own_referer; $persist['own_referer'] = $own_referer;
$all_stati = array(); $all_stati = array();
@ -325,24 +350,44 @@
if ($info_id) if ($info_id)
{ {
$this->bo->write(array( $values = array(
'info_id' => $info_id, 'info_id' => $info_id,
'info_status' => 'done', 'info_status' => 'done',
)); );
$this->bo->write($values);
} }
return $referer ? $this->tmpl->location($referer) : $this->index(); 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'])); $info_id = (int) (is_array($values) ? $values['info_id'] : ($values ? $values : $_GET['info_id']));
$referer = is_array($values) ? $values['referer'] : $referer; $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 (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(); return $referer ? $this->tmpl->location($referer) : $this->index();
} }
@ -351,16 +396,27 @@
$this->tmpl->read('infolog.delete'); $this->tmpl->read('infolog.delete');
$values['main']['no_actions'] = True; $values['nm'] = array(
$values['remove_subs'] = $this->bo->anzSubs($info_id) > 0; '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['info_id'] = $info_id;
$persist['referer'] = $referer; $persist['referer'] = $referer;
$persist['info_id_parent'] = $values['main'][1]['info_id_parent']; $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']['app_header'] = lang('InfoLog').' - '.lang('Delete');
$GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => 'ManualInfologDelete'); $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 = $content['action'];
$action_id = $content['action_id']; $action_id = $content['action_id'];
$referer = $content['referer']; $referer = $content['referer'];
$no_popup = $content['no_popup'];
$caller = $content['caller'];
if (isset($content['link_to']['primary'])) if (isset($content['link_to']['primary']))
{ {
$content['info_link_id'] = $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))) 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']); $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']; $first_link_to = $content['link_to']['to_id'];
$content['info_link_id'] = 0; // as field has to be int 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( $content['msg'] = $info_id !== 0 || !$content['info_id'] ? lang('Error: saving the entry') :
'info_id' => $content['info_id'], lang('Error: the entry has been updated since you opened it for editing!').'<br />'.
'info_status' => $content['info_status'] 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) if ($info_link_id)
{ {
list($app,$id) = explode(':',$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']; $content['info_link_id'] = $link['link_id'];
$this->bo->write(array( $to_write = array(
'info_id' => $content['info_id'], 'info_id' => $content['info_id'],
'info_link_id' => $content['info_link_id'], 'info_link_id' => $content['info_link_id'],
'info_from' => $content['info_from'] 'info_from' => $content['info_from'],
),False); '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( if (!$referer && $action) $referer = array(
'menuaction' => 'infolog.uiinfolog.index', 'menuaction' => 'infolog.uiinfolog.index',
'action' => $action, 'action' => $action,
'action_id' => $action_id '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 else
@ -449,7 +543,10 @@
$action_id = $action_id ? $action_id : get_var('action_id',array('POST','GET')); $action_id = $action_id ? $action_id : get_var('action_id',array('POST','GET'));
$info_id = $content ? $content : get_var('info_id', array('POST','GET')); $info_id = $content ? $content : get_var('info_id', array('POST','GET'));
$type = $type ? $type : get_var('type', 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"; //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 ); $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 ($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; $content['status_only'] = True;
foreach($content as $name => $value) foreach($content as $name => $value)
@ -509,9 +606,18 @@
$readonlys['#'.$name] = true; $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 case 'new': // new entry
$content['info_startdate'] = (int) $_GET['startdate'] ? (int) $_GET['startdate'] : $today; $content['info_startdate'] = (int) $_GET['startdate'] ? (int) $_GET['startdate'] : $today;
$content['info_priority'] = 1; // normal $content['info_priority'] = 1; // normal
$content['info_owner'] = $this->user;
if ($type != '') if ($type != '')
{ {
$content['info_type'] = $type; $content['info_type'] = $type;
@ -564,8 +671,10 @@
$content['info_type'] = 'note'; $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')]); $GLOBALS['egw_info']['flags']['app_header'] = lang($this->messages[$info_id ? 'edit' : ($action == 'sp' ? 'add_sub' : 'add')]);
$this->tmpl->read('infolog.edit'); $this->tmpl->read('infolog.edit');
@ -576,27 +685,30 @@
} }
else 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').' - '. $GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.
($content['status_only'] ? lang('Edit Status') : lang('Edit')); ($content['status_only'] ? lang('Edit Status') : lang('Edit'));
$GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => ($info_id ? 'ManualInfologEdit' : 'ManualInfologAdd')); $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); //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( $this->tmpl->exec('infolog.uiinfolog.edit',$content,array(
'info_type' => $this->bo->enums['type'], 'info_type' => $this->bo->enums['type'],
'info_priority' => $this->bo->enums['priority'], 'info_priority' => $this->bo->enums['priority'],
'info_confirm' => $this->bo->enums['confirm'], 'info_confirm' => $this->bo->enums['confirm'],
'info_status' => $this->bo->status[$content['info_type']] 'info_status' => $this->bo->status[$content['info_type']]
),$readonlys,array( ),$readonlys,array( // preserved values
'info_id' => $info_id, 'info_id' => $info_id,
'info_id_parent' => $content['info_id_parent'], 'info_id_parent'=> $content['info_id_parent'],
'info_link_id' => $content['info_link_id'], 'info_link_id' => $content['info_link_id'],
'action' => $action, 'info_owner' => $content['info_owner'],
'action_id' => $action_id, 'info_datemodified' => $content['info_datemodified'],
'referer' => $referer, 'info_modifier' => $content['info_modifier'],
'link_to' => array('to_id' => $content['link_to']['to_id']) // in case tab gets not viewed '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') 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 infolog de alle
all links and attachments infolog de alle Verknüpfungen und Anhänge 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) 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 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 a file infolog de Datei anhängen
attach 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 main list infolog de Zurück zur Gesamtliste
back to projectlist infolog de Zurück zur Gesamtliste
billed infolog de abgerechnet billed infolog de abgerechnet
both infolog de Annahme+erledigt both infolog de Annahme+erledigt
call infolog de anrufen call infolog de anrufen
@ -52,10 +50,12 @@ comment infolog de Kommentar
configuration infolog de Konfiguration configuration infolog de Konfiguration
confirm infolog de Bestätigung confirm infolog de Bestätigung
contact infolog de Kontakt 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 create new links infolog de Neue Verknüpfung erzeugen
creates a new field infolog de erstellt ein neues Feld 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 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 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-fieldname infolog de CSV-Feldname
csv-filename infolog de CSV-Dateiname csv-filename infolog de CSV-Dateiname
csv-import common de CSV-Import 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 default status for a new log entry infolog de Vorgabe für den Status eines neuen Eintrags
delegation infolog de Delegation delegation infolog de Delegation
delete infolog de Löschen 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 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 the entry infolog de Eintrag löschen
delete this entry infolog de diesen 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 the selected typ infolog de löscht den ausgewählten Typ
deletes this field infolog de löscht dieses Feld deletes this field infolog de löscht dieses Feld
deletes this status infolog de löscht diesen Status deletes this status infolog de löscht diesen Status
description infolog de Beschreibung 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 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 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 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 done infolog de erledigt
download infolog de Datei laden download infolog de Datei laden
duration infolog de Dauer 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 infolog de Bearbeiten
edit or create categories for ingolog infolog de Kategorien für InfoLog bearbeiten oder neu anlegen edit or create categories for ingolog infolog de Kategorien für InfoLog bearbeiten oder neu anlegen
edit status infolog de Status ändern 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 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 enter the query pattern infolog de geben Sie ein Suchmuster ein
entry and all files infolog de Eintrag und alle Dateien 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 existing links infolog de Bestehende Verknüpfungen
fax infolog de Fax fax infolog de Fax
fieldseparator infolog de Feldbegrenzer 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 infolog de InfoLog - Anlegen
infolog - new subproject infolog de InfoLog - Anlegen Teilprojekt infolog - new subproject infolog de InfoLog - Anlegen Teilprojekt
infolog - subprojects from infolog de InfoLog - Teilprojekte von 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 list infolog de InfoLog Liste
infolog preferences common de InfoLog Einstellungen infolog preferences common de InfoLog Einstellungen
infolog-fieldname infolog de InfoLog-Feldname infolog-fieldname infolog de InfoLog-Feldname
@ -141,10 +144,6 @@ longer textual description infolog de l
low infolog de niedrig 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 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 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 must not be empty !!! infolog de Name darf nicht leer sein !!!
name of new type to create infolog de Name des neu anzulegenden Types 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 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 not assigned infolog de nicht zugewiesen
note infolog de Notiz note infolog de Notiz
number of records to read (%1) infolog de Anzahl Datensätze lesen (%1) 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 offer infolog de Angebot
ongoing infolog de in Arbeit ongoing infolog de in Arbeit
only the attachments infolog de nur die Anhänge only the attachments infolog de nur die Anhänge
@ -173,12 +172,13 @@ order infolog de Reihenfolge
overdue infolog de überfällig overdue infolog de überfällig
own infolog de eigene own infolog de eigene
own open infolog de eigene offen 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 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 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!!! 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 addressbook infolog de Muster für Suche im Adressbuch
pattern for search in projects infolog de Muster für Suche des Projekts pattern for search in projects infolog de Muster für Suche des Projekts
permission denied infolog de Zugriff verweigert
phone infolog de Anruf phone infolog de Anruf
phone/email infolog de Telefon/Email phone/email infolog de Telefon/Email
phonecall infolog de Telefonanruf 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\. 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 remark infolog de Bemerkung
remove this link (not the entry itself) infolog de Diese Verknüpfung lösen (nicht den Eintrag selbst) 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 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. returns a list / search for records. infolog de Liefert eine Liste von / sucht nach Datensätzen.
save infolog de Speichern save infolog de Speichern
@ -202,7 +204,7 @@ search for: infolog de Suchen nach:
select infolog de Auswählen select infolog de Auswählen
select a category for this entry infolog de eine Kategorie für diesen Eintrag 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 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 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 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 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
status ... infolog de Status ... status ... infolog de Status ...
sub infolog de Unter-<br>einträge 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 subject infolog de Titel
task infolog de Aufgabe 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) 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 upcoming infolog de zukünftig
urgency infolog de Priorität urgency infolog de Priorität
urgent infolog de Dringend 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 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:\ 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 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 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. 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 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 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 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 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 infolog en All
all links and attachments infolog en all links and attachments 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) 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 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 a file infolog en Attach a file
attach file infolog en Attach file attach file infolog en Attach file
back to main list infolog en Back to main list back to main list infolog en Back to main list
back to projectlist infolog en Back to Projectlist
billed infolog en billed billed infolog en billed
both infolog en both both infolog en both
call infolog en call call infolog en call
@ -52,10 +50,12 @@ comment infolog en Comment
configuration infolog en Configuration configuration infolog en Configuration
confirm infolog en Confirm confirm infolog en Confirm
contact infolog en Contact 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 create new links infolog en Create new links
creates a new field infolog en creates a new field 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 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 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-fieldname infolog en CSV-Fieldname
csv-filename infolog en CSV-Filename csv-filename infolog en CSV-Filename
csv-import common en CSV-Import 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 default status for a new log entry infolog en default status for a new log entry
delegation infolog en Delegation delegation infolog en Delegation
delete infolog en Delete 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 one record by passing its id. infolog en Delete one record by passing its id.
delete the entry infolog en Delete the entry delete the entry infolog en Delete the entry
delete this entry infolog en delete this 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 the selected typ infolog en deletes the selected type
deletes this field infolog en deletes this field deletes this field infolog en deletes this field
deletes this status infolog en deletes this status deletes this status infolog en deletes this status
description infolog en Description 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 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 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 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 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 enter the query pattern infolog en Enter the query pattern
entry and all files infolog en Entry and all files 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 existing links infolog en Existing links
fax infolog en Fax fax infolog en Fax
fieldseparator infolog en Fieldseparator 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 infolog en InfoLog - New
infolog - new subproject infolog en InfoLog - New Subproject infolog - new subproject infolog en InfoLog - New Subproject
infolog - subprojects from infolog en InfoLog - Subprojects from 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 list infolog en InfoLog list
infolog preferences common en InfoLog preferences infolog preferences common en InfoLog preferences
infolog-fieldname infolog en Info Log-Fieldname infolog-fieldname infolog en Info Log-Fieldname
@ -141,10 +144,6 @@ longer textual description infolog en longer textual description
low infolog en low 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 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 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 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 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 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!!! 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 addressbook infolog en pattern for search in Addressbook
pattern for search in projects infolog en pattern for search in Projects pattern for search in projects infolog en pattern for search in Projects
permission denied infolog en Permission denied
phone infolog en Phone Call phone infolog en Phone Call
phone/email infolog en Phone/Email phone/email infolog en Phone/Email
phonecall infolog en Phone Call 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\. 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 remark infolog en Remark
remove this link (not the entry itself) infolog en Remove this link (not the entry itself) 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 responsible user, priority, times infolog en responsible user, priority, times
returns a list / search for records. infolog en Returns a list / search for records. returns a list / search for records. infolog en Returns a list / search for records.
save infolog en Save save infolog en Save
@ -226,6 +228,7 @@ startrecord infolog en Startrecord
status infolog en Status status infolog en Status
status ... infolog en Status ... status ... infolog en Status ...
sub infolog en Sub 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 subject infolog en Subject
task infolog en ToDo 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) 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 upcoming infolog en upcoming
urgency infolog en urgency urgency infolog en urgency
urgent infolog en urgent 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 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:\ 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 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 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. 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 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 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 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 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_events'] = 'infolog.boinfolog.cal_to_include';
$setup_info['infolog']['hooks']['calendar_include_todos'] = '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']['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 */ /* Dependencies for this app to work */
$setup_info['infolog']['depends'][] = array( $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"?> <?xml version="1.0"?>
<!-- $Id$ --> <!-- $Id$ -->
<overlay> <overlay>
<grid id="infolog.index.rows-noheader" template="" lang="" group="0" version="0.9.15.003"> <template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.0.1.002">
<columns> <grid>
<column width="5%"/> <columns>
<column/> <column width="5%"/>
<column width="8%"/> <column/>
<column width="8%"/> <column width="8%"/>
<column width="8%"/> <column width="8%"/>
<column width="3%" disabled="@no_actions"/> <column width="12%"/>
<column width="3%" disabled="@no_actions"/> <column width="3%" disabled="@no_actions"/>
</columns> <column width="3%" disabled="@no_actions"/>
<rows> </columns>
<row class="th"> <rows>
<vbox> <row class="th">
<description value="Type"/> <vbox>
<description value="Status"/> <description value="Type"/>
</vbox> <description value="Status"/>
<vbox> </vbox>
<description value="Subject"/> <vbox>
<description value="Description"/> <description value="Subject"/>
</vbox> <description value="Description"/>
<vbox> </vbox>
<description value="Startdate"/> <vbox>
<description value="Enddate"/> <description value="Startdate"/>
</vbox> <description value="Enddate"/>
<vbox> </vbox>
<description value="Owner"/> <vbox>
<description value="Responsible"/> <description value="Owner"/>
</vbox> <description value="Responsible"/>
<description value="last changed"/> </vbox>
<description value="Sub"/> <description value="last changed"/>
<description value="Action"/> <description value="Sub"/>
</row> <description value="Action"/>
<row class="row" valign="top"> </row>
<hbox options="2,2" align="center"> <row class="row" valign="top">
<image label="$row_cont[info_type]" src="${row}[info_type]"/> <hbox align="center" orient="2,2">
<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"/> <image label="$row_cont[info_type]" src="${row}[info_type]"/>
</hbox> <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;"/>
<vbox options="0,0"> </hbox>
<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"/> <vbox orient="0,0">
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/> <link label="%s $row_cont[info_addr]" id="${row}[info_link]"/>
<description no_lang="1" id="${row}[info_des]"/> <description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<link-string id="${row}[filelinks]"/> <description options=",,1" no_lang="1" id="${row}[info_des]"/>
</vbox> <link-string id="${row}[filelinks]"/>
<vbox options="0,0"> </vbox>
<date id="${row}[info_startdate]" readonly="true"/> <vbox orient="0,0">
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/> <date id="${row}[info_startdate]" readonly="true"/>
</vbox> <date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
<vbox options="0,0"> </vbox>
<menulist> <vbox orient="0,0">
<menupopup type="select-account" id="${row}[info_owner]" readonly="true"/> <menulist>
</menulist> <menupopup type="select-account" id="${row}[info_owner]" readonly="true"/>
<menulist> </menulist>
<menupopup type="select-account" id="${row}[info_responsible]" readonly="true"/> <listbox type="select-account" id="${row}[info_responsible]" readonly="true" rows="5"/>
</menulist> </vbox>
</vbox> <vbox orient="0,0">
<vbox options="0,0"> <date-time id="${row}[info_datemodified]" readonly="true"/>
<date-time id="${row}[info_datemodified]" readonly="true"/> <menulist>
<menulist> <menupopup type="select-account" id="${row}[info_modifier]" readonly="true"/>
<menupopup type="select-account" id="${row}[info_modifier]" readonly="true"/> </menulist>
</menulist> </vbox>
</vbox> <vbox align="center" orient="0,0">
<vbox options="0,0" align="center"> <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="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="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"/>
<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>
</vbox> <hbox>
<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="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry"/> <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="delete.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/> <button image="done" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
<button image="addfile.gif" label="Add file" id="file[$row_cont[info_id]]" disabled="true" statustext="Attach a file"/> </hbox>
</hbox> </row>
</row> </rows>
</rows> </grid>
<styles> </template>
.low,.low_done,.normal,.normal_done,.high,.high_done,.urgent,.urgent_done { font-weight: bold; } <template id="infolog.index.rows" template="" lang="" group="0" version="1.0.1.003">
.low,.low_done { color:#606060; } <grid>
.normal,.normal_done { color:black } <columns>
.high { color:#cc0000; } <column width="2%"/>
.high_done { color:#800000; } <column/>
.urgent { color:#ff00ff; } <column width="8%"/>
.urgent_done { color:#800080; } <column width="8%"/>
.overdue { color:#cc0000; font-weight:bold; } <column width="12%"/>
.private { font-style:italic; } <column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/>
</styles> </columns>
</grid> <rows>
<grid id="infolog.delete" template="" lang="" group="" version="0.9.15.003" width="100%" border="0" spacing="0" padding="0"> <row class="th">
<columns> <vbox orient="0,0">
<column/> <nextmatch-filterheader options="Type ..." id="info_type"/>
</columns> <nextmatch-filterheader options="Status ..." id="info_status"/>
<rows> </vbox>
<row> <grid width="100%" spacing="0" padding="0">
<description/> <columns>
</row> <column/>
<row> <column/>
<grid content="main" align="center" id="infolog.index.rows-noheader"/> </columns>
</row> <rows>
<row valign="bottom" height="50"> <row>
<description class="headertext" value="Are you shure you want to delete this entry ?" align="center"/> <nextmatch-sortheader label="Subject" id="info_subject"/>
</row> <nextmatch-sortheader label="Priority" align="right" id="info_priority" options="DESC"/>
<row height="50" disabled="!@remove_subs"> </row>
<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> <nextmatch-sortheader label="Description" id="info_des"/>
<row> <nextmatch-sortheader label="Creation" align="right" id="info_id" options="DESC"/>
<hbox options="20" align="center"> </row>
<button label="Yes - Delete" align="right" id="delete" statustext="Delete the entry"/> </rows>
<button label="No - Cancel" id="cancel" statustext="Abort without deleting"/> </grid>
</hbox> <vbox>
</row> <nextmatch-sortheader label="Startdate" id="info_startdate"/>
</rows> <nextmatch-sortheader label="Enddate" id="info_enddate"/>
<styles> </vbox>
.headertext { color: black; font-size: 120%; } <vbox>
</styles> <nextmatch-accountfilter id="info_owner" options="Owner" statustext="Select to filter by owner"/>
</grid> <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> </overlay>

View File

@ -2,7 +2,7 @@
<!-- $Id$ --> <!-- $Id$ -->
<overlay> <overlay>
<template id="infolog.edit.description" template="" lang="" group="0" version="1.0.1.001"> <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> <columns>
<column width="100"/> <column width="100"/>
<column/> <column/>
@ -13,13 +13,13 @@
</row> </row>
<row class="row" valign="top"> <row class="row" valign="top">
<description/> <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> </row>
</rows> </rows>
</grid> </grid>
</template> </template>
<template id="infolog.edit.links" template="" lang="" group="0" version="1.0.1.001"> <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> <columns>
<column width="100"/> <column width="100"/>
<column/> <column/>
@ -34,14 +34,14 @@
<row class="th"> <row class="th">
<description span="all" value="Existing links"/> <description span="all" value="Existing links"/>
</row> </row>
<row class="row_off" valign="top" height="164"> <row class="row_off" valign="top">
<link-list span="all" id="link_to"/> <link-list span="all" id="link_to"/>
</row> </row>
</rows> </rows>
</grid> </grid>
</template> </template>
<template id="infolog.edit.delegation" template="" lang="" group="0" version="1.0.1.001"> <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> <columns>
<column width="100"/> <column width="100"/>
<column/> <column/>
@ -76,7 +76,7 @@
<description options=",,,info_planned_time" value="planned time"/> <description options=",,,info_planned_time" value="planned time"/>
<date-duration id="info_planned_time"/> <date-duration id="info_planned_time"/>
</row> </row>
<row class="row" valign="top" height="50"> <row class="row" valign="top">
<description options=",,,info_used_time" value="used time"/> <description options=",,,info_used_time" value="used time"/>
<date-duration id="info_used_time"/> <date-duration id="info_used_time"/>
</row> </row>
@ -84,12 +84,15 @@
</grid> </grid>
</template> </template>
<template id="infolog.edit.customfields" template="" lang="" group="0" version="1.0.1.001"> <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> <columns>
<column/> <column/>
</columns> </columns>
<rows> <rows>
<row> <row class="th" height="20">
<description value="Custom fields"/>
</row>
<row height="100%">
<customfields id="customfields"/> <customfields id="customfields"/>
</row> </row>
</rows> </rows>
@ -99,12 +102,18 @@
<grid width="100%"> <grid width="100%">
<columns> <columns>
<column width="103"/> <column width="103"/>
<column width="300"/> <column width="260"/>
<column width="100"/> <column width="120"/>
<column/> <column/>
</columns> </columns>
<rows> <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"/> <description value="Type" options=",,,info_type"/>
<menulist span="all"> <menulist span="all">
<menupopup id="info_type" onchange="1" statustext="Type of the log-entry: Note, Phonecall or ToDo"/> <menupopup id="info_type" onchange="1" statustext="Type of the log-entry: Note, Phonecall or ToDo"/>
@ -118,9 +127,9 @@
</row> </row>
<row class="row"> <row class="row">
<description value="Contact" options=",,,info_from"/> <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"/> <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"/> <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_addr" statustext="Custom contact-address, leave empty to use information from most recent link"/>
</row> </row>
<row class="row"> <row class="row">
<description value="Subject" options=",,,info_subject"/> <description value="Subject" options=",,,info_subject"/>
@ -142,10 +151,10 @@
</tabpanels> </tabpanels>
</tabbox> </tabbox>
</row> </row>
<row class="th"> <row class="th" disabled="1">
<description span="all" value="Dates, Status, Access"/> <description span="all" value="Dates, Status, Access"/>
</row> </row>
<row class="row"> <row class="row_on">
<description value="Startdate" options=",,,info_startdate"/> <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)"/> <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"/> <description value="Enddate" options=",,,info_enddate"/>
@ -173,16 +182,16 @@
</hbox> </hbox>
</row> </row>
<row> <row>
<button label="Save" id="save" statustext="Saves this entry"/> <hbox span="2">
<button label="Cancel" id="cancel" statustext="leave without saveing the entry"/> <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/> <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> </row>
</rows> </rows>
</grid> </grid>
<styles>
.headertext { color: black; font-size: 120%; }
.lpadding5 { padding-left: 5px; };
</styles>
</template> </template>
</overlay> </overlay>

View File

@ -1,14 +1,26 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- $Id$ --> <!-- $Id$ -->
<overlay> <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> <grid>
<columns> <columns>
<column width="5%"/> <column width="5%"/>
<column/> <column/>
<column width="8%"/> <column width="8%"/>
<column width="8%"/> <column width="8%"/>
<column width="8%"/> <column width="12%"/>
<column width="3%" disabled="@no_actions"/> <column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/> <column width="3%" disabled="@no_actions"/>
</columns> </columns>
@ -37,10 +49,10 @@
<row class="row" valign="top"> <row class="row" valign="top">
<hbox align="center" orient="2,2"> <hbox align="center" orient="2,2">
<image label="$row_cont[info_type]" src="${row}[info_type]"/> <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> </hbox>
<vbox orient="0,0"> <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 class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/> <description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/> <link-string id="${row}[filelinks]"/>
@ -62,39 +74,27 @@
</menulist> </menulist>
</vbox> </vbox>
<vbox align="center" orient="0,0"> <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="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"/> <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> </vbox>
<hbox> <hbox>
<button image="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit 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.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/> <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"/> <button image="done" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox> </hbox>
</row> </row>
</rows> </rows>
</grid> </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>
<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> <grid>
<columns> <columns>
<column width="2%"/> <column width="2%"/>
<column/> <column/>
<column width="8%"/> <column width="8%"/>
<column width="8%"/> <column width="8%"/>
<column width="9%"/> <column width="12%"/>
<column width="3%" disabled="@no_actions"/> <column width="3%" disabled="@no_actions"/>
<column width="3%" disabled="@no_actions"/> <column width="3%" disabled="@no_actions"/>
</columns> </columns>
@ -116,7 +116,7 @@
</row> </row>
<row> <row>
<nextmatch-sortheader label="Description" id="info_des"/> <nextmatch-sortheader label="Description" id="info_des"/>
<description/> <nextmatch-sortheader label="Creation" align="right" id="info_id" options="DESC"/>
</row> </row>
</rows> </rows>
</grid> </grid>
@ -135,10 +135,10 @@
<row class="row" valign="top"> <row class="row" valign="top">
<hbox align="center" orient=",5"> <hbox align="center" orient=",5">
<image label="$row_cont[info_type]" src="${row}[info_type]"/> <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> </hbox>
<vbox orient="0,0"> <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 class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description options=",,1" no_lang="1" id="${row}[info_des]"/> <description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/> <link-string id="${row}[filelinks]"/>
@ -160,47 +160,33 @@
</menulist> </menulist>
</vbox> </vbox>
<vbox align="center" orient="0,0"> <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="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"/> <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> </vbox>
<hbox> <hbox>
<button image="edit.gif" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit 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.gif" label="Delete" id="delete[$row_cont[info_id]]" statustext="Delete this entry"/> <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"/> <button image="done.gif" label="Close" id="close[$row_cont[info_id]]" statustext="Sets the status of this entry to done"/>
</hbox> </hbox>
</row> </row>
</rows> </rows>
</grid> </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>
<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"> <grid width="100%" border="0" spacing="0" padding="0">
<columns> <columns>
<column width="95%"/> <column width="90%"/>
<column/>
<column/> <column/>
</columns> </columns>
<rows> <rows>
<row disabled="!@msg">
<description span="all" class="redItalic" align="center" id="msg" no_lang="1"/>
<description/>
</row>
<row disabled="1"> <row disabled="1">
<description class="headertext" id="appheader"/> <template id="infolog.index.header_left"/>
<description class="headertext" value="Add:" align="right"/> <template id="infolog.index.header_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>
</row> </row>
<row disabled="!@main"> <row disabled="!@main">
<template content="main" span="all" id="infolog.index.rows-noheader"/> <template content="main" span="all" id="infolog.index.rows-noheader"/>
@ -210,14 +196,11 @@
</row> </row>
<row> <row>
<hbox span="all"> <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"/> <button label="Cancel" id="cancel" statustext="Back to main list"/>
</hbox> </hbox>
</row> </row>
</rows> </rows>
</grid> </grid>
<styles>
.headertext { color: black; font-size: 120%; }
</styles>
</template> </template>
</overlay> </overlay>