Added project filter on reports depending on selected client.
authorNik Okuntseff <support@anuko.com>
Tue, 5 Mar 2019 18:42:59 +0000 (18:42 +0000)
committerNik Okuntseff <support@anuko.com>
Tue, 5 Mar 2019 18:42:59 +0000 (18:42 +0000)
WEB-INF/lib/ttClientHelper.class.php
WEB-INF/templates/footer.tpl
WEB-INF/templates/reports.tpl
reports.php

index 02014f1..64eedb0 100644 (file)
@@ -63,7 +63,7 @@ class ttClientHelper {
 
     $result = array();
 
-    $sql = "select id, name from tt_clients where group_id = $group_id and org_id = $org_id and (status = 0 or status = 1) order by upper(name)";
+    $sql = "select id, name, projects from tt_clients where group_id = $group_id and org_id = $org_id and (status = 0 or status = 1) order by upper(name)";
     $res = $mdb2->query($sql);
     if (!is_a($res, 'PEAR_Error')) {
       while ($val = $res->fetchRow()) {
index e4384dd..a83f58e 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.53.4826 | 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.53.4827 | 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 1358d29..3b66c71 100644 (file)
@@ -1,4 +1,28 @@
 <script>
+// We need a few arrays to populate project dropdown.
+// When client selection changes, the project dropdown must be re-populated with only relevant projects.
+// Format:
+// project_ids[143] = "325,370,390,400";  // Comma-separated list of project ids for client.
+// project_names[325] = "Time Tracker";   // Project name.
+
+// Prepare an array of project ids for clients.
+var project_ids = new Array();
+{foreach $client_list as $client}
+  project_ids[{$client.id}] = "{$client.projects}";
+{/foreach}
+// Prepare an array of project names.
+var project_names = new Array();
+{foreach $project_list as $project}
+  project_names[{$project.id}] = "{$project.name|escape:'javascript'}";
+{/foreach}
+// We'll use this array to populate project dropdown when client is not selected.
+var idx = 0;
+var projects = new Array();
+{foreach $project_list as $project}
+  projects[idx] = new Array("{$project.id}", "{$project.name|escape:'javascript'}");
+  idx++;
+{/foreach}
+
 // We need a couple of array-like objects, one for associated task ids, another for task names.
 // For performance, and because associated arrays are frowned upon in JavaScript, we'll use a simple object
 // with properties for project tasks. Format:
@@ -27,8 +51,7 @@ var idx = 0;
   idx++;
 {/foreach}
 
-
-// empty_label is the mandatory top option in the tasks dropdown.
+// empty_label is the mandatory top option in dropdowns.
 empty_label = '{$i18n.dropdown.all|escape:'javascript'}';
 
 // inArray - determines whether needle is in haystack array.
@@ -40,6 +63,56 @@ function inArray(needle, haystack) {
   return false;
 }
 
+// The fillProjectDropdown function populates the project combo box with
+// projects associated with a selected client (client id is passed here as id).
+function fillProjectDropdown(id) {
+  var str_ids = project_ids[id];
+  var dropdown = document.getElementById("project");
+
+  // Determine previously selected item.
+  var selected_item = dropdown.options[dropdown.selectedIndex].value;
+
+  // Remove existing content.
+  dropdown.length = 0;
+  var project_reset = true;
+  // Add mandatory top option.
+  dropdown.options[0] = new Option(empty_label, '', true);
+
+  // Populate project dropdown.
+  if (!id) {
+    // If we are here, client is not selected.
+    var len = projects.length;
+    for (var i = 0; i < len; i++) {
+      dropdown.options[i+1] = new Option(projects[i][1], projects[i][0]);
+      if (dropdown.options[i+1].value == selected_item)  {
+        dropdown.options[i+1].selected = true;
+        project_reset = false;
+      }
+    }
+  } else if (str_ids) {
+    var ids = new Array();
+    ids = str_ids.split(",");
+    var len = ids.length;
+
+    for (var i = 0; i < len; i++) {
+      var p_id = ids[i];
+      dropdown.options[i+1] = new Option(project_names[p_id], p_id);
+      if (dropdown.options[i+1].value == selected_item)  {
+        dropdown.options[i+1].selected = true;
+        project_reset = false;
+      }
+    }
+  }
+
+  // If project selection was reset - clear the tasks dropdown.
+  if (project_reset) {
+    dropdown = document.getElementById("task");
+    dropdown.length = 0;
+    dropdown.options[0] = new Option(empty_label, '', true);
+  }
+}
+
+
 // The fillTaskDropdown function populates the task combo box with
 // tasks associated with a selected project_id.
 function fillTaskDropdown(project_id) {
index fb74e16..958d88b 100644 (file)
@@ -89,6 +89,7 @@ if ($showClient) {
 }
 if ($showClient) {
   $form->addInput(array('type'=>'combobox',
+    'onchange'=>'fillProjectDropdown(this.value);',
     'name'=>'client',
     'style'=>'width: 250px;',
     'data'=>$client_list,
@@ -439,6 +440,7 @@ if ($request->isPost()) {
   }
 } // isPost
 
+$smarty->assign('client_list', $client_list);
 $smarty->assign('show_client', $showClient);
 $smarty->assign('show_cf_1_dropdown', $showCustomFieldDropdown);
 $smarty->assign('show_cf_1_checkbox', $showCustomFieldCheckbox);