3 * Copyright 2005 (c) GForge Group, LLC; Anthony J. Pugliese,
4 * Copyright 2010 (c) Fusionforge Team
5 * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
6 * http://fusionforge.org
8 * This file is part of FusionForge. FusionForge is free software;
9 * you can redistribute it and/or modify it under the terms of the
10 * GNU General Public License as published by the Free Software
11 * Foundation; either version 2 of the Licence, or (at your option)
14 * FusionForge is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 require_once $gfcommon.'tracker/ArtifactQuery.class.php';
26 if (!session_loggedin()) {
30 $query_id = getIntFromRequest('query_id');
31 $query_action = getIntFromRequest('query_action');
32 if (getStringFromRequest('submit')) {
34 // Create a Saved Query
37 if ($query_action == 1) {
38 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
39 exit_form_double_submit('tracker');
42 $aq = new ArtifactQuery($ath);
43 if (!$aq || !is_object($aq)) {
44 exit_error($aq->getErrorMessage(),'tracker');
46 $query_name = trim(getStringFromRequest('query_name'));
47 $query_type = getStringFromRequest('query_type',0);
48 $_status = getStringFromRequest('_status');
49 $_assigned_to = getStringFromRequest('_assigned_to');
50 $_sort_col = getStringFromRequest('_sort_col');
51 $_sort_ord = getStringFromRequest('_sort_ord');
52 $extra_fields = getStringFromRequest('extra_fields');
53 $_moddaterange = getStringFromRequest('_moddaterange');
54 $_opendaterange = getStringFromRequest('_opendaterange');
55 $_closedaterange = getStringFromRequest('_closedaterange');
56 $_summary = getStringFromRequest('_summary');
57 $_description = getStringFromRequest('_description');
58 $_followups = getStringFromRequest('_followups');
59 $query_options = array_keys(getArrayFromRequest('query_options'));
60 if (!$aq->create($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
61 $_summary,$_description,$_followups,$query_type, $query_options)) {
62 form_release_key(getStringFromRequest('form_key'));
63 exit_error($aq->getErrorMessage(),'tracker');
65 $feedback .= _('Query Successfully Created');
68 $query_id=$aq->getID();
69 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
72 // Make the displayed query the default
74 } elseif ($query_action == 2) {
75 $aq = new ArtifactQuery($ath,$query_id);
76 if (!$aq || !is_object($aq)) {
77 exit_error('Error',$aq->getErrorMessage());
79 if (!$aq->makeDefault()) {
80 $feedback .= $aq->getErrorMessage();
82 $feedback .= 'Query Made Default';
85 // Update the name and or fields of the displayed saved query
87 } elseif ($query_action == 3) {
88 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
89 exit_form_double_submit('tracker');
91 $aq = new ArtifactQuery($ath,$query_id);
92 if (!$aq || !is_object($aq)) {
93 exit_error($aq->getErrorMessage(),'tracker');
95 $query_name = getStringFromRequest('query_name');
96 $query_type = getStringFromRequest('query_type',0);
97 $_status = getStringFromRequest('_status');
98 $_assigned_to = getStringFromRequest('_assigned_to');
99 $_sort_col = getStringFromRequest('_sort_col');
100 $_sort_ord = getStringFromRequest('_sort_ord');
101 $_moddaterange = getStringFromRequest('_moddaterange');
102 $_opendaterange = getStringFromRequest('_opendaterange');
103 $_closedaterange = getStringFromRequest('_closedaterange');
104 $_summary = getStringFromRequest('_summary');
105 $_description = getStringFromRequest('_description');
106 $_followups = getStringFromRequest('_followups');
107 $extra_fields = getStringFromRequest('extra_fields');
108 $query_options = array_keys(getArrayFromRequest('query_options'));
109 if (!$aq->update($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
110 $_summary,$_description,$_followups,$query_type, $query_options)) {
111 exit_error($aq->getErrorMessage(),'tracker');
113 $feedback .= _('Query Updated');
116 $query_id=$aq->getID();
117 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
119 // Just load the query
121 } elseif ($query_action == 4) {
122 $aq = new ArtifactQuery($ath,$query_id);
123 if (!$aq || !is_object($aq)) {
124 exit_error($aq->getErrorMessage(),'tracker');
130 } elseif ($query_action == 5) {
131 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
132 exit_form_double_submit('tracker');
134 $aq = new ArtifactQuery($ath,$query_id);
135 if (!$aq || !is_object($aq)) {
136 exit_error($aq->getErrorMessage(),'tracker');
138 if (!$aq->delete()) {
139 $error_msg .= $aq->getErrorMessage();
140 $ret_msg = '&error_msg='.urlencode($error_msg);
142 $feedback .= _('Query Deleted');;
143 $ret_msg = '&feedback='.urlencode($feedback);
146 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse'.$ret_msg);
149 exit_error(_('Missing Build Query Action'),'tracker');
152 $user=session_get_user();
153 $query_id=$user->getPreference('art_query'.$ath->getID());
154 $aq = new ArtifactQuery($ath,$query_id);
155 if (!$aq || !is_object($aq)) {
156 exit_error($aq->getErrorMessage(),'tracker');
164 $_assigned_to=$aq->getAssignee();
165 $_status=$aq->getStatus();
166 $extra_fields=$aq->getExtraFields();
167 $_sort_col=$aq->getSortCol();
168 $_sort_ord=$aq->getSortOrd();
169 $_moddaterange=$aq->getModDateRange();
170 $_opendaterange=$aq->getOpenDateRange();
171 $_closedaterange=$aq->getCloseDateRange();
172 $_summary=$aq->getSummary();
173 $_description=$aq->getDescription();
174 $_followups=$aq->getFollowups();
175 $query_type=$aq->getQueryType();
177 // creating a custom technician box which includes "any" and "unassigned"
178 $tech_box=$ath->technicianBox ('_assigned_to[]',$_assigned_to,true,'none','-1',false,true);
182 // custom order by arrays to build a pop-up box
184 $order_name_arr=array();
185 $order_name_arr[]=_('ID');
186 $order_name_arr[]=_('Priority');
187 $order_name_arr[]=_('Summary');
188 $order_name_arr[]=_('Open Date');
189 $order_name_arr[]=_('Last Modified Date');
190 $order_name_arr[]=_('Close Date');
191 $order_name_arr[]=_('Submitter');
192 $order_name_arr[]=_('Assignee');
196 $order_arr[]='artifact_id';
197 $order_arr[]='priority';
198 $order_arr[]='summary';
199 $order_arr[]='open_date';
200 $order_arr[]='last_modified_date';
201 $order_arr[]='close_date';
202 $order_arr[]='submitted_by';
203 $order_arr[]='assigned_to';
206 // custom sort arrays to build pop-up box
208 $sort_name_arr=array();
209 $sort_name_arr[]=_('Ascending');
210 $sort_name_arr[]=_('Descending');
218 // custom changed arrays to build pop-up box
220 $changed_name_arr=array();
221 $changed_name_arr[]=_('Any changes');
222 $changed_name_arr[]=_('Last 24H');
223 $changed_name_arr[]=_('Last 7days');
224 $changed_name_arr[]=_('Last 2weeks');
225 $changed_name_arr[]=_('Last 1month');
227 $changed_arr=array();
229 $changed_arr[]= 3600 * 24; // 24 hour
230 $changed_arr[]= 3600 * 24 * 7; // 1 week
231 $changed_arr[]= 3600 * 24 * 14;// 2 week
232 $changed_arr[]= 3600 * 24 * 30;// 1 month
235 // get queries for this user
237 $res = db_query_params ('SELECT artifact_query_id,query_name FROM artifact_query WHERE user_id=$1 AND group_artifact_id=$2',
242 // Show the new pop-up boxes to select assigned to, status, etc
244 $ath->header(array('atid'=>$ath->getID(), 'title' =>_('Build Query')));
246 echo '<table align="center"><tr><td>' .
247 '<fieldset><legend>'.
252 <form action="'.getStringFromServer('PHP_SELF').'?func=query&group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
253 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
254 <table align="center" border="3" cellpadding="4" rules="groups" frame="box" width="100%" class="tablecontent">
257 <input type="submit" name="submit" value="'._('Save Changes').'" />
260 if(db_numrows($res)>0) {
261 echo html_build_select_box($res,'query_id',$query_id,false).'';
267 <tr class="tablecontent">
269 if(db_numrows($res)>0) {
270 if ($query_type == 0 || ($query_type>0 && forge_check_perm ('tracker', $ath->getID(), 'manager'))) {
271 $allow_update = true;
273 $checked[3] = ' checked="checked"';
275 $allow_update = false;
276 $checked[1] = ' checked="checked"';
280 <input type="radio" name="query_action" value="1"'.$checked[1].' />'._('Name and Save Query').'<br />
281 <input type="radio" name="query_action" value="4" />'._('Load Query').'<br />';
284 <input type="radio" name="query_action" value="3"'.$checked[3].' />'._('Update Query').'<br />
285 <input type="radio" name="query_action" value="5" />'._('Delete Query');
289 <input type="hidden" name="query_action" value="1" />'._('Name and Save Query').'<br />';
294 <input type="text" name="query_name" value="'.$aq->getName().'" size="20" maxlength="30" /></td>
299 <table width="100%" class="tablecontent">';
300 if (forge_check_perm ('tracker', $ath->getID(), 'manager')) {
301 $default_query = db_result(db_query_params('SELECT query_name FROM artifact_query WHERE query_type=2 AND group_artifact_id=$1',
302 array ($ath->getID())),
305 if ($default_query) {
306 if ($default_query == $aq->getName()) {
309 $note= '<br/><i>'.sprintf(_('Note: The default project query is currently \'%1$s\'.'), $default_query).'</i>';
312 $note= '<br/><i>'._('Note: There is no default project query defined.').'</i>';
317 <strong>'._('Type of query').':</strong><br />
318 <input name="query_type" value="0" type="radio"'.(($query_type==0) ? ' checked="checked"' : '' ).' />'.
319 _('Private query').'<br />
320 <input name="query_type" value="1" type="radio"'.(($query_type==1) ? ' checked="checked"' : '' ).' />'.
321 _('Project level query (query is public)').'<br />
322 <input name="query_type" value="2" type="radio"'.(($query_type==2) ? ' checked="checked"' : '' ).' />'.
323 _('Default project query (for project level query only)').'<br />
330 <td><strong>'._('Assignee').':</strong><br />'. $tech_box .'</td>
332 if (!$ath->usesCustomStatuses()) {
333 echo '<strong>'._('State').':</strong><br />'. $ath->statusBox('_status',$_status,true,_('Any'));
337 $ath->renderExtraFields($extra_fields,true,'None',true,'Any',array(),false,'QUERY');
339 // Compute the list of fields which can be sorted.
340 // Currently, only scalar artifacts are taken.
341 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
342 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
343 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
344 ARTIFACT_EXTRAFIELDTYPE_SELECT,
345 ARTIFACT_EXTRAFIELDTYPE_RADIO,
346 ARTIFACT_EXTRAFIELDTYPE_STATUS));
347 $keys=array_keys($efarr);
348 for ($k=0; $k<count($keys); $k++) {
350 $order_name_arr[] = $efarr[$i]['field_name'];
351 $order_arr[] = $efarr[$i]['extra_field_id'];
353 array_multisort($order_name_arr, $order_arr);
355 $tips = '<i>'._('(%% for wildcards)').'</i> ';
359 <td colspan="2" nowrap="nowrap">'.
360 '<strong>'._('Last Modified Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
361 <input type="text" name="_moddaterange" size="21" maxlength="21" value="'. htmlspecialchars($_moddaterange) .'" /><p/>
362 <strong>'._('Open Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
363 <input type="text" name="_opendaterange" size="21" maxlength="21" value="'. htmlspecialchars($_opendaterange) .'" /><p/>
364 <strong>'._('Close Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
365 <input type="text" name="_closedaterange" size="21" maxlength="21" value="'. htmlspecialchars($_closedaterange) .'" />
370 '<strong>'._('Summary').':</strong> '.$tips.'<br />
371 <input type="text" name="_summary" size="40" value="'. htmlspecialchars($_summary) .'" /><p/>
372 <strong>'._('Detailed description').':</strong> '.$tips.'<br />
373 <input type="text" name="_description" size="40" value="'. htmlspecialchars($_description) .'" /><p/>
374 <strong>'._('Followups').':</strong> '.$tips.'<br />
375 <input type="text" name="_followups" size="40" value="'. htmlspecialchars($_followups) .'" />
379 <td><strong>'._('Order by').':</strong><br />
381 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .'</td>
383 '.html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .'</td>
387 '<p/><strong>Options:</strong><br />
388 <input type="checkbox" name="query_options[bargraph]" '.
389 ((in_array('bargraph', $aq->getQueryOptions())) ? 'checked="checked"' : '')
390 .'/> Display a short summary box on top of the list (roadmap status).<p/>
395 echo '</fieldset></td></tr></table>';
396 $ath->footer(array());
400 // c-file-style: "bsd"