Ticket #2647: select-or-ticket-2647-r8675.patch
| File select-or-ticket-2647-r8675.patch, 7.0 KB (added by ebray, 3 years ago) |
|---|
-
trac/ticket/query.py
953 953 index = int(match.group(2)) 954 954 remove_constraints[k[10:match.end(1)]] = index 955 955 956 # Get constraints from form fields, and add a co onstraint if956 # Get constraints from form fields, and add a constraint if 957 957 # requested for clients without JavaScript 958 958 add_num = None 959 959 constraints = {} … … 992 992 clause = constraints.setdefault(clause_num, {}) 993 993 clause.setdefault(field, []).extend(vals) 994 994 if add_num is not None: 995 field = req.args.get('add_filter_' + add_num) 995 field = req.args.get('add_filter_' + add_num, 996 req.args.get('add_clause_' + add_num)) 996 997 if field: 997 998 clause = constraints.setdefault(int(add_num), {}) 998 999 modes = Query.get_modes().get(fields[field]['type']) … … 1009 1010 clauses[-1].setdefault(field, []).append(val) 1010 1011 clauses = filter(None, clauses) 1011 1012 1012 # Add a new empty clause for non-JavaScript clients if requested1013 if req is not None and req.args.get('add_clause'):1014 clauses.append({})1015 1016 1013 return clauses 1017 1014 1018 1015 def display_html(self, req, query): -
trac/ticket/templates/query.html
122 122 </tr> 123 123 </tbody> 124 124 125 <tbody py:with="last_clause = clause_num == len(clauses) - 1">125 <tbody py:with="last_clause = clause_num == (len(clauses) or 1) - 1"> 126 126 <tr class="actions"> 127 127 <td class="and" colspan="2"> 128 128 <label for="add_filter_${clause_num}">And</label> … … 132 132 value="$field_name" 133 133 disabled="${(field.type in ('radio', 'checkbox', 'id') and 134 134 field_name in constraints and 135 len(constraints[field_name])) or None}">${field s[field_name].label}</option>135 len(constraints[field_name])) or None}">${field.label}</option> 136 136 </select> 137 137 <div class="inlinebuttons"> 138 138 <input type="submit" name="add_${clause_num}" value="+" /> 139 139 </div> 140 140 </td> 141 141 <td py:if="last_clause" class="or" colspan="2"> 142 <label for="add_clause">Or</label> 143 <select name="add_clause_${clause_num + 1}" id="add_clause"> 144 <option></option> 145 <option py:for="field_name in field_names" value="$field_name"> 146 ${fields[field_name].label} 147 </option> 148 </select> 142 149 <div class="inlinebuttons"> 143 <input type="submit" name="add_ clause" id="add_clause" value="Or..." />150 <input type="submit" name="add_${clause_num + 1}" value="+" /> 144 151 </div> 145 152 </td> 146 153 </tr> -
trac/htdocs/js/query.js
33 33 var ctbody = table.closest("tbody"); 34 34 if (table.children().length > 2 || !ctbody.siblings().length) { 35 35 tbody.remove(); 36 if (!ctbody.siblings().length && table.children().length == 1) { 37 $("#add_clause").attr("disabled", true); 38 } 36 39 } else { 37 40 var add_clause = $("#add_clause", ctbody); 38 41 if (add_clause.length) … … 110 113 $("#filters select[name^=add_filter_]").change(function() { 111 114 if (this.selectedIndex < 1) 112 115 return; 113 116 114 117 if (this.options[this.selectedIndex].disabled) { 115 118 // IE doesn't support disabled options 116 119 alert("A filter already exists for that property"); … … 219 222 this.options[this.selectedIndex].disabled = true; 220 223 221 224 this.selectedIndex = 0; 225 226 // Enable the Or... button if it's been disabled 227 $("#add_clause").attr("disabled", false); 222 228 }).next("div.inlinebuttons").remove(); 223 229 224 230 // Add a new empty clause at the end by cloning the current last clause 225 function addClause(button) { 226 var tbody = $(button).closest("tbody"); 227 var clauseNum = parseInt($("select[name^=add_filter_]", tbody) 228 .attr("name").split("_").pop()) + 1; 229 tbody = tbody.parents("tbody").eq(0); 231 function addClause(select) { 232 var tbody = $(select).closest("tbody"); 233 var clauseNum = parseInt($(select).attr("name").split("_").pop()); 234 var tbody = $(select).closest("tbody").parents("tbody").eq(0); 230 235 var copy = tbody.clone(true); 231 $( button).closest("td").next().attr("colSpan", 4).end().remove();232 $("t d.trac-clause-sep", copy).parent().removeAttr("style");236 $(select).closest("td").next().attr("colSpan", 4).end().remove(); 237 $("tr:first", copy).removeAttr("style"); 233 238 $("tr tbody:not(:last)", copy).remove(); 234 239 var newId = "add_filter_" + clauseNum; 235 $("select", copy).attr("id", newId).attr("name", newId) 240 $("select[name^=add_filter_]", copy).attr("id", newId) 241 .attr("name", newId) 236 242 .children().enable().end() 237 243 .prev().attr("for", newId); 244 $("select[name^=add_clause_]", copy) 245 .attr("name", "add_clause_" + (clauseNum + 1)); 238 246 tbody.after(copy); 239 247 } 240 248 241 // Make the button for adding a clause a client-side trigger242 var add_clause = $("#filters input[name=add_clause]");243 add_clause.replaceWith(244 $($.template('<input type="button" id="add_clause" value="$1">',245 add_clause.val())).click(function() {249 var add_clause = $("#add_clause"); 250 add_clause.change(function() { 251 // Add a new clause and fire a change event on the new clause's 252 // add_filter select. 253 var field = $(this).val(); 246 254 addClause(this); 247 return false; 248 })); 255 $("#add_clause").closest("tr").find("select[name^=add_filter_]") 256 .val(field).change(); 257 }).next("div.inlinebuttons").remove(); 258 if (!add_clause.closest("tbody").siblings().length) { 259 // That is, if there are no filters added to this clause 260 add_clause.attr("disabled", true); 261 } 249 262 } 250 263 251 264 })(jQuery);
