forked from extern/egroupware
fixed some problems with the history functions
This commit is contained in:
parent
9259494a02
commit
46f8530437
@ -158,25 +158,9 @@ class timesheet_bo extends so_sql_cf
|
|||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $field2history = array(
|
var $field2history = array();
|
||||||
'ts_project' => 'Pro',
|
|
||||||
'ts_title' => 'Tit',
|
|
||||||
'cat_id' => 'Cat',
|
|
||||||
'ts_description' => 'Des',
|
|
||||||
'ts_start' => 'Sta',
|
|
||||||
'ts_duration' => 'Dur',
|
|
||||||
'ts_quantity' => 'Qua',
|
|
||||||
'ts_unitprice' => 'Uni',
|
|
||||||
'ts_owner' => 'Own',
|
|
||||||
'ts_modifier' => 'Mid',
|
|
||||||
'ts_status' => 'Sta',
|
|
||||||
'pm_id' => 'Pri',
|
|
||||||
// pseudo fields used in edit
|
|
||||||
//'link_to' => 'Att',
|
|
||||||
'customfields' => '#c',
|
|
||||||
);
|
|
||||||
/**
|
/**
|
||||||
* Translate field-name to 2-char history status
|
* setting field-name from DB to history status
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
@ -246,6 +230,11 @@ class timesheet_bo extends so_sql_cf
|
|||||||
$GLOBALS['timesheet_bo'] =& $this;
|
$GLOBALS['timesheet_bo'] =& $this;
|
||||||
}
|
}
|
||||||
$this->grants = $GLOBALS['egw']->acl->get_grants(TIMESHEET_APP);
|
$this->grants = $GLOBALS['egw']->acl->get_grants(TIMESHEET_APP);
|
||||||
|
//set fields for tracking
|
||||||
|
$this->field2history = array_keys($this->db_cols);
|
||||||
|
$this->field2history = array_diff(array_combine($this->field2history,$this->field2history),
|
||||||
|
array('ts_modified'));
|
||||||
|
$this->field2history = $this->field2history +array('customfields' => '#c'); //add custom fields for history
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -818,118 +807,6 @@ class timesheet_bo extends so_sql_cf
|
|||||||
}
|
}
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Tracks the changes in one entry $data, by comparing it with the last version in $old
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
* @param boolean $deleted=null can be set to true to let the tracking know the item got deleted or undelted
|
|
||||||
* @param array $changed_fields=null changed fields from ealier call to $this->changed_fields($data,$old), to not compute it again
|
|
||||||
* @return int|boolean false on error, integer number of changes logged or true for new entries ($old == null)
|
|
||||||
*/
|
|
||||||
public function track(array $data,array $old=null,$user=null,$deleted=null,array $changed_fields=null)
|
|
||||||
{
|
|
||||||
$this->user = !is_null($user) ? $user : $GLOBALS['egw_info']['user']['account_id'];
|
|
||||||
|
|
||||||
$changes = true;
|
|
||||||
if ($old && $this->field2history)
|
|
||||||
{
|
|
||||||
$changes = $this->save_history($data,$old,$deleted,$changed_fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $changes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save changes to the history log
|
|
||||||
*
|
|
||||||
* @internal use only track($data,$old)
|
|
||||||
* @param array $data current entry
|
|
||||||
* @param array $old=null old/last state of the entry or null for a new entry
|
|
||||||
* @param boolean $deleted=null can be set to true to let the tracking know the item got deleted or undelted
|
|
||||||
* @param array $changed_fields=null changed fields from ealier call to $this->changed_fields($data,$old), to not compute it again
|
|
||||||
* @return int number of log-entries made
|
|
||||||
*/
|
|
||||||
protected function save_history(array $data,array $old=null,$deleted=null,array $changed_fields=null)
|
|
||||||
{
|
|
||||||
if (is_null($changed_fields))
|
|
||||||
{
|
|
||||||
$changed_fields = self::changed_fields($data,$old);
|
|
||||||
}
|
|
||||||
if (!$changed_fields) return 0;
|
|
||||||
|
|
||||||
if (!is_object($this->historylog) || $this->historylog->user != $this->user)
|
|
||||||
{
|
|
||||||
$this->historylog = new historylog($this->app,$this->user);
|
|
||||||
}
|
|
||||||
foreach($changed_fields as $name)
|
|
||||||
{
|
|
||||||
$status = $this->field2history[$name];
|
|
||||||
if (is_array($status)) // 1:N relation --> remove common rows
|
|
||||||
{
|
|
||||||
self::compact_1_N_relation($data[$name],$status);
|
|
||||||
self::compact_1_N_relation($old[$name],$status);
|
|
||||||
$added = array_diff($data[$name],$old[$name]);
|
|
||||||
$removed = array_diff($old[$name],$data[$name]);
|
|
||||||
$n = max(array(count($added),count($removed)));
|
|
||||||
for($i = 0; $i < $n; ++$i)
|
|
||||||
{
|
|
||||||
$this->historylog->add($name,$data[$this->id_field],$added[$i],$removed[$i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$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]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count($changed_fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute changes between new and old data
|
|
||||||
*
|
|
||||||
* Can be used to check if saving the data is really necessary or user just pressed save
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @param array $old=null
|
|
||||||
* @return array of keys with different values in $data and $old
|
|
||||||
*/
|
|
||||||
public function changed_fields(array $data,array $old=null)
|
|
||||||
{
|
|
||||||
if (is_null($old)) return array_keys($data);
|
|
||||||
|
|
||||||
$changed_fields = array();
|
|
||||||
foreach($this->field2history as $name => $status)
|
|
||||||
{
|
|
||||||
if (is_array($status)) // 1:N relation
|
|
||||||
{
|
|
||||||
self::compact_1_N_relation($data[$name],$status);
|
|
||||||
self::compact_1_N_relation($old[$name],$status);
|
|
||||||
}
|
|
||||||
if ($old[$name] != $data[$name] && !(!$old[$name] && !$data[$name]))
|
|
||||||
{
|
|
||||||
// normalize arrays, we do NOT care for the order of multiselections
|
|
||||||
if (is_array($data[$name]) || is_array($old[$name]))
|
|
||||||
{
|
|
||||||
if (!is_array($data[$name])) $data[$name] = explode(',',$data[$name]);
|
|
||||||
if (!is_array($old[$name])) $old[$name] = explode(',',$old[$name]);
|
|
||||||
if (count($data[$name]) == count($old[$name]))
|
|
||||||
{
|
|
||||||
sort($data[$name]);
|
|
||||||
sort($old[$name]);
|
|
||||||
if ($data[$name] == $old[$name]) continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$changed_fields[] = $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $changed_fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -13,7 +13,7 @@
|
|||||||
/**
|
/**
|
||||||
* Timesheet - tracking object for the tracker
|
* Timesheet - tracking object for the tracker
|
||||||
*/
|
*/
|
||||||
class timesheet_tracking extends timesheet_bo
|
class timesheet_tracking extends bo_tracking
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Application we are tracking (required!)
|
* Application we are tracking (required!)
|
||||||
@ -65,12 +65,14 @@ class timesheet_tracking extends timesheet_bo
|
|||||||
* @param timesheet_bo $botimesheet
|
* @param timesheet_bo $botimesheet
|
||||||
* @return timesheet_tracking
|
* @return timesheet_tracking
|
||||||
*/
|
*/
|
||||||
function __construct(&$botimesheet)
|
function __construct($bo)
|
||||||
{
|
{
|
||||||
parent::__construct(); // calling the constructor of the extended class
|
parent::__construct(); // calling the constructor of the extended class
|
||||||
|
|
||||||
$this->timesheet =& $botimesheet;
|
$this->bo = $bo;
|
||||||
$this->field2history =& $botimesheet->field2history;
|
|
||||||
|
$this->field2history = $this->bo->field2history;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -309,17 +309,15 @@ class timesheet_ui extends timesheet_bo
|
|||||||
'id' => $this->data['ts_id'],
|
'id' => $this->data['ts_id'],
|
||||||
'app' => 'timesheet',
|
'app' => 'timesheet',
|
||||||
'status-widgets' => array(
|
'status-widgets' => array(
|
||||||
'Sta' => $this->status_labels,
|
'ts_status' => $this->status_labels,
|
||||||
'Mod' => 'select-account',
|
'ts_modifier' => 'select-account',
|
||||||
'Dur' => 'date-time',
|
'cat_id' => 'select-cat',
|
||||||
'Cat' => 'select-cat',
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
foreach($this->field2history as $field => $status)
|
foreach($this->field2history as $field => $status)
|
||||||
{
|
{
|
||||||
$sel_options['status'][$status] = $this->field2label[$field];
|
$sel_options['status'][$status] = $this->field2label[$field];
|
||||||
}
|
}
|
||||||
|
|
||||||
// the actual title-blur is either the preserved title blur (if we are called from infolog entry),
|
// the actual title-blur is either the preserved title blur (if we are called from infolog entry),
|
||||||
// or the preserved project-blur comming from the current selected project
|
// or the preserved project-blur comming from the current selected project
|
||||||
$content['ts_title_blur'] = $preserv['ts_title_blur'] ? $preserv['ts_title_blur'] : $preserv['ts_project_blur'];
|
$content['ts_title_blur'] = $preserv['ts_title_blur'] ? $preserv['ts_title_blur'] : $preserv['ts_project_blur'];
|
||||||
|
Loading…
Reference in New Issue
Block a user