2 // We need a couple of array-like objects, one for associated task ids, another for task names.
3 // For performance, and because associated arrays are frowned upon in JavaScript, we'll use a simple object
4 // with properties for project tasks. Format:
6 // obj_tasks.p325 = "100,101,302,303,304"; // Tasks ids for project 325 are "100,101,302,303,304".
7 // obj_tasks.p408 = "100,302"; // Tasks ids for project 408 are "100,302".
9 // Create an object for task ids.
11 var project_prefix = "p"; // Prefix for project property.
14 // Populate obj_tasks with task ids for each relevant project.
15 {foreach $project_list as $project}
16 project_property = project_prefix + {$project.id};
17 obj_tasks[project_property] = "{$project.tasks}";
20 // Prepare an array of task names.
21 // Format: task_names[0] = Array(100, 'Coding'), task_names[1] = Array(302, 'Debugging'), etc...
22 // First element = task_id, second element = task name.
23 task_names = new Array();
25 {foreach $task_list as $task}
26 task_names[idx] = new Array({$task.id}, "{$task.name|escape:'javascript'}");
31 // empty_label is the mandatory top option in the tasks dropdown.
32 empty_label = '{$i18n.dropdown.all|escape:'javascript'}';
34 // inArray - determines whether needle is in haystack array.
35 function inArray(needle, haystack) {
36 var length = haystack.length;
37 for(var i = 0; i < length; i++) {
38 if(haystack[i] == needle) return true;
43 // The fillTaskDropdown function populates the task combo box with
44 // tasks associated with a selected project_id.
45 function fillTaskDropdown(project_id) {
47 // Get a string of comma-separated task ids.
49 var property = "p" + project_id;
50 str_task_ids = obj_tasks[property];
53 var task_ids = new Array(); // Array of task ids.
54 task_ids = str_task_ids.split(",");
57 var dropdown = document.getElementById("task");
58 // Determine previously selected item.
59 var selected_item = dropdown.options[dropdown.selectedIndex].value;
61 // Remove existing content.
63 // Add mandatory top option.
64 dropdown.options[0] = new Option(empty_label, '', true);
66 // Populate the dropdown with associated tasks.
67 len = task_names.length;
69 for (var i = 0; i < len; i++) {
71 // No project is selected. Fill in all tasks.
72 dropdown.options[dropdown_idx+1] = new Option(task_names[i][1], task_names[i][0]);
74 } else if (str_task_ids) {
75 // Project is selected and has associated tasks. Fill them in.
76 if (inArray(task_names[i][0], task_ids)) {
77 dropdown.options[dropdown_idx+1] = new Option(task_names[i][1], task_names[i][0]);
83 // If a previously selected item is still in dropdown - select it.
84 if (dropdown.options.length > 0) {
85 for (var i = 0; i < dropdown.options.length; i++) {
86 if (dropdown.options[i].value == selected_item) {
87 dropdown.options[i].selected = true;
93 // Build JavaScript array for assigned projects out of passed in PHP array.
94 var assigned_projects = new Array();
95 {if $assigned_projects}
96 {foreach $assigned_projects as $user_id => $projects}
97 assigned_projects[{$user_id}] = new Array();
99 {foreach $projects as $idx => $project_id}
100 assigned_projects[{$user_id}][{$idx}] = {$project_id};
106 // selectAssignedUsers is called when a project is changed in project dropdown.
107 // It selects users on the form who are assigned to this project.
108 function selectAssignedUsers(project_id) {
112 for (var i = 0; i < document.reportForm.elements.length; i++) {
113 if ((document.reportForm.elements[i].type == 'checkbox') && (document.reportForm.elements[i].name == 'users[]')) {
114 user_id = document.reportForm.elements[i].value;
116 document.reportForm.elements[i].checked = false;
118 document.reportForm.elements[i].checked = true;
120 if(assigned_projects[user_id] != undefined)
121 len = assigned_projects[user_id].length;
125 if (project_id != '')
126 for (var j = 0; j < len; j++) {
127 if (project_id == assigned_projects[user_id][j]) {
128 document.reportForm.elements[i].checked = true;
136 // handleCheckboxes - unmarks and hides the "Totals only" checkbox when
137 // "no grouping" is selected in the associated group by dropdowns.
138 function handleCheckboxes() {
139 var totalsOnlyCheckbox = document.getElementById("chtotalsonly");
140 var totalsOnlyLabel = document.getElementById("totals_only_label");
141 var groupBy1 = document.getElementById("group_by1");
142 var groupBy2 = document.getElementById("group_by2");
143 var groupBy3 = document.getElementById("group_by3");
144 var grouping = false;
145 if ((groupBy1 != null && "no_grouping" != groupBy1.value) ||
146 (groupBy2 != null && "no_grouping" != groupBy2.value) ||
147 (groupBy3 != null && "no_grouping" != groupBy3.value)) {
151 // Show the "Totals only" checkbox.
152 totalsOnlyCheckbox.style.visibility = "visible";
153 totalsOnlyLabel.style.visibility = "visible";
155 // Unmark and hide the "Totals only" checkbox.
156 totalsOnlyCheckbox.checked = false;
157 totalsOnlyCheckbox.style.visibility = "hidden";
158 totalsOnlyLabel.style.visibility = "hidden";
163 {$forms.reportForm.open}
164 <div style="padding: 0 0 10 0;">
165 <table border="0" class="divider">
168 <table cellspacing="1" cellpadding="3" border="0">
170 <td>{$i18n.label.fav_report}:</td><td>{$forms.reportForm.favorite_report.control}</td>
171 <td>{$forms.reportForm.btn_generate.control} {$forms.reportForm.btn_delete.control}</td>
179 <table cellspacing="4" cellpadding="7" border="0">
181 <td valign="top" colspan="2" align="center">
182 <table border="0" cellpadding="3">
185 <table border="0" cellpadding="3">
187 <tr><td><b>{$i18n.label.client}</b></td></tr>
188 <tr><td>{$forms.reportForm.client.control}</td></tr>
191 <tr><td><b>{$i18n.label.project}</b></td></tr>
192 <tr><td>{$forms.reportForm.project.control}</td></tr>
195 <tr><td><b>{$i18n.form.time.billable}</b></td></tr>
196 <tr><td>{$forms.reportForm.include_records.control}</td></tr>
198 {if $show_paid_status}
199 <tr><td><b>{$i18n.label.paid_status}</b></td></tr>
200 <tr><td>{$forms.reportForm.paid_status.control}</td></tr>
206 <table border="0" cellpadding="3">
207 {if $show_cf_1_dropdown}
208 <tr><td><b>{$i18n.label.option}</b></td></tr>
209 <tr><td>{$forms.reportForm.option.control}</td></tr>
212 <tr><td><b>{$i18n.label.task}</b></td></tr>
213 <tr><td>{$forms.reportForm.task.control}</td></tr>
215 {if $show_invoice_dropdown}
216 <tr><td><b>{$i18n.label.invoice}</b></td></tr>
217 <tr><td>{$forms.reportForm.invoice.control}</td></tr>
220 <tr><td><b>{$i18n.label.timesheet}</b></td></tr>
221 <tr><td>{$forms.reportForm.timesheet.control}</td></tr>
228 <td colspan="3"><b>{$i18n.label.users}</b></td>
231 <td colspan="3">{$forms.reportForm.users.control}</td>
235 <td><b>{$i18n.form.reports.select_period}</b></td>
237 <td><b>{$i18n.form.reports.set_period}</b></td>
240 <td>{$forms.reportForm.period.control}</td>
241 <td align="right">{$i18n.label.start_date}:</td>
242 <td>{$forms.reportForm.start_date.control}</td>
246 <td align="right">{$i18n.label.end_date}:</td>
247 <td>{$forms.reportForm.end_date.control}</td>
249 <tr><td colspan="3"><b>{$i18n.form.reports.show_fields}</b></td></tr>
252 <table border="0" width="100%">
254 <td width="25%" valign="top">
255 <table border="0" cellpadding="3">
257 <tr><td><label>{$forms.reportForm.chclient.control} {$i18n.label.client}</label></td></tr>
260 <tr><td><label>{$forms.reportForm.chproject.control} {$i18n.label.project}</label></td></tr>
263 <tr><td><label>{$forms.reportForm.chtimesheet.control} {$i18n.label.timesheet}</label></td></tr>
265 {if $show_cf_1_checkbox}
266 <tr><td><label>{$forms.reportForm.chcf_1.control} {$custom_fields->fields[0]['label']|escape}</label></td></tr>
270 <td width="25%" valign="top">
271 <table border="0" cellpadding="3">
273 <tr><td><label>{$forms.reportForm.chstart.control} {$i18n.label.start}</label></td></tr>
276 <tr><td><label>{$forms.reportForm.chtask.control} {$i18n.label.task}</label></td></tr>
279 <tr><td><label>{$forms.reportForm.chip.control} {$i18n.label.ip}</label></td></tr>
281 {if $show_work_units}
282 <tr><td><label>{$forms.reportForm.chunits.control} {$i18n.label.work_units}</label></td></tr>
286 <td width="25%" valign="top">
287 <table border="0" cellpadding="3">
289 <tr><td><label>{$forms.reportForm.chfinish.control} {$i18n.label.finish}</label></td></tr>
291 <tr><td><label>{$forms.reportForm.chnote.control} {$i18n.label.note}</label></td></tr>
292 {if $show_invoice_checkbox}
293 <tr><td><label>{$forms.reportForm.chinvoice.control} {$i18n.label.invoice}</label></td></tr>
297 <td width="25%" valign="top">
298 <table border="0" cellpadding="3">
299 <tr><td><label>{$forms.reportForm.chduration.control} {$i18n.label.duration}</label></td></tr>
300 <tr><td><label>{$forms.reportForm.chcost.control} {$i18n.label.cost}</label></td></tr>
301 {if $show_paid_status}
302 <tr><td><label>{$forms.reportForm.chpaid.control} {$i18n.label.paid}</label></td></tr>
311 <tr><td><b>{$i18n.form.reports.group_by}</b></td></tr>
313 <td>{$forms.reportForm.group_by1.control}</td>
314 <td>{$forms.reportForm.group_by2.control}</td>
315 <td>{$forms.reportForm.group_by3.control}</td>
318 <td><span id="totals_only_label"><label>{$forms.reportForm.chtotalsonly.control} {$i18n.label.totals_only}</label></span></td>
322 <div style="padding: 10 0 10 0;">
323 <table border="0" class="divider">
326 <table cellspacing="1" cellpadding="3" border="0">
328 <td>{$i18n.form.reports.save_as_favorite}:</td><td>{$forms.reportForm.new_fav_report.control}</td>
329 <td>{$forms.reportForm.btn_save.control}</td>
337 <table border="0" cellpadding="3" width="100%">
338 <tr><td colspan="3" height="50" align="center">{$forms.reportForm.btn_generate.control}</td></tr>
343 {$forms.reportForm.close}