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 $_submitted_by = getStringFromRequest('_submitted_by');
50 $_assigned_to = getStringFromRequest('_assigned_to');
51 $_sort_col = getStringFromRequest('_sort_col');
52 $_sort_ord = getStringFromRequest('_sort_ord');
53 $extra_fields = getStringFromRequest('extra_fields');
54 $_moddaterange = getStringFromRequest('_moddaterange');
55 $_opendaterange = getStringFromRequest('_opendaterange');
56 $_closedaterange = getStringFromRequest('_closedaterange');
57 $_summary = getStringFromRequest('_summary');
58 $_description = getStringFromRequest('_description');
59 $_followups = getStringFromRequest('_followups');
60 $query_options = array_keys(getArrayFromRequest('query_options'));
61 if (!$aq->create($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
62 $_summary,$_description,$_followups,$query_type, $query_options, $_submitted_by)) {
63 form_release_key(getStringFromRequest('form_key'));
64 exit_error($aq->getErrorMessage(),'tracker');
66 $feedback .= _('Query Successfully Created');
69 $query_id=$aq->getID();
70 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
73 // Make the displayed query the default
75 } elseif ($query_action == 2) {
76 $aq = new ArtifactQuery($ath,$query_id);
77 if (!$aq || !is_object($aq)) {
78 exit_error('Error',$aq->getErrorMessage());
80 if (!$aq->makeDefault()) {
81 $feedback .= $aq->getErrorMessage();
83 $feedback .= 'Query Made Default';
86 // Update the name and or fields of the displayed saved query
88 } elseif ($query_action == 3) {
89 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
90 exit_form_double_submit('tracker');
92 $aq = new ArtifactQuery($ath,$query_id);
93 if (!$aq || !is_object($aq)) {
94 exit_error($aq->getErrorMessage(),'tracker');
96 $query_name = getStringFromRequest('query_name');
97 $query_type = getStringFromRequest('query_type',0);
98 $_status = getStringFromRequest('_status');
99 $_submitted_by = getStringFromRequest('_submitted_by');
100 $_assigned_to = getStringFromRequest('_assigned_to');
101 $_sort_col = getStringFromRequest('_sort_col');
102 $_sort_ord = getStringFromRequest('_sort_ord');
103 $_moddaterange = getStringFromRequest('_moddaterange');
104 $_opendaterange = getStringFromRequest('_opendaterange');
105 $_closedaterange = getStringFromRequest('_closedaterange');
106 $_summary = getStringFromRequest('_summary');
107 $_description = getStringFromRequest('_description');
108 $_followups = getStringFromRequest('_followups');
109 $extra_fields = getStringFromRequest('extra_fields');
110 $query_options = array_keys(getArrayFromRequest('query_options'));
111 if (!$aq->update($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
112 $_summary,$_description,$_followups,$query_type, $query_options, $_submitted_by)) {
113 exit_error($aq->getErrorMessage(),'tracker');
115 $feedback .= _('Query Updated');
118 $query_id=$aq->getID();
119 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
121 // Just load the query
123 } elseif ($query_action == 4) {
124 $aq = new ArtifactQuery($ath,$query_id);
125 if (!$aq || !is_object($aq)) {
126 exit_error($aq->getErrorMessage(),'tracker');
132 } elseif ($query_action == 5) {
133 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
134 exit_form_double_submit('tracker');
136 $aq = new ArtifactQuery($ath,$query_id);
137 if (!$aq || !is_object($aq)) {
138 exit_error($aq->getErrorMessage(),'tracker');
140 if (!$aq->delete()) {
141 $error_msg .= $aq->getErrorMessage();
142 $ret_msg = '&error_msg='.urlencode($error_msg);
144 $feedback .= _('Query Deleted');;
145 $ret_msg = '&feedback='.urlencode($feedback);
148 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse'.$ret_msg);
151 exit_error(_('Missing Build Query Action'),'tracker');
154 $user=session_get_user();
155 $query_id=$user->getPreference('art_query'.$ath->getID());
156 $aq = new ArtifactQuery($ath,$query_id);
157 if (!$aq || !is_object($aq)) {
158 exit_error($aq->getErrorMessage(),'tracker');
166 $_submitted_by=$aq->getSubmitter();
167 $_assigned_to=$aq->getAssignee();
168 $_status=$aq->getStatus();
169 $extra_fields=$aq->getExtraFields();
170 $_sort_col=$aq->getSortCol();
171 $_sort_ord=$aq->getSortOrd();
172 $_moddaterange=$aq->getModDateRange();
173 $_opendaterange=$aq->getOpenDateRange();
174 $_closedaterange=$aq->getCloseDateRange();
175 $_summary=$aq->getSummary();
176 $_description=$aq->getDescription();
177 $_followups=$aq->getFollowups();
178 $query_type=$aq->getQueryType();
180 // creating a submitter box
181 $submitter_box = $ath->submitterBox('_submitted_by[]',$_submitted_by,true,'none','-1',false,true);
182 // creating a custom technician box which includes "any" and "unassigned"
183 $tech_box=$ath->technicianBox ('_assigned_to[]',$_assigned_to,true,'none','-1',false,true);
187 // custom order by arrays to build a pop-up box
189 $order_name_arr=array();
190 $order_name_arr[]=_('ID');
191 $order_name_arr[]=_('Priority');
192 $order_name_arr[]=_('Summary');
193 $order_name_arr[]=_('Open Date');
194 $order_name_arr[]=_('Last Modified Date');
195 $order_name_arr[]=_('Close Date');
196 $order_name_arr[]=_('Submitter');
197 $order_name_arr[]=_('Assignee');
201 $order_arr[]='artifact_id';
202 $order_arr[]='priority';
203 $order_arr[]='summary';
204 $order_arr[]='open_date';
205 $order_arr[]='last_modified_date';
206 $order_arr[]='close_date';
207 $order_arr[]='submitted_by';
208 $order_arr[]='assigned_to';
211 // custom sort arrays to build pop-up box
213 $sort_name_arr=array();
214 $sort_name_arr[]=_('Ascending');
215 $sort_name_arr[]=_('Descending');
223 // custom changed arrays to build pop-up box
225 $changed_name_arr=array();
226 $changed_name_arr[]=_('Any changes');
227 $changed_name_arr[]=_('Last 24H');
228 $changed_name_arr[]=_('Last 7days');
229 $changed_name_arr[]=_('Last 2weeks');
230 $changed_name_arr[]=_('Last 1month');
232 $changed_arr=array();
234 $changed_arr[]= 3600 * 24; // 24 hour
235 $changed_arr[]= 3600 * 24 * 7; // 1 week
236 $changed_arr[]= 3600 * 24 * 14;// 2 week
237 $changed_arr[]= 3600 * 24 * 30;// 1 month
240 // get queries for this user
242 $res = db_query_params ('SELECT artifact_query_id,query_name FROM artifact_query WHERE user_id=$1 AND group_artifact_id=$2',
247 // Show the new pop-up boxes to select assigned to, status, etc
249 $ath->header(array('atid'=>$ath->getID(), 'title' =>_('Build Query')));
251 echo '<table align="center"><tr><td>' .
252 '<fieldset><legend>'.
257 <form action="'.getStringFromServer('PHP_SELF').'?func=query&group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
258 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
259 <table align="center" border="3" cellpadding="4" rules="groups" frame="box" width="100%" class="tablecontent">
262 <input type="submit" name="submit" value="'._('Save Changes').'" />
265 if(db_numrows($res)>0) {
266 echo html_build_select_box($res,'query_id',$query_id,false).'';
272 <tr class="tablecontent">
274 if(db_numrows($res)>0) {
275 if ($query_type == 0 || ($query_type>0 && forge_check_perm ('tracker', $ath->getID(), 'manager'))) {
276 $allow_update = true;
278 $checked[3] = ' checked="checked"';
280 $allow_update = false;
281 $checked[1] = ' checked="checked"';
285 <input type="radio" name="query_action" value="1"'.$checked[1].' />'._('Name and Save Query').'<br />
286 <input type="radio" name="query_action" value="4" />'._('Load Query').'<br />';
289 <input type="radio" name="query_action" value="3"'.$checked[3].' />'._('Update Query').'<br />
290 <input type="radio" name="query_action" value="5" />'._('Delete Query');
294 <input type="hidden" name="query_action" value="1" />'._('Name and Save Query').'<br />';
299 <input type="text" name="query_name" value="'.$aq->getName().'" size="20" maxlength="30" /></td>
304 <table width="100%" class="tablecontent">';
305 if (forge_check_perm ('tracker', $ath->getID(), 'manager')) {
306 $default_query = db_result(db_query_params('SELECT query_name FROM artifact_query WHERE query_type=2 AND group_artifact_id=$1',
307 array ($ath->getID())),
310 if ($default_query) {
311 if ($default_query == $aq->getName()) {
314 $note= '<br/><i>'.sprintf(_('Note: The default project query is currently \'%1$s\'.'), $default_query).'</i>';
317 $note= '<br/><i>'._('Note: There is no default project query defined.').'</i>';
322 <strong>'._('Type of query').':</strong><br />
323 <input name="query_type" value="0" type="radio"'.(($query_type==0) ? ' checked="checked"' : '' ).' />'.
324 _('Private query').'<br />
325 <input name="query_type" value="1" type="radio"'.(($query_type==1) ? ' checked="checked"' : '' ).' />'.
326 _('Project level query (query is public)').'<br />
327 <input name="query_type" value="2" type="radio"'.(($query_type==2) ? ' checked="checked"' : '' ).' />'.
328 _('Default project query (for project level query only)').'<br />
334 if (!$ath->usesCustomStatuses()) {
337 <strong>'._('State').':</strong><br />'. $ath->statusBox('_status',$_status,true,_('Any')).'
343 <td class="top"><strong>'._('Submitter').':</strong><br />'. $submitter_box .'</td>
344 <td class="top"><strong>'._('Assignee').':</strong><br />'. $tech_box .'</td>
346 $ath->renderExtraFields($extra_fields,true,'None',true,'Any',array(),false,'QUERY');
348 // Compute the list of fields which can be sorted.
349 // Currently, only scalar artifacts are taken.
350 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
351 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
352 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
353 ARTIFACT_EXTRAFIELDTYPE_SELECT,
354 ARTIFACT_EXTRAFIELDTYPE_RADIO,
355 ARTIFACT_EXTRAFIELDTYPE_STATUS));
356 $keys=array_keys($efarr);
357 for ($k=0; $k<count($keys); $k++) {
359 $order_name_arr[] = $efarr[$i]['field_name'];
360 $order_arr[] = $efarr[$i]['extra_field_id'];
362 array_multisort($order_name_arr, $order_arr);
364 $tips = '<i>'._('(%% for wildcards)').'</i>';
368 <td colspan="2" nowrap="nowrap">'.
369 '<strong>'._('Last Modified Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
370 <input type="text" name="_moddaterange" size="21" maxlength="21" value="'. htmlspecialchars($_moddaterange) .'" /><p/>
371 <strong>'._('Open Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
372 <input type="text" name="_opendaterange" size="21" maxlength="21" value="'. htmlspecialchars($_opendaterange) .'" /><p/>
373 <strong>'._('Close Date range').':</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
374 <input type="text" name="_closedaterange" size="21" maxlength="21" value="'. htmlspecialchars($_closedaterange) .'" />
379 '<strong>'._('Summary').':</strong> '.$tips.'<br />
380 <input type="text" name="_summary" size="40" value="'. htmlspecialchars($_summary) .'" /><p/>
381 <strong>'._('Detailed description').':</strong> '.$tips.'<br />
382 <input type="text" name="_description" size="40" value="'. htmlspecialchars($_description) .'" /><p/>
383 <strong>'._('Followups').':</strong> '.$tips.'<br />
384 <input type="text" name="_followups" size="40" value="'. htmlspecialchars($_followups) .'" />
388 <td><strong>'._('Order by').':</strong><br />
390 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .'</td>
392 '.html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .'</td>
396 '<p/><strong>Options:</strong><br />
397 <input type="checkbox" name="query_options[bargraph]" '.
398 ((in_array('bargraph', $aq->getQueryOptions())) ? 'checked="checked"' : '')
399 .'/> Display a short summary box on top of the list (roadmap status).<p/>
404 echo '</fieldset></td></tr></table>';
405 $ath->footer(array());
409 // c-file-style: "bsd"