* Timesheet: if linked via ProjectManager, behave identical as if project was set in own GUI, fixed setting project to none to also unset project-title and blur

This commit is contained in:
Ralf Becker 2012-05-30 08:21:18 +00:00
parent 5b59e85574
commit 2427a60c90
3 changed files with 74 additions and 9 deletions

View File

@ -804,4 +804,47 @@ class timesheet_bo extends so_sql_cf
} }
return array(); return array();
} }
/**
* receives notifications from the link-class: new, deleted links to timesheets, or updated content of linked entries
*
* Function makes sure timesheets linked or unlinked to projects via projectmanager behave like ones
* linked via timesheets project-selector, thought timesheet only stores project-title, not the id!
*
* @param array $data array with keys type, id, target_app, target_id, link_id, data
*/
function notify($data)
{
//error_log(__METHOD__.'('.array2string($data).')');
$backup =& $this->data; // backup internal data in case class got re-used by ExecMethod
unset($this->data);
if ($data['target_app'] == 'projectmanager' && $this->read($data['id']))
{
switch($data['type'])
{
case 'link':
case 'update':
if (empty($this->data['ts_project'])) // timesheet has not yet project set --> set just linked one
{
$pm_id = $data['target_id'];
}
break;
case 'unlink': // if current project got unlinked --> unset it
if ($this->data['ts_project'] == projectmanager_bo::link_title($data['target_id']))
{
$pm_id = 0;
}
break;
}
if (isset($pm_id))
{
$ts_project = $pm_id ? egw_link::title('projectmanager', $pm_id) : null;
$this->update(array('ts_project' => $ts_project));
//error_log(__METHOD__."() setting pm_id=$pm_id --> ts_project=".array2string($ts_project));
}
}
if ($backup) $this->data = $backup;
}
} }

View File

@ -57,6 +57,7 @@ class timesheet_hooks
'add_popup' => '600x425', 'add_popup' => '600x425',
'file_access'=> TIMESHEET_APP.'.timesheet_bo.file_access', 'file_access'=> TIMESHEET_APP.'.timesheet_bo.file_access',
'file_access_user' => true, // file_access supports 4th parameter $user 'file_access_user' => true, // file_access supports 4th parameter $user
'notify' => TIMESHEET_APP.'.timesheet_bo.notify',
); );
} }

View File

@ -63,9 +63,9 @@ class timesheet_ui extends timesheet_bo
{ {
if (!$this->read((int)$_GET['ts_id'])) if (!$this->read((int)$_GET['ts_id']))
{ {
$GLOBALS['egw']->common->egw_header(); common::egw_header();
echo "<script>alert('".lang('Permission denied!!!')."'); window.close();</script>\n"; echo "<script>alert('".lang('Permission denied!!!')."'); window.close();</script>\n";
$GLOBALS['egw']->common->egw_exit(); common::egw_exit();
} }
if (!$view && !$this->check_acl(EGW_ACL_EDIT)) if (!$view && !$this->check_acl(EGW_ACL_EDIT))
{ {
@ -143,6 +143,14 @@ class timesheet_ui extends timesheet_bo
{ {
unset($this->data[$key]); unset($this->data[$key]);
} }
// user switched project to none --> remove project and blur
if ($this->data['ts_project_blur'] && !$this->data['pm_id'] && $this->data['old_pm_id'])
{
unset($this->data['ts_project_blur']);
unset($content['ts_project_blur']);
unset($this->data['ts_project']);
unset($content['ts_project']);
}
switch($button) switch($button)
{ {
case 'edit': case 'edit':
@ -164,8 +172,8 @@ class timesheet_ui extends timesheet_bo
{ {
$etpl->set_validation_error('ts_quantity',lang('Starttime has to be before endtime !!!')); $etpl->set_validation_error('ts_quantity',lang('Starttime has to be before endtime !!!'));
} }
//echo "<p>ts_start=$content[ts_start], start_time=$content[start_time], end_time=$content[end_time], ts_duration=$content[ts_duration], ts_quantity=$content[ts_quantity]</p>\n"; // only store project-blur, if a project is selected
if (!$this->data['ts_project']) $this->data['ts_project'] = $this->data['ts_project_blur']; if (!$this->data['ts_project'] && $this->data['pm_id']) $this->data['ts_project'] = $this->data['ts_project_blur'];
// set ts_title to ts_project if short viewtype (title is not editable) // set ts_title to ts_project if short viewtype (title is not editable)
if($this->ts_viewtype == 'short') if($this->ts_viewtype == 'short')
{ {
@ -191,6 +199,19 @@ class timesheet_ui extends timesheet_bo
} }
if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry
// check if we are linked to a project, but that is NOT set as project
if (!$this->data['pm_id'] && is_array($content['link_to']['to_id']))
{
foreach($content['link_to']['to_id'] as $data)
{
if ($data['app'] == 'projectmanager')
{
$this->data['pm_id'] = $data['id'];
break;
}
}
}
if ($this->save() != 0) if ($this->save() != 0)
{ {
$msg = lang('Error saving the entry!!!'); $msg = lang('Error saving the entry!!!');
@ -263,7 +284,7 @@ class timesheet_ui extends timesheet_bo
case 'cancel': case 'cancel':
$js .= 'window.close();'; $js .= 'window.close();';
echo "<html>\n<body>\n<script>\n$js\n</script>\n</body>\n</html>\n"; echo "<html>\n<body>\n<script>\n$js\n</script>\n</body>\n</html>\n";
$GLOBALS['egw']->common->egw_exit(); common::egw_exit();
break; break;
} }
} }
@ -572,7 +593,7 @@ class timesheet_ui extends timesheet_bo
$GLOBALS['egw_info']['flags']['app_header'] = lang('timesheet'); $GLOBALS['egw_info']['flags']['app_header'] = lang('timesheet');
if ($query['col_filter']['ts_owner']) if ($query['col_filter']['ts_owner'])
{ {
$GLOBALS['egw_info']['flags']['app_header'] .= ': '.$GLOBALS['egw']->common->grab_owner_name($query['col_filter']['ts_owner']); $GLOBALS['egw_info']['flags']['app_header'] .= ': '.common::grab_owner_name($query['col_filter']['ts_owner']);
#if ($GLOBALS['egw']->accounts->get_type($query['col_filter']['ts_owner']) == 'g') $GLOBALS['egw_info']['flags']['app_header'] .= ' '. lang("and its members"); #if ($GLOBALS['egw']->accounts->get_type($query['col_filter']['ts_owner']) == 'g') $GLOBALS['egw_info']['flags']['app_header'] .= ' '. lang("and its members");
#_debug_array($GLOBALS['egw']->accounts->members($query['col_filter']['ts_owner'],true)); #_debug_array($GLOBALS['egw']->accounts->members($query['col_filter']['ts_owner'],true));
if ($query['col_filter']['ts_owner']<0) $query['col_filter']['ts_owner'] = array_merge(array($query['col_filter']['ts_owner']),$GLOBALS['egw']->accounts->members($query['col_filter']['ts_owner'],true)); if ($query['col_filter']['ts_owner']<0) $query['col_filter']['ts_owner'] = array_merge(array($query['col_filter']['ts_owner']),$GLOBALS['egw']->accounts->members($query['col_filter']['ts_owner'],true));
@ -612,10 +633,10 @@ class timesheet_ui extends timesheet_bo
else else
{ {
$df = $GLOBALS['egw_info']['user']['preferences']['common']['dateformat']; $df = $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'];
$GLOBALS['egw_info']['flags']['app_header'] .= ': ' . $GLOBALS['egw']->common->show_date($query['startdate']+12*60*60,$df,false); $GLOBALS['egw_info']['flags']['app_header'] .= ': ' . common::show_date($query['startdate']+12*60*60,$df,false);
if ($start != $end) if ($start != $end)
{ {
$GLOBALS['egw_info']['flags']['app_header'] .= ' - '.$GLOBALS['egw']->common->show_date($query['enddate']+12*60*60,$df,false); $GLOBALS['egw_info']['flags']['app_header'] .= ' - '.common::show_date($query['enddate']+12*60*60,$df,false);
} }
} }
if ($query['filter'] == 'custom') // show the custom dates if ($query['filter'] == 'custom') // show the custom dates
@ -677,7 +698,7 @@ class timesheet_ui extends timesheet_bo
switch($row['ts_id']) switch($row['ts_id'])
{ {
case 0: // day-sum case 0: // day-sum
$row['ts_title'] = lang('Sum %1:',lang(date('l',$row['ts_start'])).' '.$GLOBALS['egw']->common->show_date($row['ts_start'], $row['ts_title'] = lang('Sum %1:',lang(date('l',$row['ts_start'])).' '.common::show_date($row['ts_start'],
$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],false)); $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],false));
// For some reason day sum checkbox on the etemplate is checked[1] instead of checked[0] // For some reason day sum checkbox on the etemplate is checked[1] instead of checked[0]