Fixed a problem with predefined expenses missing on mobile pages.
authorNik Okuntseff <support@anuko.com>
Fri, 23 Feb 2018 17:44:37 +0000 (17:44 +0000)
committerNik Okuntseff <support@anuko.com>
Fri, 23 Feb 2018 17:44:37 +0000 (17:44 +0000)
WEB-INF/templates/expenses.tpl
WEB-INF/templates/footer.tpl
WEB-INF/templates/mobile/expense_edit.tpl
WEB-INF/templates/mobile/expenses.tpl
mobile/expense_edit.php
mobile/expenses.php

index 8a3ae4c..ed98bb5 100644 (file)
@@ -136,7 +136,6 @@ function recalculateCost() {
         </tr>
 {/if}
 {if $predefined_expenses}
-
         <tr>
           <td align="right">{$i18n.label.expense}:</td>
           <td>{$forms.expensesForm.predefined_expense.control}</td>
index e63b199..571e5a4 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.17.30.4018 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.17.31.4019 | 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 a9c0958..ea29723 100644 (file)
@@ -26,6 +26,14 @@ projects = new Array();
 // Mandatory top option for project dropdown.
 empty_label_project = '{$i18n.dropdown.select|escape:'javascript'}';
 
+// Prepare an array of predefined expenses.
+idx = 0;
+var defined_expenses = new Array();
+{foreach $predefined_expenses as $predefined_expense}
+  defined_expenses[idx] = new Array("{$predefined_expense.id}", "{$predefined_expense.name|escape:'javascript'}", "{$predefined_expense.cost}");
+  idx++;
+{/foreach}
+
 // 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) {
@@ -66,6 +74,42 @@ function get_date() {
   var date = new Date();
   return date.strftime("%Y-%m-%d");
 }
+
+// The recalculateCost function recalculates cost based on the current selection
+// of predefined expense and quantity and also changes the comment accordingly.
+function recalculateCost() {
+  var quantity_control = document.getElementById("quantity");
+  // Set quantity to 1 if it is not set already.
+  if (!quantity_control.value) {
+     quantity_control.value = "1";
+  }
+
+  var comment_control = document.getElementById("item_name");
+  var cost_control = document.getElementById("cost");
+  var replaceDecimalMark = ("." != "{$user->decimal_mark}");
+
+  // Calculate cost.
+  var dropdown = document.getElementById("predefined_expense");
+  if (dropdown.selectedIndex == 0) {
+    quantity_control.value = "";
+    comment_control.value = "";
+    cost_control.value = "";
+  } else {
+    comment_control.value = defined_expenses[dropdown.selectedIndex - 1][1] + " - " + quantity_control.value;
+    var quantity = quantity_control.value;
+    if (isNaN(quantity))
+      cost_control.value = "";
+    else {
+      var expenseCost = defined_expenses[dropdown.selectedIndex - 1][2];
+      if (replaceDecimalMark)
+        expenseCost = expenseCost.replace("{$user->decimal_mark}", ".");
+      var newCost = (quantity_control.value * expenseCost).toFixed(2);
+      if (replaceDecimalMark)
+        newCost = newCost.replace(".", "{$user->decimal_mark}");
+      cost_control.value = newCost;
+    }
+  }
+}
 </script>
 
 {$forms.expenseItemForm.open}
@@ -87,6 +131,16 @@ function get_date() {
       <td align="right">{$i18n.label.project} (*):</td>
       <td>{$forms.expenseItemForm.project.control}</td>
     </tr>
+{/if}
+{if $predefined_expenses}
+    <tr>
+      <td align="right">{$i18n.label.expense}:</td>
+      <td>{$forms.expenseItemForm.predefined_expense.control}</td>
+    </tr>
+    <tr>
+      <td align="right">{$i18n.label.quantity}:</td>
+      <td>{$forms.expenseItemForm.quantity.control}</td>
+    </tr>
 {/if}
     <tr>
       <td align="right">{$i18n.label.item}:</td>
index a4a3847..d8e8612 100644 (file)
@@ -26,6 +26,14 @@ projects = new Array();
 // Mandatory top option for project dropdown.
 empty_label_project = '{$i18n.dropdown.select|escape:'javascript'}';
 
+// Prepare an array of predefined expenses.
+idx = 0;
+var defined_expenses = new Array();
+{foreach $predefined_expenses as $predefined_expense}
+  defined_expenses[idx] = new Array("{$predefined_expense.id}", "{$predefined_expense.name|escape:'javascript'}", "{$predefined_expense.cost}");
+  idx++;
+{/foreach}
+
 // 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) {
@@ -66,6 +74,42 @@ function get_date() {
   var date = new Date();
   return date.strftime("%Y-%m-%d");
 }
+
+// The recalculateCost function recalculates cost based on the current selection
+// of predefined expense and quantity and also changes the comment accordingly.
+function recalculateCost() {
+  var quantity_control = document.getElementById("quantity");
+  // Set quantity to 1 if it is not set already.
+  if (!quantity_control.value) {
+     quantity_control.value = "1";
+  }
+
+  var comment_control = document.getElementById("item_name");
+  var cost_control = document.getElementById("cost");
+  var replaceDecimalMark = ("." != "{$user->decimal_mark}");
+
+  // Calculate cost.
+  var dropdown = document.getElementById("predefined_expense");
+  if (dropdown.selectedIndex == 0) {
+    quantity_control.value = "";
+    comment_control.value = "";
+    cost_control.value = "";
+  } else {
+    comment_control.value = defined_expenses[dropdown.selectedIndex - 1][1] + " - " + quantity_control.value;
+    var quantity = quantity_control.value;
+    if (isNaN(quantity))
+      cost_control.value = "";
+    else {
+      var expenseCost = defined_expenses[dropdown.selectedIndex - 1][2];
+      if (replaceDecimalMark)
+        expenseCost = expenseCost.replace("{$user->decimal_mark}", ".");
+      var newCost = (quantity_control.value * expenseCost).toFixed(2);
+      if (replaceDecimalMark)
+        newCost = newCost.replace(".", "{$user->decimal_mark}");
+      cost_control.value = newCost;
+    }
+  }
+}
 </script>
 
 <!-- Inserted from time.tpl -->
@@ -99,6 +143,16 @@ function get_date() {
           <td align="right">{$i18n.label.project} (*):</td>
           <td>{$forms.expensesForm.project.control}</td>
         </tr>
+{/if}
+{if $predefined_expenses}
+        <tr>
+          <td align="right">{$i18n.label.expense}:</td>
+          <td>{$forms.expensesForm.predefined_expense.control}</td>
+        </tr>
+        <tr>
+          <td align="right">{$i18n.label.quantity}:</td>
+          <td>{$forms.expensesForm.quantity.control}</td>
+        </tr>
 {/if}
         <tr>
           <td align="right">{$i18n.label.item} (*):</td>
index 69c13ec..a4b1f2d 100644 (file)
@@ -119,6 +119,19 @@ if (MODE_PROJECTS == $user->tracking_mode || MODE_PROJECTS_AND_TASKS == $user->t
       'empty'=>array(''=>$i18n->getKey('dropdown.select'))));
   }
 }
+// If predefined expenses are configured, add controls to select an expense and quantity.
+$predefined_expenses = ttTeamHelper::getPredefinedExpenses($user->team_id);
+if ($predefined_expenses) {
+    $form->addInput(array('type'=>'combobox',
+      'onchange'=>'recalculateCost();',
+      'name'=>'predefined_expense',
+      'style'=>'width: 250px;',
+      'value'=>$cl_predefined_expense,
+      'data'=>$predefined_expenses,
+      'datakeys'=>array('id', 'name'),
+      'empty'=>array(''=>$i18n->getKey('dropdown.select'))));
+    $form->addInput(array('type'=>'text','onchange'=>'recalculateCost();','maxlength'=>'40','name'=>'quantity','style'=>'width: 100px;','value'=>$cl_quantity));
+}
 $form->addInput(array('type'=>'text','maxlength'=>'100','name'=>'item_name','style'=>'width: 250px;','value'=>$cl_item_name));
 $form->addInput(array('type'=>'text','maxlength'=>'40','name'=>'cost','style'=>'width: 100px;','value'=>$cl_cost));
 $form->addInput(array('type'=>'datefield','name'=>'date','maxlength'=>'20','value'=>$cl_date));
@@ -198,6 +211,7 @@ if ($request->isPost()) {
   }
 } // isPost
 
+$smarty->assign('predefined_expenses', $predefined_expenses);
 $smarty->assign('client_list', $client_list);
 $smarty->assign('project_list', $project_list);
 $smarty->assign('task_list', $task_list);
index dd8e87c..82fe428 100644 (file)
@@ -131,6 +131,19 @@ if (MODE_PROJECTS == $user->tracking_mode || MODE_PROJECTS_AND_TASKS == $user->t
       'empty'=>array(''=>$i18n->getKey('dropdown.select'))));
   }
 }
+// If predefined expenses are configured, add controls to select an expense and quantity.
+$predefined_expenses = ttTeamHelper::getPredefinedExpenses($user->team_id);
+if ($predefined_expenses) {
+  $form->addInput(array('type'=>'combobox',
+    'onchange'=>'recalculateCost();',
+    'name'=>'predefined_expense',
+    'style'=>'width: 250px;',
+    'value'=>$cl_predefined_expense,
+    'data'=>$predefined_expenses,
+    'datakeys'=>array('id', 'name'),
+    'empty'=>array(''=>$i18n->getKey('dropdown.select'))));
+  $form->addInput(array('type'=>'text','onchange'=>'recalculateCost();','maxlength'=>'40','name'=>'quantity','style'=>'width: 100px;','value'=>$cl_quantity));
+}
 $form->addInput(array('type'=>'text','maxlength'=>'100','name'=>'item_name','style'=>'width: 250px;','value'=>$cl_item_name));
 $form->addInput(array('type'=>'text','maxlength'=>'40','name'=>'cost','style'=>'width: 100px;','value'=>$cl_cost));
 $form->addInput(array('type'=>'calendar','name'=>'date','highlight'=>'expenses','value'=>$cl_date)); // calendar
@@ -189,6 +202,7 @@ $smarty->assign('next_date', $next_date);
 $smarty->assign('prev_date', $prev_date);
 $smarty->assign('day_total', ttExpenseHelper::getTotalForDay($user->getActiveUser(), $cl_date));
 $smarty->assign('expense_items', ttExpenseHelper::getItems($user->getActiveUser(), $cl_date));
+$smarty->assign('predefined_expenses', $predefined_expenses);
 $smarty->assign('client_list', $client_list);
 $smarty->assign('project_list', $project_list);
 $smarty->assign('forms', array($form->getName()=>$form->toArray()));