5 * Copyright 1999-2001 (c) VA Linux Systems
6 * Copyright 2010 Roland Mas
7 * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
9 * This file is part of FusionForge. FusionForge is free software;
10 * you can redistribute it and/or modify it under the terms of the
11 * GNU General Public License as published by the Free Software
12 * Foundation; either version 2 of the Licence, or (at your option)
15 * FusionForge is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
26 require_once $gfcommon.'tracker/ArtifactQuery.class.php';
28 // make sure this person has permission to view artifacts
30 session_require_perm ('tracker', $ath->getID(), 'read') ;
32 $query_id = getIntFromRequest('query_id');
33 $start = getIntFromRequest('start');
37 // The browse page can be powered by a pre-saved query
38 // or by select boxes chosen by the user
40 // If there is a $query_id coming from the request OR the pref
41 // was already saved, use the artifact factory that way.
43 // If the query_id = -1, unset the pref and use regular browse boxes
45 if (session_loggedin()) {
46 $u =& session_get_user();
47 if (getStringFromRequest('setpaging')) {
48 /* store paging preferences */
49 $paging = getIntFromRequest('nres');
53 $u->setPreference("paging", $paging);
57 if ($query_id == '-1') {
58 $u->setPreference('art_query'.$ath->getID(),'');
60 $aq = new ArtifactQuery($ath,$query_id);
61 if (!$aq || !is_object($aq)) {
62 exit_error($aq->getErrorMessage(),'tracker');
67 $query_id=$u->getPreference('art_query'.$ath->getID(),'');
69 } elseif ($query_id) {
70 // If user is not logged, then use a cookie to store the current query.
71 if (isset($_COOKIE["GFTrackerQuery"])) {
72 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
74 $gf_tracker = array();
76 $gf_tracker[$ath->getID()] = $query_id;
77 // Send the query_id as a cookie to save it.
78 setcookie("GFTrackerQuery", serialize($gf_tracker));
79 $_COOKIE["GFTrackerQuery"] = serialize($gf_tracker);
80 } elseif (isset($_COOKIE["GFTrackerQuery"])) {
81 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
82 $query_id = (int)$gf_tracker[$ath->getID()];
85 $af = new ArtifactFactory($ath);
87 if (!$af || !is_object($af)) {
88 exit_error(_('Could Not Get Factory'),'tracker');
89 } elseif ($af->isError()) {
90 exit_error($af->getErrorMessage(),'tracker');
93 if (!isset($_sort_col)) {
94 /* default sort order: highest priority first */
95 $_sort_col = 'priority';
98 $offset = getStringFromRequest('offset');
99 $_sort_col = getStringFromRequest('_sort_col',$_sort_col);
100 $_sort_ord = getStringFromRequest('_sort_ord',$_sort_ord);
101 $max_rows = getIntFromRequest('max_rows', 25);
102 $set = getStringFromRequest('set');
103 $_assigned_to = getIntFromRequest('_assigned_to');
104 $_status = getIntFromRequest('_status');
105 $_extra_fields = array() ;
106 $aux_extra_fields = array() ;
108 if ($set == 'custom') {
109 /* may be past in next/prev url */
110 $i = $ath->getCustomStatusField();
111 $tmp_extra_fields = getArrayFromRequest('extra_fields');
112 if (isset($tmp_extra_fields[$i])) {
113 $_extra_fields[$i] = $tmp_extra_fields[$i];
117 if (is_array($_extra_fields)){
118 $keys=array_keys($_extra_fields);
119 foreach ($keys as $key) {
120 if ($_extra_fields[$key] != 'Array') {
121 $aux_extra_fields[$key] = $_extra_fields[$key];
125 if (isset($_extra_fields)){
126 $aux_extra_fields = $_extra_fields;
128 $aux_extra_fields = '';
132 $af->setup($offset,$_sort_col,$_sort_ord,$paging,$set,$_assigned_to,$_status,$aux_extra_fields);
134 // These vals are sanitized and/or retrieved from ArtifactFactory stored settings
136 $_sort_col=$af->order_col;
137 $_sort_ord=$af->sort;
138 $_status=$af->status;
139 $_assigned_to=$af->assigned_to;
140 $_extra_fields=$af->extra_fields;
142 $art_arr = $af->getArtifacts();
144 if (!$art_arr && $af->isError()) {
145 exit_error($af->getErrorMessage(),'tracker');
148 //build page title to make bookmarking easier
149 //if a user was selected, add the user_name to the title
151 use_javascript('/tabber/tabber.js');
153 html_use_coolfieldset();
155 $ath->header(array('atid'=>$ath->getID(), 'title'=>$ath->getName()));
159 * Build the powerful browsing options pop-up boxes
164 // creating a custom technician box which includes "any" and "unassigned"
166 $engine = RBACEngine::getInstance () ;
167 $techs = $engine->getUsersByAllowedAction ('tracker', $ath->getID(), 'tech') ;
169 $tech_id_arr = array () ;
170 $tech_name_arr = array () ;
172 foreach ($techs as $tech) {
173 $tech_id_arr[] = $tech->getID() ;
174 $tech_name_arr[] = $tech->getRealName() ;
176 $tech_id_arr[]='0'; //this will be the 'any' row
177 $tech_name_arr[]=_('Any');
179 if (is_array($_assigned_to)) {
182 $tech_box=html_build_select_box_from_arrays ($tech_id_arr,$tech_name_arr,'_assigned_to',$_assigned_to,true,_('Unassigned'));
186 // custom order by arrays to build a pop-up box
188 $order_name_arr=array();
189 $order_name_arr[]=_('ID');
190 $order_name_arr[]=_('Priority');
191 $order_name_arr[]=_('Summary');
192 $order_name_arr[]=_('Open Date');
193 $order_name_arr[]=_('Last Modified Date');
194 $order_name_arr[]=_('Close Date');
195 $order_name_arr[]=_('Submitter');
196 $order_name_arr[]=_('Assignee');
200 $order_arr[]='artifact_id';
201 $order_arr[]='priority';
202 $order_arr[]='summary';
203 $order_arr[]='open_date';
204 $order_arr[]='last_modified_date';
205 $order_arr[]='close_date';
206 $order_arr[]='submitted_by';
207 $order_arr[]='assigned_to';
210 // custom sort arrays to build pop-up box
212 $sort_name_arr=array();
213 $sort_name_arr[]=_('Ascending');
214 $sort_name_arr[]=_('Descending');
221 // custom changed arrays to build pop-up box
223 $changed_name_arr=array();
224 $changed_name_arr[]=_('Any changes');
225 $changed_name_arr[]=_('Last 24H');
226 $changed_name_arr[]=_('Last 7days');
227 $changed_name_arr[]=_('Last 2weeks');
228 $changed_name_arr[]=_('Last 1month');
230 $changed_arr=array();
231 $changed_arr[]= 0x7fffffff; // Any
232 $changed_arr[]= 3600 * 24; // 24 hour
233 $changed_arr[]= 3600 * 24 * 7; // 1 week
234 $changed_arr[]= 3600 * 24 * 14;// 2 week
235 $changed_arr[]= 3600 * 24 * 30;// 1 month
237 if ($art_arr && ($art_cnt = count($art_arr)) > 0) {
238 $focus = getIntFromRequest('focus');
245 if (session_loggedin()) {
246 /* logged in users get configurable paging */
247 $paging = $u->getPreference("paging");
248 echo '<form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&start='.
249 $start.'" method="post">'."\n";
256 for ($i = 0; $i < $art_cnt; ++$i)
257 if ($art_arr[$i]->getID() == $focus) {
262 $max = ($art_cnt > ($start + $paging)) ? ($start + $paging) : $art_cnt;
267 printf('<p>' . _('Displaying results %1$d‒%2$d out of %3$d total.'),
268 $start + 1, $max, $art_cnt);
269 if (session_loggedin()) {
270 printf(' ' . _('Displaying %2$s results.') . "\n\t<input " .
271 'type="submit" name="setpaging" value="%1$s" />' .
272 "\n</p>\n</form>\n", _('Change'),
273 html_build_select_box_from_array(array(
274 '10', '25', '50', '100', '1000'), 'nres', $paging, 1));
281 * Show the free-form text submitted by the project admin
283 echo $ath->renderBrowseInstructions();
286 // statuses can be custom in GForge 4.5+
288 if ($ath->usesCustomStatuses()) {
289 $aux_extra_fields = array();
290 if (is_array($_extra_fields)){
291 $keys=array_keys($_extra_fields);
292 foreach ($keys as $key) {
293 if (!is_array($_extra_fields[$key])) {
294 $aux_extra_fields[$key] = $_extra_fields[$key];
298 $aux_extra_fields = $_extra_fields;
300 $status_box=$ath->renderSelect ($ath->getCustomStatusField(),$aux_extra_fields[$ath->getCustomStatusField()],false,'',true,_('Any'));
302 if (is_array($_status)) {
305 $status_box = $ath->statusBox('_status',$_status,true,_('Any'));
309 $proj_name = $group->getUnixName();
310 $proj_url = util_make_url_g($group->getUnixName(),$group_id);
311 // the tracker's URIs are constructed in order to support addition of an OSLC-CM REST server
312 // inside /tracker/cm/. There each tracker has a URL in the form .../project/PROJ_NAME/atid/ATID
313 $tracker_stdzd_uri = util_make_url('/tracker/cm/project/'. $proj_name .'/atid/'. $ath->getID());
314 print '<div about="'. $tracker_stdzd_uri
315 .'" typeof="sioc:Container">'."\n";
316 print '<span rel="http://www.w3.org/2002/07/owl#sameAs" resource="" />'."\n";
317 print '<span rev="doap:bug-database sioc:space_of" resource="'. $proj_url .'" />'."\n";
318 print "</div>\n"; // end of about
321 <div id="tabber" class="tabber">
322 <div class="tabbertab" title="'._('Advanced queries').'">';
324 if (session_loggedin()) {
325 $res = db_query_params ('SELECT artifact_query_id,query_name, CASE WHEN query_type>0 THEN 1 ELSE 0 END as type
327 WHERE group_artifact_id=$1 AND (user_id=$2 OR query_type>0)
328 ORDER BY type ASC, query_name ASC',
329 array ($ath->getID(),
332 $res = db_query_params ('SELECT artifact_query_id,query_name, CASE WHEN query_type>0 THEN 1 ELSE 0 END as type
334 WHERE group_artifact_id=$1 AND query_type>0
335 ORDER BY type ASC, query_name ASC',
336 array ($ath->getID()));
340 if (db_numrows($res)>0) {
341 echo '<form action="'. getStringFromServer('PHP_SELF') .'" method="get">';
342 echo '<input type="hidden" name="group_id" value="'.$group_id.'" />';
343 echo '<input type="hidden" name="atid" value="'.$ath->getID().'" />';
344 echo '<input type="hidden" name="power_query" value="1" />';
345 echo ' <table width="100%" cellspacing="0">
349 $optgroup['key'] = 'type';
350 $optgroup['values'][0] = 'Private queries';
351 $optgroup['values'][1] = 'Project queries';
352 echo '<span style="font-size:smaller">';
353 echo '<select name="query_id" id="query_id">';
354 echo '<option value="100">Select One</option>';
356 $selected = $af->getDefaultQuery();
357 while ($row = db_fetch_array($res)) {
358 if ($current != $row['type']) {
361 $label = $row['type'] ? 'Project' : 'Private';
362 echo '<optgroup label="'.$label.'">';
363 $current = $row['type'];
365 echo '<option value="'.$row['artifact_query_id'].'"';
366 if ($row['artifact_query_id'] == $selected)
367 echo ' selected="selected"';
368 echo '>'. $row['query_name'] .'</option>'."\n";
374 <noscript><input type="submit" name="run" value="'._('Power Query').'" /></noscript>
375 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'.
376 _('Build Query').'</a>
380 <script language="JavaScript" type="text/javascript">/* <![CDATA[ */
381 $('#query_id').change(function() {
382 location.href = '<?php echo getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&power_query=1&query_id=' ?>'+$('#query_id').val();
388 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'._('Build Query').'</a></strong>';
392 <div class="tabbertab'.($af->query_type == 'custom' ? ' tabbertabdefault' : '').'" title="'._('Simple Filtering and Sorting').'">
393 <form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
394 <input type="hidden" name="query_id" value="-1" />
395 <input type="hidden" name="set" value="custom" />
396 <table width="100%" cellspacing="0">
399 '._('Assignee').': '. $tech_box .'
402 '._('State').': '. $status_box .'
406 // Compute the list of fields which can be sorted.
407 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
408 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
409 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
410 ARTIFACT_EXTRAFIELDTYPE_SELECT,
411 ARTIFACT_EXTRAFIELDTYPE_RADIO,
412 ARTIFACT_EXTRAFIELDTYPE_STATUS));
413 $keys=array_keys($efarr);
414 for ($k=0; $k<count($keys); $k++) {
416 $order_name_arr[] = $efarr[$i]['field_name'];
417 $order_arr[] = $efarr[$i]['extra_field_id'];
421 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .
422 html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .
423 '<input type="submit" name="submit" value="'._('Quick Browse').'" />';
431 if ($af->query_type == 'default') {
432 echo '<div class="tabbertab tabbertabdefault" title="'._('Default').'">';
433 echo '<strong>'._('Viewing only opened records by default, use \'Advanced queries\' or \'Simple Filtering and Sorting\' to change.').'</strong>';
439 $art_cnt = count($art_arr);
440 if ($art_arr && $art_cnt > 0) {
443 $aq = new ArtifactQuery($ath,$query_id);
444 $has_bargraph = (in_array('bargraph', $aq->getQueryOptions()));
446 $has_bargraph = false;
450 // Display the roadmap block based on the values of the Status field.
451 $colors = array('#a71d16', '#ffa0a0', '#f5f5b5', '#bae0ba', '#16a716');
454 foreach($art_arr as $art) {
455 if ($ath->usesCustomStatuses()) {
456 $custom_id = $ath->getCustomStatusField();
457 $extra_data = $art->getExtraFieldDataText();
458 @$count[ $extra_data[$custom_id]['value'] ]++;
460 @$count[ $art->getStatusName()]++;
463 foreach($count as $n => $c) {
464 $percent[$n] = round(100*$c/$art_cnt);
466 if ($ath->getCustomStatusField()) {
467 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_STATUS));
468 $keys=array_keys($efarr);
469 $field_id = $keys[0];
470 $custom_states = $ath->getExtraFieldElements($field_id);
472 if (is_array($custom_states)) {
473 foreach($custom_states as $state) {
474 $states[] = $state['element_name'];
478 $colors = array('#ffa0a0', '#bae0ba');
479 $res = $ath->getStatuses();
480 while ($row = db_fetch_array($res)) {
481 $states[] = $row['status_name'];
488 if (is_array($states)) {
489 foreach($states as $name) {
491 $graph .= '<td style="background: '.$colors[$i].'; width: '.$percent[$name].'%;"> </td>';
492 $legend .= '<td style="white-space: nowrap; width: '.$percent[$name].'%;">'."<i>$name: $count[$name] ($percent[$name]%)</i></td>";
500 <table class="progress">
502 <tr><?php echo $graph; ?></tr>
505 <table class="progress_legend">
506 <tr><?php echo $legend ?></tr>
512 if ($set=='custom') {
513 $set .= '&_assigned_to='.$_assigned_to.'&_status='.$_status.'&_sort_col='.$_sort_col.'&_sort_ord='.$_sort_ord;
514 if (array_key_exists($ath->getCustomStatusField(),$_extra_fields)) {
515 $set .= '&extra_fields['.$ath->getCustomStatusField().']='.$_extra_fields[$ath->getCustomStatusField()];
520 $IS_ADMIN = forge_check_perm ('tracker', $ath->getID(), 'manager') ;
524 <form name="artifactList" action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
525 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
526 <input type="hidden" name="func" value="massupdate" />';
532 <a href="javascript:checkAllArtifacts(1)">'._('Check all').'</a>
534 <a href="javascript:checkAllArtifacts(0)">'._('Clear all').'</a>';
539 $browse_fields = explode(',', "id,".$ath->getBrowseList());
541 foreach ($browse_fields as $f) {
543 if (intval($f) > 0) {
544 $title = $ath->getExtraFieldName($f);
551 $title=_('Description');
552 if ($f == 'open_date')
553 $title=_('Open Date');
554 if ($f == 'close_date')
555 $title=_('Close Date');
556 if ($f == 'status_id')
558 if ($f == 'priority')
559 $title=_('Priority');
560 if ($f == 'assigned_to')
561 $title=_('Assigned to');
562 if ($f == 'submitted_by')
563 $title=_('Submitted by');
564 if ($f == 'related_tasks')
565 $title=_('Related tasks');
566 if ($f == 'last_modified_date')
567 $title=_('Last Modified Date');
569 $title_arr[] = $title;
573 echo $GLOBALS['HTML']->listTableTop ($title_arr);
576 $then=(time()-$ath->getDuePeriod());
578 for ($i=$start; $i<$max; $i++) {
579 $extra_data = $art_arr[$i]->getExtraFieldDataText();
581 <tr '. $HTML->boxGetAltRowStyle($i) . '>';
582 foreach ($browse_fields as $f) {
584 echo '<td style="white-space: nowrap;">'.
585 ($IS_ADMIN?'<input type="checkbox" name="artifact_id_list[]" value="'.
586 $art_arr[$i]->getID() .'" /> ':'').
587 '<a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
588 $art_arr[$i]->getID() .
589 '&group_id='. $group_id .'&atid='.
590 $ath->getID().'">'.$art_arr[$i]->getID() .
592 } else if ($f == 'summary') {
593 echo '<td><a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
594 $art_arr[$i]->getID() .
595 '&group_id='. $group_id .'&atid='.
597 $art_arr[$i]->getSummary().
599 } else if ($f == 'open_date') {
600 echo '<td>'. (($set != 'closed' && $art_arr[$i]->getOpenDate() < $then)?'* ':' ') .
601 date(_('Y-m-d H:i'),$art_arr[$i]->getOpenDate()) .'</td>';
602 } else if ($f == 'status_id') {
603 echo '<td>'. $art_arr[$i]->getStatusName() .'</td>';
604 } else if ($f == 'priority') {
605 echo '<td class="priority'.$art_arr[$i]->getPriority() .'">'. $art_arr[$i]->getPriority() .'</td>';
606 } else if ($f == 'assigned_to') {
607 echo '<td>'. $art_arr[$i]->getAssignedRealName() .'</td>';
608 } else if ($f == 'submitted_by') {
609 echo '<td>'. $art_arr[$i]->getSubmittedRealName() .'</td>';
610 } else if ($f == 'close_date') {
611 echo '<td>'. ($art_arr[$i]->getCloseDate() ?
612 date(_('Y-m-d H:i'),$art_arr[$i]->getCloseDate()) :' ') .'</td>';
613 } else if ($f == 'details') {
614 echo '<td>'. $art_arr[$i]->getDetails() .'</td>';
615 } else if ($f == 'related_tasks') {
617 $tasks_res = $art_arr[$i]->getRelatedTasks();
619 while ($rest = db_fetch_array($tasks_res)) {
620 $link = '/pm/task.php?func=detailtask&project_task_id='.$rest['project_task_id'].
621 '&group_id='.$group_id.'&group_project_id='.$rest['group_project_id'];
622 $title = '[T'.$rest['project_task_id'].']';
623 if ($rest['status_id'] == 2) {
624 $title = '<strike>'.$title.'</strike>';
626 print $s.'<a href="'.$link.'" title="'.util_html_secure($rest['summary']).'">'.$title.'</a>';
630 } else if ($f == 'last_modified_date') {
631 echo '<td>'. ($art_arr[$i]->getLastModifiedDate() ?
632 date(_('Y-m-d H:i'),$art_arr[$i]->getLastModifiedDate()) :' ') .'</td>';
633 } else if (intval($f) > 0) {
634 // Now display extra-fields (fields are numbers).
635 $value = $extra_data[$f]['value'];
636 if ($extra_data[$f]['type'] == 9) {
637 $value = preg_replace('/\b(\d+)\b/e', "_artifactid2url('\\1')", $value);
638 } else if ($extra_data[$f]['type'] == 7) {
639 if ($art_arr[$i]->getStatusID() == 2) {
640 $value = '<strike>'.$value.'</strike>';
644 echo '<td>' . $value .'</td>';
646 // Display ? for unknown values.
654 echo $GLOBALS['HTML']->listTableBottom();
656 $pages = $art_cnt / $paging;
657 $currentpage = intval($start / $paging);
660 $skipped_pages=false;
661 for ($j=0; $j<$pages; $j++) {
663 if ((($j > 4) && ($j < ($currentpage-5))) || (($j > ($currentpage+5)) && ($j < ($pages-5)))) {
664 if (!$skipped_pages) {
670 $skipped_pages=false;
673 if ($j * $paging == $start) {
674 echo '<strong>'.($j+1).'</strong> ';
676 echo '<a href="'.getStringFromServer('PHP_SELF')."?func=browse&group_id=".$group_id.'&atid='.$ath->getID().'&set='. $set.'&start='.($j*$paging).'"><strong>'.($j+1).'</strong></a> ';
681 echo '<div style="display:table;width:100%">';
682 echo '<div style="display:table-row">';
684 echo '<div style="display:table-cell">';
685 printf(_('* Denotes requests > %1$s Days Old'), ($ath->getDuePeriod()/86400));
688 if (in_array('priority', $browse_fields)) {
689 echo '<div style="display:table-cell;text-align:right">';
690 show_priority_colors_key();
695 echo '<div style="display:table-row">';
697 echo '<div style="display:table-cell">'.$check_all.'</div>';
698 echo '<div style="display:table-cell;text-align:right">'.$pager.'</div>'."\n";
707 echo '<script language="JavaScript" type="text/javascript">/* <![CDATA[ */
708 function checkAll(val) {
709 al=document.artifactList;
710 len = al.elements.length;
712 for( i=0 ; i<len ; i++) {
713 if (al.elements[i].name==\'artifact_id_list[]\') {
714 al.elements[i].checked=val;
720 echo '<fieldset id="fieldset1_closed" class="coolfieldset">
721 <legend>'._('Mass Update').'</legend>
723 <table class="fullwidth" id="admin_mass_update">
726 <span class="important">'._('<strong>Admin:</strong> If you wish to apply changes to all items selected above, use these controls to change their properties and click once on "Mass Update".').'</span></p>
730 // build custom fields
732 $ef = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELD_FILTER_INT));
733 $keys=array_keys($ef);
736 for ($i=0; $i<count($keys); $i++) {
737 if (($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_CHECKBOX) || ($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_MULTISELECT)) {
738 $sel[$keys[$i]]=array('100');
740 $sel[$keys[$i]]='100';
743 $ath->renderExtraFields($sel,true,_('No Change'),false,'',array(ARTIFACT_EXTRAFIELD_FILTER_INT),true);
745 <td><strong>'._('Priority').':</strong><br />';
746 echo build_priority_select_box ('priority', '100', true);
753 <td><strong>'._('Assigned to').':</strong><br />'.
754 $ath->technicianBox ('assigned_to','100.1',true,_('Nobody'),'100.1',_('No Change')) .'</td>
756 if (!$ath->usesCustomStatuses()) {
757 echo '<strong>'._('State').':</strong>
758 <br />'. $ath->statusBox ('status_id','xzxz',true,_('No Change'));
763 <tr><td colspan="2"><strong>'._('Canned Response').':</strong><br />'.
764 $ath->cannedResponseBox ('canned_response') .'</td></tr>
766 <tr><td colspan="3" align="center"><input type="submit" name="submit" value="'._('Mass update').'" /></td></tr>
775 echo '<p class="information">'._('No items found').'</p>';
779 $ath->footer(array());
783 // c-file-style: "bsd"