1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
5 die("custom query... todo...");
7 mtrack_head("Custom Query");
9 echo "<h1>Custom Query</h1>\n";
11 /* This logic matches up to equivalent logic in the macro_RunReport
12 * function in inc/report */
16 if (strlen($_SERVER['QUERY_STRING'])) {
17 $qs = $_SERVER['QUERY_STRING'];
19 $qs = mtrack_get_pathinfo();
22 list ($params, $mparams) = MTrack_Report::parseQuery($qs);
24 echo "<form action='{$ABSWEB}query.php' method='get' id='qform' onsubmit='return false;'>";
25 echo "<table id='qtable'></table></form>";
27 $params = json_encode($params);
29 $milestones = json_encode(array_values(MTrack_Milestone::enumMilestones(true)));
31 <form id='customqryaddfilter'>
32 Add Filter: <select id='addfilt'>
33 <option value="">- Select to add a filter</option>
36 $fields = array('cc', 'component', 'milestone', 'status', 'owner',
37 'type', 'summary', 'ticket', 'priority', 'keyword');
42 foreach ($fields as $field) {
43 echo "<option value='$field'>" . ucfirst($field) . "</option>\n";
44 $labels[$field] = ucfirst($field);
46 $C = MTrackTicket_CustomFields::getInstance();
47 $custom_fields = new stdclass;
48 foreach ($C->fields as $f) {
49 echo "<option value='$f->name'>" .
50 htmlentities($f->label, ENT_QUOTES, 'utf-8') . "</option>\n";
51 $labels[$f->name] = $f->label;
52 if ($f->type == 'select' || $f->type == 'multiselect') {
53 $d = $f->ticketData();
54 $custom_fields->{$f->name} = array_values($d['options']);
60 <div id='colselector'>
61 <h3><a href='#'>Choose Columns (drag to re-order)</a></h3>
62 <div style="display:none">
66 $labels = json_encode($labels);
67 $custom_fields = json_encode($custom_fields);
68 $c = new MTrackClassification;
69 $classifications = json_encode(array_values($c->enumerate()));
70 $c = new MTrackPriority;
71 $priorities = json_encode(array_values($c->enumerate()));
72 /* Allow selection of columns */
73 function add_col($name, $label) {
75 $checked = in_array($name, $mparams['col']) ? ' checked="yes" ' : '';
76 $label = htmlentities($label, ENT_QUOTES, 'utf-8');
77 echo "<li class='ui-state-default'><input type='checkbox' name='col_$name' mtrackcol='$name' class='qrycol' $checked> ";
78 echo "<label for='col_$name'>$label</label></li> ";
82 // Add in the selected columns in order first
83 foreach ($mparams['col'] as $col) {
84 $field = $C->fieldByName($col);
86 $all_cols[$field->name] = $field->label;
88 $all_cols[$col] = ucfirst($col);
91 // Add in other possible fields
92 foreach ($fields as $field) {
93 $all_cols[$field] = ucfirst($field);
95 $possible_fields = array(
96 'severity', 'remaining'
98 foreach ($possible_fields as $name) {
99 $all_cols[$name] = ucfirst($name);
101 foreach ($C->fields as $f) {
102 $all_cols[$f->name] = $f->label;
105 foreach ($all_cols as $name => $label) {
106 add_col($name, $label);
114 <button id='updfilt'>Update</button><br>
115 <script language='javascript' type='text/javascript'>
117 var milestones = $milestones;
118 var classifications = $classifications;
119 var priorities = $priorities;
120 var next_field_id = 1;
121 var adding_field = false;
122 var custom_fields = $custom_fields;
123 var field_labels = $labels;
125 function mtrack_add_sel(sel, a, b)
127 sel.options[sel.options.length] = new Option(a, b);
130 // given a field name, operator and value, create a new entry in the form
131 function mtrack_add_field(name, op, value)
133 var qtable = document.getElementById('qtable');
135 // <tr><td>X</td><td>name</td><td>op select</td><td>value</td></tr>
136 var tr = document.createElement('tr');
137 var xcell = document.createElement('td');
138 var but = document.createElement('button');
140 xcell.appendChild(but);
141 xcell.onclick = function() {
142 qtable.removeChild(tr);
145 tr.appendChild(xcell);
147 var ncell = document.createElement('td');
148 ncell.innerHTML = field_labels[name];
149 ncell.align = "right";
150 var ntype = document.createElement('input');
151 ntype.type = 'hidden';
152 ntype.id = "optyp_" + next_field_id;
153 ntype.name = ntype.id;
155 ncell.appendChild(ntype);
156 tr.appendChild(ncell);
158 var opcell = document.createElement('td');
159 // create the operator map
160 var sel = document.createElement('select');
161 sel.id = "opsel_" + next_field_id;
163 mtrack_add_sel(sel, "is", "=");
164 mtrack_add_sel(sel, "is not", "!=");
166 if (name != 'milestone' && name != 'status' && name != 'type') {
167 mtrack_add_sel(sel, "contains", "~=");
168 mtrack_add_sel(sel, "does not contain", "!~=");
169 mtrack_add_sel(sel, "starts with", "^=");
170 mtrack_add_sel(sel, "does not start with", "!^=");
171 mtrack_add_sel(sel, "ends with", "\$=");
172 mtrack_add_sel(sel, "does not end with", "!\$=");
175 for (i = 0; i < sel.length; i++) {
176 if (sel.options[i].value == op) {
177 sel.selectedIndex = i;
182 opcell.appendChild(sel);
183 tr.appendChild(opcell);
185 var vid = "opval_" + next_field_id;
187 var vcell = document.createElement('td');
190 if (name == 'milestone') {
191 vele = document.createElement('select');
192 for (i in milestones) {
193 mtrack_add_sel(vele, milestones[i], milestones[i]);
194 if (milestones[i] == value) {
195 vele.selectedIndex = vele.length - 1;
198 } else if (name == 'status') {
199 vele = document.createElement('select');
200 mtrack_add_sel(vele, 'new', 'new');
201 mtrack_add_sel(vele, 'open', 'open');
202 mtrack_add_sel(vele, 'closed', 'closed');
203 mtrack_add_sel(vele, 'assigned', 'assigned');
205 case 'new': vele.selectedIndex = 0; break;
206 case 'open': vele.selectedIndex = 1; break;
207 case 'closed': vele.selectedIndex = 2; break;
208 case 'assigned': vele.selectedIndex = 3; break;
210 } else if (name == 'type') {
211 vele = document.createElement('select');
212 for (i in classifications) {
213 mtrack_add_sel(vele, classifications[i], classifications[i]);
214 if (classifications[i] == value) {
215 vele.selectedIndex = vele.length - 1;
218 } else if (name == 'priority') {
219 vele = document.createElement('select');
220 for (i in priorities) {
221 mtrack_add_sel(vele, priorities[i], priorities[i]);
222 if (priorities[i] == value) {
223 vele.selectedIndex = vele.length - 1;
226 } else if (custom_fields[name]) {
227 vele = document.createElement('select');
228 var opts = custom_fields[name];
230 mtrack_add_sel(vele, opts[i], opts[i]);
231 if (opts[i] == value) {
232 vele.selectedIndex = vele.length - 1;
238 // default to a text entry field
239 vele = document.createElement('input');
245 vcell.appendChild(vele);
246 tr.appendChild(vcell);
248 qtable.appendChild(tr);
249 \$(vele).bind('keypress', function (e) {
251 case $.ui.keyCode.ENTER:
252 case $.ui.keyCode.BACKSPACE:
260 $(document).ready(function (){
261 $('#colselector').accordion({
265 $('#columns').sortable();
267 // decode the parameters and build out the form
269 for (prop in initq) {
274 for (val in values) {
275 mtrack_add_field(prop, op, values[val]);
279 $('#addfilt').change(function () {
282 mtrack_add_field(this.options[this.selectedIndex].value, null, null);
283 this.selectedIndex = 0;
284 adding_field = false;
288 $('#updfilt').click(function (){
290 // Iterate the form elements and build up the query string
292 var f = document.getElementById('qform');
293 for (i = 0; i < f.length; i++) {
294 var ele = f.elements[i];
295 if (ele.name.match(/^op(sel|val|typ)_/)) {
296 var fid = ele.name.substr(6);
297 var oper = document.getElementById('opsel_' + fid);
298 var val = document.getElementById('opval_' + fid);
299 var type = document.getElementById('optyp_' + fid);
300 filt[fid] = [type.value, oper.value, val.value];
309 qs += f[0] + f[1] + f[2];
313 $('input.qrycol:checked').each(function () {
314 col[col.length] = $(this).attr('mtrackcol');
316 qs = qs + "&col=" + col.join('|');
317 document.location.href = "{$ABSWEB}query.php?" + qs;
324 if (strlen(trim($qs))) {
325 echo MTrack_Report::macro_TicketQuery($qs);