From 418debd53cd52628f3a8451483f5e5b77e4e3a08 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Mon, 13 Jun 2011 17:43:51 +0000 Subject: [PATCH] Fix indenting and sorting on statuses --- timesheet/inc/class.timesheet_bo.inc.php | 117 ++++++++++++++--------- timesheet/inc/class.timesheet_ui.inc.php | 11 ++- 2 files changed, 78 insertions(+), 50 deletions(-) diff --git a/timesheet/inc/class.timesheet_bo.inc.php b/timesheet/inc/class.timesheet_bo.inc.php index 9818089b85..70abc54af6 100644 --- a/timesheet/inc/class.timesheet_bo.inc.php +++ b/timesheet/inc/class.timesheet_bo.inc.php @@ -110,10 +110,6 @@ class timesheet_bo extends so_sql_cf * @var array */ var $status_labels_config = array(); - /** - * Array with substatus of label configuration - */ - var $status_labels_substatus = array(); /** * Instance of the timesheet_tracking object * @@ -158,48 +154,10 @@ class timesheet_bo extends so_sql_cf $this->config_data = config::read(TIMESHEET_APP); $this->quantity_sum = $this->config_data['quantity_sum'] == 'true'; - if($this->config_data['status_labels']) - { - $this->status_labels =& $this->config_data['status_labels']; - if (!is_array($this->status_labels)) $this->status_labels= array($this->status_labels); - foreach ($this->status_labels as $status_id => $label) - { - if (!is_array($label)) - { //old values, bevor parent status - $name = $label; - $label=array(); - $label['name'] = $name; - $label['parent'] = ''; - } - $sort_labels[$status_id][] = $label['name']; - $this->status_labels_config[$status_id] = $label; - if ($label['parent']!='') - { - $sort = $label['parent']?$label['parent']:$status_id; - $sort_labels[$sort][$status_id]= $label['name']; - $this->status_labels_substatus[$sort][$status_id] = $status_id; - if (!isset($this->status_labels_substatus[$sort][$sort])) - { - $this->status_labels_substatus[$sort][$sort]= $sort; - } - } - } - unset($this->status_labels); - foreach ($sort_labels as $status_id => $label_sub) - { - if (!isset($this->status_labels[$status_id])) $this->status_labels[$status_id] = $this->status_labels_config[$status_id]['name']; - foreach ($sort_labels[$status_id] as $sub_status_id => $sub_label) - { - if (isset($this->status_labels_config[$sub_status_id])) - { - $level = '  '; - if (isset($this->status_labels_substatus[$sub_status_id])) $this->status_labels_substatus['2level'][$sub_status_id] = $sub_status_id ; - if (isset($this->status_labels_substatus['2level'][$status_id])) $level = '    '; - $this->status_labels[$sub_status_id]= $level.$this->status_labels_config[$sub_status_id]['name']; - } - } - } - } + + // Load & process statuses + if($this->config_data['status_labels']) $this->load_statuses(); + $this->today = mktime(0,0,0,date('m',$this->now),date('d',$this->now),date('Y',$this->now)); // save us in $GLOBALS['timesheet_bo'] for ExecMethod used in hooks @@ -210,6 +168,73 @@ class timesheet_bo extends so_sql_cf $this->grants = $GLOBALS['egw']->acl->get_grants(TIMESHEET_APP); } + /** + * Load status labels + */ + protected function load_statuses() + { + $this->status_labels =& $this->config_data['status_labels']; + if (!is_array($this->status_labels)) $this->status_labels= array($this->status_labels); + + foreach ($this->status_labels as $status_id => $label) + { + if (!is_array($label)) + { //old values, before parent status + $name = $label; + $label=array(); + $label['name'] = $name; + $label['parent'] = ''; + } + $label['id'] = $status_id; + $this->status_labels_config[$status_id] = $label; + } + + // Organise into tree structure + $map = array( + '' => array('substatus' => array()) + ); + foreach($this->status_labels_config as $id => &$status) { + $status['substatus'] = array(); + $map[$id] = &$status; + } + foreach($this->status_labels_config as &$status) { + $map[$status['parent']]['substatus'][] = &$status; + } + $tree = $map['']['substatus']; + + // Make nice selectbox labels + $this->status_labels = array(); + $this->make_status_labels($tree, $this->status_labels); + + // Sort config based on tree + $sorted = array(); + foreach($this->status_labels as $status_id => $label) { + $sorted[$status_id] = $this->status_labels_config[$status_id]; + //$sorted[$status_id]['name'] = $label; + unset($sorted[$status_id]['substatus']); + } + $this->status_labels_config = $sorted; + } + + /** + * Make nice labels with leading spaces depending on depth + * + * @param statuses List of statuses to process, with sub-statuses in a 'substatus' array + * @param labels Array of labels, pass array() and labels will be built in it + * @param depth Current depth + * + * @return None, labels are built in labels parameter + */ + protected function make_status_labels($statuses, &$labels, $depth=0) { + foreach($statuses as $status) { + $labels[$status['id']] = str_pad('',$depth*12, " ",STR_PAD_LEFT).trim(str_replace(' ','',$status['name'])); + //$labels[$status['id']] = str_pad('',$depth, "+------",STR_PAD_LEFT).$status['name']; + if(count($status['substatus']) > 0) { + $this->make_status_labels($status['substatus'], $labels, $depth+1); + } + } + } + /** * get list of specified grants as uid => Username pairs * diff --git a/timesheet/inc/class.timesheet_ui.inc.php b/timesheet/inc/class.timesheet_ui.inc.php index fd29a5bcc6..76cc9bee3f 100644 --- a/timesheet/inc/class.timesheet_ui.inc.php +++ b/timesheet/inc/class.timesheet_ui.inc.php @@ -1067,14 +1067,13 @@ class timesheet_ui extends timesheet_bo break; case 'apply': case 'save': - foreach($content['statis'] as $cat) + foreach($content['statis'] as &$cat) { $id = $cat['id']; if (($cat ['name'] !== $this->status_labels_config[$id]) && ($cat ['name'] !== '') || ($cat ['parent'] !== $this->status_labels_config[$id]['parent']) && ($cat ['parent'] !== '')) { - $this->status_labels[$id] = $cat['name']; $this->status_labels_config[$id] = array( - 'name' => $cat['name'], + 'name' => trim(str_replace(' ', '', $cat['name'])), 'parent' => $cat['parent'], 'admin' => $cat['admin']); $need_update = true; @@ -1083,6 +1082,8 @@ class timesheet_ui extends timesheet_bo if ($need_update) { config::save_value('status_labels',$this->status_labels_config,TIMESHEET_APP); + $this->config_data = config::read(TIMESHEET_APP); + $this->load_statuses(); $msg .= lang('Status updated.'); } if ($button == 'apply') break; @@ -1108,6 +1109,7 @@ class timesheet_ui extends timesheet_bo } $i = 1; + $max_id = 0; unset($content['statis']); foreach($this->status_labels_config as $id => $label) { @@ -1116,11 +1118,12 @@ class timesheet_ui extends timesheet_bo $content['statis'][$i]['parent']= $label['parent']; $content['statis'][$i]['admin']= $label['admin']; $i++; + $max_id = max($id, $max_id); } $content['statis'][$i]['name'] = ''; $content['statis'][$i]['parent']; $content['statis'][$i]['admin'] = ''; - $content['statis'][$i]['id'] = ++$id; + $content['statis'][$i]['id'] = ++$max_id; $content['msg'] = $msg; $preserv = $content;