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 * Copyright 2012, Franck Villaume - TrivialDev
7 * http://fusionforge.org
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/ArtifactQuery.class.php';
33 if (!session_loggedin()) {
37 $query_id = getIntFromRequest('query_id');
38 $query_action = getIntFromRequest('query_action');
39 if (getStringFromRequest('submit')) {
41 // Create a Saved Query
44 if ($query_action == 1) {
45 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
46 exit_form_double_submit('tracker');
49 $aq = new ArtifactQuery($ath);
50 if (!$aq || !is_object($aq)) {
51 exit_error($aq->getErrorMessage(),'tracker');
53 $query_name = trim(getStringFromRequest('query_name'));
54 $query_type = getStringFromRequest('query_type',0);
55 $_status = getStringFromRequest('_status');
56 $_submitted_by = getStringFromRequest('_submitted_by');
57 $_assigned_to = getStringFromRequest('_assigned_to');
58 $_sort_col = getStringFromRequest('_sort_col');
59 $_sort_ord = getStringFromRequest('_sort_ord');
60 $extra_fields = getStringFromRequest('extra_fields');
61 $_moddaterange = getStringFromRequest('_moddaterange');
62 $_opendaterange = getStringFromRequest('_opendaterange');
63 $_closedaterange = getStringFromRequest('_closedaterange');
64 $_summary = getStringFromRequest('_summary');
65 $_description = getStringFromRequest('_description');
66 $_followups = getStringFromRequest('_followups');
67 $query_options = array_keys(getArrayFromRequest('query_options'));
68 if (!$aq->create($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
69 $_summary,$_description,$_followups,$query_type, $query_options, $_submitted_by)) {
70 form_release_key(getStringFromRequest('form_key'));
71 exit_error($aq->getErrorMessage(),'tracker');
73 $feedback .= _('Query Successfully Created');
76 $query_id=$aq->getID();
77 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
80 // Make the displayed query the default
82 } elseif ($query_action == 2) {
83 $aq = new ArtifactQuery($ath,$query_id);
84 if (!$aq || !is_object($aq)) {
85 exit_error('Error',$aq->getErrorMessage());
87 if (!$aq->makeDefault()) {
88 $feedback .= $aq->getErrorMessage();
90 $feedback .= 'Query Made Default';
93 // Update the name and or fields of the displayed saved query
95 } elseif ($query_action == 3) {
96 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
97 exit_form_double_submit('tracker');
99 $aq = new ArtifactQuery($ath,$query_id);
100 if (!$aq || !is_object($aq)) {
101 exit_error($aq->getErrorMessage(),'tracker');
103 $query_name = getStringFromRequest('query_name');
104 $query_type = getStringFromRequest('query_type',0);
105 $_status = getStringFromRequest('_status');
106 $_submitted_by = getStringFromRequest('_submitted_by');
107 $_assigned_to = getStringFromRequest('_assigned_to');
108 $_sort_col = getStringFromRequest('_sort_col');
109 $_sort_ord = getStringFromRequest('_sort_ord');
110 $_moddaterange = getStringFromRequest('_moddaterange');
111 $_opendaterange = getStringFromRequest('_opendaterange');
112 $_closedaterange = getStringFromRequest('_closedaterange');
113 $_summary = getStringFromRequest('_summary');
114 $_description = getStringFromRequest('_description');
115 $_followups = getStringFromRequest('_followups');
116 $extra_fields = getStringFromRequest('extra_fields');
117 $query_options = array_keys(getArrayFromRequest('query_options'));
118 if (!$aq->update($query_name,$_status,$_assigned_to,$_moddaterange,$_sort_col,$_sort_ord,$extra_fields,$_opendaterange,$_closedaterange,
119 $_summary,$_description,$_followups,$query_type, $query_options, $_submitted_by)) {
120 exit_error($aq->getErrorMessage(),'tracker');
122 $feedback .= _('Query Updated');
125 $query_id=$aq->getID();
126 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse&feedback='.urlencode($feedback));
128 // Just load the query
130 } elseif ($query_action == 4) {
131 $aq = new ArtifactQuery($ath,$query_id);
132 if (!$aq || !is_object($aq)) {
133 exit_error($aq->getErrorMessage(),'tracker');
139 } elseif ($query_action == 5) {
140 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
141 exit_form_double_submit('tracker');
143 $aq = new ArtifactQuery($ath,$query_id);
144 if (!$aq || !is_object($aq)) {
145 exit_error($aq->getErrorMessage(),'tracker');
147 if (!$aq->delete()) {
148 $error_msg .= $aq->getErrorMessage();
149 $ret_msg = '&error_msg='.urlencode($error_msg);
151 $feedback .= _('Query Deleted');;
152 $ret_msg = '&feedback='.urlencode($feedback);
155 session_redirect('/tracker/?atid='.$atid.'&group_id='.$group_id.'&func=browse'.$ret_msg);
158 exit_error(_('Missing Build Query Action'),'tracker');
161 $user=session_get_user();
162 $query_id=$user->getPreference('art_query'.$ath->getID());
163 $aq = new ArtifactQuery($ath,$query_id);
164 if (!$aq || !is_object($aq)) {
165 exit_error($aq->getErrorMessage(),'tracker');
173 $_submitted_by=$aq->getSubmitter();
174 $_assigned_to=$aq->getAssignee();
175 $_status=$aq->getStatus();
176 $extra_fields=$aq->getExtraFields();
177 $_sort_col=$aq->getSortCol();
178 $_sort_ord=$aq->getSortOrd();
179 $_moddaterange=$aq->getModDateRange();
180 $_opendaterange=$aq->getOpenDateRange();
181 $_closedaterange=$aq->getCloseDateRange();
182 $_summary=$aq->getSummary();
183 $_description=$aq->getDescription();
184 $_followups=$aq->getFollowups();
185 $query_type=$aq->getQueryType();
187 // creating a submitter box
188 $submitter_box = $ath->submitterBox('_submitted_by[]',$_submitted_by,true,'none','-1',false,true);
189 // creating a custom technician box which includes "any" and "unassigned"
190 $tech_box=$ath->technicianBox ('_assigned_to[]',$_assigned_to,true,'none','-1',false,true);
193 // custom order by arrays to build a pop-up box
195 $order_name_arr=array();
196 $order_name_arr[]=_('Id');
197 $order_name_arr[]=_('Priority');
198 $order_name_arr[]=_('Summary');
199 $order_name_arr[]=_('Open Date');
200 $order_name_arr[]=_('Last Modified Date');
201 $order_name_arr[]=_('Close Date');
202 $order_name_arr[]=_('Submitter');
203 $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 24 h');
232 $changed_name_arr[]=_('Last 7 days');
233 $changed_name_arr[]=_('Last 2 weeks');
234 $changed_name_arr[]=_('Last month');
236 $changed_arr=array();
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
244 // get queries for this user
246 $res = db_query_params ('SELECT artifact_query_id,query_name FROM artifact_query WHERE user_id=$1 AND group_artifact_id=$2',
250 // Show the new pop-up boxes to select assigned to, status, etc
252 $ath->header(array('atid'=>$ath->getID(), 'title' =>_('Build Query')));
254 echo '<table style="margin-left:auto;margin-right:auto"><tr><td>' .
255 '<fieldset><legend>'.
260 <form action="'.getStringFromServer('PHP_SELF').'?func=query&group_id='.$group_id.'&atid='.$ath->getID().'" method="post">
261 <input type="hidden" name="form_key" value="'.form_generate_key().'" />
262 <table align="center" border="3" cellpadding="4" rules="groups" frame="box" width="100%" class="tablecontent">
265 <input type="submit" name="submit" value="'._('Save Changes').'" />
268 if(db_numrows($res)>0) {
269 echo html_build_select_box($res,'query_id',$query_id,false).'';
275 <tr class="tablecontent">
277 if(db_numrows($res)>0) {
278 if ($query_type == 0 || ($query_type>0 && forge_check_perm ('tracker', $ath->getID(), 'manager'))) {
279 $allow_update = true;
281 $checked[3] = ' checked="checked"';
283 $allow_update = false;
284 $checked[1] = ' checked="checked"';
288 <input type="radio" name="query_action" value="1"'.$checked[1].' />'._('Name and Save Query').'<br />
289 <input type="radio" name="query_action" value="4" />'._('Load Query').'<br />';
292 <input type="radio" name="query_action" value="3"'.$checked[3].' />'._('Update Query').'<br />
293 <input type="radio" name="query_action" value="5" />'._('Delete Query');
297 <input type="hidden" name="query_action" value="1" />'._('Name and Save Query').'<br />';
302 <input type="text" name="query_name" value="'.$aq->getName().'" size="20" maxlength="30" /></td>
307 <table width="100%" class="tablecontent">';
308 if (forge_check_perm ('tracker', $ath->getID(), 'manager')) {
309 $default_query = db_result(db_query_params('SELECT query_name FROM artifact_query WHERE query_type=2 AND group_artifact_id=$1',
310 array ($ath->getID())),
313 if ($default_query) {
314 if ($default_query == $aq->getName()) {
317 $note= '<br/><i>'.sprintf(_('Note: The default project query is currently ā%sā.'), $default_query).'</i>';
320 $note= '<br/><i>'._('Note: There is no default project query defined.').'</i>';
325 <strong>'._('Type of query')._(': ').'</strong><br />
326 <input name="query_type" value="0" type="radio"'.(($query_type==0) ? ' checked="checked"' : '' ).' />'.
327 _('Private query').'<br />
328 <input name="query_type" value="1" type="radio"'.(($query_type==1) ? ' checked="checked"' : '' ).' />'.
329 _('Project level query (query is public)').'<br />
330 <input name="query_type" value="2" type="radio"'.(($query_type==2) ? ' checked="checked"' : '' ).' />'.
331 _('Default project query (for project level query only)').'<br />
337 if (!$ath->usesCustomStatuses()) {
340 <strong>'._('State')._(': ').'</strong><br />'. $ath->statusBox('_status',$_status,true,_('Any')).'
346 <td class="top"><strong>'._('Submitter')._(': ').'</strong><br />'. $submitter_box .'</td>
347 <td class="top"><strong>'._('Assignee')._(': ').'</strong><br />'. $tech_box .'</td>
349 $ath->renderExtraFields($extra_fields,true,'None',true,'Any',array(),false,'QUERY');
351 // Compute the list of fields which can be sorted.
352 // Currently, only scalar artifacts are taken.
353 $efarr = $ath->getExtraFields(array(ARTIFACT_EXTRAFIELDTYPE_TEXT,
354 ARTIFACT_EXTRAFIELDTYPE_TEXTAREA,
355 ARTIFACT_EXTRAFIELDTYPE_INTEGER,
356 ARTIFACT_EXTRAFIELDTYPE_SELECT,
357 ARTIFACT_EXTRAFIELDTYPE_RADIO,
358 ARTIFACT_EXTRAFIELDTYPE_STATUS));
359 $keys=array_keys($efarr);
360 for ($k=0; $k<count($keys); $k++) {
362 $order_name_arr[] = $efarr[$i]['field_name'];
363 $order_arr[] = $efarr[$i]['extra_field_id'];
365 array_multisort($order_name_arr, $order_arr);
367 $tips = '<i>'._('(%% for wildcards)').'</i>';
371 <td colspan="2" style="white-space: nowrap;">'.
372 '<strong>'._('Last Modified Date range')._(':').'</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
373 <input type="text" name="_moddaterange" size="21" maxlength="21" value="'. htmlspecialchars($_moddaterange) .'" /><p/>
374 <strong>'._('Open Date range')._(':').'</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
375 <input type="text" name="_opendaterange" size="21" maxlength="21" value="'. htmlspecialchars($_opendaterange) .'" /><p/>
376 <strong>'._('Close Date range')._(':').'</strong> <i>(YYYY-MM-DD YYYY-MM-DD Format)</i><br />
377 <input type="text" name="_closedaterange" size="21" maxlength="21" value="'. htmlspecialchars($_closedaterange) .'" />
382 '<strong>'._('Summary')._(': ').'</strong> '.$tips.'<br />
383 <input type="text" name="_summary" size="40" value="'. htmlspecialchars($_summary) .'" /><p/>
384 <strong>'._('Detailed description')._(': ').'</strong> '.$tips.'<br />
385 <input type="text" name="_description" size="40" value="'. htmlspecialchars($_description) .'" /><p/>
386 <strong>'._('Comments')._(': ').'</strong> '.$tips.'<br />
387 <input type="text" name="_followups" size="40" value="'. htmlspecialchars($_followups) .'" />
391 <td><strong>'._('Order by')._(': ').'</strong><br />
393 html_build_select_box_from_arrays($order_arr,$order_name_arr,'_sort_col',$_sort_col,false) .'</td>
395 '.html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'_sort_ord',$_sort_ord,false) .'</td>
399 '<p><strong>'._('Options')._(':').'</strong><br />
400 <input type="checkbox" name="query_options[bargraph]" '.
401 ((in_array('bargraph', $aq->getQueryOptions())) ? 'checked="checked"' : '')
402 .'/>'._('Display a short summary box on top of the list (roadmap status).').'</p>
407 echo '</fieldset></td></tr></table>';
408 $ath->footer(array());
412 // c-file-style: "bsd"