Adjusted charts.php for subgroups.
authorNik Okuntseff <support@anuko.com>
Mon, 3 Dec 2018 15:09:57 +0000 (15:09 +0000)
committerNik Okuntseff <support@anuko.com>
Mon, 3 Dec 2018 15:09:57 +0000 (15:09 +0000)
WEB-INF/lib/ttChartHelper.class.php
WEB-INF/lib/ttUser.class.php
WEB-INF/templates/charts.tpl
WEB-INF/templates/footer.tpl
WEB-INF/templates/header.tpl
charts.php

index 75a38d0..7a4d258 100644 (file)
@@ -132,4 +132,39 @@ class ttChartHelper {
 
     return $result;
   }
+
+  // adjustType - adjust chart type to something that is available for a group.
+  static function adjustType($requested_type) {
+    global $user;
+    $tracking_mode = $user->getTrackingMode();
+    $client_option = $user->isPluginEnabled('cl');
+
+    // We have 3 possible options for chart tyep: projects, tasks, or clients.
+    // Deal with each one individually.
+
+    if ($requested_type == CHART_PROJECTS) {
+      if ($tracking_mode == MODE_PROJECTS || $tracking_mode == MODE_PROJECTS_AND_TASKS)
+        return CHART_PROJECTS;
+      else if ($client_option)
+        return CHART_CLIENTS;
+    }
+
+    if ($requested_type == CHART_TASKS) {
+      if ($tracking_mode == MODE_PROJECTS_AND_TASKS)
+        return CHART_TASKS;
+      if ($tracking_mode == MODE_PROJECTS)
+        return CHART_PROJECTS;
+      else if ($client_option)
+        return CHART_CLIENTS;
+    }
+
+    if ($requested_type == CHART_CLIENTS) {
+      if ($client_option)
+        return CHART_CLIENTS;
+      else if ($tracking_mode == MODE_PROJECTS || ($tracking_mode == MODE_PROJECTS_AND_TASKS))
+        return CHART_PROJECTS;
+    }
+
+    return  CHART_PROJECTS;
+  }
 }
index 587ca73..5e359cd 100644 (file)
@@ -523,7 +523,7 @@ class ttUser {
   // - subgroup must ve valid;
   // - user should be a member of it.
   function checkBehalfId() {
-    if (!$this->behalf_group_id) {
+    if (!$this->behalfGroup) {
       // Checking user from home group.
       $options = array('status'=>ACTIVE,'max_rank'=>$this->rank-1);
       $users = $this->getUsers($options);
@@ -533,7 +533,7 @@ class ttUser {
       }
     } else {
       // Checking user from a subgroup.
-      $group_id = $this->behalf_group_id;
+      $group_id = $this->behalfGroup->id;
       if (!$this->isSubgroupValid($group_id))
         return false;
 
@@ -556,11 +556,10 @@ class ttUser {
   // In this case we still allow access to charts, but set behalf_id to someone else.
   // Another example: working in a subgroup on behalf of someone else.
   function adjustBehalfId() {
-    $group_id = $this->behalf_group_id ? $this->behalf_group_id : $this->group_id;
-    $rank = $this->getMaxRankForGroup($group_id);
+    $rank = $this->getMaxRankForGroup($this->getGroup());
 
     // Adjust to first found user in group.
-    $options = array('group_id'=>$group_id,'status'=>ACTIVE,'max_rank'=>$rank);
+    $options = array('status'=>ACTIVE,'max_rank'=>$rank);
     $users = $this->getUsers($options);
     foreach($users as $one_user) {
       // Fake loop to access first element.
@@ -786,7 +785,7 @@ class ttUser {
 
     $this->behalfGroup = new ttGroup($this->behalf_group_id, $this->org_id);
 
-    // Adjust on behalf user.
+    // Adjust on behalf user to first found user in subgroup.
     $this->adjustBehalfId();
     return;
   }
index 5e173e1..b7df0e8 100644 (file)
@@ -2,8 +2,8 @@
 {$forms.chartForm.open}
 <table border="0" width="720">
   <tr>
-{if $on_behalf_control}
-      <td width="50%" align="center">{$i18n.label.user}: {$forms.chartForm.onBehalfUser.control}</td>
+{if $user_dropdown}
+      <td width="50%" align="center">{$i18n.label.user}: {$forms.chartForm.user.control}</td>
   {if $chart_selector}
       <td width="50%" align="left">{$i18n.form.charts.chart}: {$forms.chartForm.type.control}</td>
   {/if}
index dbbcb63..aacf7a6 100644 (file)
@@ -12,7 +12,7 @@
       <br>
       <table cellspacing="0" cellpadding="4" width="100%" border="0">
         <tr>
-          <td align="center">&nbsp;Anuko Time Tracker 1.18.29.4572 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.18.29.4573 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
             <a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
             <a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
             <a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
index de25c06..57e842e 100644 (file)
     {if $user->isPluginEnabled('iv') && ($user->can('view_own_invoices') || $user->can('manage_invoices'))}
             &middot; <a class="mainMenu" href="invoices.php">{$i18n.title.invoices}</a>
     {/if}
-    {if ($user->isPluginEnabled('ch') && ($user->can('view_own_charts') || $user->can('view_charts'))) && ($smarty.const.MODE_PROJECTS == $user->tracking_mode
-      || $smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode || $user->isPluginEnabled('cl'))}
+    {if ($user->isPluginEnabled('ch') && ($user->can('view_own_charts') || $user->can('view_charts'))) && ($smarty.const.MODE_PROJECTS == $user->getTrackingMode()
+      || $smarty.const.MODE_PROJECTS_AND_TASKS == $user->getTrackingMode() || $user->isPluginEnabled('cl'))}
             &middot; <a class="mainMenu" href="charts.php">{$i18n.menu.charts}</a>
     {/if}
-    {if ($user->can('view_own_projects') || $user->can('manage_projects')) && ($smarty.const.MODE_PROJECTS == $user->tracking_mode || $smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode)}
+    {if ($user->can('view_own_projects') || $user->can('manage_projects')) && ($smarty.const.MODE_PROJECTS == $user->getTrackingMode() || $smarty.const.MODE_PROJECTS_AND_TASKS == $user->getTrackingMode())}
             &middot; <a class="mainMenu" href="projects.php">{$i18n.menu.projects}</a>
     {/if}
-    {if ($smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode && ($user->can('view_own_tasks') || $user->can('manage_tasks')))}
+    {if ($smarty.const.MODE_PROJECTS_AND_TASKS == $user->getTrackingMode() && ($user->can('view_own_tasks') || $user->can('manage_tasks')))}
             &middot; <a class="mainMenu" href="tasks.php">{$i18n.menu.tasks}</a>
     {/if}
     {if $user->can('view_users') || $user->can('manage_users')}
index 3923d9a..adaa8ae 100644 (file)
@@ -54,6 +54,28 @@ if (!$user->behalf_id && !$user->can('view_own_charts') && !$user->adjustBehalfI
   header('Location: access_denied.php'); // Trying as self, but no right for self, and noone to view on behalf.
   exit();
 }
+if ($request->isPost() && $request->getParameter('user')) {
+  if (!$user->isUserValid($request->getParameter('user'))) {
+    header('Location: access_denied.php'); // Wrong user id on post.
+    exit();
+  }
+}
+// End of access checks.
+
+// Determine user for which we display this page.
+$userChanged = $request->getParameter('user_changed');
+if ($request->isPost() && $userChanged) {
+  $user_id = $request->getParameter('user');
+  $user->setOnBehalfUser($user_id);
+} else {
+  $user_id = $user->getUser();
+  // Handle a situation for no users in on behalf group.
+  if ($user->behalfGroup && $user_id == $user->id)
+    $user_id = null;
+}
+
+$uc = new ttUserConfig();
+$tracking_mode = $user->getTrackingMode();
 
 // Initialize and store date in session.
 $cl_date = $request->getParameter('date', @$_SESSION['date']);
@@ -63,73 +85,29 @@ if(!$cl_date) {
 }
 $_SESSION['date'] = $cl_date;
 
-// Initialize chart interval.
-$cl_interval = $_SESSION['chart_interval'];
-if (!$cl_interval) {
-  $uc = new ttUserConfig();
-  $cl_interval = $uc->getValue(SYSC_CHART_INTERVAL);
-}
-if (!$cl_interval) $cl_interval = INTERVAL_THIS_MONTH;
-$_SESSION['chart_interval'] = $cl_interval;
-
-// Initialize chart type.
-$cl_type = $_SESSION['chart_type'];
-if (!$cl_type) {
-  $uc = new ttUserConfig();
-  $cl_type = $uc->getValue(SYSC_CHART_TYPE);
-}
-if (MODE_TIME == $user->getTrackingMode()) {
-  if ($user->isPluginEnabled('cl'))
-    $cl_type = CHART_CLIENTS;
-} else {
-  if ($cl_type == CHART_CLIENTS) {
-    if (!$user->isPluginEnabled('cl'))
-      $cl_type = CHART_PROJECTS;       
-  } elseif ($cl_type == CHART_TASKS) {
-    if (MODE_PROJECTS_AND_TASKS != $user->getTrackingMode())
-      $cl_type = CHART_PROJECTS;
-  }
-}
-if (!$cl_type) $cl_type = CHART_PROJECTS;
-$_SESSION['chart_type'] = $cl_type;
-
-// Who do we draw charts for?
-$on_behalf_id = $request->getParameter('onBehalfUser', (isset($_SESSION['behalf_id'])? $_SESSION['behalf_id'] : $user->id));
-
 if ($request->isPost()) {
-  // If chart interval changed - save it.
   $cl_interval = $request->getParameter('interval');
-  if ($cl_interval) {
-    // Save in the session
-    $_SESSION['chart_interval'] = $cl_interval;
-    // and permanently.
-    $uc = new ttUserConfig();
-    $uc->setValue(SYSC_CHART_INTERVAL, $cl_interval);
-  }
-  // If chart type changed - save it.
+  if (!$cl_interval) $cl_interval = INTERVAL_THIS_MONTH;
+  $_SESSION['chart_interval'] = $cl_interval;
+  $uc->setValue(SYSC_CHART_INTERVAL, $cl_interval);
+
   $cl_type = $request->getParameter('type');
-  if ($cl_type) {
-    // Save in the session
-    $_SESSION['chart_type'] = $cl_type;
-    // and permanently.
-    $uc = new ttUserConfig();
-    $uc->setValue(SYSC_CHART_TYPE, $cl_type);
-  }
-  // If user has changed - set behalf_id accordingly in the session.
-  if ($request->getParameter('onBehalfUser')) {
-    if($user->can('view_charts')) {
-      unset($_SESSION['behalf_id']);
-      unset($_SESSION['behalf_name']);
-
-      if($on_behalf_id != $user->id) {
-        $_SESSION['behalf_id'] = $on_behalf_id;
-        $_SESSION['behalf_name'] = ttUserHelper::getUserName($on_behalf_id);
-      }
-      header('Location: charts.php');
-      exit();
-    }
-  }
-} // isPost
+  if (!$cl_type) $cl_type = ttChartHelper::adjustType($cl_type);
+  $_SESSION['chart_type'] = $cl_type;
+  $uc->setValue(SYSC_CHART_TYPE, $cl_type);
+} else {
+  // Initialize chart interval.
+  $cl_interval = $_SESSION['chart_interval'];
+  if (!$cl_interval) $cl_interval = $uc->getValue(SYSC_CHART_INTERVAL);
+  if (!$cl_interval) $cl_interval = INTERVAL_THIS_MONTH;
+  $_SESSION['chart_interval'] = $cl_interval;
+
+  // Initialize chart type.
+  $cl_type = $_SESSION['chart_type'];
+  if (!$cl_type) $cl_type = $uc->getValue(SYSC_CHART_TYPE);
+  $cl_type = ttChartHelper::adjustType($cl_type);
+  $_SESSION['chart_type'] = $cl_type;
+}
 
 // Elements of chartForm.
 $chart_form = new Form('chartForm');
@@ -143,13 +121,14 @@ if ($user->can('view_charts')) {
   $user_list = $user->getUsers($options);
   if (count($user_list) >= 1) {
     $chart_form->addInput(array('type'=>'combobox',
-      'onchange'=>'this.form.submit();',
-      'name'=>'onBehalfUser',
-      'value'=>$on_behalf_id,
+      'onchange'=>'this.form.user_changed.value=1;this.form.submit();',
+      'name'=>'user',
+      'value'=>$user_id,
       'data'=>$user_list,
       'datakeys'=>array('id','name'),
     ));
-    $smarty->assign('on_behalf_control', 1);
+    $chart_form->addInput(array('type'=>'hidden','name'=>'user_changed'));
+    $smarty->assign('user_dropdown', 1);
   }
 }
 
@@ -163,26 +142,26 @@ $intervals[INTERVAL_ALL_TIME] = $i18n->get('dropdown.all_time');
 
 // Chart interval dropdown.
 $chart_form->addInput(array('type' => 'combobox',
-  'onchange' => 'if(this.form) this.form.submit();',
+  'onchange' => 'this.form.submit();',
   'name' => 'interval',
   'value' => $cl_interval,
   'data' => $intervals
 ));
 
 // Chart type options.
-$chart_selector = (MODE_PROJECTS_AND_TASKS == $user->tracking_mode || $user->isPluginEnabled('cl'));
+$chart_selector = (MODE_PROJECTS_AND_TASKS == $tracking_mode || $user->isPluginEnabled('cl'));
 if ($chart_selector) {
   $types = array();
-  if (MODE_PROJECTS == $user->tracking_mode || MODE_PROJECTS_AND_TASKS == $user->tracking_mode)
+  if (MODE_PROJECTS == $tracking_mode || MODE_PROJECTS_AND_TASKS == $tracking_mode)
     $types[CHART_PROJECTS] = $i18n->get('dropdown.projects');
-  if (MODE_PROJECTS_AND_TASKS == $user->tracking_mode)
+  if (MODE_PROJECTS_AND_TASKS == $tracking_mode)
     $types[CHART_TASKS] = $i18n->get('dropdown.tasks');
   if ($user->isPluginEnabled('cl'))
     $types[CHART_CLIENTS] = $i18n->get('dropdown.clients');
 
   // Add chart type dropdown.
   $chart_form->addInput(array('type' => 'combobox',
-    'onchange' => 'if(this.form) this.form.submit();',
+    'onchange' => 'this.form.submit();',
     'name' => 'type',
     'value' => $cl_type,
     'data' => $types
@@ -193,7 +172,7 @@ if ($chart_selector) {
 $chart_form->addInput(array('type'=>'calendar','name'=>'date','value'=>$cl_date)); // calendar
 
 // Get data for our chart.
-$totals = ttChartHelper::getTotals($on_behalf_id, $cl_type, $cl_date, $cl_interval);
+$totals = ttChartHelper::getTotals($user_id, $cl_type, $cl_date, $cl_interval);
 $smarty->assign('totals', $totals);
 
 // Prepare chart for drawing.