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-2013, Franck Villaume - TrivialDev
9 * Copyright 2011, Iñigo Martinez
11 * This file is part of FusionForge. FusionForge is free software;
12 * you can redistribute it and/or modify it under the terms of the
13 * GNU General Public License as published by the Free Software
14 * Foundation; either version 2 of the Licence, or (at your option)
17 * FusionForge is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License along
23 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
28 require_once $gfcommon.'tracker/ArtifactQuery.class.php';
35 // make sure this person has permission to view artifacts
37 session_require_perm ('tracker', $ath->getID(), 'read') ;
39 $query_id = getIntFromRequest('query_id');
40 $start = getIntFromRequest('start');
44 // The browse page can be powered by a pre-saved query
45 // or by select boxes chosen by the user
47 // If there is a $query_id coming from the request OR the pref
48 // was already saved, use the artifact factory that way.
50 // If the query_id = -1, unset the pref and use regular browse boxes
52 if (session_loggedin()) {
53 $u =& session_get_user();
54 if (getStringFromRequest('setpaging')) {
55 /* store paging preferences */
56 $paging = getIntFromRequest('nres');
60 $u->setPreference("paging", $paging);
64 if ($query_id == '-1') {
65 $u->setPreference('art_query'.$ath->getID(),'');
67 $aq = new ArtifactQuery($ath,$query_id);
68 if (!$aq || !is_object($aq)) {
69 exit_error($aq->getErrorMessage(),'tracker');
74 $query_id=$u->getPreference('art_query'.$ath->getID(),'');
76 } elseif ($query_id) {
77 // If user is not logged, then use a cookie to store the current query.
78 if (isset($_COOKIE["GFTrackerQuery"])) {
79 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
81 $gf_tracker = array();
83 $gf_tracker[$ath->getID()] = $query_id;
84 // Send the query_id as a cookie to save it.
85 setcookie("GFTrackerQuery", serialize($gf_tracker));
86 $_COOKIE["GFTrackerQuery"] = serialize($gf_tracker);
87 } elseif (isset($_COOKIE["GFTrackerQuery"])) {
88 $gf_tracker = unserialize($_COOKIE["GFTrackerQuery"]);
89 $query_id = (int)$gf_tracker[$ath->getID()];
92 $af = new ArtifactFactory($ath);
94 if (!$af || !is_object($af)) {
95 exit_error(_('Could Not Get Factory'),'tracker');
96 } elseif ($af->isError()) {
97 exit_error($af->getErrorMessage(),'tracker');
100 if (!isset($_sort_col)) {
101 /* default sort order: highest priority first */
102 $_sort_col = 'priority';
105 $offset = getStringFromRequest('offset');
106 $_sort_col = getStringFromRequest('_sort_col',$_sort_col);
107 $_sort_ord = getStringFromRequest('_sort_ord',$_sort_ord);
108 $max_rows = getIntFromRequest('max_rows', 25);
109 $set = getStringFromRequest('set');
110 $_assigned_to = getIntFromRequest('_assigned_to');
111 $_status = getIntFromRequest('_status');
112 $_extra_fields = array() ;
113 $aux_extra_fields = array() ;
115 if ($set == 'custom') {
116 /* may be past in next/prev url */
117 $i = $ath->getCustomStatusField();
118 $tmp_extra_fields = getArrayFromRequest('extra_fields');
119 if (isset($tmp_extra_fields[$i])) {
120 $_extra_fields[$i] = $tmp_extra_fields[$i];
124 if (is_array($_extra_fields)){
125 $keys=array_keys($_extra_fields);
126 foreach ($keys as $key) {
127 if ($_extra_fields[$key] != 'Array') {
128 $aux_extra_fields[$key] = $_extra_fields[$key];
132 if (isset($_extra_fields)){
133 $aux_extra_fields = $_extra_fields;
135 $aux_extra_fields = '';
139 $af->setup($offset,$_sort_col,$_sort_ord,$paging,$set,$_assigned_to,$_status,$aux_extra_fields);
141 // These vals are sanitized and/or retrieved from ArtifactFactory stored settings
143 $_sort_col=$af->order_col;
144 $_sort_ord=$af->sort;
145 $_status=$af->status;
146 $_assigned_to=$af->assigned_to;
147 $_extra_fields=$af->extra_fields;
149 $art_arr = $af->getArtifacts();
151 if (!$art_arr && $af->isError()) {
152 exit_error($af->getErrorMessage(),'tracker');
155 //build page title to make bookmarking easier
156 //if a user was selected, add the user_name to the title
158 use_javascript('/tabber/tabber.js');
160 html_use_coolfieldset();
162 $ath->header(array('atid'=>$ath->getID(), 'title'=>$ath->getName()));
166 * Build the powerful browsing options pop-up boxes
171 // creating a custom technician box which includes "any" and "unassigned"
173 $engine = RBACEngine::getInstance () ;
174 $techs = $engine->getUsersByAllowedAction ('tracker', $ath->getID(), 'tech') ;
176 $tech_id_arr = array () ;
177 $tech_name_arr = array () ;
179 foreach ($techs as $tech) {
180 $tech_id_arr[] = $tech->getID() ;
181 $tech_name_arr[] = $tech->getRealName() ;
183 $tech_id_arr[]='0'; //this will be the 'any' row
184 $tech_name_arr[]=_('Any');
186 if (is_array($_assigned_to)) {
189 $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');
205 $order_arr[]='artifact_id';
206 $order_arr[]='priority';
207 $order_arr[]='summary';
208 $order_arr[]='open_date';
209 $order_arr[]='last_modified_date';
210 $order_arr[]='close_date';
211 $order_arr[]='submitted_by';
212 $order_arr[]='assigned_to';
215 // custom sort arrays to build pop-up box
217 $sort_name_arr=array();
218 $sort_name_arr[]=_('Ascending');
219 $sort_name_arr[]=_('Descending');
226 // custom changed arrays to build pop-up box
228 $changed_name_arr=array();
229 $changed_name_arr[]=_('Any changes');
230 $changed_name_arr[]=_('Last 24 h');
231 $changed_name_arr[]=_('Last 7 days');
232 $changed_name_arr[]=_('Last 2 weeks');
233 $changed_name_arr[]=_('Last month');
235 $changed_arr=array();
236 $changed_arr[]= 0x7fffffff; // Any
237 $changed_arr[]= 3600 * 24; // 24 hour
238 $changed_arr[]= 3600 * 24 * 7; // 1 week
239 $changed_arr[]= 3600 * 24 * 14;// 2 week
240 $changed_arr[]= 3600 * 24 * 30;// 1 month
242 if ($art_arr && ($art_cnt = count($art_arr)) > 0) {
243 $focus = getIntFromRequest('focus');
250 if (session_loggedin()) {
251 /* logged in users get configurable paging */
252 $paging = $u->getPreference("paging");
253 echo '<form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&start='.
254 $start.'" method="post">'."\n";
261 for ($i = 0; $i < $art_cnt; ++$i)
262 if ($art_arr[$i]->getID() == $focus) {
267 $max = ($art_cnt > ($start + $paging)) ? ($start + $paging) : $art_cnt;
272 printf('<p>' . _('Displaying results %1$d‒%2$d out of %3$d total.'),
273 $start + 1, $max, $art_cnt);
274 if (session_loggedin()) {
275 printf(' ' . _('Displaying %2$s results.') . "\n\t<input " .
276 'type="submit" name="setpaging" value="%1$s" />' .
277 "\n</p>\n</form>\n", _('Change'),
278 html_build_select_box_from_array(array(
279 '10', '25', '50', '100', '1000'), 'nres', $paging, 1));
286 * Show the free-form text submitted by the project admin
288 echo $ath->renderBrowseInstructions();
291 // statuses can be custom in GForge 4.5+
293 if ($ath->usesCustomStatuses()) {
294 $aux_extra_fields = array();
295 if (is_array($_extra_fields)){
296 $keys=array_keys($_extra_fields);
297 foreach ($keys as $key) {
298 if (!is_array($_extra_fields[$key])) {
299 $aux_extra_fields[$key] = $_extra_fields[$key];
303 $aux_extra_fields = $_extra_fields;
305 $checked_status = isset($aux_extra_fields[$ath->getCustomStatusField()]) ? $aux_extra_fields[$ath->getCustomStatusField()] : '';
306 $status_box=$ath->renderSelect ($ath->getCustomStatusField(), $checked_status, false, '', true, _('Any'));
308 if (is_array($_status)) {
311 $status_box = $ath->statusBox('_status',$_status,true,_('Any'));
315 $proj_name = $group->getUnixName();
316 $proj_url = util_make_url_g($group->getUnixName(),$group_id);
317 // the tracker's URIs are constructed in order to support addition of an OSLC-CM REST server
318 // inside /tracker/cm/. There each tracker has a URL in the form .../project/PROJ_NAME/atid/ATID
319 $tracker_stdzd_uri = util_make_url('/tracker/cm/project/'. $proj_name .'/atid/'. $ath->getID());
320 print '<div about="'. $tracker_stdzd_uri
321 .'" typeof="sioc:Container">'."\n";
322 print '<span rel="http://www.w3.org/2002/07/owl#sameAs" resource="" />'."\n";
323 print '<span rev="doap:bug-database sioc:space_of" resource="'. $proj_url .'" />'."\n";
324 print "</div>\n"; // end of about
327 <div id="tabber" class="tabber">
328 <div class="tabbertab" title="'._('Advanced queries').'">';
330 if (session_loggedin()) {
331 $res = db_query_params ('SELECT artifact_query_id,query_name, CASE WHEN query_type>0 THEN 1 ELSE 0 END as type
333 WHERE group_artifact_id=$1 AND (user_id=$2 OR query_type>0)
334 ORDER BY type ASC, query_name ASC',
335 array ($ath->getID(),
338 $res = db_query_params ('SELECT artifact_query_id,query_name, CASE WHEN query_type>0 THEN 1 ELSE 0 END as type
340 WHERE group_artifact_id=$1 AND query_type>0
341 ORDER BY type ASC, query_name ASC',
342 array ($ath->getID()));
345 if (db_numrows($res)>0) {
346 echo '<form action="'. getStringFromServer('PHP_SELF') .'" method="get">';
347 echo '<input type="hidden" name="group_id" value="'.$group_id.'" />';
348 echo '<input type="hidden" name="atid" value="'.$ath->getID().'" />';
349 echo '<input type="hidden" name="power_query" value="1" />';
350 echo ' <table class="fullwidth">
354 $optgroup['key'] = 'type';
355 $optgroup['values'][0] = 'Private queries';
356 $optgroup['values'][1] = 'Project queries';
357 echo '<select name="query_id" id="query_id">';
358 echo '<option value="100">' . _('Select One') . '</option>';
360 $selected = $af->getDefaultQuery();
361 while ($row = db_fetch_array($res)) {
362 if ($current != $row['type']) {
365 $label = $row['type'] ? _('Project') : _('Private');
366 echo '<optgroup label="'.$label.'">';
367 $current = $row['type'];
369 echo '<option value="'.$row['artifact_query_id'].'"';
370 if ($row['artifact_query_id'] == $selected)
371 echo ' selected="selected"';
372 echo '>'. $row['query_name'] .'</option>'."\n";
377 <noscript><input type="submit" name="run" value="'._('Power Query').'" /></noscript>
378 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'.
379 _('Build Query').'</a>
383 <script type="text/javascript">/* <![CDATA[ */
384 $('#query_id').change(function() {
385 location.href = '<?php echo getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'&power_query=1&query_id=' ?>'+$('#query_id').val();
391 <a href="/tracker/?atid='. $ath->getID().'&group_id='.$group_id.'&func=query">'._('Build Query').'</a></strong>';
395 <div class="tabbertab'.($af->query_type == 'custom' ? ' tabbertabdefault' : '').'" title="'._('Simple Filtering and Sorting').'">
396 <form action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
397 <input type="hidden" name="query_id" value="-1" />
398 <input type="hidden" name="set" value="custom" />
399 <table class="fullwidth">
402 '._('Assignee')._(': '). $tech_box .'
404 <td class="align-center">
405 '._('State')._(': '). $status_box .'
407 <td class="align-right">';
409 // Compute the list of fields which can be sorted.
410 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
411 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
412 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
413 ARTIFACT_EXTRAFIELDTYPE_SELECT,
414 ARTIFACT_EXTRAFIELDTYPE_RADIO,
415 ARTIFACT_EXTRAFIELDTYPE_STATUS));
416 $keys=array_keys($efarr);
417 for ($k=0; $k<count($keys); $k++) {
419 $order_name_arr[] = $efarr[$i]['field_name'];
420 $order_arr[] = $efarr[$i]['extra_field_id'];
424 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .
425 html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .
426 '<input type="submit" name="submit" value="'._('Quick Browse').'" />';
434 if ($af->query_type == 'default') {
435 echo '<div class="tabbertab tabbertabdefault" title="'._('Default').'">';
437 echo sprintf(_('Viewing only opened records by default, use “%1$s” or “%2$s” to change.'),
438 _('Advanced queries'),
439 _('Simple Filtering and Sorting'));
441 echo '</div>' . "\n";
443 echo '</div>' . "\n";
445 $art_cnt = count($art_arr);
446 if ($art_arr && $art_cnt > 0) {
449 $aq = new ArtifactQuery($ath,$query_id);
450 $has_bargraph = (in_array('bargraph', $aq->getQueryOptions()));
452 $has_bargraph = false;
456 // Display the roadmap block based on the values of the Status field.
457 $colors = array('#a71d16', '#ffa0a0', '#f5f5b5', '#bae0ba', '#16a716');
460 foreach($art_arr as $art) {
461 if ($ath->usesCustomStatuses()) {
462 $custom_id = $ath->getCustomStatusField();
463 $extra_data = $art->getExtraFieldDataText();
464 @$count[ $extra_data[$custom_id]['value'] ]++;
466 @$count[ $art->getStatusName()]++;
469 foreach($count as $n => $c) {
470 $percent[$n] = round(100*$c/$art_cnt);
472 if ($ath->getCustomStatusField()) {
473 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_STATUS));
474 $keys=array_keys($efarr);
475 $field_id = $keys[0];
476 $custom_states = $ath->getExtraFieldElements($field_id);
478 if (is_array($custom_states)) {
479 foreach($custom_states as $state) {
480 $states[] = $state['element_name'];
484 $colors = array('#ffa0a0', '#bae0ba');
485 $res = $ath->getStatuses();
486 while ($row = db_fetch_array($res)) {
487 $states[] = $row['status_name'];
494 if (is_array($states)) {
495 foreach($states as $name) {
497 $graph .= '<td style="background: '.$colors[$i].'; width: '.$percent[$name].'%;"> </td>';
498 $legend .= '<td style="white-space: nowrap; width: '.$percent[$name].'%;">'."<i>$name: $count[$name] ($percent[$name]%)</i></td>";
506 <table class="progress">
508 <tr><?php echo $graph; ?></tr>
511 <table class="progress_legend">
512 <tr><?php echo $legend ?></tr>
518 if ($set=='custom') {
519 $set .= '&_assigned_to='.$_assigned_to.'&_status='.$_status.'&_sort_col='.$_sort_col.'&_sort_ord='.$_sort_ord;
520 if (array_key_exists($ath->getCustomStatusField(),$_extra_fields)) {
521 $set .= '&extra_fields['.$ath->getCustomStatusField().']='.$_extra_fields[$ath->getCustomStatusField()];
526 $IS_ADMIN = forge_check_perm ('tracker', $ath->getID(), 'manager') ;
530 <form name="artifactList" action="'. getStringFromServer('PHP_SELF') .'?group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
531 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
532 <input type="hidden" name="func" value="massupdate" />';
538 <a href="javascript:checkAllArtifacts(1)">'._('Check all').'</a>
540 <a href="javascript:checkAllArtifacts(0)">'._('Clear all').'</a>';
545 $browse_fields = explode(',', "id,".$ath->getBrowseList());
547 foreach ($browse_fields as $f) {
549 if (intval($f) > 0) {
550 $title = $ath->getExtraFieldName($f);
557 $title=_('Description');
558 if ($f == 'open_date')
559 $title=_('Open Date');
560 if ($f == 'close_date')
561 $title=_('Close Date');
562 if ($f == 'status_id')
564 if ($f == 'priority')
565 $title=_('Priority');
566 if ($f == 'assigned_to')
567 $title=_('Assigned to');
568 if ($f == 'submitted_by')
569 $title=_('Submitted by');
570 if ($f == 'related_tasks')
571 $title=_('Related Tasks');
572 if ($f == 'last_modified_date')
573 $title=_('Last Modified Date');
575 $title_arr[] = $title;
579 echo $GLOBALS['HTML']->listTableTop ($title_arr);
582 $then=(time()-$ath->getDuePeriod());
584 for ($i=$start; $i<$max; $i++) {
585 $extra_data = $art_arr[$i]->getExtraFieldDataText();
587 <tr class=priority'. $art_arr[$i]->getPriority().'>';
588 foreach ($browse_fields as $f) {
590 echo '<td style="white-space: nowrap;">'.
591 ($IS_ADMIN?'<input type="checkbox" name="artifact_id_list[]" value="'.
592 $art_arr[$i]->getID() .'" /> ':'').
593 '<a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
594 $art_arr[$i]->getID() .
595 '&group_id='. $group_id .'&atid='.
596 $ath->getID().'">'.$art_arr[$i]->getID() .
598 } elseif ($f == 'summary') {
599 echo '<td><a href="'.getStringFromServer('PHP_SELF').'?func=detail&aid='.
600 $art_arr[$i]->getID() .
601 '&group_id='. $group_id .'&atid='.
603 $art_arr[$i]->getSummary().
605 } elseif ($f == 'open_date') {
606 echo '<td>'. (($set != 'closed' && $art_arr[$i]->getOpenDate() < $then)?'* ':' ') .
607 date(_('Y-m-d H:i'),$art_arr[$i]->getOpenDate()) .'</td>';
608 } elseif ($f == 'status_id') {
609 echo '<td>'. $art_arr[$i]->getStatusName() .'</td>';
610 } elseif ($f == 'priority') {
611 echo '<td class="priority'.$art_arr[$i]->getPriority() .'">'. $art_arr[$i]->getPriority() .'</td>';
612 } elseif ($f == 'assigned_to') {
613 echo '<td>'. $art_arr[$i]->getAssignedRealName() .'</td>';
614 } elseif ($f == 'submitted_by') {
615 echo '<td>'. $art_arr[$i]->getSubmittedRealName() .'</td>';
616 } elseif ($f == 'close_date') {
617 echo '<td>'. ($art_arr[$i]->getCloseDate() ?
618 date(_('Y-m-d H:i'),$art_arr[$i]->getCloseDate()) :' ') .'</td>';
619 } elseif ($f == 'details') {
620 echo '<td>'. $art_arr[$i]->getDetails() .'</td>';
621 } elseif ($f == 'related_tasks') {
623 $tasks_res = $art_arr[$i]->getRelatedTasks();
625 while ($rest = db_fetch_array($tasks_res)) {
626 $link = '/pm/task.php?func=detailtask&project_task_id='.$rest['project_task_id'].
627 '&group_id='.$group_id.'&group_project_id='.$rest['group_project_id'];
628 $title = '[T'.$rest['project_task_id'].']';
629 if ($rest['status_id'] == 2) {
630 $title = '<span class="strike">'.$title.'</span>';
632 print $s.'<a href="'.$link.'" title="'.util_html_secure($rest['summary']).'">'.$title.'</a>';
636 } elseif ($f == 'last_modified_date') {
637 echo '<td>'. ($art_arr[$i]->getLastModifiedDate() ?
638 date(_('Y-m-d H:i'),$art_arr[$i]->getLastModifiedDate()) :' ') .'</td>';
639 } elseif (intval($f) > 0) {
640 // Now display extra-fields (fields are numbers).
641 $value = $extra_data[$f]['value'];
642 if ($extra_data[$f]['type'] == 9) {
643 $value = preg_replace('/\b(\d+)\b/e', "_artifactid2url('\\1')", $value);
644 } elseif ($extra_data[$f]['type'] == 7) {
645 if ($art_arr[$i]->getStatusID() == 2) {
646 $value = '<span class="strike">'.$value.'</span>';
650 echo '<td>' . $value .'</td>';
652 // Display ? for unknown values.
660 echo $GLOBALS['HTML']->listTableBottom();
662 $pages = $art_cnt / $paging;
663 $currentpage = intval($start / $paging);
666 $skipped_pages=false;
667 for ($j=0; $j<$pages; $j++) {
669 if ((($j > 4) && ($j < ($currentpage-5))) || (($j > ($currentpage+5)) && ($j < ($pages-5)))) {
670 if (!$skipped_pages) {
676 $skipped_pages=false;
679 if ($j * $paging == $start) {
680 echo '<strong>'.($j+1).'</strong> ';
682 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> ';
687 echo '<div style="display:table;width:100%">';
688 echo '<div style="display:table-row">';
690 echo '<div style="display:table-cell">';
691 printf(_('* Denotes requests > %s Days Old'), ($ath->getDuePeriod()/86400));
694 if (in_array('priority', $browse_fields)) {
695 echo '<div style="display:table-cell;text-align:right">';
696 show_priority_colors_key();
701 echo '<div style="display:table-row">';
703 echo '<div style="display:table-cell">'.$check_all.'</div>';
704 echo '<div style="display:table-cell;text-align:right">'.$pager.'</div>'."\n";
713 echo '<fieldset id="fieldset1_closed" class="coolfieldset">
714 <legend>'._('Mass Update').'</legend>
716 <table class="fullwidth" id="admin_mass_update">
718 <p class="information">'._('If you wish to apply changes to all items selected above, use these controls to change their properties and click once on “Mass Update”.').'</p>
722 // build custom fields
724 $ef = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELD_FILTER_INT));
725 $keys=array_keys($ef);
728 for ($i=0; $i<count($keys); $i++) {
729 if (($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_CHECKBOX) || ($ef[$keys[$i]]['field_type']==ARTIFACT_EXTRAFIELDTYPE_MULTISELECT)) {
730 $sel[$keys[$i]]=array('100');
732 $sel[$keys[$i]]='100';
735 $ath->renderExtraFields($sel,true,_('No Change'),false,'', array(ARTIFACT_EXTRAFIELD_FILTER_INT),true);
737 <td><strong>'._('Priority')._(':').'</strong><br />';
738 build_priority_select_box ('priority', '100', true);
745 <td><strong>'._('Assigned to')._(':').'</strong><br />'.
746 $ath->technicianBox ('assigned_to','100.1',true,_('Nobody'),'100.1',_('No Change')) .'</td>
748 if (!$ath->usesCustomStatuses()) {
749 echo '<strong>'._('State')._(': ').'</strong>
750 <br />'. $ath->statusBox ('status_id','xzxz',true,_('No Change'));
755 echo '<tr><td colspan="2"><strong>'._('Canned Response')._(':').'</strong><br />'.
756 $ath->cannedResponseBox ('canned_response') .'</td></tr>
758 <tr><td colspan="3" class="align-center"><input type="submit" name="submit" value="'._('Mass Update').'" /></td></tr>
767 echo '<p class="information">'._('No items found').'</p>';
771 $ath->footer(array());
775 // c-file-style: "bsd"