5 * Copyright 1999-2001 (c) VA Linux Systems
6 * Copyright 2010 Roland Mas
7 * Copyright (C) 2011-2012 Alain Peyrat - Alcatel-Lucent
8 * Copyright 2012, Franck Villaume - TrivialDev
10 * This file is part of FusionForge. FusionForge is free software;
11 * you can redistribute it and/or modify it under the terms of the
12 * GNU General Public License as published by the Free Software
13 * Foundation; either version 2 of the Licence, or (at your option)
16 * FusionForge is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License along
22 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
27 require_once $gfcommon.'tracker/ArtifactQuery.class.php';
34 // make sure this person has permission to view artifacts
36 session_require_perm ('tracker', $ath->getID(), 'read') ;
38 $query_id = getIntFromRequest('query_id');
39 $start = getIntFromRequest('start');
43 // The browse page can be powered by a pre-saved query
44 // or by select boxes chosen by the user
46 // If there is a $query_id coming from the request OR the pref
47 // was already saved, use the artifact factory that way.
49 // If the query_id = -1, unset the pref and use regular browse boxes
51 if (session_loggedin()) {
52 $u =& session_get_user();
53 if (getStringFromRequest('setpaging')) {
54 /* store paging preferences */
55 $paging = getIntFromRequest('nres');
59 $u->setPreference("paging", $paging);
63 if ($query_id == '-1') {
64 $u->setPreference('art_query'.$ath->getID(),'');
66 $aq = new ArtifactQuery($ath,$query_id);
67 if (!$aq || !is_object($aq)) {
68 exit_error($aq->getErrorMessage(),'tracker');
73 $query_id=$u->getPreference('art_query'.$ath->getID(),'');
75 } elseif ($query_id) {
76 // If user is not logged, then use a cookie to store the current query.
77 if (isset($_COOKIE["GFTrackerQuery"])) {
78 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
80 $gf_tracker = array();
82 $gf_tracker[$ath->getID()] = $query_id;
83 // Send the query_id as a cookie to save it.
84 setcookie("GFTrackerQuery", serialize($gf_tracker));
85 $_COOKIE["GFTrackerQuery"] = serialize($gf_tracker);
86 } elseif (isset($_COOKIE["GFTrackerQuery"])) {
87 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
88 $query_id = (int)$gf_tracker[$ath->getID()];
91 $af = new ArtifactFactory($ath);
93 if (!$af || !is_object($af)) {
94 exit_error(_('Could Not Get Factory'),'tracker');
95 } elseif ($af->isError()) {
96 exit_error($af->getErrorMessage(),'tracker');
99 if (!isset($_sort_col)) {
100 /* default sort order: highest priority first */
101 $_sort_col = 'priority';
104 $offset = getStringFromRequest('offset');
105 $_sort_col = getStringFromRequest('_sort_col',$_sort_col);
106 $_sort_ord = getStringFromRequest('_sort_ord',$_sort_ord);
107 $max_rows = getIntFromRequest('max_rows', 25);
108 $set = getStringFromRequest('set');
109 $_assigned_to = getIntFromRequest('_assigned_to');
110 $_status = getIntFromRequest('_status');
111 $_extra_fields = array() ;
112 $aux_extra_fields = array() ;
114 if ($set == 'custom') {
115 /* may be past in next/prev url */
116 $i = $ath->getCustomStatusField();
117 $tmp_extra_fields = getArrayFromRequest('extra_fields');
118 if (isset($tmp_extra_fields[$i])) {
119 $_extra_fields[$i] = $tmp_extra_fields[$i];
123 if (is_array($_extra_fields)){
124 $keys=array_keys($_extra_fields);
125 foreach ($keys as $key) {
126 if ($_extra_fields[$key] != 'Array') {
127 $aux_extra_fields[$key] = $_extra_fields[$key];
131 if (isset($_extra_fields)){
132 $aux_extra_fields = $_extra_fields;
134 $aux_extra_fields = '';
138 $af->setup($offset,$_sort_col,$_sort_ord,$paging,$set,$_assigned_to,$_status,$aux_extra_fields);
140 // These vals are sanitized and/or retrieved from ArtifactFactory stored settings
142 $_sort_col=$af->order_col;
143 $_sort_ord=$af->sort;
144 $_status=$af->status;
145 $_assigned_to=$af->assigned_to;
146 $_extra_fields=$af->extra_fields;
148 $art_arr = $af->getArtifacts();
150 if (!$art_arr && $af->isError()) {
151 exit_error($af->getErrorMessage(),'tracker');
154 //build page title to make bookmarking easier
155 //if a user was selected, add the user_name to the title
157 use_javascript('/tabber/tabber.js');
159 html_use_coolfieldset();
161 $ath->header(array('atid'=>$ath->getID(), 'title'=>$ath->getName()));
165 * Build the powerful browsing options pop-up boxes
170 // creating a custom technician box which includes "any" and "unassigned"
172 $engine = RBACEngine::getInstance () ;
173 $techs = $engine->getUsersByAllowedAction ('tracker', $ath->getID(), 'tech') ;
175 $tech_id_arr = array () ;
176 $tech_name_arr = array () ;
178 foreach ($techs as $tech) {
179 $tech_id_arr[] = $tech->getID() ;
180 $tech_name_arr[] = $tech->getRealName() ;
182 $tech_id_arr[]='0'; //this will be the 'any' row
183 $tech_name_arr[]=_('Any');
185 if (is_array($_assigned_to)) {
188 $tech_box=html_build_select_box_from_arrays ($tech_id_arr,$tech_name_arr,'_assigned_to',$_assigned_to,true,_('Unassigned'));
192 // custom order by arrays to build a pop-up box
194 $order_name_arr=array();
195 $order_name_arr[]=_('ID');
196 $order_name_arr[]=_('Priority');
197 $order_name_arr[]=_('Summary');
198 $order_name_arr[]=_('Open Date');
199 $order_name_arr[]=_('Last Modified Date');
200 $order_name_arr[]=_('Close Date');
201 $order_name_arr[]=_('Submitter');
202 $order_name_arr[]=_('Assignee');
206 $order_arr[]='artifact_id';
207 $order_arr[]='priority';
208 $order_arr[]='summary';
209 $order_arr[]='open_date';
210 $order_arr[]='last_modified_date';
211 $order_arr[]='close_date';
212 $order_arr[]='submitted_by';
213 $order_arr[]='assigned_to';
216 // custom sort arrays to build pop-up box
218 $sort_name_arr=array();
219 $sort_name_arr[]=_('Ascending');
220 $sort_name_arr[]=_('Descending');
227 // custom changed arrays to build pop-up box
229 $changed_name_arr=array();
230 $changed_name_arr[]=_('Any changes');
231 $changed_name_arr[]=_('Last 24H');
232 $changed_name_arr[]=_('Last 7days');
233 $changed_name_arr[]=_('Last 2weeks');
234 $changed_name_arr[]=_('Last 1month');
236 $changed_arr=array();
237 $changed_arr[]= 0x7fffffff; // Any
238 $changed_arr[]= 3600 * 24; // 24 hour
239 $changed_arr[]= 3600 * 24 * 7; // 1 week
240 $changed_arr[]= 3600 * 24 * 14;// 2 week
241 $changed_arr[]= 3600 * 24 * 30;// 1 month
243 if ($art_arr && ($art_cnt = count($art_arr)) > 0) {
244 $focus = getIntFromRequest('focus');
251 if (session_loggedin()) {
252 /* logged in users get configurable paging */
253 $paging = $u->getPreference("paging");
254 echo '<form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&start='.
255 $start.'" method="post">'."\n";
262 for ($i = 0; $i < $art_cnt; ++$i)
263 if ($art_arr[$i]->getID() == $focus) {
268 $max = ($art_cnt > ($start + $paging)) ? ($start + $paging) : $art_cnt;
273 printf('<p>' . _('Displaying results %1$d‒%2$d out of %3$d total.'),
274 $start + 1, $max, $art_cnt);
275 if (session_loggedin()) {
276 printf(' ' . _('Displaying %2$s results.') . "\n\t<input " .
277 'type="submit" name="setpaging" value="%1$s" />' .
278 "\n</p>\n</form>\n", _('Change'),
279 html_build_select_box_from_array(array(
280 '10', '25', '50', '100', '1000'), 'nres', $paging, 1));
287 * Show the free-form text submitted by the project admin
289 echo $ath->renderBrowseInstructions();
292 // statuses can be custom in GForge 4.5+
294 if ($ath->usesCustomStatuses()) {
295 $aux_extra_fields = array();
296 if (is_array($_extra_fields)){
297 $keys=array_keys($_extra_fields);
298 foreach ($keys as $key) {
299 if (!is_array($_extra_fields[$key])) {
300 $aux_extra_fields[$key] = $_extra_fields[$key];
304 $aux_extra_fields = $_extra_fields;
306 $checked_status = isset($aux_extra_fields[$ath->getCustomStatusField()]) ? $aux_extra_fields[$ath->getCustomStatusField()] : '';
307 $status_box=$ath->renderSelect ($ath->getCustomStatusField(), $checked_status, false, '', true, _('Any'));
309 if (is_array($_status)) {
312 $status_box = $ath->statusBox('_status',$_status,true,_('Any'));
316 $proj_name = $group->getUnixName();
317 $proj_url = util_make_url_g($group->getUnixName(),$group_id);
318 // the tracker's URIs are constructed in order to support addition of an OSLC-CM REST server
319 // inside /tracker/cm/. There each tracker has a URL in the form .../project/PROJ_NAME/atid/ATID
320 $tracker_stdzd_uri = util_make_url('/tracker/cm/project/'. $proj_name .'/atid/'. $ath->getID());
321 print '<div about="'. $tracker_stdzd_uri
322 .'" typeof="sioc:Container">'."\n";
323 print '<span rel="http://www.w3.org/2002/07/owl#sameAs" resource="" />'."\n";
324 print '<span rev="doap:bug-database sioc:space_of" resource="'. $proj_url .'" />'."\n";
325 print "</div>\n"; // end of about
328 <div id="tabber" class="tabber">
329 <div class="tabbertab" title="'._('Advanced queries').'">';
331 if (session_loggedin()) {
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 (user_id=$2 OR query_type>0)
335 ORDER BY type ASC, query_name ASC',
336 array ($ath->getID(),
339 $res = db_query_params ('SELECT artifact_query_id,query_name, CASE WHEN query_type>0 THEN 1 ELSE 0 END as type
341 WHERE group_artifact_id=$1 AND query_type>0
342 ORDER BY type ASC, query_name ASC',
343 array ($ath->getID()));
347 if (db_numrows($res)>0) {
348 echo '<form action="'. getStringFromServer('PHP_SELF') .'" method="get">';
349 echo '<input type="hidden" name="group_id" value="'.$group_id.'" />';
350 echo '<input type="hidden" name="atid" value="'.$ath->getID().'" />';
351 echo '<input type="hidden" name="power_query" value="1" />';
352 echo ' <table class="fullwidth">
356 $optgroup['key'] = 'type';
357 $optgroup['values'][0] = 'Private queries';
358 $optgroup['values'][1] = 'Project queries';
359 echo '<span style="font-size:smaller">';
360 echo '<select name="query_id" id="query_id">';
361 echo '<option value="100">Select One</option>';
363 $selected = $af->getDefaultQuery();
364 while ($row = db_fetch_array($res)) {
365 if ($current != $row['type']) {
368 $label = $row['type'] ? 'Project' : 'Private';
369 echo '<optgroup label="'.$label.'">';
370 $current = $row['type'];
372 echo '<option value="'.$row['artifact_query_id'].'"';
373 if ($row['artifact_query_id'] == $selected)
374 echo ' selected="selected"';
375 echo '>'. $row['query_name'] .'</option>'."\n";
381 <noscript><input type="submit" name="run" value="'._('Power Query').'" /></noscript>
382 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'.
383 _('Build Query').'</a>
387 <script type="text/javascript">/* <![CDATA[ */
388 $('#query_id').change(function() {
389 location.href = '<?php echo getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&power_query=1&query_id=' ?>'+$('#query_id').val();
395 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'._('Build Query').'</a></strong>';
399 <div class="tabbertab'.($af->query_type == 'custom' ? ' tabbertabdefault' : '').'" title="'._('Simple Filtering and Sorting').'">
400 <form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
401 <input type="hidden" name="query_id" value="-1" />
402 <input type="hidden" name="set" value="custom" />
403 <table class="fullwidth">
406 '._('Assignee').': '. $tech_box .'
408 <td class="align-center">
409 '._('State').': '. $status_box .'
411 <td class="align-right">';
413 // Compute the list of fields which can be sorted.
414 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
415 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
416 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
417 ARTIFACT_EXTRAFIELDTYPE_SELECT,
418 ARTIFACT_EXTRAFIELDTYPE_RADIO,
419 ARTIFACT_EXTRAFIELDTYPE_STATUS));
420 $keys=array_keys($efarr);
421 for ($k=0; $k<count($keys); $k++) {
423 $order_name_arr[] = $efarr[$i]['field_name'];
424 $order_arr[] = $efarr[$i]['extra_field_id'];
428 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .
429 html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .
430 '<input type="submit" name="submit" value="'._('Quick Browse').'" />';
438 if ($af->query_type == 'default') {
439 echo '<div class="tabbertab tabbertabdefault" title="'._('Default').'">';
440 echo '<strong>'._('Viewing only opened records by default, use \'Advanced queries\' or \'Simple Filtering and Sorting\' to change.').'</strong>';
446 $art_cnt = count($art_arr);
447 if ($art_arr && $art_cnt > 0) {
450 $aq = new ArtifactQuery($ath,$query_id);
451 $has_bargraph = (in_array('bargraph', $aq->getQueryOptions()));
453 $has_bargraph = false;
457 // Display the roadmap block based on the values of the Status field.
458 $colors = array('#a71d16', '#ffa0a0', '#f5f5b5', '#bae0ba', '#16a716');
461 foreach($art_arr as $art) {
462 if ($ath->usesCustomStatuses()) {
463 $custom_id = $ath->getCustomStatusField();
464 $extra_data = $art->getExtraFieldDataText();
465 @$count[ $extra_data[$custom_id]['value'] ]++;
467 @$count[ $art->getStatusName()]++;
470 foreach($count as $n => $c) {
471 $percent[$n] = round(100*$c/$art_cnt);
473 if ($ath->getCustomStatusField()) {
474 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_STATUS));
475 $keys=array_keys($efarr);
476 $field_id = $keys[0];
477 $custom_states = $ath->getExtraFieldElements($field_id);
479 if (is_array($custom_states)) {
480 foreach($custom_states as $state) {
481 $states[] = $state['element_name'];
485 $colors = array('#ffa0a0', '#bae0ba');
486 $res = $ath->getStatuses();
487 while ($row = db_fetch_array($res)) {
488 $states[] = $row['status_name'];
495 if (is_array($states)) {
496 foreach($states as $name) {
498 $graph .= '<td style="background: '.$colors[$i].'; width: '.$percent[$name].'%;"> </td>';
499 $legend .= '<td style="white-space: nowrap; width: '.$percent[$name].'%;">'."<i>$name: $count[$name] ($percent[$name]%)</i></td>";
507 <table class="progress">
509 <tr><?php echo $graph; ?></tr>
512 <table class="progress_legend">
513 <tr><?php echo $legend ?></tr>
519 if ($set=='custom') {
520 $set .= '&_assigned_to='.$_assigned_to.'&_status='.$_status.'&_sort_col='.$_sort_col.'&_sort_ord='.$_sort_ord;
521 if (array_key_exists($ath->getCustomStatusField(),$_extra_fields)) {
522 $set .= '&extra_fields['.$ath->getCustomStatusField().']='.$_extra_fields[$ath->getCustomStatusField()];
527 $IS_ADMIN = forge_check_perm ('tracker', $ath->getID(), 'manager') ;
531 <form name="artifactList" action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
532 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
533 <input type="hidden" name="func" value="massupdate" />';
539 <a href="javascript:checkAllArtifacts(1)">'._('Check all').'</a>
541 <a href="javascript:checkAllArtifacts(0)">'._('Clear all').'</a>';
546 $browse_fields = explode(',', "id,".$ath->getBrowseList());
548 foreach ($browse_fields as $f) {
550 if (intval($f) > 0) {
551 $title = $ath->getExtraFieldName($f);
558 $title=_('Description');
559 if ($f == 'open_date')
560 $title=_('Open Date');
561 if ($f == 'close_date')
562 $title=_('Close Date');
563 if ($f == 'status_id')
565 if ($f == 'priority')
566 $title=_('Priority');
567 if ($f == 'assigned_to')
568 $title=_('Assigned to');
569 if ($f == 'submitted_by')
570 $title=_('Submitted by');
571 if ($f == 'related_tasks')
572 $title=_('Related tasks');
573 if ($f == 'last_modified_date')
574 $title=_('Last Modified Date');
576 $title_arr[] = $title;
580 echo $GLOBALS['HTML']->listTableTop ($title_arr);
583 $then=(time()-$ath->getDuePeriod());
585 for ($i=$start; $i<$max; $i++) {
586 $extra_data = $art_arr[$i]->getExtraFieldDataText();
588 <tr '. $HTML->boxGetAltRowStyle($i) . '>';
589 foreach ($browse_fields as $f) {
591 echo '<td style="white-space: nowrap;">'.
592 ($IS_ADMIN?'<input type="checkbox" name="artifact_id_list[]" value="'.
593 $art_arr[$i]->getID() .'" /> ':'').
594 '<a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
595 $art_arr[$i]->getID() .
596 '&group_id='. $group_id .'&atid='.
597 $ath->getID().'">'.$art_arr[$i]->getID() .
599 } elseif ($f == 'summary') {
600 echo '<td><a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
601 $art_arr[$i]->getID() .
602 '&group_id='. $group_id .'&atid='.
604 $art_arr[$i]->getSummary().
606 } elseif ($f == 'open_date') {
607 echo '<td>'. (($set != 'closed' && $art_arr[$i]->getOpenDate() < $then)?'* ':' ') .
608 date(_('Y-m-d H:i'),$art_arr[$i]->getOpenDate()) .'</td>';
609 } elseif ($f == 'status_id') {
610 echo '<td>'. $art_arr[$i]->getStatusName() .'</td>';
611 } elseif ($f == 'priority') {
612 echo '<td class="priority'.$art_arr[$i]->getPriority() .'">'. $art_arr[$i]->getPriority() .'</td>';
613 } elseif ($f == 'assigned_to') {
614 echo '<td>'. $art_arr[$i]->getAssignedRealName() .'</td>';
615 } elseif ($f == 'submitted_by') {
616 echo '<td>'. $art_arr[$i]->getSubmittedRealName() .'</td>';
617 } elseif ($f == 'close_date') {
618 echo '<td>'. ($art_arr[$i]->getCloseDate() ?
619 date(_('Y-m-d H:i'),$art_arr[$i]->getCloseDate()) :' ') .'</td>';
620 } elseif ($f == 'details') {
621 echo '<td>'. $art_arr[$i]->getDetails() .'</td>';
622 } elseif ($f == 'related_tasks') {
624 $tasks_res = $art_arr[$i]->getRelatedTasks();
626 while ($rest = db_fetch_array($tasks_res)) {
627 $link = '/pm/task.php?func=detailtask&project_task_id='.$rest['project_task_id'].
628 '&group_id='.$group_id.'&group_project_id='.$rest['group_project_id'];
629 $title = '[T'.$rest['project_task_id'].']';
630 if ($rest['status_id'] == 2) {
631 $title = '<strike>'.$title.'</strike>';
633 print $s.'<a href="'.$link.'" title="'.util_html_secure($rest['summary']).'">'.$title.'</a>';
637 } elseif ($f == 'last_modified_date') {
638 echo '<td>'. ($art_arr[$i]->getLastModifiedDate() ?
639 date(_('Y-m-d H:i'),$art_arr[$i]->getLastModifiedDate()) :' ') .'</td>';
640 } elseif (intval($f) > 0) {
641 // Now display extra-fields (fields are numbers).
642 $value = $extra_data[$f]['value'];
643 if ($extra_data[$f]['type'] == 9) {
644 $value = preg_replace('/\b(\d+)\b/e', "_artifactid2url('\\1')", $value);
645 } elseif ($extra_data[$f]['type'] == 7) {
646 if ($art_arr[$i]->getStatusID() == 2) {
647 $value = '<strike>'.$value.'</strike>';
651 echo '<td>' . $value .'</td>';
653 // Display ? for unknown values.
661 echo $GLOBALS['HTML']->listTableBottom();
663 $pages = $art_cnt / $paging;
664 $currentpage = intval($start / $paging);
667 $skipped_pages=false;
668 for ($j=0; $j<$pages; $j++) {
670 if ((($j > 4) && ($j < ($currentpage-5))) || (($j > ($currentpage+5)) && ($j < ($pages-5)))) {
671 if (!$skipped_pages) {
677 $skipped_pages=false;
680 if ($j * $paging == $start) {
681 echo '<strong>'.($j+1).'</strong> ';
683 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> ';
688 echo '<div style="display:table;width:100%">';
689 echo '<div style="display:table-row">';
691 echo '<div style="display:table-cell">';
692 printf(_('* Denotes requests > %1$s Days Old'), ($ath->getDuePeriod()/86400));
695 if (in_array('priority', $browse_fields)) {
696 echo '<div style="display:table-cell;text-align:right">';
697 show_priority_colors_key();
702 echo '<div style="display:table-row">';
704 echo '<div style="display:table-cell">'.$check_all.'</div>';
705 echo '<div style="display:table-cell;text-align:right">'.$pager.'</div>'."\n";
714 echo '<fieldset id="fieldset1_closed" class="coolfieldset">
715 <legend>'._('Mass Update').'</legend>
717 <table class="fullwidth" id="admin_mass_update">
720 <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>
724 // build custom fields
726 $ef = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELD_FILTER_INT));
727 $keys=array_keys($ef);
730 for ($i=0; $i<count($keys); $i++) {
731 if (($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_CHECKBOX) || ($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_MULTISELECT)) {
732 $sel[$keys[$i]]=array('100');
734 $sel[$keys[$i]]='100';
737 $ath->renderExtraFields($sel,true,_('No Change'),false,'',array(ARTIFACT_EXTRAFIELD_FILTER_INT),true);
739 <td><strong>'._('Priority').':</strong><br />';
740 echo build_priority_select_box ('priority', '100', true);
747 <td><strong>'._('Assigned to').':</strong><br />'.
748 $ath->technicianBox ('assigned_to','100.1',true,_('Nobody'),'100.1',_('No Change')) .'</td>
750 if (!$ath->usesCustomStatuses()) {
751 echo '<strong>'._('State').':</strong>
752 <br />'. $ath->statusBox ('status_id','xzxz',true,_('No Change'));
757 <tr><td colspan="2"><strong>'._('Canned Response').':</strong><br />'.
758 $ath->cannedResponseBox ('canned_response') .'</td></tr>
760 <tr><td colspan="3" align="center"><input type="submit" name="submit" value="'._('Mass update').'" /></td></tr>
769 echo '<p class="information">'._('No items found').'</p>';
773 $ath->footer(array());
777 // c-file-style: "bsd"