-<script>
-// We need a few arrays to populate project and task dropdowns.
-// When client selection changes, the project dropdown must be re-populated with only relevant projects.
-// When project selection changes, the task dropdown must be repopulated similarly.
-// Format:
-// project_ids[143] = "325,370,390,400"; // Comma-separated list of project ids for client.
-// project_names[325] = "Time Tracker"; // Project name.
-// task_ids[325] = "100,101,302,303,304"; // Comma-separated list ot task ids for project.
-// task_names[100] = "Coding"; // Task 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}
-
-// Prepare an array of task ids for projects.
-var task_ids = new Array();
-{foreach $project_list as $project}
- task_ids[{$project.id}] = "{$project.tasks}";
-{/foreach}
-// Prepare an array of task names.
-var task_names = new Array();
-{foreach $task_list as $task}
- task_names[{$task.id}] = "{$task.name|escape:'javascript'}";
-{/foreach}
-
-// Mandatory top options for project and task dropdowns.
-var empty_label_project = '{$i18n.dropdown.select|escape:'javascript'}';
-var empty_label_task = '{$i18n.dropdown.select|escape:'javascript'}';
-
-// The fillDropdowns function populates the "project" and "task" dropdown controls
-// with relevant values.
-function fillDropdowns() {
- if(document.body.contains(document.timeRecordForm.client))
- fillProjectDropdown(document.timeRecordForm.client.value);
-
- fillTaskDropdown(document.timeRecordForm.project.value);
-}
-
-// 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_project, '', 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_task, '', true);
- }
-}
-
-// The fillTaskDropdown function populates the task combo box with
-// tasks associated with a selected project (project id is passed here as id).
-function fillTaskDropdown(id) {
- var str_ids = task_ids[id];
-
- var dropdown = document.getElementById("task");
- if (dropdown == null) return; // Nothing to do.
-
- // Determine previously selected item.
- var selected_item = dropdown.options[dropdown.selectedIndex].value;
-
- // Remove existing content.
- dropdown.length = 0;
- // Add mandatory top option.
- dropdown.options[0] = new Option(empty_label_task, '', true);
-
- // Populate the dropdown from the task_names array.
- if (str_ids) {
- var ids = new Array();
- ids = str_ids.split(",");
- var len = ids.length;
-
- var idx = 1;
- for (var i = 0; i < len; i++) {
- var t_id = ids[i];
- if (task_names[t_id]) {
- dropdown.options[idx] = new Option(task_names[t_id], t_id);
- idx++;
- }
- }
-
- // If a previously selected item is still in dropdown - select it.
- if (dropdown.options.length > 0) {
- for (var i = 0; i < dropdown.options.length; i++) {
- if (dropdown.options[i].value == selected_item) {
- dropdown.options[i].selected = true;
- }
- }
- }
- }
-}
-
-// The formDisable function disables some fields depending on what we have in other fields.
-function formDisable(formField) {
- var formFieldValue = eval("document.timeRecordForm." + formField + ".value");
- var formFieldName = eval("document.timeRecordForm." + formField + ".name");
- var x;
-
- if (((formFieldValue != "") && (formFieldName == "start")) || ((formFieldValue != "") && (formFieldName == "finish"))) {
- x = eval("document.timeRecordForm.duration");
- x.value = "";
- x.disabled = true;
- x.style.background = "#e9e9e9";
- }
-
- if (((formFieldValue == "") && (formFieldName == "start") && (document.timeRecordForm.finish.value == "")) || ((formFieldValue == "") && (formFieldName == "finish") && (document.timeRecordForm.start.value == ""))) {
- x = eval("document.timeRecordForm.duration");
- x.value = "";
- x.disabled = false;
- x.style.background = "white";
- }
-
- if ((formFieldValue != "") && (formFieldName == "duration")) {
- x = eval("document.timeRecordForm.start");
- x.value = "";
- x.disabled = true;
- x.style.background = "#e9e9e9";
- x = eval("document.timeRecordForm.finish");
- x.value = "";
- x.disabled = true;
- x.style.background = "#e9e9e9";
- }
-
- if ((formFieldValue == "") && (formFieldName == "duration")) {
- x = eval("document.timeRecordForm.start");
- x.disabled = false;
- x.style.background = "white";
- x = eval("document.timeRecordForm.finish");
- x.disabled = false;
- x.style.background = "white";
- }
-}
-
-// The setNow function fills a given field with current time.
-function setNow(formField) {
- var x = eval("document.timeRecordForm.start");
- x.disabled = false;
- x.style.background = "white";
- x = eval("document.timeRecordForm.finish");
- x.disabled = false;
- x.style.background = "white";
- var today = new Date();
- var time_format = '{$user->time_format}';
- var obj = eval("document.timeRecordForm." + formField);
- obj.value = today.strftime(time_format);
- formDisable(formField);
-}
-
-function get_date() {
- var date = new Date();
- return date.strftime("%Y-%m-%d");
-}
-
-function get_time() {
- var date = new Date();
- return date.strftime("%H:%M");
-}
-</script>
+{include file="time_script.tpl"}
<style>
.not_billable td {
{$forms.timeRecordForm.open}
<table cellspacing="4" cellpadding="0" border="0">
+{if $user->isPluginEnabled('wv')}
+ <tr>
+ <td align="center" colspan=2">
+ <a href="time.php?date={$selected_date->toString()}">{$i18n.label.day_view}</a> / <a href="week.php?date={$selected_date->toString()}">{$i18n.label.week_view}</a>
+ </td>
+ </tr>
+{/if}
<tr>
<td valign="top">
<table>
-{if $on_behalf_control}
+{if $user_dropdown}
<tr>
<td align="right">{$i18n.label.user}:</td>
- <td>{$forms.timeRecordForm.onBehalfUser.control}</td>
+ <td>{$forms.timeRecordForm.user.control}</td>
</tr>
{/if}
{if $user->isPluginEnabled('cl')}
{/if}
{if ($smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode)}
<tr>
- <td align="right">{$i18n.label.task}:</td>
+ <td align="right">{$i18n.label.task}{if $user->task_required} (*){/if}:</td>
<td>{$forms.timeRecordForm.task.control}</td>
</tr>
{/if}
{if (($smarty.const.TYPE_DURATION == $user->record_type) || ($smarty.const.TYPE_ALL == $user->record_type))}
<tr>
<td align="right">{$i18n.label.duration}:</td>
- <td>{$forms.timeRecordForm.duration.control} {$i18n.form.time.duration_format}</td>
+ <td>{$forms.timeRecordForm.duration.control} {if $user->getDecimalMark() == ','}{str_replace('.', ',', $i18n.form.time.duration_format)}{else}{$i18n.form.time.duration_format}{/if}</td>
</tr>
{/if}
</table>
<td width="5%" class="tableHeader">{$i18n.label.edit}</td>
</tr>
{foreach $time_records as $record}
- <tr bgcolor="{cycle values="#f5f5f5,#ccccce"}" {if !$record.billable} class="not_billable" {/if}>
+ <tr bgcolor="{cycle values="#f5f5f5,#ffffff"}" {if !$record.billable} class="not_billable" {/if}>
{if $user->isPluginEnabled('cl')}
<td valign="top">{$record.client|escape}</td>
{/if}
<td align="right" valign="top">{if ($record.duration == '0:00' && $record.start <> '')}<font color="#ff0000">{$i18n.form.time.uncompleted}</font>{else}{$record.duration}{/if}</td>
<td valign="top">{if $record.comment}{$record.comment|escape}{else} {/if}</td>
<td valign="top" align="center">
- {if $record.invoice_id}
+ {if $record.timesheet_id || $record.invoice_id}
{else}
<a href="time_edit.php?id={$record.id}">{$i18n.label.edit}</a>
</td>
</tr>
</table>
-{if $time_records}
+
<table cellpadding="3" cellspacing="1" width="720">
<tr>
<td align="left">{$i18n.label.week_total}: {$week_total}</td>
{if $user->isPluginEnabled('mq')}
<tr>
<td align="left">{$i18n.label.month_total}: {$month_total}</td>
+ {if $over_balance}
+ <td align="right">{$i18n.form.time.over_balance}: <span style="color: green;">{$balance_remaining}</span></td>
+ {else}
+ <td align="right">{$i18n.form.time.remaining_balance}: <span style="color: red;">{$balance_remaining}</span></td>
+ {/if}
+ </tr>
+ <tr>
+ <td align="left">{$i18n.label.quota}: {$month_quota}</td>
{if $over_quota}
<td align="right">{$i18n.form.time.over_quota}: <span style="color: green;">{$quota_remaining}</span></td>
{else}
</tr>
{/if}
</table>
-{/if}
+
{$forms.timeRecordForm.close}