2 // We need a few arrays to populate project and task dropdowns.
3 // When client selection changes, the project dropdown must be re-populated with only relevant projects.
4 // When project selection changes, the task dropdown must be repopulated similarly.
6 // project_ids[143] = "325,370,390,400"; // Comma-separated list of project ids for client.
7 // project_names[325] = "Time Tracker"; // Project name.
8 // task_ids[325] = "100,101,302,303,304"; // Comma-separated list ot task ids for project.
9 // task_names[100] = "Coding"; // Task name.
11 // Prepare an array of projects ids for clients.
12 var project_ids = new Array();
13 {foreach $client_list as $client}
14 project_ids[{$client.id}] = "{$client.projects}";
16 // Prepare an array of project names.
17 var project_names = new Array();
18 {foreach $project_list as $project}
19 project_names[{$project.id}] = "{$project.name|escape:'javascript'}";
21 // We'll use this array to populate project dropdown when client is not selected.
23 var projects = new Array();
24 {foreach $project_list as $project}
25 projects[idx] = new Array("{$project.id}", "{$project.name|escape:'javascript'}");
29 // Prepare an array of task ids for projects.
30 var task_ids = new Array();
31 {foreach $project_list as $project}
32 task_ids[{$project.id}] = "{$project.tasks}";
34 // Prepare an array of task names.
35 var task_names = new Array();
36 {foreach $task_list as $task}
37 task_names[{$task.id}] = "{$task.name|escape:'javascript'}";
40 // Mandatory top options for project and task dropdowns.
41 var empty_label_project = "{$i18n.dropdown.select|escape:'javascript'}";
42 var empty_label_task = "{$i18n.dropdown.select|escape:'javascript'}";
44 // The fillDropdowns function populates the "project" and "task" dropdown controls
45 // with relevant values.
46 function fillDropdowns() {
47 if(document.body.contains(document.timeRecordForm.client))
48 fillProjectDropdown(document.timeRecordForm.client.value);
50 fillTaskDropdown(document.timeRecordForm.project.value);
53 // The fillProjectDropdown function populates the project combo box with
54 // projects associated with a selected clientt (client id is passed here as id).
55 function fillProjectDropdown(id) {
56 var str_ids = project_ids[id];
58 var dropdown = document.getElementById("project");
59 // Determine previously selected item.
60 var selected_item = dropdown.options[dropdown.selectedIndex].value;
62 // Remove existing content.
64 var project_reset = true;
65 // Add mandatory top option.
66 dropdown.options[0] = new Option(empty_label_project, '', true);
68 // Populate project dropdown.
70 // If we are here, client is not selected.
71 var len = projects.length;
72 for (var i = 0; i < len; i++) {
73 dropdown.options[i+1] = new Option(projects[i][1], projects[i][0]);
74 if (dropdown.options[i+1].value == selected_item) {
75 dropdown.options[i+1].selected = true;
76 project_reset = false;
80 var ids = new Array();
81 ids = str_ids.split(",");
84 for (var i = 0; i < len; i++) {
86 dropdown.options[i+1] = new Option(project_names[p_id], p_id);
87 if (dropdown.options[i+1].value == selected_item) {
88 dropdown.options[i+1].selected = true;
89 project_reset = false;
94 // If project selection was reset - clear the tasks dropdown.
96 dropdown = document.getElementById("task");
98 dropdown.options[0] = new Option(empty_label_task, '', true);
102 // The fillTaskDropdown function populates the task combo box with
103 // tasks associated with a selected project (project id is passed here as id).
104 function fillTaskDropdown(id) {
105 var str_ids = task_ids[id];
107 var dropdown = document.getElementById("task");
108 if (dropdown == null) return; // Nothing to do.
110 // Determine previously selected item.
111 var selected_item = dropdown.options[dropdown.selectedIndex].value;
113 // Remove existing content.
115 // Add mandatory top option.
116 dropdown.options[0] = new Option(empty_label_task, '', true);
118 // Populate the dropdown from the task_names array.
120 var ids = new Array();
121 ids = str_ids.split(",");
122 var len = ids.length;
125 for (var i = 0; i < len; i++) {
127 if (task_names[t_id]) {
128 dropdown.options[idx] = new Option(task_names[t_id], t_id);
133 // If a previously selected item is still in dropdown - select it.
134 if (dropdown.options.length > 0) {
135 for (var i = 0; i < dropdown.options.length; i++) {
136 if (dropdown.options[i].value == selected_item) {
137 dropdown.options[i].selected = true;
144 // The formDisable function disables some fields depending on what we have in other fields.
145 function formDisable(formField) {
146 var formFieldValue = eval("document.timeRecordForm." + formField + ".value");
147 var formFieldName = eval("document.timeRecordForm." + formField + ".name");
150 if (((formFieldValue != "") && (formFieldName == "start")) || ((formFieldValue != "") && (formFieldName == "finish"))) {
151 x = eval("document.timeRecordForm.duration");
154 x.style.background = "#e9e9e9";
157 if (((formFieldValue == "") && (formFieldName == "start") && (document.timeRecordForm.finish.value == "")) || ((formFieldValue == "") && (formFieldName == "finish") && (document.timeRecordForm.start.value == ""))) {
158 x = eval("document.timeRecordForm.duration");
161 x.style.background = "white";
164 if ((formFieldValue != "") && (formFieldName == "duration")) {
165 x = eval("document.timeRecordForm.start");
168 x.style.background = "#e9e9e9";
169 x = eval("document.timeRecordForm.finish");
172 x.style.background = "#e9e9e9";
175 if ((formFieldValue == "") && (formFieldName == "duration")) {
176 x = eval("document.timeRecordForm.start");
178 x.style.background = "white";
179 x = eval("document.timeRecordForm.finish");
181 x.style.background = "white";
185 // The setNow function fills a given field with current time.
186 function setNow(formField) {
187 var x = eval("document.timeRecordForm.start");
189 x.style.background = "white";
190 x = eval("document.timeRecordForm.finish");
192 x.style.background = "white";
193 var today = new Date();
194 var time_format = '{$user->time_format}';
195 var obj = eval("document.timeRecordForm." + formField);
196 obj.value = today.strftime(time_format);
197 formDisable(formField);
201 {$forms.timeRecordForm.open}
202 <table cellspacing="4" cellpadding="7" border="0">
205 <table width = "100%">
209 {if $user->isPluginEnabled('cl')}
211 <td align="right">{$i18n.label.client}{if $user->isPluginEnabled('cm')} (*){/if}:</td>
212 <td>{$forms.timeRecordForm.client.control}</td>
215 {if $user->isPluginEnabled('iv')}
217 <td align="right"> </td>
218 <td><label>{$forms.timeRecordForm.billable.control}{$i18n.form.time.billable}</label></td>
221 {if ($custom_fields && $custom_fields->fields[0])}
223 <td align="right">{$custom_fields->fields[0]['label']|escape}{if $custom_fields->fields[0]['required']} (*){/if}:</td><td>{$forms.timeRecordForm.cf_1.control}</td>
226 {if ($smarty.const.MODE_PROJECTS == $user->tracking_mode || $smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode)}
228 <td align="right">{$i18n.label.project} (*):</td>
229 <td>{$forms.timeRecordForm.project.control}</td>
232 {if ($smarty.const.MODE_PROJECTS_AND_TASKS == $user->tracking_mode)}
234 <td align="right">{$i18n.label.task}:</td>
235 <td>{$forms.timeRecordForm.task.control}</td>
238 {if (($smarty.const.TYPE_START_FINISH == $user->record_type) || ($smarty.const.TYPE_ALL == $user->record_type))}
240 <td align="right">{$i18n.label.start}:</td>
241 <td>{$forms.timeRecordForm.start.control} <input onclick="setNow('start');" type="button" tabindex="-1" value="{$i18n.button.now}"></td>
244 <td align="right">{$i18n.label.finish}:</td>
245 <td>{$forms.timeRecordForm.finish.control} <input onclick="setNow('finish');" type="button" tabindex="-1" value="{$i18n.button.now}"></td>
248 {if (($smarty.const.TYPE_DURATION == $user->record_type) || ($smarty.const.TYPE_ALL == $user->record_type))}
250 <td align="right">{$i18n.label.duration}:</td>
251 <td>{$forms.timeRecordForm.duration.control} {$i18n.form.time.duration_format}</td>
255 <td align="right">{$i18n.label.date}:</td>
256 <td>{$forms.timeRecordForm.date.control}</td>
259 <td align="right">{$i18n.label.note}:</td>
260 <td>{$forms.timeRecordForm.note.control}</td>
263 <td colspan="2"> </td>
267 <td align="left">{$forms.timeRecordForm.btn_save.control} {$forms.timeRecordForm.btn_copy.control} {$forms.timeRecordForm.btn_delete.control}</td>
276 {$forms.timeRecordForm.close}