From 9e49e8c50db0715cfc0a6a77dfb117e95476f4b4 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 13 Jun 2007 21:37:05 +0000 Subject: [PATCH] History for InfoLog (incl. the ability to disable real deletes) and delete notifications --- etemplate/inc/class.bo_tracking.inc.php | 22 ++- infolog/inc/class.boinfolog.inc.php | 129 ++++++++++++++--- infolog/inc/class.infolog_tracking.inc.php | 126 ++++++++++++---- infolog/inc/class.soinfolog.inc.php | 42 ++++-- infolog/inc/class.uiinfolog.inc.php | 159 +++++++++++++++------ infolog/setup/etemplates.inc.php | 21 +-- infolog/setup/phpgw_de.lang | 11 +- infolog/setup/phpgw_en.lang | 10 ++ infolog/templates/default/admin.tpl | 6 +- infolog/templates/default/edit.xet | 16 ++- 10 files changed, 417 insertions(+), 125 deletions(-) diff --git a/etemplate/inc/class.bo_tracking.inc.php b/etemplate/inc/class.bo_tracking.inc.php index aaebcb06dd..bda7bac188 100644 --- a/etemplate/inc/class.bo_tracking.inc.php +++ b/etemplate/inc/class.bo_tracking.inc.php @@ -195,14 +195,16 @@ class bo_tracking $changes = 0; foreach($this->field2history as $name => $status) { - if ($old[$name] != $data[$name]) + if ($old[$name] != $data[$name] && !(!$old[$name] && !$data[$name])) { if (!is_object($this->historylog)) { require_once(EGW_API_INC.'/class.historylog.inc.php'); $this->historylog =& new historylog($this->app); } - $this->historylog->add($status,$data[$this->id_field],$data[$name],$old[$name]); + $this->historylog->add($status,$data[$this->id_field], + is_array($data[$name]) ? implode(',',$data[$name]) : $data[$name], + is_array($old[$name]) ? implode(',',$old[$name]) : $old[$name]); ++$changes; } } @@ -536,10 +538,18 @@ class bo_tracking $link .= '&'.$this->id_field.'='.$data[$this->id_field]; } } - elseif (($view = $GLOBALS['egw']->link->view($this->app,$data[$this->id_field]))) + else { - $link = $GLOBALS['egw']->link('/index.php',$view); - $popup = $GLOBALS['egw']->link->is_popup($this->app,'view'); + if (!is_object($GLOBALS['egw']->link)) + { + require_once(EGW_API_INC.'/class.bolink.inc.php'); + $GLOBALS['egw']->link =& new bolink(); + } + if (($view = $GLOBALS['egw']->link->view($this->app,$data[$this->id_field]))) + { + $link = $GLOBALS['egw']->link('/index.php',$view); + $popup = $GLOBALS['egw']->link->is_popup($this->app,'view'); + } } if ($link{0} == '/') { @@ -585,7 +595,7 @@ class bo_tracking // if there's no old entry, the entry is not modified by definition // if both values are '', 0 or null, we count them as equal too $modified = $old && $data[$name] != $old[$name] && !(!$data[$name] && !$old[$name]); - //if ($modified) error_log("data[$name]='{$data[$name]}', old[$name]='{$old[$name]}' --> modified=".(int)$modified); + //if ($modified) error_log("data[$name]=".print_r($data[$name],true).", old[$name]=".print_r($old[$name],true)." --> modified=".(int)$modified); if (empty($detail['value']) && !$modified) continue; // skip unchanged, empty values $body .= $this->format_line($html_email,$detail['type'],$modified, diff --git a/infolog/inc/class.boinfolog.inc.php b/infolog/inc/class.boinfolog.inc.php index d2133be2ed..34ae3b2f3f 100644 --- a/infolog/inc/class.boinfolog.inc.php +++ b/infolog/inc/class.boinfolog.inc.php @@ -12,6 +12,8 @@ include_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.soinfolog.inc.php'); +define('EGW_ACL_UNDELETE',EGW_ACL_CUSTOM_1); // undelete right + /** * This class is the BO-layer of InfoLog, it also handles xmlrpc requests */ @@ -32,7 +34,7 @@ class boinfolog var $link; var $vfs; var $vfs_basedir='/infolog'; - var $valid_pathes = array(); + var $link_pathes = array(); var $send_file_ips = array(); var $xmlrpc_methods = array(); @@ -111,6 +113,18 @@ class boinfolog * @var int */ var $user; + /** + * History loggin: ''=no, 'history'=history & delete allowed, 'history_admin_delete', 'history_no_delete' + * + * @var string + */ + var $history; + /** + * Instance of infolog_tracking, only instaciated if needed! + * + * @var infolog_tracking + */ + var $tracking; /** * Constructor Infolog BO @@ -151,11 +165,11 @@ class boinfolog 'billed' => 'billed' ), // --> DONE 'note' => array( 'ongoing' => 'ongoing', // iCal has no status on notes - 'done' => 'done'), + 'done' => 'done' ), 'email' => array( 'ongoing' => 'ongoing', // iCal has no status on notes - 'done' => 'done' - )); + 'done' => 'done' ), + ); if (!is_object($GLOBALS['egw']->link) && $instanciate_link) { @@ -211,14 +225,15 @@ class boinfolog } if ($save_config) $this->config->save_repository(); } - if (count(explode(',',$this->config->config_data['responsible_edit']))) + if (is_array($this->config->config_data['responsible_edit'])) { - $this->responsible_edit = array_merge($this->responsible_edit,explode(',',$this->config->config_data['responsible_edit'])); + $this->responsible_edit = array_merge($this->responsible_edit,$this->config->config_data['responsible_edit']); } if ($this->config->config_data['implicit_rights'] == 'edit') { $this->implicit_rights = 'edit'; } + $this->history = $this->config->config_data['history']; } // sort types by there translation foreach($this->enums['type'] as $key => $val) @@ -305,6 +320,33 @@ class boinfolog { return $cache[$info_id][$required_rights]; } + // handle delete for the various history modes + if ($this->history) + { + if (!is_array($info) && !($info = $this->so->read($info_id))) return false; + + if ($info['info_status'] == 'deleted' && + ($required_rights == EGW_ACL_EDIT || // no edit rights for deleted entries + $required_rights == EGW_ACL_ADD || // no add rights for deleted entries + $required_rights == EGW_ACL_DELETE && ($this->history == 'history_no_delete' || // no delete at all! + $this->history == 'history_admin_delete' && !isset($GLOBALS['egw_info']['user']['apps']['admin'])))) // delete only for admins + { + return $cache[$info_id][$required_rights] = false; + } + if ($required_rights == EGW_ACL_UNDELETE) + { + if ($info['info_status'] != 'deleted') + { + return $cache[$info_id][$required_rights] = false; // can only undelete deleted items + } + // undelete requires edit rights + return $cache[$info_id][$required_rights] = $this->so->check_access( $info,EGW_ACL_EDIT,$this->implicit_rights == 'edit' ); + } + } + elseif ($required_rights == EGW_ACL_UNDELETE) + { + return $cache[$info_id][$required_rights] = false; + } return $cache[$info_id][$required_rights] = $this->so->check_access( $info,$required_rights,$this->implicit_rights == 'edit' ); } @@ -467,18 +509,59 @@ class boinfolog } return False; } - - $this->link->unlink(0,'infolog',$info_id); - - $info = $this->read($info_id); - - $this->so->delete($info_id,$delete_children,$new_parent); - - $GLOBALS['egw']->contenthistory->updateTimeStamp('infolog_'.$info['info_type'], $info_id, 'delete', time()); + // check if we have children and delete or re-parent them + if (($children = $this->so->get_children($info_id))) + { + foreach($children as $id => $owner) + { + if ($delete_children && $this->so->grants[$owner] & EGW_ACL_DELETE) + { + $this->delete($id,$delete_children,$new_parent); // call ourself recursive to delete the child + } + else // dont delete or no rights to delete the child --> re-parent it + { + $this->so->write(array( + 'info_id' => $id, + 'info_parent_id' => $new_parent, + )); + } + } + } + if (!($info = $this->read($info_id))) return false; // should not happen + $deleted = $info; + $deleted['info_status'] = 'deleted'; + $deleted['info_datemodified'] = time(); + $deleted['info_modifier'] = $this->user; + + // if we have history switched on and not an already deleted item --> set only status deleted + if ($this->history && $info['info_status'] != 'deleted') + { + if ($info['info_status'] == 'deleted') return false; // entry already deleted + + $this->so->write($deleted); + } + else + { + $this->so->delete($info_id,false); // we delete the children via bo to get all notifications! + } + if ($info['info_status'] != 'deleted') // dont notify of final purge of already deleted items + { + $this->link->unlink(0,'infolog',$info_id); + + $GLOBALS['egw']->contenthistory->updateTimeStamp('infolog_'.$info['info_type'], $info_id, 'delete', time()); + + // send email notifications and do the history logging + require_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.infolog_tracking.inc.php'); + if (!is_object($this->tracking)) + { + $this->tracking =& new infolog_tracking($this); + } + $this->tracking->track($deleted,$info,$this->user); + } return True; } - + /** * writes the given $values to InfoLog, a new entry gets created if info_id is not set or 0 * @@ -517,6 +600,10 @@ class boinfolog { $status_only = !!array_intersect($responsible,array_keys($GLOBALS['egw']->accounts->memberships($this->user))); } + if (!$status_only && $values['info_status'] != 'deleted') + { + $status_only = $undelete = $this->check_access($values['info_id'],EGW_ACL_UNDELETE); + } } if ($values['info_id'] && !$this->check_access($values['info_id'],EGW_ACL_EDIT) && !$status_only || !$values['info_id'] && $values['info_id_parent'] && !$this->check_access($values['info_id_parent'],EGW_ACL_ADD)) @@ -531,7 +618,7 @@ class boinfolog { $values = $this->xmlrpc2data($values); } - if ($status_only) // make sure only status gets writen + if ($status_only && !$undelete) // make sure only status gets writen { $set_completed = !$values['info_datecompleted'] && // set date completed of finished job, only if its not already set (in_array($values['info_status'],array('done','billed','cancelled')) || (int)$values['info_percent'] == 100); @@ -606,7 +693,7 @@ class boinfolog $values['info_modifier'] = $this->so->user; } $to_write = $values; - if ($status_only) $values = array_merge($backup_values,$values); + if ($status_only && !$undelete) $values = array_merge($backup_values,$values); // convert user- to system-time foreach($this->timestamps as $time) { @@ -623,7 +710,7 @@ class boinfolog { $values = $this->read($info_id); } - if($values['info_id']) + if($values['info_id'] && $old['info_status'] != 'deleted') { // update $GLOBALS['egw']->contenthistory->updateTimeStamp( @@ -640,7 +727,11 @@ class boinfolog ); } $values['info_id'] = $info_id; - + + if (!is_array($values['info_responsible'])) // this should not happen, bug it does ;-) + { + $values['info_responsible'] = $values['info_responsible'] ? explode(',',$values['info_responsible']) : array(); + } // create (and remove) links in custom fields $this->update_customfield_links($values,$old); diff --git a/infolog/inc/class.infolog_tracking.inc.php b/infolog/inc/class.infolog_tracking.inc.php index ed38b2b799..205f60c2e6 100644 --- a/infolog/inc/class.infolog_tracking.inc.php +++ b/infolog/inc/class.infolog_tracking.inc.php @@ -46,7 +46,33 @@ class infolog_tracking extends bo_tracking * * @var array */ - var $field2history = array(); + var $field2history = array( + 'info_type' => 'Ty', + 'info_from' => 'Fr', + 'info_addr' => 'Ad', + 'info_link_id' => 'Li', + 'info_cat' => 'Ca', + 'info_priority' => 'Pr', + 'info_owner' => 'Ow', + 'info_access' => 'Ac', + 'info_status' => 'St', + 'info_percent' => 'Pe', + 'info_datecompleted' => 'Co', + 'info_location' => 'Lo', + 'info_startdate' => 'st', + 'info_enddate' => 'En', + 'info_responsible' => 'Re', + 'info_subject' => 'Su', + 'info_des' => 'De', + 'info_location' => 'Lo', + // PM fields + 'info_planned_time' => 'pT', + 'info_used_time' => 'uT', + 'pl_id' => 'pL', + 'info_price' => 'pr', + // all custom fields together + 'custom' => '#c', + ); /** * Translate field-names to labels * @@ -56,9 +82,11 @@ class infolog_tracking extends bo_tracking 'info_type' => 'Type', 'info_from' => 'Contact', 'info_addr' => 'Phone/Email', + 'info_link_id' => 'primary link', 'info_cat' => 'Category', 'info_priority' => 'Priority', 'info_owner' => 'Owner', + 'info_access' => 'Access', 'info_status' => 'Status', 'info_percent' => 'Completed', 'info_datecompleted' => 'Date completed', @@ -67,6 +95,14 @@ class infolog_tracking extends bo_tracking 'info_enddate' => 'Enddate', 'info_responsible' => 'Responsible', 'info_subject' => 'Subject', + 'info_des' => 'Description', + // PM fields + 'info_planned_time' => 'planned time', + 'info_used_time' => 'used time', + 'pl_id' => 'pricelist', + 'info_price' => 'price', + // custom fields + 'custom' => 'custom fields' ); /** @@ -90,29 +126,6 @@ class infolog_tracking extends bo_tracking $this->infolog =& $boinfolog; } - /** - * Tracks the changes in one entry $data, by comparing it with the last version in $old - * - * Reimplemented to fix some fields, who otherwise allways show up as modified - * - * @param array $data current entry - * @param array $old=null old/last state of the entry or null for a new entry - * @param int $user=null user who made the changes, default to current user - * @return int/boolean false on error, integer number of changes logged or true for new entries ($old == null) - */ - function track($data,$old=null,$user=null) - { - if ($old) - { - foreach($this->infolog->timestamps as $name) - { - if (!$old[$name]) $old[$name] = ''; - } - } - return parent::track($data,$old,$user); - } - - /** * Get a notification-config value * @@ -129,22 +142,54 @@ class infolog_tracking extends bo_tracking return null; } + /** + * Get the subject for a given entry + * + * Reimpleneted to use a New|deleted|modified prefix. + * + * @param array $data + * @param array $old + * @return string + */ + function get_subject($data,$old) + { + if (!$old || $old['info_status'] == 'deleted') + { + $prefix = lang('New %1',lang($this->infolog->enums['type'][$data['info_type']])); + } + elseif($data['info_status'] == 'deleted') + { + $prefix = lang('%1 deleted',lang($this->infolog->enums['type'][$data['info_type']])); + } + else + { + $prefix = lang('%1 modified',lang($this->infolog->enums['type'][$data['info_type']])); + } + return $prefix.': '.$data['info_subject']; + } + /** * Get the modified / new message (1. line of mail body) for a given entry, can be reimplemented * * @param array $data * @param array $old - * @return array/string array(message,user-id,timestamp-in-servertime) or string + * @return string */ function get_message($data,$old) { if ($data['message']) return $data['message']; // async notification - if (!$data['info_datemodified'] || !$old) + if (!$old || $old['info_status'] == 'deleted') { return lang('New %1 created by %2 at %3',lang($this->infolog->enums['type'][$data['info_type']]), $GLOBALS['egw']->common->grab_owner_name($this->infolog->user),$this->datetime(time())); } + elseif($data['info_status'] == 'deleted') + { + return lang('%1 deleted by %2 at %3',lang($this->infolog->enums['type'][$data['info_type']]), + $GLOBALS['egw']->common->grab_owner_name($data['info_modifier']), + $this->datetime($data['info_datemodified']-$this->infolog->tz_offset_s)); + } return lang('%1 modified by %2 at %3',lang($this->infolog->enums['type'][$data['info_type']]), $GLOBALS['egw']->common->grab_owner_name($data['info_modifier']), $this->datetime($data['info_datemodified']-$this->infolog->tz_offset_s)); @@ -184,7 +229,7 @@ class infolog_tracking extends bo_tracking 'info_cat' => $data['info_cat'] ? $GLOBALS['egw']->categories->id2name($data['info_cat']) : '', 'info_priority' => lang($this->infolog->enums['priority'][$data['info_priority']]), 'info_owner' => $GLOBALS['egw']->common->grab_owner_name($data['info_owner']), - 'info_status' => lang($this->infolog->status[$data['info_type']][$data['info_status']]), + 'info_status' => lang($data['info_status']=='deleted'?'deleted':$this->infolog->status[$data['info_type']][$data['info_status']]), 'info_percent' => (int)$data['info_percent'].'%', 'info_datecompleted' => $data['info_datecomplete'] ? $this->datetime($data['info_datecompleted']-$this->infolog->tz_offset_s) : '', 'info_location' => $data['info_location'], @@ -209,7 +254,7 @@ class infolog_tracking extends bo_tracking { foreach($this->infolog->customfields as $name => $field) { - if ($field['type2'] && $field['type2'] != $data['info_type']) continue; // different type + if ($field['type2'] && !in_array($data['info_type'],explode(',',$field['type2']))) continue; // different type if (!$header_done) { @@ -219,7 +264,7 @@ class infolog_tracking extends bo_tracking ); $header_done = true; } - $details[$name] = array( + $details['#'.$name] = array( 'label' => $field['label'], 'value' => $data['#'.$name], ); @@ -227,4 +272,27 @@ class infolog_tracking extends bo_tracking } return $details; } + + /** + * Save changes to the history log + * + * Reimplemented to store all customfields in a single field, as the history-log has only 2-char field-ids + * + * @param array $data current entry + * @param array $old=null old/last state of the entry or null for a new entry + * @param int number of log-entries made + */ + function save_history($data,$old) + { + $data_custom = $old_custom = array(); + foreach($this->infolog->customfields as $name => $custom) + { + if (isset($data['#'.$name]) && (string)$data['#'.$name]!=='') $data_custom[] = $custom['label'].': '.$data['#'.$name]; + if (isset($old['#'.$name]) && (string)$old['#'.$name]!=='') $old_custom[] = $custom['label'].': '.$old['#'.$name]; + } + $data['custom'] = implode("\n",$data_custom); + $old['custom'] = implode("\n",$old_custom); + + return parent::save_history($data,$old); + } } \ No newline at end of file diff --git a/infolog/inc/class.soinfolog.inc.php b/infolog/inc/class.soinfolog.inc.php index 8380cc8777..a8f5b154de 100644 --- a/infolog/inc/class.soinfolog.inc.php +++ b/infolog/inc/class.soinfolog.inc.php @@ -262,21 +262,24 @@ class soinfolog // DB-Layer /** * generate sql to filter based on the status of the log-entry * - * @param $filter done = done or billed, open = not ()done or billed), offer = offer + * @param string $filter done = done or billed, open = not (done, billed, cancelled or deleted), offer = offer + * @param boolean $prefix_and=true if true prefix the fileter with ' AND ' * @return string the necesary sql */ - function statusFilter($filter = '') + function statusFilter($filter = '',$prefix_and=true) { - preg_match('/(done|open|offer)/',$filter,$vars); + preg_match('/(done|open|offer|deleted)/',$filter,$vars); $filter = $vars[1]; switch ($filter) { - case 'done': return " AND info_status IN ('done','billed','cancelled')"; - case 'open': return " AND NOT (info_status IN ('done','billed','cancelled'))"; - case 'offer': return " AND info_status = 'offer'"; + case 'done': $filter = "info_status IN ('done','billed','cancelled')"; break; + case 'open': $filter = "NOT (info_status IN ('done','billed','cancelled','deleted'))"; break; + case 'offer': $filter = "info_status = 'offer'"; break; + case 'deleted': $filter = "info_status = 'deleted'"; break; + default: $filter = "info_status <> 'deleted'"; break; } - return ''; + return ($prefix_and ? ' AND ' : '').$filter; } /** @@ -444,6 +447,26 @@ class soinfolog // DB-Layer // set parent_id to $new_parent or 0 for all not deleted children $this->db->update($this->info_table,array('info_id_parent'=>$new_parent),array('info_id_parent'=>$info_id),__LINE__,__FILE__); } + + /** + * Return array with children of $info_id as info_id => info_owner pairs + * + * @param int $info_id + * @return array with info_id => info_owner pairs + */ + function get_children($info_id) + { + $this->db->select($this->info_table,'info_id,info_owner',array( + 'info_id_parent' => $info_id, + ),__LINE__,__FILE__); + + $children = array(); + while (($row = $this->db->row(true))) + { + $children[$row['info_id']] = $row['info_owner']; + } + return $children; + } /** * changes or deletes entries with a spezified owner (for hook_delete_account) @@ -466,6 +489,7 @@ class soinfolog // DB-Layer { $this->db->update($this->info_table,array('info_owner'=>$new_owner),array('info_owner'=>$owner),__LINE__,__FILE__); } + // ToDo: does not work with multiple owners!!! $this->db->update($this->info_table,array('info_responsible'=>$new_owner),array('info_responsible'=>$owner),__LINE__,__FILE__); } @@ -560,7 +584,7 @@ class soinfolog // DB-Layer //echo "

anzSubs($info_id) = ".$this->db->f(0)." ($sql)

\n"; return $this->db->f(0); } - + /** * searches InfoLog for a certain pattern in $query * @@ -743,7 +767,7 @@ class soinfolog // DB-Layer { $users[] = $this->db->f(0); } - $this->db->select($this->info_table,'DISTINCT info_responsible',str_replace(' AND ','',$this->statusFilter('open')),__LINE__,__FILE__); + $this->db->select($this->info_table,'DISTINCT info_responsible',$this->statusFilter('open',false),__LINE__,__FILE__); while ($this->db->next_record()) { foreach(explode(',',$this->db->f(0)) as $responsible) diff --git a/infolog/inc/class.uiinfolog.inc.php b/infolog/inc/class.uiinfolog.inc.php index 82fa80f359..aad233c9c8 100644 --- a/infolog/inc/class.uiinfolog.inc.php +++ b/infolog/inc/class.uiinfolog.inc.php @@ -142,6 +142,10 @@ class uiinfolog $this->duration_format = str_replace(',','',$pm_config->config_data['duration_units']).','.$pm_config->config_data['hours_per_workday']; unset($pm_config); } + if ($this->bo->history) + { + $this->filters['deleted'] = 'deleted'; + } /* these are just for testing of the notifications for($i = -1; $i <= 3; ++$i) { @@ -196,7 +200,8 @@ class uiinfolog $readonlys["close[$id]"] = $done || ($readonlys["edit_status[$id]"] = !($this->bo->check_access($info,EGW_ACL_EDIT) || $this->bo->is_responsible($info))); $readonlys["edit_status[$id]"] = $readonlys["edit_percent[$id]"] = - !$this->bo->check_access($info,EGW_ACL_EDIT) && !$this->bo->is_responsible($info); + !$this->bo->check_access($info,EGW_ACL_EDIT) && !$this->bo->is_responsible($info) && + !$this->bo->check_access($info,EGW_ACL_UNDELETE); // undelete is handled like status edit $readonlys["delete[$id]"] = !$this->bo->check_access($info,EGW_ACL_DELETE); $readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD); $readonlys["view[$id]"] = $info['info_anz_subs'] < 1; @@ -237,7 +242,8 @@ class uiinfolog } } $info['info_type_label'] = $this->bo->enums['type'][$info['info_type']]; - $info['info_status_label'] = $this->bo->status[$info['info_type']][$info['info_status']]; + $info['info_status_label'] = isset($this->bo->status[$info['info_type']][$info['info_status']]) ? + $this->bo->status[$info['info_type']][$info['info_status']] : $info['info_status']; if (!$this->prefs['show_percent'] || $this->prefs['show_percent'] == 2 && !$details) { @@ -691,7 +697,7 @@ class uiinfolog */ function edit($content = null,$action = '',$action_id=0,$type='',$referer='') { - $tabs = 'description|links|delegation|project|customfields'; + $tabs = 'description|links|delegation|project|customfields|history'; if (is_array($content)) { @@ -722,9 +728,10 @@ class uiinfolog { $old = $this->bo->read($info_id); $status_only = $this->bo->is_responsible($old); + $undelete = $this->bo->check_access($old,EGW_ACL_UNDELETE); } } - if (($button == 'save' || $button == 'apply') && (!$info_id || $edit_acl || $status_only)) + if (($button == 'save' || $button == 'apply') && (!$info_id || $edit_acl || $status_only || $undelete)) { if ($content['info_contact']) { @@ -912,7 +919,9 @@ class uiinfolog } else { - if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && !$this->bo->is_responsible($content)) + if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && + !($undelete = $this->bo->check_access($info_id,EGW_ACL_UNDELETE)) && + !$this->bo->is_responsible($content)) { if ($no_popup) { @@ -1018,7 +1027,7 @@ class uiinfolog } $preserv = $content; // for implizit edit of responsible user make all fields readonly, but status and percent - if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && $this->bo->is_responsible($content)) + if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && $this->bo->is_responsible($content) && !$undelete) { $content['status_only'] = !in_array('link_to',$this->bo->responsible_edit); foreach(array_diff(array_merge(array_keys($content),array('pm_id')),$this->bo->responsible_edit) as $name) @@ -1032,6 +1041,9 @@ class uiinfolog $readonlys['#'.$name] = true; } } + // ToDo: use the old status before the delete + if ($undelete) $content['info_status'] = $this->bo->status['defaults'][$content['info_type']]; + $content['hide_from_css'] = $content['info_custom_from'] ? '' : 'hideFrom'; if (!($readonlys['button[delete]'] = !$info_id || !$this->bo->check_access($info_id,EGW_ACL_DELETE))) @@ -1051,7 +1063,7 @@ class uiinfolog } else { - $readonlys[$tabs] = array('customfields' => true); + $readonlys[$tabs]['customfields'] = true; } if (!isset($GLOBALS['egw_info']['user']['apps']['projectmanager'])) { @@ -1066,6 +1078,44 @@ class uiinfolog $old_pm_id = is_array($pm_links) ? array_shift($pm_links) : $content['old_pm_id']; if (!isset($content['pm_id']) && $old_pm_id) $content['pm_id'] = $old_pm_id; + if ($info_id && $this->bo->history) + { + $content['history'] = array( + 'id' => $info_id, + 'app' => 'infolog', + 'status-widgets' => array( + 'Ty' => $types, + //'Li', // info_link_id + 'Ca' => 'select-cat', + 'Pr' => $this->bo->enums['priority'], + 'Ow' => 'select-account', + //'Ac', // info_access: private||public + 'St' => $this->bo->status[$content['info_type']]+array('deleted' => 'deleted'), + 'Pe' => 'select-percent', + 'Co' => 'date-time', + 'st' => 'date-time', + 'En' => 'date', + 'Re' => 'select-account', + // PM fields, ToDo: access control!!! + 'pT' => 'date-duration', + 'uT' => 'date-duration', +// 'pL' => 'projectmanager-pricelist', + 'pr' => 'float', + ), + ); + $history_stati = array(); + require_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.infolog_tracking.inc.php'); + $tracking = new infolog_tracking($this); + foreach($tracking->field2history as $field => $history) + { + $history_stati[$history] = $tracking->field2label[$field]; + } + unset($tracking); + } + else + { + $readonlys[$tabs]['history'] = true; + } $GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '. ($content['status_only'] ? lang('Edit Status') : lang('Edit')); $GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => ($info_id ? 'ManualInfologEdit' : 'ManualInfologAdd')); @@ -1074,7 +1124,8 @@ class uiinfolog 'info_type' => $types, 'info_priority' => $this->bo->enums['priority'], 'info_confirm' => $this->bo->enums['confirm'], - 'info_status' => $this->bo->status[$content['info_type']] + 'info_status' => $this->bo->status[$content['info_type']], + 'status' => $history_stati, ),$readonlys,$preserv+array( // preserved values 'info_id' => $info_id, 'action' => $action, @@ -1110,6 +1161,33 @@ class uiinfolog return $icon ? $this->html->image('infolog',$icon,lang($alt),'border=0') : lang($alt); } + /** + * stripping slashes from an array + * + * @static + * @param array $arr + * @return array + */ + function array_stripslashes($arr) + { + foreach($arr as $key => $val) + { + if (is_array($val)) + { + $arr[$key] = self::array_stripslashes($var); + } + else + { + $arr[$key] = stripslashes($val); + } + } + return $arr; + } + + /** + * Infolog's site configuration + * + */ function admin( ) { $fields = array( @@ -1126,41 +1204,43 @@ class uiinfolog ); if($_POST['save'] || $_POST['apply']) { - $this->link_pathes = $this->bo->send_file_ips = array(); + if (get_magic_quotes_gpc()) + { + $_POST = self::array_stripslashes($_POST); + } + $this->bo->config->config_data['link_pathes'] = $this->bo->link_pathes = array(); + $this->bo->config->config_data['send_file_ips'] = $this->bo->send_file_ips = array(); $valid = get_var('valid',Array('POST')); $trans = get_var('trans',Array('POST')); $ip = get_var('ip',Array('POST')); - while(list($key,$val) = each($valid)) + foreach($valid as $key => $val) { - if($val = stripslashes($val)) + if($val) { - $this->link_pathes[$val] = stripslashes($trans[$key]); - $this->bo->send_file_ips[$val] = stripslashes($ip[$key]); + $this->bo->config->config_data['link_pathes'][$val] = $this->bo->link_pathes[$val] = $trans[$key]; + $this->bo->config->config_data['send_file_ips'][$val] = $this->bo->send_file_ips[$val] = $ip[$key]; } } $this->bo->responsible_edit = array('info_status','info_percent','info_datecompleted'); + if ($_POST['responsible_edit']) { $extra = array_intersect($_POST['responsible_edit'],array_keys($fields)); - $this->bo->responsible_edit = array_merge($this->bo->responsible_edit,$extra); + $this->bo->config->config_data['responsible_edit'] = $this->bo->responsible_edit = array_merge($this->bo->responsible_edit,$extra); } - $this->bo->implicit_rights = $_POST['implicit_rights'] == 'edit' ? 'edit' : 'read'; + $this->bo->config->config_data['implicit_rights'] = $this->bo->implicit_rights = $_POST['implicit_rights'] == 'edit' ? 'edit' : 'read'; + + $this->bo->config->config_data['history'] = $this->bo->history = $_POST['history']; - $this->bo->config->config_data += array( // only "adding" the changed items, to not delete other config like custom fields - 'link_pathes' => $this->link_pathes, - 'send_file_ips' => $this->bo->send_file_ips, - 'implicit_rights' => $this->bo->implicit_rights, - 'responsible_edit' => is_array($extra) ? implode(',',$extra) : $extra, - ); $this->bo->config->save_repository(True); } if($_POST['cancel'] || $_POST['save']) { - $GLOBALS['egw']->redirect_link('/admin/index.php'); + $GLOBALS['egw']->redirect_link('/infolog/index.php'); } - $GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Configuration'); + $GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Site configuration'); $GLOBALS['egw']->common->egw_header(); $GLOBALS['egw']->template->set_file(array('info_admin_t' => 'admin.tpl')); @@ -1183,16 +1263,24 @@ class uiinfolog 'cancel_button' => $this->html->submit_button('cancel','Cancel'), 'lang_valid' => lang('valid path on clientside
eg. \\\\Server\\Share or e:\\'), 'lang_trans' => lang('path on (web-)serverside
eg. /var/samba/Share'), - 'lang_ip' => lang('reg. expr. for local IP\'s
eg. ^192\\.168\\.1\\.') + 'lang_ip' => lang('reg. expr. for local IP\'s
eg. ^192\\.168\\.1\\.'), + 'lang_history'=> lang('History logging'), + 'lang_history2'=> lang('History logging and deleting of items'), + 'history' => $this->html->select('history',$this->bo->history,array( + '' => lang('No'), + 'history' => lang('Yes, with purging of deleted items possible'), + 'history_admin_delete' => lang('Yes, only admins can purge deleted items'), + 'history_no_delete' => lang('Yes, noone can purge deleted items'), + )) )); if (!is_array($this->bo->send_file_ips)) { - $this->bo->send_file_ips = $this->link_pathes = array(); + $this->bo->send_file_ips = $this->bo->link_pathes = array(); } - $i = 0; @reset($this->link_pathes); + $i = 0; @reset($this->bo->link_pathes); do { - list($valid,$trans) = @each($this->link_pathes); + list($valid,$trans) = @each($this->bo->link_pathes); $GLOBALS['egw']->template->set_var(array( 'tr_color' => $i & 1 ? 'row_off' : 'row_on', 'num' => $i+1, @@ -1322,23 +1410,6 @@ class uiinfolog exit; } - /** - * writes langfile with all templates and messages registered here - * - * called via [write Langfile] in the etemplate-editor or as http://domain/egroupware/index.php?menuaction=infolog.uiinfolog.writeLangFile - */ - function writeLangFile() - { - $extra = $this->messages + $this->filters; - $enums = $this->bo->enums + $this->bo->status; - unset($enums['defaults']); - foreach($enums as $key => $msg_arr) - { - $extra += $msg_arr; - } - return $this->tmpl->writeLangFile('infolog','en',$extra); - } - /** * shows infolog in other applications * diff --git a/infolog/setup/etemplates.inc.php b/infolog/setup/etemplates.inc.php index 85198c9cd9..a6347041ab 100644 --- a/infolog/setup/etemplates.inc.php +++ b/infolog/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * eGroupWare - eTemplates for Application infolog * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2007-03-12 10:59 + * generated by soetemplate::dump4setup() 2007-06-13 23:32 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package infolog @@ -12,9 +12,6 @@ $templ_version=1; -$templ_data[] = array('name' => 'infolog.customfields','template' => '','lang' => '','group' => '0','version' => '1.2.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:3:{s:1:"F";s:3:"80%";s:2:"c2";s:6:"header";s:2:"c4";s:6:"header";}i:1;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"Typ";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:3:"typ";s:8:"onchange";s:1:"1";s:4:"help";s:52:"select a typ to edit it\'s status-values or delete it";}s:1:"C";a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:4:"name";s:14:"button[delete]";s:4:"help";s:24:"deletes the selected typ";}s:1:"D";a:5:{s:4:"type";s:4:"text";s:4:"size";s:5:"10,40";s:4:"name";s:8:"new_name";s:4:"help";s:26:"name of new type to create";s:4:"blur";s:8:"new name";}s:1:"E";a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Create";s:4:"name";s:14:"button[create]";s:4:"help";s:37:"creates a new typ with the given name";}s:1:"F";a:5:{s:4:"type";s:5:"label";s:4:"span";s:10:",error_msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:9:"error_msg";}}i:2;a:6:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:21:"Custom status for typ";s:4:"name";s:3:"typ";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:3;a:6:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:6:"status";s:4:"span";s:3:"all";s:4:"name";s:6:"status";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:4;a:6:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:13:"Custom fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:5;a:6:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:6:"fields";s:4:"span";s:3:"all";s:4:"name";s:6:"fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:6;a:6:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";s:4:"span";s:3:"all";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:33:"saves the changes made and leaves";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";s:4:"help";s:19:"applies the changes";}i:3;a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:4:"help";s:22:"leaves without saveing";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:6;}}','size' => '','style' => '.header { font-weight: bold; font-size: 120%; } -.error_msg { color: red; font-style: italics; }','modified' => '1061729975',); - $templ_data[] = array('name' => 'infolog.customfields','template' => '','lang' => '','group' => '0','version' => '1.3.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:3:{s:1:"F";s:3:"80%";s:2:"c2";s:6:"header";s:2:"c4";s:6:"header";}i:1;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"Typ";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:5:"type2";s:8:"onchange";i:1;s:4:"help";s:52:"select a typ to edit it\'s status-values or delete it";s:7:"no_lang";s:1:"1";}s:1:"C";a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:4:"name";s:14:"button[delete]";s:4:"help";s:24:"deletes the selected typ";}s:1:"D";a:5:{s:4:"type";s:4:"text";s:4:"size";s:5:"10,40";s:4:"name";s:8:"new_name";s:4:"help";s:26:"name of new type to create";s:4:"blur";s:8:"new name";}s:1:"E";a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Create";s:4:"name";s:14:"button[create]";s:4:"help";s:37:"creates a new typ with the given name";}s:1:"F";a:5:{s:4:"type";s:5:"label";s:4:"span";s:10:",error_msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:9:"error_msg";}}i:2;a:6:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:21:"Custom status for typ";s:4:"name";s:3:"typ";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:3;a:6:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:6:"status";s:4:"span";s:3:"all";s:4:"name";s:6:"status";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:4;a:6:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:13:"Custom fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:5;a:6:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:6:"fields";s:4:"span";s:3:"all";s:4:"name";s:6:"fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:6;a:6:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";s:4:"span";s:3:"all";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:33:"saves the changes made and leaves";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";s:4:"help";s:19:"applies the changes";}i:3;a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:4:"help";s:22:"leaves without saveing";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:1:{s:4:"type";s:5:"label";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:6;}}','size' => '','style' => '.header { font-weight: bold; font-size: 120%; } .error_msg { color: red; font-style: italics; }','modified' => '1159943136',); @@ -33,16 +30,11 @@ $templ_data[] = array('name' => 'infolog.delete','template' => '','lang' => '',' $templ_data[] = array('name' => 'infolog.delete','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:3:{s:2:"h3";s:2:"30";s:2:"h4";s:2:"50";s:2:"c3";s:7:",bottom";}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:4:"main";s:5:"align";s:6:"center";s:4:"name";s:27:"infolog.index.rows-noheader";}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:11:",headertext";s:5:"label";s:45:"Are you shure you want to delete this entry ?";s:5:"align";s:6:"center";}}i:4;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:12:"Yes - Delete";s:4:"name";s:6:"delete";s:4:"help";s:75:"Sub-entries become subs of the parent or main entries, if there\'s no parent";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:34:"Yes - Delete including sub-entries";s:4:"name";s:11:"delete_subs";s:4:"help";s:44:"Delete this entry and all listed sub-entries";}s:5:"align";s:6:"center";i:3;a:4:{s:4:"type";s:6:"button";s:5:"label";s:11:"No - Cancel";s:4:"name";s:6:"cancel";s:4:"help";s:22:"Abort without deleting";}}}i:5;a:1:{s:1:"A";a:4:{s:4:"type";s:9:"nextmatch";s:4:"size";s:20:"infolog.index.rows,1";s:4:"span";s:3:"all";s:4:"name";s:2:"nm";}}}s:4:"rows";i:5;s:4:"cols";i:1;s:4:"size";s:12:"100%,,0,,0,0";}}','size' => '100%,,0,,0,0','style' => '','modified' => '1131742953',); -$templ_data[] = array('name' => 'infolog.edit','template' => '','lang' => '','group' => '0','version' => '1.2.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:13:{i:0;a:18:{s:1:"A";s:3:"103";s:1:"B";s:3:"260";s:1:"C";s:3:"140";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c8";s:6:"row_on";s:2:"c9";s:3:"row";s:2:"c7";s:2:"th";s:2:"c6";s:4:",top";s:2:"c5";s:3:"row";s:2:"c2";s:2:"th";s:2:"h6";s:3:"250";s:2:"h7";s:2:",1";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";s:3:"c11";s:3:"row";s:3:"h11";s:13:",!@info_owner";s:3:"c10";s:3:"row";}i:1;a:4:{s:1:"A";a:5:{s:4:"type";s:4:"html";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";s:4:"size";s:12:",,,info_type";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"span";s:3:"all";s:4:"name";s:9:"info_type";s:8:"onchange";s:1:"1";s:4:"help";s:46:"Type of the log-entry: Note, Phonecall or ToDo";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:8:"Category";s:4:"size";s:11:",,,info_cat";}s:1:"B";a:5:{s:4:"type";s:10:"select-cat";s:4:"size";s:4:"None";s:4:"span";s:3:"all";s:4:"name";s:8:"info_cat";s:4:"help";s:32:"select a category for this entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Contact";s:4:"size";s:12:",,,info_from";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:6:"36,255";s:4:"name";s:9:"info_from";s:4:"help";s:80:"Custom contact-information, leave emtpy to use information from most recent link";s:4:"blur";s:11:"@blur_title";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:11:"Phone/Email";s:4:"size";s:13:",,,_info_addr";}s:1:"D";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"30,255";s:4:"name";s:9:"info_addr";s:4:"help";s:76:"Custom contact-address, leave empty to use information from most recent link";}}i:5;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Subject";s:4:"size";s:15:",,,info_subject";}s:1:"B";a:6:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"span";s:3:"all";s:4:"name";s:12:"info_subject";s:6:"needed";s:1:"1";s:4:"help";s:29:"a short subject for the entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:6;a:4:{s:1:"A";a:5:{s:4:"type";s:3:"tab";s:4:"span";s:3:"all";s:5:"label";s:56:"Description|Links|Delegation|Projectmanager|Customfields";s:4:"name";s:49:"description|links|delegation|project|customfields";s:4:"help";s:118:"longer textual description|Links of this entry|responsible user, priority|Project settings: price, times|Custom fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:7;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:21:"Dates, Status, Access";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:8;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Startdate";s:4:"size";s:17:",,,info_startdate";}s:1:"B";a:4:{s:4:"type";s:9:"date-time";s:4:"size";s:2:",2";s:4:"name";s:14:"info_startdate";s:4:"help";s:115:"when should the ToDo or Phonecall be started, it shows up from that date in the filter open or own open (startpage)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Enddate";s:4:"size";s:15:",,,info_enddate";}s:1:"D";a:3:{s:4:"type";s:4:"date";s:4:"name";s:12:"info_enddate";s:4:"help";s:49:"til when should the ToDo or Phonecall be finished";}}i:9;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";s:4:"size";s:14:",,,info_status";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:11:"info_status";s:4:"help";s:12:"@status_help";s:8:"onchange";s:183:"if (this.value==\'done\' || this.value==\'billed\') set_element(this.form,\'exec[info_percent]\',\'100\'); else if (this.value==\'not-started\') set_element(this.form,\'exec[info_percent]\',\'0\');";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Completed";s:4:"size";s:15:",,,info_percent";}s:1:"D";a:4:{s:4:"type";s:14:"select-percent";s:4:"name";s:12:"info_percent";s:4:"help";s:17:"Percent completed";s:8:"onchange";s:570:"if (this.value==100 && this.form[\'exec[info_status]\'].value != \'done\' && this.form[\'exec[info_status]\'].value != \'billed\' && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=\'done\'; else if (this.value != 100 && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=this.value != 0 ? \'ongoing\' : \'not-started\'; else if (this.value==0 && this.form[\'exec[info_status]\'].value != \'cancelled\' && this.form[\'exec[info_status]\'].value != \'offer\') this.form[\'exec[info_status]\'].value=\'not-started\'; ";}}i:10;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:21:",,,info_datecompleted";s:5:"label";s:14:"Date completed";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:18:"info_datecompleted";s:4:"help";s:84:"Date completed (leave it empty to have it automatic set if status is done or billed)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Private";s:4:"size";s:14:",,,info_access";}s:1:"D";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:14:"private,public";s:4:"name";s:11:"info_access";s:4:"help";s:87:"should this entry only be visible to you and people you grant privat access via the ACL";}}i:11;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:10:"info_owner";s:8:"readonly";s:1:"1";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"D";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";i:1;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"info_modifier";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:9:"date-time";s:4:"span";s:10:",lpadding5";s:4:"name";s:17:"info_datemodified";s:8:"readonly";s:1:"1";}}}i:12;a:4:{s:1:"A";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:16:"Saves this entry";}s:4:"span";s:1:"2";i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:17:"Apply the changes";}i:3;a:5:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:4:"help";s:31:"leave without saveing the entry";s:7:"onclick";s:15:"window.close();";}i:4;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"delete this entry";s:7:"onclick";s:60:"return $cont[info_anz_subs] || confirm(\'Delete this entry\');";}}}s:4:"rows";i:12;s:4:"cols";i:4;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1142602276',); - $templ_data[] = array('name' => 'infolog.edit','template' => '','lang' => '','group' => '0','version' => '1.3.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:13:{i:0;a:18:{s:1:"A";s:3:"103";s:1:"B";s:3:"260";s:1:"C";s:3:"140";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c8";s:6:"row_on";s:2:"c9";s:3:"row";s:2:"c7";s:2:"th";s:2:"c6";s:4:",top";s:2:"c5";s:3:"row";s:2:"c2";s:2:"th";s:2:"h6";s:3:"250";s:2:"h7";s:2:",1";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";s:3:"c11";s:3:"row";s:3:"h11";s:13:",!@info_owner";s:3:"c10";s:3:"row";}i:1;a:4:{s:1:"A";a:5:{s:4:"type";s:4:"html";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";s:4:"size";s:12:",,,info_type";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:6:"2,,0,0";i:1;a:5:{s:4:"type";s:6:"select";s:4:"name";s:9:"info_type";s:8:"onchange";i:1;s:4:"help";s:46:"Type of the log-entry: Note, Phonecall or ToDo";s:7:"no_lang";s:1:"1";}i:2;a:4:{s:4:"type";s:3:"int";s:4:"name";s:11:"info_number";s:4:"span";s:7:",infoId";s:8:"readonly";s:1:"1";}}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:8:"Category";s:4:"size";s:11:",,,info_cat";}s:1:"B";a:5:{s:4:"type";s:10:"select-cat";s:4:"size";s:4:"None";s:4:"span";s:3:"all";s:4:"name";s:8:"info_cat";s:4:"help";s:32:"select a category for this entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Contact";s:4:"size";s:12:",,,info_from";}s:1:"B";a:38:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:10:"link-entry";s:4:"name";s:12:"info_contact";s:4:"span";s:7:",noWrap";}i:2;a:4:{s:4:"type";s:8:"checkbox";s:4:"name";s:16:"info_custom_from";s:8:"onchange";s:91:"document.getElementById(form::name(\'info_from\')).style.display=this.checked?\'block\':\'none\';";s:4:"help";s:31:"Check to specify custom contact";}}i:2;a:6:{s:4:"type";s:4:"text";s:4:"size";s:6:"36,255";s:4:"name";s:9:"info_from";s:4:"help";s:80:"Custom contact-information, leave emtpy to use information from most recent link";s:4:"blur";s:11:"@blur_title";s:4:"span";s:21:",$cont[hide_from_css]";}i:3;a:1:{s:4:"type";s:5:"label";}i:4;a:1:{s:4:"type";s:5:"label";}i:5;a:1:{s:4:"type";s:5:"label";}i:6;a:1:{s:4:"type";s:5:"label";}i:7;a:1:{s:4:"type";s:5:"label";}i:8;a:1:{s:4:"type";s:5:"label";}i:9;a:1:{s:4:"type";s:5:"label";}i:10;a:1:{s:4:"type";s:5:"label";}i:11;a:1:{s:4:"type";s:5:"label";}i:12;a:1:{s:4:"type";s:5:"label";}i:13;a:1:{s:4:"type";s:5:"label";}i:14;a:1:{s:4:"type";s:5:"label";}i:15;a:1:{s:4:"type";s:5:"label";}i:16;a:1:{s:4:"type";s:5:"label";}i:17;a:1:{s:4:"type";s:5:"label";}i:18;a:1:{s:4:"type";s:5:"label";}i:19;a:1:{s:4:"type";s:5:"label";}i:20;a:1:{s:4:"type";s:5:"label";}i:21;a:1:{s:4:"type";s:5:"label";}i:22;a:1:{s:4:"type";s:5:"label";}i:23;a:1:{s:4:"type";s:5:"label";}i:24;a:1:{s:4:"type";s:5:"label";}i:25;a:1:{s:4:"type";s:5:"label";}i:26;a:1:{s:4:"type";s:5:"label";}i:27;a:1:{s:4:"type";s:5:"label";}i:28;a:1:{s:4:"type";s:5:"label";}i:29;a:1:{s:4:"type";s:5:"label";}i:30;a:1:{s:4:"type";s:5:"label";}i:31;a:1:{s:4:"type";s:5:"label";}i:32;a:1:{s:4:"type";s:5:"label";}i:33;a:1:{s:4:"type";s:5:"label";}i:34;a:1:{s:4:"type";s:5:"label";}i:35;a:1:{s:4:"type";s:5:"label";}i:36;a:1:{s:4:"type";s:5:"label";}}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:11:"Phone/Email";s:4:"size";s:13:",,,_info_addr";}s:1:"D";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"30,255";s:4:"name";s:9:"info_addr";s:4:"help";s:76:"Custom contact-address, leave empty to use information from most recent link";}}i:5;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Subject";s:4:"size";s:15:",,,info_subject";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"span";s:3:"all";s:4:"name";s:12:"info_subject";s:4:"help";s:29:"a short subject for the entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:6;a:4:{s:1:"A";a:5:{s:4:"type";s:3:"tab";s:4:"span";s:3:"all";s:5:"label";s:56:"Description|Links|Delegation|Projectmanager|Customfields";s:4:"name";s:49:"description|links|delegation|project|customfields";s:4:"help";s:118:"longer textual description|Links of this entry|responsible user, priority|Project settings: price, times|Custom fields";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:7;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:21:"Dates, Status, Access";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:8;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Startdate";s:4:"size";s:17:",,,info_startdate";}s:1:"B";a:4:{s:4:"type";s:9:"date-time";s:4:"size";s:2:",2";s:4:"name";s:14:"info_startdate";s:4:"help";s:115:"when should the ToDo or Phonecall be started, it shows up from that date in the filter open or own open (startpage)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Enddate";s:4:"size";s:15:",,,info_enddate";}s:1:"D";a:3:{s:4:"type";s:4:"date";s:4:"name";s:12:"info_enddate";s:4:"help";s:49:"til when should the ToDo or Phonecall be finished";}}i:9;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";s:4:"size";s:14:",,,info_status";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:11:"info_status";s:4:"help";s:12:"@status_help";s:8:"onchange";s:183:"if (this.value==\'done\' || this.value==\'billed\') set_element(this.form,\'exec[info_percent]\',\'100\'); else if (this.value==\'not-started\') set_element(this.form,\'exec[info_percent]\',\'0\');";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Completed";s:4:"size";s:15:",,,info_percent";}s:1:"D";a:4:{s:4:"type";s:14:"select-percent";s:4:"name";s:12:"info_percent";s:4:"help";s:17:"Percent completed";s:8:"onchange";s:570:"if (this.value==100 && this.form[\'exec[info_status]\'].value != \'done\' && this.form[\'exec[info_status]\'].value != \'billed\' && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=\'done\'; else if (this.value != 100 && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=this.value != 0 ? \'ongoing\' : \'not-started\'; else if (this.value==0 && this.form[\'exec[info_status]\'].value != \'cancelled\' && this.form[\'exec[info_status]\'].value != \'offer\') this.form[\'exec[info_status]\'].value=\'not-started\'; ";}}i:10;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:21:",,,info_datecompleted";s:5:"label";s:14:"Date completed";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:18:"info_datecompleted";s:4:"help";s:84:"Date completed (leave it empty to have it automatic set if status is done or billed)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Private";s:4:"size";s:14:",,,info_access";}s:1:"D";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:14:"private,public";s:4:"name";s:11:"info_access";s:4:"help";s:87:"should this entry only be visible to you and people you grant privat access via the ACL";}}i:11;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:10:"info_owner";s:8:"readonly";s:1:"1";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"D";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";i:1;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"info_modifier";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:9:"date-time";s:4:"span";s:10:",lpadding5";s:4:"name";s:17:"info_datemodified";s:8:"readonly";s:1:"1";}}}i:12;a:4:{s:1:"A";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:16:"Saves this entry";}s:4:"span";s:1:"2";i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:17:"Apply the changes";}i:3;a:5:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:4:"help";s:31:"leave without saveing the entry";s:7:"onclick";s:15:"window.close();";}i:4;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"delete this entry";s:7:"onclick";s:60:"return $cont[info_anz_subs] || confirm(\'Delete this entry\');";}}}s:4:"rows";i:12;s:4:"cols";i:4;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.hideFrom input { display: none; } .link_select select { width: 250px; }','modified' => '1159943980',); -$templ_data[] = array('name' => 'infolog.edit.Angebot','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:3:{s:1:"A";s:3:"100";s:1:"B";s:2:"1%";s:2:"c2";s:7:"noPrint";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"name";s:12:"infolog.edit";s:4:"span";s:11:"all,noPrint";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"hrule";}s:1:"B";a:4:{s:4:"type";s:6:"button";s:5:"label";s:5:"Print";s:5:"align";s:5:"right";s:7:"onclick";s:15:"window.print();";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:8:"template";s:4:"name";s:26:"infolog.edit.Angebot.print";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:3;s:4:"cols";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1158750796',); - -$templ_data[] = array('name' => 'infolog.edit.Angebot','template' => '','lang' => '','group' => '0','version' => '1.2','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:3:{s:1:"B";s:2:"1%";s:2:"c2";s:7:"noPrint";s:2:"c1";s:7:"noPrint";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:12:"infolog.edit";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"hrule";}s:1:"B";a:3:{s:4:"type";s:6:"button";s:5:"label";s:5:"Print";s:7:"onclick";s:31:"document.print(); return false;";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:26:"infolog.edit.Angebot.print";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}','size' => '','style' => '','modified' => '1160039724',); - -$templ_data[] = array('name' => 'infolog.edit.Angebot.print','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:13:"contact-value";s:4:"size";s:4:"n_fn";s:4:"name";s:12:"info_contact";}}}s:4:"rows";i:1;s:4:"cols";i:1;}}','size' => '','style' => '','modified' => '1160042614',); +$templ_data[] = array('name' => 'infolog.edit','template' => '','lang' => '','group' => '0','version' => '1.3.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:13:{i:0;a:18:{s:1:"A";s:3:"103";s:1:"B";s:3:"260";s:1:"C";s:3:"140";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c8";s:6:"row_on";s:2:"c9";s:3:"row";s:2:"c7";s:2:"th";s:2:"c6";s:4:",top";s:2:"c5";s:3:"row";s:2:"c2";s:2:"th";s:2:"h6";s:3:"250";s:2:"h7";s:2:",1";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";s:3:"c11";s:3:"row";s:3:"h11";s:13:",!@info_owner";s:3:"c10";s:3:"row";}i:1;a:4:{s:1:"A";a:5:{s:4:"type";s:4:"html";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";s:4:"size";s:12:",,,info_type";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:6:"2,,0,0";i:1;a:5:{s:4:"type";s:6:"select";s:4:"name";s:9:"info_type";s:8:"onchange";i:1;s:4:"help";s:46:"Type of the log-entry: Note, Phonecall or ToDo";s:7:"no_lang";s:1:"1";}i:2;a:4:{s:4:"type";s:3:"int";s:4:"name";s:11:"info_number";s:4:"span";s:7:",infoId";s:8:"readonly";s:1:"1";}}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:8:"Category";s:4:"size";s:11:",,,info_cat";}s:1:"B";a:5:{s:4:"type";s:10:"select-cat";s:4:"size";s:4:"None";s:4:"span";s:3:"all";s:4:"name";s:8:"info_cat";s:4:"help";s:32:"select a category for this entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Contact";s:4:"size";s:12:",,,info_from";}s:1:"B";a:38:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:10:"link-entry";s:4:"name";s:12:"info_contact";s:4:"span";s:7:",noWrap";}i:2;a:4:{s:4:"type";s:8:"checkbox";s:4:"name";s:16:"info_custom_from";s:8:"onchange";s:91:"document.getElementById(form::name(\'info_from\')).style.display=this.checked?\'block\':\'none\';";s:4:"help";s:31:"Check to specify custom contact";}}i:2;a:6:{s:4:"type";s:4:"text";s:4:"size";s:6:"36,255";s:4:"name";s:9:"info_from";s:4:"help";s:80:"Custom contact-information, leave emtpy to use information from most recent link";s:4:"blur";s:11:"@blur_title";s:4:"span";s:21:",$cont[hide_from_css]";}i:3;a:1:{s:4:"type";s:5:"label";}i:4;a:1:{s:4:"type";s:5:"label";}i:5;a:1:{s:4:"type";s:5:"label";}i:6;a:1:{s:4:"type";s:5:"label";}i:7;a:1:{s:4:"type";s:5:"label";}i:8;a:1:{s:4:"type";s:5:"label";}i:9;a:1:{s:4:"type";s:5:"label";}i:10;a:1:{s:4:"type";s:5:"label";}i:11;a:1:{s:4:"type";s:5:"label";}i:12;a:1:{s:4:"type";s:5:"label";}i:13;a:1:{s:4:"type";s:5:"label";}i:14;a:1:{s:4:"type";s:5:"label";}i:15;a:1:{s:4:"type";s:5:"label";}i:16;a:1:{s:4:"type";s:5:"label";}i:17;a:1:{s:4:"type";s:5:"label";}i:18;a:1:{s:4:"type";s:5:"label";}i:19;a:1:{s:4:"type";s:5:"label";}i:20;a:1:{s:4:"type";s:5:"label";}i:21;a:1:{s:4:"type";s:5:"label";}i:22;a:1:{s:4:"type";s:5:"label";}i:23;a:1:{s:4:"type";s:5:"label";}i:24;a:1:{s:4:"type";s:5:"label";}i:25;a:1:{s:4:"type";s:5:"label";}i:26;a:1:{s:4:"type";s:5:"label";}i:27;a:1:{s:4:"type";s:5:"label";}i:28;a:1:{s:4:"type";s:5:"label";}i:29;a:1:{s:4:"type";s:5:"label";}i:30;a:1:{s:4:"type";s:5:"label";}i:31;a:1:{s:4:"type";s:5:"label";}i:32;a:1:{s:4:"type";s:5:"label";}i:33;a:1:{s:4:"type";s:5:"label";}i:34;a:1:{s:4:"type";s:5:"label";}i:35;a:1:{s:4:"type";s:5:"label";}i:36;a:1:{s:4:"type";s:5:"label";}}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:11:"Phone/Email";s:4:"size";s:13:",,,_info_addr";}s:1:"D";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"30,255";s:4:"name";s:9:"info_addr";s:4:"help";s:76:"Custom contact-address, leave empty to use information from most recent link";}}i:5;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Subject";s:4:"size";s:15:",,,info_subject";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"span";s:3:"all";s:4:"name";s:12:"info_subject";s:4:"help";s:29:"a short subject for the entry";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:6;a:4:{s:1:"A";a:5:{s:4:"type";s:3:"tab";s:4:"span";s:3:"all";s:5:"label";s:64:"Description|Links|Delegation|Projectmanager|Customfields|History";s:4:"name";s:57:"description|links|delegation|project|customfields|history";s:4:"help";s:133:"longer textual description|Links of this entry|responsible user, priority|Project settings: price, times|Custom fields|Change history";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:7;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:21:"Dates, Status, Access";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:8;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Startdate";s:4:"size";s:17:",,,info_startdate";}s:1:"B";a:4:{s:4:"type";s:9:"date-time";s:4:"size";s:2:",2";s:4:"name";s:14:"info_startdate";s:4:"help";s:115:"when should the ToDo or Phonecall be started, it shows up from that date in the filter open or own open (startpage)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Enddate";s:4:"size";s:15:",,,info_enddate";}s:1:"D";a:3:{s:4:"type";s:4:"date";s:4:"name";s:12:"info_enddate";s:4:"help";s:49:"til when should the ToDo or Phonecall be finished";}}i:9;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";s:4:"size";s:14:",,,info_status";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:11:"info_status";s:4:"help";s:12:"@status_help";s:8:"onchange";s:183:"if (this.value==\'done\' || this.value==\'billed\') set_element(this.form,\'exec[info_percent]\',\'100\'); else if (this.value==\'not-started\') set_element(this.form,\'exec[info_percent]\',\'0\');";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Completed";s:4:"size";s:15:",,,info_percent";}s:1:"D";a:4:{s:4:"type";s:14:"select-percent";s:4:"name";s:12:"info_percent";s:4:"help";s:17:"Percent completed";s:8:"onchange";s:570:"if (this.value==100 && this.form[\'exec[info_status]\'].value != \'done\' && this.form[\'exec[info_status]\'].value != \'billed\' && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=\'done\'; else if (this.value != 100 && this.form[\'exec[info_status]\'].value != \'cancelled\') this.form[\'exec[info_status]\'].value=this.value != 0 ? \'ongoing\' : \'not-started\'; else if (this.value==0 && this.form[\'exec[info_status]\'].value != \'cancelled\' && this.form[\'exec[info_status]\'].value != \'offer\') this.form[\'exec[info_status]\'].value=\'not-started\'; ";}}i:10;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:21:",,,info_datecompleted";s:5:"label";s:14:"Date completed";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:18:"info_datecompleted";s:4:"help";s:84:"Date completed (leave it empty to have it automatic set if status is done or billed)";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Private";s:4:"size";s:14:",,,info_access";}s:1:"D";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:14:"private,public";s:4:"name";s:11:"info_access";s:4:"help";s:87:"should this entry only be visible to you and people you grant privat access via the ACL";}}i:11;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:10:"info_owner";s:8:"readonly";s:1:"1";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"D";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";i:1;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"info_modifier";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:9:"date-time";s:4:"span";s:10:",lpadding5";s:4:"name";s:17:"info_datemodified";s:8:"readonly";s:1:"1";}}}i:12;a:4:{s:1:"A";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:16:"Saves this entry";}s:4:"span";s:1:"2";i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:17:"Apply the changes";}i:3;a:5:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:4:"help";s:31:"leave without saveing the entry";s:7:"onclick";s:15:"window.close();";}i:4;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"delete this entry";s:7:"onclick";s:60:"return $cont[info_anz_subs] || confirm(\'Delete this entry\');";}}}s:4:"rows";i:12;s:4:"cols";i:4;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.hideFrom input { display: none; } +.link_select select { width: 250px; }','modified' => '1159943980',); $templ_data[] = array('name' => 'infolog.edit.customfields','template' => '','lang' => '','group' => '0','version' => '1.0.0.001','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:12:"customfields";s:4:"name";s:12:"customfields";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:15:"100%,100%,,,0,0";}}','size' => '100%,100%,,,0,0','style' => '','modified' => '1061732462',); @@ -56,10 +48,12 @@ $templ_data[] = array('name' => 'infolog.edit.description','template' => '','lan $templ_data[] = array('name' => 'infolog.edit.description','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:1:"A";s:3:"100";s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:11:"Description";s:4:"size";s:11:",,,info_des";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:5:{s:4:"type";s:8:"textarea";s:4:"size";s:5:"13,75";s:7:"no_lang";s:1:"1";s:4:"name";s:8:"info_des";s:4:"help";s:44:"enter a textual description of the log-entry";}}}s:4:"rows";i:2;s:4:"cols";i:2;s:4:"size";s:10:"100%,245,0";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"245";i:2;s:1:"0";}}}','size' => '100%,245,0','style' => '','modified' => '1051391600',); -$templ_data[] = array('name' => 'infolog.edit.links','template' => '','lang' => '','group' => '0','version' => '0.9.15.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:8:{s:1:"A";s:3:"100";s:2:"h1";s:13:",@status_only";s:2:"h2";s:13:",@status_only";s:2:"h4";s:3:"164";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:4:"100%";}}','size' => '100%','style' => '','modified' => '1075977056',); +$templ_data[] = array('name' => 'infolog.edit.history','template' => '','lang' => '','group' => '0','version' => '1.3.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:1:{s:2:"c1";s:4:",top";}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:10:"historylog";s:4:"name";s:7:"history";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,250,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"250";i:6;s:4:"auto";}}}','size' => '100%,250,,,,,auto','style' => '','modified' => '1181576846',); $templ_data[] = array('name' => 'infolog.edit.links','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:3:"100";s:2:"h1";s:13:",@status_only";s:2:"h2";s:13:",@status_only";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:17:"100%,245,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"245";i:6;s:4:"auto";}}}','size' => '100%,245,,,,,auto','style' => '','modified' => '1075977056',); +$templ_data[] = array('name' => 'infolog.edit.links','template' => '','lang' => '','group' => '0','version' => '1.3.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:7:{s:1:"A";s:3:"100";s:2:"h1";s:13:",@status_only";s:2:"h2";s:13:",@status_only";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c4";s:2:"th";s:2:"c5";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"link-add";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:5;s:4:"cols";i:2;s:4:"size";s:17:"100%,245,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"245";i:6;s:4:"auto";}}}','size' => '100%,245,,,,,auto','style' => '','modified' => '1075977056',); + $templ_data[] = array('name' => 'infolog.edit.project','template' => '','lang' => '','group' => '0','version' => '1.2.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:7:{s:1:"A";s:3:"100";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"h5";s:3:"60%";s:2:"c5";s:7:"row,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Projectmanager";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Project";}s:1:"B";a:4:{s:4:"type";s:21:"projectmanager-select";s:4:"name";s:5:"pm_id";s:8:"onchange";s:1:"1";s:4:"size";s:4:"None";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Price";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:24:"projectmanager-pricelist";s:4:"name";s:5:"pl_id";s:4:"size";s:4:"None";s:8:"onchange";s:207:"this.form[\'exec[info_price]\'].value=this.options[this.selectedIndex].text.lastIndexOf(\'(\') < 0 ? \'\' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf(\'(\')+1,-1);";}i:2;a:3:{s:4:"type";s:5:"float";s:4:"name";s:10:"info_price";s:4:"span";s:3:"all";}}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:20:",,,info_planned_time";s:5:"label";s:12:"planned time";}s:1:"B";a:3:{s:4:"type";s:13:"date-duration";s:4:"name";s:17:"info_planned_time";s:4:"size";s:23:",$cont[duration_format]";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:17:",,,info_used_time";s:5:"label";s:9:"used time";}s:1:"B";a:2:{s:4:"type";s:13:"date-duration";s:4:"name";s:14:"info_used_time";}}}s:4:"rows";i:5;s:4:"cols";i:2;s:4:"size";s:8:"100%,245";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"245";}}}','size' => '100%,245','style' => '','modified' => '1139017165',); $templ_data[] = array('name' => 'infolog.index','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:5:{s:1:"A";s:3:"90%";s:2:"h3";s:2:",1";s:2:"h2";s:6:",!@msg";s:2:"c6";s:7:"noPrint";s:2:"h4";s:7:",!@main";}i:1;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:8:"template";s:4:"name";s:11:"header_left";}s:1:"B";a:2:{s:4:"type";s:8:"template";s:4:"name";s:12:"header_right";}}i:4;a:2:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:4:"main";s:4:"span";s:3:"all";s:4:"name";s:27:"infolog.index.rows-noheader";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:9:"nextmatch";s:4:"size";s:20:"infolog.index.rows,1";s:4:"span";s:3:"all";s:4:"name";s:2:"nm";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:6;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:5:{s:4:"type";s:6:"button";s:5:"label";s:3:"Add";s:4:"name";s:9:"add[note]";s:4:"help";s:15:"Add a new Entry";s:7:"onclick";s:217:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&type=note&action=$cont[action]&action_id=$cont[action_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:6:"cancel";s:4:"help";s:17:"Back to main list";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:2;s:4:"size";s:12:"100%,,0,,0,0";}}','size' => '100%,,0,,0,0','style' => '','modified' => '1121355584',); @@ -82,6 +76,3 @@ $templ_data[] = array('name' => 'infolog.index.rows-noheader','template' => '',' $templ_data[] = array('name' => 'infolog.index.rows-noheader','template' => '','lang' => '','group' => '0','version' => '1.3.003','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:9:{s:1:"A";s:2:"2%";s:1:"C";s:3:"120";s:1:"E";s:34:"8%,@no_info_onwer_info_responsible";s:1:"F";s:25:"12%,@no_info_datemodified";s:1:"G";s:14:"3%,@no_actions";s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"H";s:14:"3%,@no_actions";s:1:"D";s:37:",@no_info_used_time_info_planned_time";}i:1;a:8:{s:1:"A";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";}i:2;a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";s:5:"align";s:6:"center";}i:3;a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Completed";s:5:"align";s:5:"right";}}s:1:"B";a:8:{s:4:"type";s:4:"vbox";s:4:"data";a:3:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:7:"Subject";s:4:"name";s:12:"info_subject";}}i:2;a:1:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:8:"info_des";}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Subject";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:11:"Description";}s:7:"options";a:1:{i:0;s:1:"2";}}s:1:"C";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:9:"Startdate";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Enddate";}i:3;a:2:{s:4:"type";s:5:"label";s:5:"label";s:14:"Date completed";}}s:1:"D";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Times";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"span";s:8:",planned";s:5:"label";s:7:"planned";}}s:1:"E";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:11:"Responsible";}}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"last changed";}s:1:"G";a:3:{s:4:"type";s:5:"label";s:5:"label";s:3:"Sub";s:4:"span";s:8:",noPrint";}s:1:"H";a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";s:4:"span";s:8:",noPrint";}}i:2;a:8:{s:1:"A";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:4:"4,,5";s:5:"align";s:6:"center";i:1;a:3:{s:4:"type";s:5:"image";s:5:"label";s:20:"$row_cont[info_type]";s:4:"name";s:17:"${row}[info_type]";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:57:"$row_cont[info_status_label],$row_cont[info_status_label]";s:5:"label";s:28:"$row_cont[info_status_label]";s:4:"name";s:31:"edit_status[$row_cont[info_id]]";s:4:"help";s:43:"Change the status of an entry, eg. close it";s:7:"onclick";s:186:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&info_id=$row_cont[info_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}i:3;a:6:{s:4:"type";s:6:"button";s:4:"size";s:23:"$row_cont[info_percent]";s:5:"label";s:23:"$row_cont[info_percent]";s:4:"name";s:32:"edit_percent[$row_cont[info_id]]";s:4:"help";s:43:"Change the status of an entry, eg. close it";s:7:"onclick";s:186:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&info_id=$row_cont[info_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}i:4;a:4:{s:4:"type";s:5:"image";s:5:"label";s:24:"$row_cont[info_percent2]";s:4:"name";s:21:"{$row}[info_percent2]";s:7:"onclick";s:186:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&info_id=$row_cont[info_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}}s:1:"B";a:7:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:4:{s:4:"type";s:4:"link";s:5:"label";s:23:"%s $row_cont[info_addr]";s:4:"name";s:17:"${row}[info_link]";s:4:"size";s:1:"b";}i:2;a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:5:"label";s:4:"span";s:21:",$row_cont[sub_class]";s:7:"no_lang";s:1:"1";s:4:"name";s:20:"${row}[info_subject]";}i:2;a:5:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:19:"{$row}[info_number]";s:4:"span";s:7:",infoId";}}i:3;a:4:{s:4:"type";s:5:"label";s:4:"size";s:3:",,1";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[info_des]";}i:4;a:2:{s:4:"type";s:11:"link-string";s:4:"name";s:17:"${row}[filelinks]";}s:4:"span";s:10:",fullWidth";}s:1:"C";a:8:{s:4:"type";s:4:"vbox";s:4:"size";s:8:"3,,0,0,1";s:4:"data";a:4:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:5:{s:4:"type";s:9:"date-time";s:4:"size";s:2:",8";s:4:"name";s:22:"${row}[info_startdate]";s:8:"readonly";s:1:"1";s:4:"span";s:12:",fixedHeight";}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"date";s:4:"span";s:33:",$row_cont[end_class] fixedHeight";s:4:"name";s:20:"${row}[info_enddate]";s:8:"readonly";s:1:"1";}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:26:"${row}[info_datecompleted]";s:8:"readonly";s:1:"1";s:4:"span";s:12:",fixedHeight";}}}s:4:"rows";i:3;s:4:"cols";i:1;i:1;a:5:{s:4:"type";s:9:"date-time";s:4:"size";s:2:",8";s:4:"name";s:22:"${row}[info_startdate]";s:8:"readonly";s:1:"1";s:4:"span";s:12:",fixedHeight";}i:2;a:4:{s:4:"type";s:4:"date";s:4:"span";s:33:",$row_cont[end_class] fixedHeight";s:4:"name";s:20:"${row}[info_enddate]";s:8:"readonly";s:1:"1";}i:3;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:26:"${row}[info_datecompleted]";s:8:"readonly";s:1:"1";s:4:"span";s:12:",fixedHeight";}}s:1:"D";a:8:{s:4:"type";s:4:"vbox";s:4:"data";a:4:{i:0;a:1:{s:2:"h2";s:14:",@no_timesheet";}i:1;a:1:{s:1:"A";a:5:{s:4:"type";s:13:"date-duration";s:4:"name";s:22:"${row}[info_used_time]";s:8:"readonly";s:1:"1";s:4:"size";s:5:",,,,1";s:4:"span";s:3:"all";}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:13:"date-duration";s:4:"name";s:27:"${row}[info_sum_timesheets]";s:8:"readonly";s:1:"1";s:4:"size";s:5:",,,,1";}}i:3;a:1:{s:1:"A";a:5:{s:4:"type";s:13:"date-duration";s:4:"name";s:25:"${row}[info_planned_time]";s:4:"span";s:11:"all,planned";s:8:"readonly";s:1:"1";s:4:"size";s:5:",,,,1";}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:13:"date-duration";s:4:"name";s:22:"${row}[info_used_time]";s:8:"readonly";s:1:"1";s:4:"size";s:16:"@duration_format";}i:2;a:5:{s:4:"type";s:13:"date-duration";s:4:"name";s:27:"${row}[info_sum_timesheets]";s:8:"readonly";s:1:"1";s:4:"size";s:16:"@duration_format";s:4:"span";s:10:",timesheet";}i:3;a:5:{s:4:"type";s:13:"date-duration";s:4:"name";s:25:"${row}[info_planned_time]";s:4:"span";s:11:"all,planned";s:8:"readonly";s:1:"1";s:4:"size";s:16:"@duration_format";}}s:1:"E";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:18:"${row}[info_owner]";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:24:"${row}[info_responsible]";s:8:"readonly";s:1:"1";s:4:"size";s:1:"5";}}s:1:"F";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:5:"2,0,0";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:25:"${row}[info_datemodified]";s:8:"readonly";s:1:"1";}i:2;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:21:"${row}[info_modifier]";s:8:"readonly";s:1:"1";}}s:1:"G";a:8:{s:4:"type";s:4:"vbox";s:4:"size";s:5:"4,0,0";s:5:"align";s:6:"center";i:1;a:7:{s:4:"type";s:6:"button";s:4:"size";s:3:"new";s:5:"label";s:7:"Add sub";s:5:"align";s:6:"center";s:4:"name";s:22:"sp[$row_cont[info_id]]";s:4:"help";s:46:"Add a new sub-task, -note, -call to this entry";s:7:"onclick";s:198:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&action=sp&action_id=$row_cont[info_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:8:"view.gif";s:5:"label";s:9:"View subs";s:5:"align";s:6:"center";s:4:"name";s:24:"view[$row_cont[info_id]]";s:4:"help";s:27:"View all subs of this entry";}i:3;a:6:{s:4:"type";s:6:"button";s:4:"size";s:10:"parent.gif";s:5:"label";s:11:"View parent";s:5:"align";s:6:"center";s:4:"name";s:31:"view[$row_cont[info_id_parent]]";s:4:"help";s:46:"View the parent of this entry and all his subs";}i:4;a:6:{s:4:"type";s:6:"button";s:4:"size";s:9:"timesheet";s:5:"label";s:19:"Add timesheet entry";s:4:"name";s:29:"timesheet[$row_cont[info_id]]";s:7:"onclick";s:233:"window.open(egw::link(\'/index.php\',\'menuaction=timesheet.uitimesheet.edit&link_app[]=infolog&link_id[]=$row_cont[info_id]$row_cont[extra_links]\'),\'_blank\',\'dependent=yes,width=600,height=400,scrollbars=yes,status=yes\'); return false;";s:5:"align";s:6:"center";}s:4:"span";s:8:",noPrint";}s:1:"H";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"name";s:24:"edit[$row_cont[info_id]]";s:4:"help";s:15:"Edit this entry";s:7:"onclick";s:186:"window.open(egw::link(\'/index.php\',\'menuaction=infolog.uiinfolog.edit&info_id=$row_cont[info_id]\'),\'_blank\',\'dependent=yes,width=750,height=600,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"name";s:26:"delete[$row_cont[info_id]]";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:64:"return $row_cont[info_anz_subs] || confirm(\'Delete this entry\');";}i:3;a:5:{s:4:"type";s:6:"button";s:4:"size";s:4:"done";s:5:"label";s:5:"Close";s:4:"name";s:25:"close[$row_cont[info_id]]";s:4:"help";s:50:"Sets the status of this entry and its subs to done";}s:4:"span";s:8:",noPrint";}}}s:4:"rows";i:2;s:4:"cols";i:8;}}','size' => '','style' => '','modified' => '1142615238',); -$templ_data[] = array('name' => 'infolog.Lebert.Baienfurt.Kopf','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:1:{s:2:"c1";s:4:",top";}i:1;a:2:{s:1:"A";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:5:"label";s:17:"Lebert + Co. GmbH";s:4:"span";s:11:",my_heading";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:23:"International Spedition";}i:3;a:2:{s:4:"type";s:5:"label";s:5:"label";s:18:"Eisenbahnstrasse 4";}i:4;a:2:{s:4:"type";s:5:"label";s:5:"label";s:15:"88255 Baienfurt";}}s:1:"B";a:4:{s:4:"type";s:5:"image";s:4:"name";s:8:"logo.png";s:7:"no_lang";s:1:"1";s:5:"align";s:5:"right";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"size";s:14:"100%,,,my_form";s:7:"options";a:2:{i:3;s:7:"my_form";i:0;s:4:"100%";}}}','size' => '100%,,,my_form','style' => '.xmy_form td { font-size: 20pt; } -.my_heading { font-size: 120%; font-weight: bold; }','modified' => '1158752011',); - diff --git a/infolog/setup/phpgw_de.lang b/infolog/setup/phpgw_de.lang index 8ffc6e0871..f38538ddea 100644 --- a/infolog/setup/phpgw_de.lang +++ b/infolog/setup/phpgw_de.lang @@ -1,4 +1,7 @@ %1 days in advance infolog de %1 Tage im Vorraus +%1 deleted infolog de %1 gelöscht +%1 deleted by %2 at %3 infolog de %1 wurde von %2 am %3 gelöscht +%1 modified infolog de %1 geändert %1 modified by %2 at %3 infolog de %1 wurde von %2 am %3 geändert %1 records imported infolog de %1 Datensätze importiert %1 records read (not yet imported, you may go %2back%3 and uncheck test import) infolog de %1 Datensätze gelesen (noch nicht importiert, sie können %2zurück%3 gehen und Test Import ausschalten) @@ -97,6 +100,7 @@ delete one record by passing its id. infolog de Einen Datensatz spezifiziert dur delete the entry infolog de Eintrag löschen delete this entry infolog de diesen Eintrag löschen delete this entry and all listed sub-entries infolog de Diesen Eintrag und all aufgelisteten Untereinträge löschen +deleted infolog de gelöscht deletes the selected typ infolog de löscht den ausgewählten Typ deletes this field infolog de löscht dieses Feld deletes this status infolog de löscht diesen Status @@ -142,6 +146,8 @@ from infolog de Von general infolog de Allgemein group owner for infolog de Gruppeneigentümer für high infolog de hoch +history logging infolog de Protokollierung der Historie +history logging and deleting of items infolog de Protokollierung der Historie und löschen von Einträgen id infolog de Id if a type has a group owner, all entries of that type will be owned by the given group and not the user who created it! infolog de Wenn ein Typ einen Gruppeneigentümer hat, gehören alle Einträge dieses Typs der angegebenen Gruppe und NICHT dem Benutzer der sie angelegt hat! if not set, the line with search and filters is hidden for less entries then "max matches per page" (as defined in your common preferences). infolog de Falls nicht gesetzt, wird die Suche und die Filter ausgeblendet für weniger Einträge als "maximale Treffer pro Seite" (in ihren allg. Einstellungen definiert). @@ -181,6 +187,7 @@ max length of the input [, length of the inputfield (optional)] infolog de max. name must not be empty !!! infolog de Name darf nicht leer sein !!! name of new type to create infolog de Name des neu anzulegenden Types never hide search and filters infolog de Suche und Filter niemals ausblenden +new %1 infolog de Neue %1 new %1 created by %2 at %3 infolog de Neue %1 wurde von %2 am %3 angelegt new name infolog de neuer name new search infolog de Neue Suche @@ -322,7 +329,6 @@ urgent infolog de Dringend used time infolog de benötigte Zeit valid path on clientside
eg. \\server\share or e:\ infolog de gültiger Pfad clientseitig
zB. \\Server\Share oder e:\ valid path on clientside
eg. \servershare or e: infolog de gültiger Pfad clientseitig
zB. \\Server\Share oder e:\ -valid path on clientside
eg. servershare or e: infolog de gültiger Pfad clientseitig
zB. \\Server\Share oder e:\ values for selectbox infolog de Werte für die Auswahlbox view all subs of this entry infolog de alle Untereinträge dieses Eintrag anzeigen view other subs infolog de andere Untereinträge anzeigen @@ -337,6 +343,9 @@ will-call infolog de ruft zur write (add or update) a record by passing its fields. infolog de Schreiben (zufügen oder aktualisieren) eines Datensatzes durch Angabe seiner Felder. yes - delete infolog de Ja - Löschen yes - delete including sub-entries infolog de Ja - Löschen einschließlich Untereinträge +yes, noone can purge deleted items infolog de Ja, niemand darf gelöschte Einträge bereinigen +yes, only admins can purge deleted items infolog de Ja, nur Admins dürfen gelöschte Einträge bereinigen +yes, with purging of deleted items possible infolog de Ja, jeder darf gelöschte Einträge bereinigen 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 Fälligkeitsdatum eingegeben you have entered an invalid starting date infolog de Sie haben ein ungültiges Startdatum eingegeben diff --git a/infolog/setup/phpgw_en.lang b/infolog/setup/phpgw_en.lang index 8bad9a7290..d2b7200304 100644 --- a/infolog/setup/phpgw_en.lang +++ b/infolog/setup/phpgw_en.lang @@ -1,4 +1,7 @@ %1 days in advance infolog en %1 days in advance +%1 deleted infolog en %1 deleted +%1 deleted by %2 at %3 infolog en %1 deleted by %2 at %3 +%1 modified infolog en %1 modified %1 modified by %2 at %3 infolog en %1 modified by %2 at %3 %1 records imported infolog en %1 records imported %1 records read (not yet imported, you may go %2back%3 and uncheck test import) infolog en %1 records read (not yet imported, you may go %2back%3 and uncheck Test Import) @@ -97,6 +100,7 @@ delete one record by passing its id. infolog en Delete one record by passing its delete the entry infolog en Delete the entry delete this entry infolog en delete this entry delete this entry and all listed sub-entries infolog en Delete this entry and all listed sub-entries +deleted infolog en deleted deletes the selected typ infolog en deletes the selected type deletes this field infolog en deletes this field deletes this status infolog en deletes this status @@ -142,6 +146,8 @@ from infolog en From general infolog en General group owner for infolog en Group owner for high infolog en high +history logging infolog en History logging +history logging and deleting of items infolog en History logging and deleting of items id infolog en Id if a type has a group owner, all entries of that type will be owned by the given group and not the user who created it! infolog en If a type has a group owner, all entries of that type will be owned by the given group and NOT the user who created it! if not set, the line with search and filters is hidden for less entries then "max matches per page" (as defined in your common preferences). infolog en If not set, the line with search and filters is hidden for less entries then "max matches per page" (as defined in your common preferences). @@ -181,6 +187,7 @@ max length of the input [, length of the inputfield (optional)] infolog en max l name must not be empty !!! infolog en Name must not be empty !!! name of new type to create infolog en name of new type to create never hide search and filters infolog en Never hide search and filters +new %1 infolog en New %1 new %1 created by %2 at %3 infolog en New %1 created by %2 at %3 new name infolog en new name new search infolog en New search @@ -334,6 +341,9 @@ will-call infolog en will call write (add or update) a record by passing its fields. infolog en Write (add or update) a record by passing its fields. yes - delete infolog en Yes - Delete yes - delete including sub-entries infolog en Yes - Delete including sub-entries +yes, noone can purge deleted items infolog en Yes, noone can purge deleted items +yes, only admins can purge deleted items infolog en Yes, only admins can purge deleted items +yes, with purging of deleted items possible infolog en Yes, with purging of deleted items possible 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 due date you have entered an invalid starting date infolog en You have entered an invalid starting date diff --git a/infolog/templates/default/admin.tpl b/infolog/templates/default/admin.tpl index b2c3469d6f..adc7c7efab 100644 --- a/infolog/templates/default/admin.tpl +++ b/infolog/templates/default/admin.tpl @@ -22,8 +22,12 @@ {lang_responsible_edit} {responsible_edit} + + {lang_history} + -   + {lang_history2} + {history} {text} diff --git a/infolog/templates/default/edit.xet b/infolog/templates/default/edit.xet index ac00e76e13..2fd0434c61 100644 --- a/infolog/templates/default/edit.xet +++ b/infolog/templates/default/edit.xet @@ -126,7 +126,19 @@ -