From 46f8530437cf46c7e69c2f5c9029453e56ab765f Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sun, 13 Sep 2009 10:48:40 +0000 Subject: [PATCH] fixed some problems with the history functions --- timesheet/inc/class.timesheet_bo.inc.php | 137 +----------------- .../inc/class.timesheet_tracking.inc.php | 10 +- timesheet/inc/class.timesheet_ui.inc.php | 8 +- 3 files changed, 16 insertions(+), 139 deletions(-) diff --git a/timesheet/inc/class.timesheet_bo.inc.php b/timesheet/inc/class.timesheet_bo.inc.php index c0bdf51a01..d964de726b 100644 --- a/timesheet/inc/class.timesheet_bo.inc.php +++ b/timesheet/inc/class.timesheet_bo.inc.php @@ -158,25 +158,9 @@ class timesheet_bo extends so_sql_cf * * @var 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', - ); + var $field2history = array(); /** - * Translate field-name to 2-char history status + * setting field-name from DB to history status * * @var array */ @@ -246,6 +230,11 @@ class timesheet_bo extends so_sql_cf $GLOBALS['timesheet_bo'] =& $this; } $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(); } - /** - * 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; - } - } \ No newline at end of file diff --git a/timesheet/inc/class.timesheet_tracking.inc.php b/timesheet/inc/class.timesheet_tracking.inc.php index f76a1aaca3..bcaffe8aed 100644 --- a/timesheet/inc/class.timesheet_tracking.inc.php +++ b/timesheet/inc/class.timesheet_tracking.inc.php @@ -13,7 +13,7 @@ /** * Timesheet - tracking object for the tracker */ -class timesheet_tracking extends timesheet_bo +class timesheet_tracking extends bo_tracking { /** * Application we are tracking (required!) @@ -65,12 +65,14 @@ class timesheet_tracking extends timesheet_bo * @param timesheet_bo $botimesheet * @return timesheet_tracking */ - function __construct(&$botimesheet) + function __construct($bo) { parent::__construct(); // calling the constructor of the extended class - $this->timesheet =& $botimesheet; - $this->field2history =& $botimesheet->field2history; + $this->bo = $bo; + + $this->field2history = $this->bo->field2history; + } /** diff --git a/timesheet/inc/class.timesheet_ui.inc.php b/timesheet/inc/class.timesheet_ui.inc.php index 2329c951ad..cb78d03537 100644 --- a/timesheet/inc/class.timesheet_ui.inc.php +++ b/timesheet/inc/class.timesheet_ui.inc.php @@ -309,17 +309,15 @@ class timesheet_ui extends timesheet_bo 'id' => $this->data['ts_id'], 'app' => 'timesheet', 'status-widgets' => array( - 'Sta' => $this->status_labels, - 'Mod' => 'select-account', - 'Dur' => 'date-time', - 'Cat' => 'select-cat', + 'ts_status' => $this->status_labels, + 'ts_modifier' => 'select-account', + 'cat_id' => 'select-cat', ), ); foreach($this->field2history as $field => $status) { $sel_options['status'][$status] = $this->field2label[$field]; } - // 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 $content['ts_title_blur'] = $preserv['ts_title_blur'] ? $preserv['ts_title_blur'] : $preserv['ts_project_blur'];